Android: Die Verwendung eines linearen Verlaufs als Hintergrund sieht gebändert aus

83

Ich versuche, einen linearen Verlauf auf meine ListView anzuwenden. Dies ist der Inhalt meiner zeichnbaren 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>

Also wende ich es auf meine ListView an mit:

android:background="@drawable/shape_background_grey"

Es funktioniert, aber es sieht auf dem Emulator und auch auf einem realen Gerät sehr "gebändert" aus.

Gibt es eine Möglichkeit, dieses "Verhalten" zu reduzieren?

Francesco Laurita
quelle
18
Nur ein Update: Hinzufügen von getWindow (). SetFormat (PixelFormat.RGBA_8888); getWindow (). addFlags (WindowManager.LayoutParams.FLAG_DITHER); in der onCreate Methode scheint der Trick auch für HDPI mit Amoled Screen (N1 / Desire)
Francesco Laurita
2
@FrancescoToll! Es hat auf meinem Galaxy S mit Android 2.2 geholfen . Bitte wandeln Sie Ihren nützlichen Kommentar in eine Antwort um, damit die Leute dafür stimmen können.
java.is.for.desktop

Antworten:

84

Wie Romain Guy vorschlägt:

listView.getBackground().setDither(true);

löst mein Problem

Wenn dies insbesondere für AMOLED- und / oder HDPI-Geräte nicht ausreicht, versuchen Sie Folgendes:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
Francesco Laurita
quelle
Dies funktioniert nicht unter Android 1.6 und höher. Siehe meinen anderen Kommentar
Francesco Laurita
8
Können Sie dies in XML tun?
Thomas Ahle
@Artem In meinem Fall, unter Android> = 1.6 listView.getBackground().setDither(true);funktioniert nicht, musste ich die onAttachedToWindowMethode überschreiben .
Francesco Laurita
3
setDither () ist jetzt veraltet
GuillermoMP
39

Sie können einfach das Dithering für Ihr Drawable-Objekt aktivieren.

Romain Guy
quelle
1
Ja es funktioniert! Vielen Dank. Übrigens habe ich versucht, diese Eigenschaft in der zeichnbaren XML-Definition zu verwenden, aber da ich die Dokumentation besser gelesen habe, wird diese Eigenschaft nur für das Selektorelement unterstützt.
Francesco Laurita
Leider funktioniert dies nicht mit Android-Version> 1.5. Ich habe auf einem realen Gerät mit Android 1.6 und Android 1.5 getestet. Das Hinzufügen von Dithering zu meinem zeichnbaren Farbverlauf funktioniert nicht. Die Geräte sind beide 320 x 480 (180 ppi). Irgendein Vorschlag? Tnx
Francesco Laurita
3
setDither()wurde in API-Level 23 veraltet. Diese Eigenschaft wird jetzt ignoriert.
Tot Zam
9

Fügen Sie dies in Ihre Aktivität ein:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
Miša Peić
quelle
3

Für mich funktioniert das HTC Desire so

window.getDecorView().getBackground().setDither(true);
Sebastian
quelle
1
setDither()wurde in API-Level 23 veraltet. Diese Eigenschaft wird jetzt ignoriert.
Tot Zam
2

Für mich verschwand die Streifenbildung, als ich den Android: useLevel = "true" für den Farbverlauf: gradient_dark.xml festlegte

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

Aber zuerst habe ich versucht, eine Ebenenliste mit einem "Rauschen" zu verwenden, das zum Entfernen der Streifenbildung gezeichnet werden kann. Es hilft, aber es gibt immer noch einige Streifen.

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

Das "Noise_repeater" Drawable, das ich erstellt und verwendet habe

Geben Sie hier die Bildbeschreibung ein

TouchBoarder
quelle
2

Wenn die Einstellungen für Dithering und RGBA_888 auf einigen Telefonen nicht hilfreich sind, kann die Lösung darin bestehen, das Element layerTypeauf einzustellen und softwaredie Hardwarebeschleunigung zu deaktivieren

android:layerType="software"

Dies hat mein Problem auf einem Samsung S5-Telefon behoben.

peter.bartos
quelle
0

Das einzige, was für mich funktioniert hat, war, einen leicht transparenten Alphakanal sowohl für startColor als auch für endColor festzulegen.

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

Ich hatte die Idee, dies anhand dieser anderen SO-Frage zu versuchen: android: dither = "true" zittert nicht, was ist los?

Greg
quelle