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"

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

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


person Francesco Laurita    schedule 28.05.2010    source источник
comment
Просто обновление: добавление getWindow (). SetFormat (PixelFormat.RGBA_8888); getWindow (). addFlags (WindowManager.LayoutParams.FLAG_DITHER); в методе onCreate кажется, что трюк также подходит для hdpi с амоледным экраном (N1 / Desire)   -  person Francesco Laurita    schedule 08.06.2010
comment
@Francesco Отлично! Это помогло на моем Galaxy S с Android 2.2. Преобразуйте ваш полезный комментарий в ответ, чтобы люди могли проголосовать за него.   -  person java.is.for.desktop    schedule 11.06.2011


Ответы (7)


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

listView.getBackground().setDither(true);

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

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

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
person Francesco Laurita    schedule 28.05.2010
comment
Это не работает на Android 1.6 и выше. Смотрите мой другой комментарий - person Francesco Laurita; 31.05.2010
comment
@Artem В моем случае на Android ›= 1.6 listView.getBackground().setDither(true); не работает, мне пришлось переопределить метод onAttachedToWindow. - person Francesco Laurita; 17.06.2011
comment
setDither () теперь устарел - person GuillermoMP; 14.01.2016

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

person Romain Guy    schedule 28.05.2010
comment
Да, это работает! Ты очень понравился. Кстати, я попытался использовать это свойство в определении drawable xml, но по мере того, как я лучше читал документацию, это свойство поддерживается только для элемента селектора. - person Francesco Laurita; 28.05.2010
comment
К сожалению, это не работает на Android версии ›1.5. Тестировал на реальном устройстве с Android 1.6 и Android 1.5. Добавление дизеринга к моему рисованному градиенту не работает. Оба устройства имеют разрешение 320 x 480 (180 пикселей на дюйм). Любое предложение? Tnx - person Francesco Laurita; 31.05.2010
comment
setDither() устарел на уровне API 23. Это свойство теперь игнорируется. - person Tot Zam; 17.03.2017

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

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
person Miša Peić    schedule 10.06.2011

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

window.getDecorView().getBackground().setDither(true);
person Sebastian    schedule 11.06.2011
comment
setDither() устарел на уровне API 23. Это свойство теперь игнорируется. - person Tot Zam; 17.03.2017

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

android:layerType="software"

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

person peter.bartos    schedule 17.03.2015

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

введите описание изображения здесь

person TouchBoarder    schedule 13.02.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 »не дрожит, что не так?

person Greg    schedule 05.05.2014