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

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

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

Así que lo aplico a mi ListView con:

 android:background="@drawable/shape_background_grey" 

Funciona, pero se ve muy "banded" en el emulador y en un dispositivo real también.

¿Hay alguna forma de reducir este "comportamiento"?

Como sugiere Romain Guy:

 listView.getBackground().setDither(true); 

Soluciona mi problema

Si esto no es suficiente, especialmente para dispositivos AMOLED y / o hdpi, pruebe lo siguiente:

 @Override public void onAttachedToWindow() { super.onAttachedToWindow(); Window window = getWindow(); window.setFormat(PixelFormat.RGBA_8888); } 

Simplemente puede activar el dithering en su objeto Drawable.

Pon esto en tu Actividad:

 @Override public void onAttachedToWindow() { super.onAttachedToWindow(); Window window = getWindow(); window.setFormat(PixelFormat.RGBA_8888); } 

Para mí en HTC Desire funciona así

 window.getDecorView().getBackground().setDither(true); 

Para mí el anillado desapareció cuando establecí el androide: useLevel = "true" en el 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> 

Pero primero traté de usar una lista de capas con un "ruido" para extraer la banda, que ayuda, pero todavía hay 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 "noise_repeater" dibujable i creado y utilizado

Introduzca aquí la descripción de la imagen

Si los ajustes dither y RGBA_888 no ayudan en algunos teléfonos, la solución puede ser establecer el elemento layerType en software , desactivar la aceleración de hardware

 android:layerType="software" 

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

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

Tengo la idea de probar esto desde esta otra pregunta SO: android: dither = "true" no dither, lo que está mal?

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.