2010-05-28 17 views
80

Sto provando ad applicare un gradiente lineare al mio ListView. Questo è il contenuto del mio xml drawable:Android: utilizzo del gradiente lineare come sfondo appare a bande

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

Così ho applicarlo al mio ListView con:

android:background="@drawable/shape_background_grey" 

Funziona ma sembra molto "fasciato" su emulatore e su un dispositivo reale troppo .

Esiste un modo per ridurre questo "comportamento"?

+3

Potresti pubblicare uno screenshot? – CommonsWare

+18

Solo un aggiornamento: aggiunta di getWindow(). SetFormat (PixelFormat.RGBA_8888); \t \t getWindow(). AddFlags (WindowManager.LayoutParams.FLAG_DITHER); nel metodo onCreate sembra fa il trucco anche per hdpi con schermo AMOLED (N1/Desire) –

+2

'@ Francesco' Grande!Ha aiutato sul mio ** Galaxy S ** con ** Android 2.2 **. Ti preghiamo di convertire il tuo commento utile in una risposta, in modo che le persone possano votare per questo. –

risposta

79

come suggerisce Romain Guy:

listView.getBackground().setDither(true); 

risolve il mio problema

Se questo non è sufficiente soprattutto per AMOLED e/o dispositivi hdpi provare questo:

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

Questo non funziona su Android 1.6 e versioni successive. Vedi il mio altro commento –

+8

Puoi farlo in xml? –

+7

"non funziona" o "ora funziona"? Grande differenza lì. –

38

Si può semplicemente abilitare il dithering sull'oggetto Drawable.

+1

Sì, funziona! Ty molto. BTW Ho provato a utilizzare questa proprietà nella definizione xml estraibile, ma poiché I legge meglio nella documentazione, questa proprietà è supportata solo per l'elemento selettore . –

+0

Purtroppo questo non funziona su Android versione 1.5. Ho provato su un dispositivo reale con Android 1.6 e Android 1.5. L'aggiunta del dither al mio gradiente drawable non funziona. I dispositivi sono entrambi 320 x 480 (180 ppi). Qualche suggerimento? Tnx –

+1

'setDither()' è stato deprecato nel livello API 23. Questa proprietà è ora ignorata. –

8

mettere questo nella vostra Attività:

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

per me su HTC Desire funziona così

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

'setDither()' è stato deprecato nel livello API 23. Questa proprietà è ora ignorata. –

1

Per me il bendaggio è scomparso quando ho impostato l'androide: useLevel = "true" sul 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> 

Ma prima ho provato a usare una lista dei livelli con un "rumore" estraibile per rimuovere il banding, ma aiuta anche se c'è ancora qualche banding.

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

Il disegnabile "noise_repeater" Ho creato e utilizzato

enter image description here

0

L'unica cosa che ha funzionato per me è stato quello di impostare un canale alfa leggermente trasparente sia sul StartColor e 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> 

ho avuto l'idea di provare questo da questa domanda altri SO: android:dither=“true” does not dither, what's wrong?

1

Se il dithering e l'impostazione RGBA_888 non aiutano su alcuni telefoni, la soluzione può essere quella di impostare l'elemento layerType-software , per disabilitare l'accelerazione hardware

android:layerType="software" 

Questo problema risolto su un telefono Samsung S5.

+0

Risolto il problema per me - grazie! –

Problemi correlati