2010-05-28 1 views
80

Я пытаюсь применить линейный градиент к моему списку. Это содержание моего вытяжке XML:Android: Использование линейного градиента в качестве фонового изображения с полосой

<?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" 

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

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

+3

Не могли бы вы разместить снимок экрана? – CommonsWare

+18

Просто обновление: добавление getWindow(). SetFormat (PixelFormat.RGBA_8888); \t \t getWindow(). AddFlags (WindowManager.LayoutParams.FLAG_DITHER); в методе onCreate, похоже, делает трюк также для hdpi с amoled screen (N1/Desire) –

+2

'@ Francesco' Отлично!Это помогло моей ** Galaxy S ** с ** Android 2.2 **. Преобразуйте свой полезный комментарий в ответ, чтобы люди могли голосовать за него. –

ответ

79

Как Romain Guy предлагает:

listView.getBackground().setDither(true); 

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

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

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

Это не работает на Android 1.6 и выше. См. Мой другой комментарий –

+8

Можете ли вы сделать это в xml? –

+7

«не работает» или «сейчас работает»? Большая разница там. –

38

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

+1

Да, это работает! Ty очень много. BTW Я попытался использовать это свойство в вычерчиваемом определении xml, но по мере того, как I лучше читал в документации, это свойство поддерживается только для селекторного элемента . –

+0

К сожалению, это не работает в версии для Android> 1.5. Я тестировал на реальном устройстве с Android 1.6 и Android 1.5. Добавление сглаживания в мой гибкий градиент не работает. Устройства - 320 x 480 (180 ppi). Любое предложение? Tnx –

+1

'setDither()' устарел на уровне API 23. Это свойство теперь игнорируется. –

8

это в вашем Деятельность:

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

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

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

'setDither()' устарел на уровне API 23. Это свойство теперь игнорируется. –

1

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

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” does not dither, what's wrong?

1

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

android:layerType="software" 

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

+0

Исправлена ​​проблема для меня - спасибо! –