web-dev-qa-db-fra.com

Android: l'utilisation d'un dégradé linéaire comme arrière-plan semble groupée

J'essaie d'appliquer un dégradé linéaire à mon ListView. Voici le contenu de mon XML dessinable:

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

Je l'applique donc à mon ListView avec:

Android:background="@drawable/shape_background_grey"

Cela fonctionne mais il a l’air très "groupé" sur l’émulateur et aussi sur un périphérique réel.

Y a-t-il un moyen de réduire ce "comportement"?

81

Comme le suggère Romain Guy:

listView.getBackground().setDither(true);

résout mon problème

Si cela ne suffit pas spécialement pour les périphériques AMOLED et/ou hdpi, essayez ceci:

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

Vous pouvez simplement activer le dithering sur votre objet Drawable.

38
Romain Guy

Mettez ceci dans votre activité:

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

Pour moi sur HTC Desire fonctionne comme ça

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

Si les paramètres de dither et RGBA_888 ne vous aident pas sur certains téléphones, la solution peut être de définir l'élément layerType sur software pour désactiver l'accélération matérielle.

Android:layerType="software"

Cela a résolu mon problème sur un téléphone Samsung S5.

2
peter.bartos

Pour moi, le banding a disparu lorsque j'ai défini Android: useLevel = "true" sur le dégradé: 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>

Mais d’abord, j’ai essayé d’utiliser une liste de couches avec un "bruit" pouvant être dessiné pour supprimer la formation de bande, cela aide mais il reste encore une certaine bande.

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

Le "noise_repeater" que je peux créer et utiliser

enter image description here

2
TouchBoarder

La seule chose qui a fonctionné pour moi a été de définir un canal alpha légèrement transparent à la fois sur startColor et 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>

J'ai eu l'idée d'essayer cela de cet autre SO question: Android: dither = "true" ne dither pas, qu'est-ce qui ne va pas?

0
Greg