Android: l'utilizzo del gradiente lineare come sfondo sembra a fasce


85

Sto cercando di applicare un gradiente lineare al mio ListView. Questo è il contenuto del mio xml disegnabile:

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

Quindi lo applico al mio ListView con:

android:background="@drawable/shape_background_grey"

Funziona ma sembra molto "bandito" sull'emulatore e anche su un dispositivo reale.

C'è un modo per ridurre questo "comportamento"?


18
Solo un aggiornamento: aggiunta di getWindow (). SetFormat (PixelFormat.RGBA_8888); getWindow (). addFlags (WindowManager.LayoutParams.FLAG_DITHER); nel metodo onCreate sembra che vada bene anche per hdpi con schermo amolto (N1 / Desire)
Francesco Laurita

2
@FrancescoGrande! Ha aiutato sul mio Galaxy S con Android 2.2 . Converti il ​​tuo commento utile in una risposta, in modo che le persone possano votarlo.
java.is.for.desktop

Risposte:


84

Come suggerisce Romain Guy:

listView.getBackground().setDither(true);

risolve il mio problema

Se questo non è sufficiente soprattutto per i dispositivi AMOLED e / o hdpi, prova questo:

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

Non funziona su Android 1.6 e versioni successive. Vedi l'altro mio commento
Francesco Laurita

@Artem Nel mio caso, su Android> = 1.6 listView.getBackground().setDither(true);non funzionava, ho dovuto sovrascrivere il onAttachedToWindowmetodo.
Francesco Laurita

3
setDither () è ora deprecato
GuillermoMP

39

Puoi semplicemente abilitare il dithering sul tuo oggetto Drawable.


1
Sì funziona! Ty molto. A proposito, ho provato a utilizzare questa proprietà nella definizione xml disegnabile, ma come ho letto meglio nella documentazione, questa proprietà è supportata solo per l'elemento selector.
Francesco Laurita

Sfortunatamente questo non funziona sulla versione Android> 1.5. Ho provato su un dispositivo reale con Android 1.6 e Android 1.5. L'aggiunta di dithering al mio gradiente disegnabile non funziona. I dispositivi sono entrambi 320 x 480 (180 ppi). Qualche suggerimento? Tnx
Francesco Laurita

3
setDither()è stato deprecato nel livello API 23. Questa proprietà è ora ignorata.
Tot Zam

9

Metti questo nella tua 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);

1
setDither()è stato deprecato nel livello API 23. Questa proprietà è ora ignorata.
Tot Zam

2

Per me il banding è scomparso quando ho impostato Android: useLevel = "true" sul gradiente: gradiente_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 un Layer-List con un "rumore" disegnabile per rimuovere le bande, aiuta ma 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" che ho creato e utilizzato

inserisci qui la descrizione dell'immagine


2

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

android:layerType="software"

Questo ha risolto il mio problema su un telefono Samsung S5.


0

L'unica cosa che ha funzionato per me è stata impostare un canale alfa leggermente trasparente sia su startColor che su 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 provarlo da quest'altra domanda SO: android: dither = "true" non dithering, cosa c'è che non va?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.