Próbuję zastosować gradient liniowy do mojego ListView. Oto zawartość mojego pliku XML do rysowania:
<?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>
Więc stosuję go do mojego ListView z:
android:background="@drawable/shape_background_grey"
Działa, ale na emulatorze i na prawdziwym urządzeniu wygląda na bardzo „opasany”.
Czy istnieje sposób na ograniczenie tego „zachowania”?
@Francesco
Świetny! Pomogło na moim Galaxy S z Androidem 2.2 . Przekształć swój przydatny komentarz w odpowiedź, aby inni mogli na nią głosować.Odpowiedzi:
Jak sugeruje Romain Guy:
listView.getBackground().setDither(true);
rozwiązuje mój problem
Jeśli to nie wystarczy, szczególnie w przypadku urządzeń AMOLED i / lub HDpi, spróbuj tego:
@Override public void onAttachedToWindow() { super.onAttachedToWindow(); Window window = getWindow(); window.setFormat(PixelFormat.RGBA_8888); }
źródło
listView.getBackground().setDither(true);
nie zadziała, musiałem nadpisaćonAttachedToWindow
metodę.Możesz po prostu włączyć dithering na swoim obiekcie do rysowania.
źródło
setDither()
została wycofana na poziomie API 23. Ta właściwość jest teraz ignorowana.Umieść to w swojej aktywności:
@Override public void onAttachedToWindow() { super.onAttachedToWindow(); Window window = getWindow(); window.setFormat(PixelFormat.RGBA_8888); }
źródło
U mnie na HTC Desire działa tak
window.getDecorView().getBackground().setDither(true);
źródło
setDither()
została wycofana na poziomie API 23. Ta właściwość jest teraz ignorowana.U mnie pasmowanie zniknęło po ustawieniu androida: useLevel = "true" na gradiencie: 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>
Ale najpierw spróbowałem użyć listy warstw z „szumem”, który można narysować, aby usunąć pasmowanie, pomaga, ale nadal jest pewne pasmo.
<?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>
Utworzony i użyty przeze mnie plik „noise_repeater”
źródło
Jeśli dithering i ustawienie RGBA_888 nie pomagają w niektórych telefonach, rozwiązaniem może być ustawienie elementu
layerType
nasoftware
, aby wyłączyć akcelerację sprzętowąandroid:layerType="software"
To rozwiązało mój problem z telefonem Samsung S5.
źródło
Jedyną rzeczą, która działała dla mnie, było ustawienie lekko przezroczystego kanału alfa zarówno na startColor, jak i 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>
Wpadłem na pomysł, aby to wypróbować z tego drugiego pytania SO: android: dither = „true” nie waha się, co jest nie tak?
źródło