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"?
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);
}
Vous pouvez simplement activer le dithering sur votre objet Drawable.
Mettez ceci dans votre activité:
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
Window window = getWindow();
window.setFormat(PixelFormat.RGBA_8888);
}
Pour moi sur HTC Desire fonctionne comme ça
window.getDecorView().getBackground().setDither(true);
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.
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
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?