Android: Використання лінійного градієнта як фону виглядає смуговим


85

Я намагаюся застосувати лінійний градієнт до мого 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"

Це працює, але виглядає дуже «смуговим» на емуляторі та на реальному пристрої.

Чи є спосіб зменшити цю "поведінку"?


18
Просто оновлення: додавання getWindow (). SetFormat (PixelFormat.RGBA_8888); getWindow (). addFlags (WindowManager.LayoutParams.FLAG_DITHER); у методі onCreate, здається, робить трюк також для hdpi з амольованим екраном (N1 / Desire)
Франческо Лауріта

2
@FrancescoЧудово! Це допомогло на моєму Galaxy S з Android 2.2 . Будь ласка, перетворіть свій корисний коментар на відповідь, щоб люди могли проголосувати за нього.
java.is.for.desktop

Відповіді:


84

Як пропонує Ромен Гай:

listView.getBackground().setDither(true);

вирішує мою проблему

Якщо цього недостатньо, особливо для пристроїв AMOLED та / або hdpi, спробуйте:

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

Це не працює на android 1.6 і вище. Подивіться мій інший коментар
Франческо Лауріта

8
Чи можете ви це зробити в xml?
Thomas Ahle 02

@Artem У моєму випадку на Android> = 1,6 listView.getBackground().setDither(true);звичка не працює, мені довелося замінити onAttachedToWindowметод.
Франческо Лауріта,

3
setDither () тепер застаріло
GuillermoMP

39

Ви можете просто увімкнути стирання на об’єкті, що малюється.


1
Так це працює! Тай дуже. До речі, я спробував використати цю властивість у витяжному визначенні xml, але оскільки я краще читаю документацію, ця властивість підтримується лише для елемента селектора.
Франческо Лауріта

На жаль, це не працює у версії Android> 1.5. Я тестував на реальному пристрої з Android 1.6 та Android 1.5. Додавання дизеру до мого графічного градієнта не працює. Пристрої мають 320 х 480 (180 пікселів на дюйм). Будь-яка пропозиція? Tnx
Франческо Лауріта

3
setDither()було припинено на рівні API 23. Ця властивість ігнорується.
Тот Зам

9

Помістіть це у свою активність:

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

3

Для мене на HTC Desire працює так

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

1
setDither()було припинено на рівні API 23. Ця властивість ігнорується.
Тот Зам

2

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

"Шумовий_повторювач", який можна створити та використати

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


2

Якщо налаштування dither і RGBA_888 не допомагають на деяких телефонах, рішенням може бути встановлення елементу layerTypeна software, щоб відключити апаратне прискорення

android:layerType="software"

Це вирішило мою проблему на телефоні Samsung S5.


0

Єдине, що мені вдалося, це встановити злегка прозорий альфа-канал як на 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” не затухає, що не так?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.