2010-05-28 8 views
80

Estoy tratando de aplicar un gradiente lineal a mi ListView. Este es el contenido de mi xml dibujable:Android: El uso de gradiente lineal como fondo parece congregado

<?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í lo aplico a mi ListView con:

android:background="@drawable/shape_background_grey" 

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

¿Hay alguna manera de reducir este "comportamiento"?

+3

¿Podría publicar una captura de pantalla? – CommonsWare

+18

Solo una actualización: agregando getWindow(). SetFormat (PixelFormat.RGBA_8888); . \t \t GetWindow() addFlags (WindowManager.LayoutParams.FLAG_DITHER); en el método onCreate parece hace el truco también para IPAP con pantalla AMOLED (N1/Desire) –

+2

'@ Francesco' Gran!Ayudó en mi ** Galaxy S ** con ** Android 2.2 **. Por favor, convierta su comentario útil en una respuesta, para que la gente pueda votar. –

Respuesta

79

Como Romain individuo sugiere:

listView.getBackground().setDither(true); 

resuelve mi problema

Si esto no es suficiente, especialmente para AMOLED y/o dispositivos IPAP Prueba esto:

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

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

+8

¿Puedes hacer esto en xml? –

+7

"no funciona" o "ahora funciona"? Gran diferencia allí. –

38

Usted puede simplemente permitir que el tramado en el objeto Disponibles.

+1

Sí, funciona! Ty mucho. BTW Intenté utilizar esta propiedad en la definición xml dibujable, pero como I leyó mejor en la documentación, esta propiedad solo es compatible con el elemento selector . –

+0

Desafortunadamente, esto no funciona en la versión de Android> 1.5. Probé en dispositivos reales con Android 1.6 y Android 1.5. Añadir tramado a mi gradiente dibujable no funciona. Los dispositivos son 320 x 480 (180 ppi). ¿Cualquier sugerencia? Tnx –

+1

'setDither()' está en desuso en el nivel de API 23. Esta propiedad ahora se ignora. –

8

poner esto en su actividad:

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

Para mí el deseo de HTC funciona así

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

'setDither()' ha quedado obsoleto en el nivel de API 23. Esta propiedad ahora se ignora. –

1

Para mí las bandas desapareció cuando me puse 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 intenté usar una lista de capas con un "ruido" dibujable para eliminar las bandas, esto ayuda, pero todavía hay algo de 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 estirable "noise_repeater" i creado y utilizado

enter image description here

0

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

me ocurrió la idea de probar esto desde este otro SO pregunta: android:dither=“true” does not dither, what's wrong?

1

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

android:layerType="software" 

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

+0

Se arregló el problema para mí, ¡gracias! –

Cuestiones relacionadas