Я пытаюсь применить к своему ListView линейный градиент. Это содержимое моего рисованного 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>
Поэтому я применяю его к своему ListView с помощью:
android:background="@drawable/shape_background_grey"
Это работает, но на эмуляторе и на реальном устройстве выглядит очень "скрученно".
Есть ли способ уменьшить это «поведение»?
@Francesco
Большой! Это помогло на моем Galaxy S с Android 2.2 . Преобразуйте ваш полезный комментарий в ответ, чтобы люди могли проголосовать за него.Ответы:
Как предлагает Ромен Гай:
listView.getBackground().setDither(true);
решает мою проблему
Если этого недостаточно, особенно для устройств AMOLED и / или hdpi, попробуйте следующее:
@Override public void onAttachedToWindow() { super.onAttachedToWindow(); Window window = getWindow(); window.setFormat(PixelFormat.RGBA_8888); }
источник
listView.getBackground().setDither(true);
работает, мне пришлось переопределитьonAttachedToWindow
метод.Вы можете просто включить дизеринг для своего объекта Drawable.
источник
setDither()
устарело на уровне API 23. Это свойство теперь игнорируется.Поместите это в свою деятельность:
@Override public void onAttachedToWindow() { super.onAttachedToWindow(); Window window = getWindow(); window.setFormat(PixelFormat.RGBA_8888); }
источник
У меня на HTC Desire работает так
window.getDecorView().getBackground().setDither(true);
источник
setDither()
устарело на уровне API 23. Это свойство теперь игнорируется.Для меня полосы исчезли, когда я установил android: useLevel = "true" на градиент: 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>
Но сначала я попробовал использовать Layer-List с «шумом» для удаления полос, это помогает, но некоторые полосы все еще есть.
<?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>
Рисунок "noise_repeater", который я создал и использовал
источник
Если настройки дизеринга и RGBA_888 не помогают на некоторых телефонах, решением может быть установка элемента
layerType
наsoftware
, чтобы отключить аппаратное ускорение.android:layerType="software"
Это устранило мою проблему на телефоне Samsung S5.
источник
Единственное, что сработало для меня, - это установить слегка прозрачный альфа-канал как для startColor, так и для 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>
У меня возникла идея попробовать это из другого вопроса SO: android: dither = «true» не дизерирует, что не так?
источник