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

3 minutos de lectura

Android el uso de degradado lineal como fondo se ve
francesco laurita

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 se ve muy “anillado” en el emulador y también en un dispositivo real.

¿Hay alguna forma de reducir este “comportamiento”?

  • Solo una actualización: agregar getWindow().setFormat(PixelFormat.RGBA_8888); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER); en el método onCreate parece funcionar también para hdpi con pantalla amoled (N1/Desire)

    – Francesco Laurita

    08 jun.

  • @Francesco ¡Estupendo! Ayudó en mi Galaxy S con androide 2.2. Convierta su comentario útil en una respuesta, para que la gente pueda votar por él.

    – java.es.para.escritorio

    10 jun.


Android el uso de degradado lineal como fondo se ve
francesco laurita

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);
}

  • Esto no funciona en Android 1.6 y superior. Ver mi otro comentario

    – Francesco Laurita

    31 mayo 2010 en 09:53

  • @Artem En mi caso, en Android >= 1.6 listView.getBackground().setDither(true); no funciona, tuve que anular el onAttachedToWindow método.

    – Francesco Laurita

    17 jun.

  • setDither() ahora está en desuso

    – GuillermoMP

    14 ene.

Simplemente puede habilitar el tramado en su objeto Drawable.

  • ¡Si, funciona! Muchas gracias. Por cierto, traté de usar esta propiedad en la definición xml dibujable, pero como leí mejor en la documentación, esta propiedad solo es compatible con el elemento selector.

    – Francesco Laurita

    28 mayo 2010 en 19:47

  • 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. Ambos dispositivos son de 320 x 480 (180 ppp). ¿Cualquier sugerencia? Tnx

    – Francesco Laurita

    31 mayo 2010 en 09:52

  • setDither() quedó en desuso en el nivel de API 23. Esta propiedad ahora se ignora.

    – Tot Zam

    17 mar. 17 en 0:58


Pon esto en tu Actividad:

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

Si la configuración de interpolación y RGBA_888 no ayuda en algunos teléfonos, la solución puede ser configurar el elemento layerType a softwarepara deshabilitar la aceleración de hardware

android:layerType="software"

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

1644144845 850 Android el uso de degradado lineal como fondo se ve
Sebastián

Para mí en HTC Desire funciona así

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

  • setDither() quedó en desuso en el nivel de API 23. Esta propiedad ahora se ignora.

    – Tot Zam

    17 mar. 17 en 0:58


Android el uso de degradado lineal como fondo se ve
TouchBoarder

Para mí, las bandas desaparecieron cuando configuré android: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 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="https://stackoverflow.com/questions/2928101/@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í

  • setDither() quedó en desuso en el nivel de API 23. Esta propiedad ahora se ignora.

    – Tot Zam

    17 mar. 17 en 0:58


1644144846 188 Android el uso de degradado lineal como fondo se ve
Comunidad

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 a partir de esta otra pregunta SO: android: dither = “true” no interfiere, ¿qué pasa?

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad