Android: использование линейного градиента в качестве фонового изображения

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

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

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

Ответ 1

Как говорит Ромен Гай:

listView.getBackground().setDither(true);

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Для меня на HTC Desire работает вот так

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

Ответ 5

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

enter image description here

Ответ 6

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

android:layerType="software"

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

Ответ 7

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