87

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

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

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

4

7 回答 7

86

正如罗曼盖伊建议的那样:

listView.getBackground().setDither(true);

解决了我的问题

如果这还不够,特别是对于 AMOLED 和/或 hdpi 设备,请尝试以下操作:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
于 2010-05-28T19:50:47.803 回答
40

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

于 2010-05-28T17:36:05.397 回答
9

把它放在你的活动中:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
于 2011-06-10T18:03:14.393 回答
5

如果抖动和 RGBA_888 设置在某些手机上没有帮助,解决方案可以将元素设置layerTypesoftware,以禁用硬件加速

android:layerType="software"

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

于 2015-03-17T16:11:10.963 回答
4

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

window.getDecorView().getBackground().setDither(true);
于 2011-06-11T08:19:31.610 回答
3

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

但首先我尝试使用带有“噪声”可绘制的图层列表来删除条带,它有帮助,但仍然有一些条带。

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

在此处输入图像描述

于 2014-02-13T12:05:56.647 回答
1

唯一对我有用的是在 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” 不抖动,怎么了?

于 2014-05-05T04:51:04.853 回答