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