Android: el uso de degradado lineal como fondo se ve con bandas

85

Estoy tratando de aplicar un degradado lineal a mi ListView. Este es el contenido de mi xml dibujable:

 <?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>

Entonces lo aplico a mi ListView con:

android:background="@drawable/shape_background_grey"

Funciona pero parece muy "anillado" en el emulador y también en un dispositivo real.

¿Hay alguna forma de reducir este "comportamiento"?

Francesco Laurita
fuente
18
Solo una actualización: agregando getWindow (). SetFormat (PixelFormat.RGBA_8888); getWindow (). addFlags (WindowManager.LayoutParams.FLAG_DITHER); en el método onCreate parece que funciona también para hdpi con pantalla amoled (N1 / Desire)
Francesco Laurita
2
@Francesco¡Excelente! Ayudó en mi Galaxy S con Android 2.2 . Convierta su comentario útil en una respuesta para que la gente pueda votar por él.
java.is.for.desktop

Respuestas:

84

Como sugiere Romain Guy:

listView.getBackground().setDither(true);

resuelve mi problema

Si esto no es suficiente, especialmente para dispositivos AMOLED y / o hdpi, intente esto:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
Francesco Laurita
fuente
Esto no funciona en Android 1.6 y superior. Ver mi otro comentario
Francesco Laurita
8
¿Puedes hacer esto en xml?
Thomas Ahle
@Artem En mi caso, en Android> = 1.6 listView.getBackground().setDither(true);no funcionará, tuve que anular el onAttachedToWindowmétodo.
Francesco Laurita
3
setDither () ahora está obsoleto
GuillermoMP
39

Simplemente puede habilitar el tramado en su objeto Drawable.

Romain Guy
fuente
1
¡Si, funciona! Muchas gracias. Por cierto, intenté usar esta propiedad en la definición xml dibujable, pero a medida que leí mejor en la documentación, esta propiedad solo es compatible con el elemento selector.
Francesco Laurita
Desafortunadamente, esto no funciona en la versión de Android> 1.5. Probé en un dispositivo real con Android 1.6 y Android 1.5. Agregar tramado a mi degradado dibujable no funciona. Los dispositivos son de 320 x 480 (180 ppi). ¿Cualquier sugerencia? Tnx
Francesco Laurita
3
setDither()quedó obsoleto en el nivel de API 23. Esta propiedad ahora se ignora.
Tot Zam
9

Pon esto en tu actividad:

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

Para mí en HTC Desire funciona así

window.getDecorView().getBackground().setDither(true);
Sebastián
fuente
1
setDither()quedó obsoleto en el nivel de API 23. Esta propiedad ahora se ignora.
Tot Zam
2

Para mí, las bandas desaparecieron cuando configuré android: useLevel = "true" en el degradado: 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>

Pero primero intenté usar una lista de capas con un "ruido" dibujable para eliminar las bandas, ayuda, pero todavía hay algunas bandas.

<?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>

El dibujable "noise_repeater" que creé y usé

ingrese la descripción de la imagen aquí

TouchBoarder
fuente
2

Si el tramado y el ajuste RGBA_888 no ayudan en algunos teléfonos, la solución puede ser establecer el elemento layerTypeque software, para desactivar la aceleración de hardware

android:layerType="software"

Esto solucionó mi problema en un teléfono Samsung S5.

peter.bartos
fuente
0

Lo único que funcionó para mí fue establecer un canal alfa ligeramente transparente tanto en startColor como en 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>

Tuve la idea de probar esto de esta otra pregunta SO: android: dither = "true" no dither, ¿qué pasa?

Greg
fuente