Android:使用线性渐变作为背景看起来带状

Posted

技术标签:

【中文标题】Android:使用线性渐变作为背景看起来带状【英文标题】:Android: Using linear gradient as background looks banded 【发布时间】:2011-02-25 01:35:23 【问题描述】:

我正在尝试对我的 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"

它可以工作,但在模拟器和真实设备上看起来非常“带状”。

有没有办法减少这种“行为”?

【问题讨论】:

只是一个更新:添加 getWindow().setFormat(PixelFormat.RGBA_8888); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);在 onCreate 方法中似乎也适用于带有 amoled 屏幕的 hdpi (N1/Desire) @Francesco 太好了!它对我的 Galaxy SAndroid 2.2 有帮助。请将您的有用评论转换为答案,以便人们为它投票。 【参考方案1】:

正如罗曼盖伊所说:

listView.getBackground().setDither(true);

解决了我的问题

如果这还不够,特别是对于 AMOLED 和/或 hdpi 设备,试试这个:

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

【讨论】:

这不适用于 android 1.6 及更高版本。查看我的其他评论 @Artem 在我的情况下,在 Android >= 1.6 listView.getBackground().setDither(true); 上不起作用,我必须重写 onAttachedToWindow 方法。 setDither() 现已弃用【参考方案2】:

您可以简单地在 Drawable 对象上启用抖动。

【讨论】:

是的,它有效!泰非常。顺便说一句,我尝试将此属性用于可绘制 xml 定义,但当我更好地阅读文档时,此属性仅支持选择器元素。 不幸的是,这不适用于 Android 版本 > 1.5。我在装有 Android 1.6 和 Android 1.5 的真实设备上进行了测试。向我的可绘制渐变添加抖动不起作用。这些设备都是 320 x 480 (180 ppi)。有什么建议吗? Tnx setDither() 在 API 级别 23 中已弃用。此属性现在被忽略。【参考方案3】:

把它放在你的活动中:

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

【讨论】:

【参考方案4】:

如果抖动和 RGBA_888 设置在某些手机上不起作用,解决方法是将元素 layerType 设置为 software,以禁用硬件加速

android:layerType="software"

这解决了我在三星 S5 手机上的问题。

【讨论】:

【参考方案5】:

对于我来说,HTC Desire 的工作原理是这样的

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

【讨论】:

setDither() 在 API 级别 23 中已弃用。此属性现在被忽略。【参考方案6】:

对我来说,当我在渐变上设置 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>

但首先我尝试使用带有“noise”drawable 的 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”drawable

【讨论】:

【参考方案7】:

唯一对我有用的是在 startColor 和 endColor 上设置一个稍微透明的 Alpha 通道。

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

【讨论】:

以上是关于Android:使用线性渐变作为背景看起来带状的主要内容,如果未能解决你的问题,请参考以下文章

从线性渐变颜色值获取背景颜色

Android背景色内部渐变

Android背景色内部渐变

Android背景色内部渐变

如何去除使用线性渐变属性时出现的条纹[重复]

如何去除使用线性渐变属性时出现的条纹[重复]