Android: usando gradiente linear como o fundo parece em faixas

85

Estou tentando aplicar um gradiente linear ao meu ListView. Este é o conteúdo do meu xml drawable:

 <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient 
        android:startColor="#3A3C39" 
        android:endColor="#181818"
        android:angle="270"
     />
    <corners android:radius="0dp" />
</shape>

Então, eu o aplico ao meu ListView com:

android:background="@drawable/shape_background_grey"

Funciona, mas parece muito "agrupado" no emulador e também em um dispositivo real.

Existe alguma maneira de reduzir esse "comportamento"?

Francesco Laurita
fonte
18
Apenas uma atualização: adicionando getWindow (). SetFormat (PixelFormat.RGBA_8888); getWindow (). addFlags (WindowManager.LayoutParams.FLAG_DITHER); no método onCreate parece funcionar também para hdpi com tela amoled (N1 / Desire)
Francesco Laurita
2
@FrancescoÓtimo! Isso ajudou no meu Galaxy S com Android 2.2 . Converta seu comentário útil em uma resposta, para que as pessoas possam votar nele.
java.is.for.desktop

Respostas:

84

Como sugere Romain Guy:

listView.getBackground().setDither(true);

resolve meu problema

Se isso não for suficiente, especialmente para dispositivos AMOLED e / ou hdpi, tente o seguinte:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
Francesco Laurita
fonte
Isso não funciona no Android 1.6 e superior. Veja meu outro comentário
Francesco Laurita
8
Você pode fazer isso em xml?
Thomas Ahle,
@Artem No meu caso, no Android> = 1.6 listView.getBackground().setDither(true);não funcionará, tive que substituir o onAttachedToWindowmétodo.
Francesco Laurita
3
setDither () está obsoleto
GuillermoMP
39

Você pode simplesmente ativar o pontilhamento em seu objeto Drawable.

Romain Guy
fonte
1
Sim, funciona! Ty muito. BTW, tentei usar essa propriedade na definição xml drawable, mas como li melhor na documentação, essa propriedade é compatível apenas com o elemento seletor.
Francesco Laurita
Infelizmente, isso não funciona na versão Android> 1.5. Testei em um dispositivo real com Android 1.6 e Android 1.5. Adicionar pontilhamento ao meu gradiente drawable não funciona. Os dispositivos são 320 x 480 (180 ppi). Alguma sugestão? Tnx
Francesco Laurita
3
setDither()foi descontinuado no nível de API 23. Esta propriedade agora é ignorada.
Tot Zam
9

Coloque isso em sua atividade:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
Miša Peić
fonte
3

Para mim, o HTC Desire funciona assim

window.getDecorView().getBackground().setDither(true);
Sebastian
fonte
1
setDither()foi descontinuado no nível de API 23. Esta propriedade agora é ignorada.
Tot Zam
2

Para mim, as faixas desapareceram quando defini o android: useLevel = "true" no gradiente: gradient_dark.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient android:startColor="#464646"
        android:endColor="#323232"
        android:angle="270"
        android:type="linear"
        android:useLevel="true"
         />
</shape>

Mas primeiro tentei usar um Layer-List com um drawable de "ruído" para remover as faixas, isso ajuda, mas ainda há algumas faixas.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/gradient_dark"/>
    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/noise_repeater"
            android:tileMode="repeat" />
    </item>

</layer-list>

O drawable "noise_repeater" que criei e usei

insira a descrição da imagem aqui

TouchBoarder
fonte
2

Se o dither e a configuração RGBA_888 não ajudarem em alguns telefones, a solução pode ser definir o elemento layerTypepara software, para desativar a aceleração de hardware

android:layerType="software"

Isso resolveu meu problema em um telefone Samsung S5.

peter.bartos
fonte
0

A única coisa que funcionou para mim foi definir um canal alfa ligeiramente transparente em startColor e endColor.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient 
        android:startColor="#FE3A3C39" 
        android:endColor="#FE181818"
        android:angle="270"
     />
</shape>

Tive a ideia de tentar isso a partir de outra pergunta do SO: android: dither = “true” não dither, o que há de errado?

Greg
fonte