Android: использование линейного градиента в качестве фона выглядит как полоса - PullRequest
80 голосов
/ 28 мая 2010

Я пытаюсь применить линейный градиент к моему 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"

Работает, но выглядит очень «полосатым» на эмуляторе и на реальном устройстве.

Есть ли способ уменьшить это "поведение"?

Ответы [ 7 ]

80 голосов
/ 28 мая 2010

Как предполагает Ромен Гай:

listView.getBackground().setDither(true);

решает мою проблему

Если этого недостаточно, особенно для устройств AMOLED и / или HDMI, попробуйте следующее:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
38 голосов
/ 28 мая 2010

Вы можете просто включить дизеринг на своем Drawable объекте.

8 голосов
/ 10 июня 2011

Поместите это в свою деятельность:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
3 голосов
/ 11 июня 2011

У меня на HTC Desire работает так

window.getDecorView().getBackground().setDither(true);
2 голосов
/ 17 марта 2015

Если на некоторых телефонах настройка дизеринга и RGBA_888 не помогает, решение может состоять в том, чтобы установить элемент layerType на software, чтобы отключить аппаратное ускорение

android:layerType="software"

Это исправило мою проблему на телефоне Samsung S5.

2 голосов
/ 13 февраля 2014

Для меня исчезли полосы, когда я установил андроид: 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>

Drawable «noise_repeater», которое я создал и использовал

enter image description here

0 голосов
/ 05 мая 2014

Единственное, что мне помогло, это установить слегка прозрачный альфа-канал на 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» не дизеринг, что не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...