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>

所以我将它应用于:

android:background="@drawable/shape_background_grey"

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

有什么办法可以减少这种“行为”?


18
只是更新:添加getWindow()。setFormat(PixelFormat.RGBA_8888); getWindow()。addFlags(WindowManager.LayoutParams.FLAG_DITHER); 在onCreate方法似乎是卓有成效的也为HDPI与AMOLED屏幕(N1 /欲望)
弗朗西斯Laurita

2
@Francesco大!它帮助我的Galaxy SAndroid 2.2的。请将您的有用评论转换为答案,以便其他人投票。
java.is.for.desktop 2011年

Answers:


84

正如罗曼·盖伊(Romain Guy)所说:

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 2010年

@Artem以我为例,在Android> = 1.6上listView.getBackground().setDither(true);无法正常工作,我不得不重写该onAttachedToWindow方法。
Francesco Laurita 2011年

3
setDither()现在已弃用
GuillermoMP

39

您只需在Drawable对象上启用抖动即可。


1
是的,它有效!泰非常。顺便说一句,我试图在可绘制的xml定义中使用此属性,但随着我对文档的深入了解,仅选择器元素支持此属性。
Francesco Laurita 2010年

不幸的是,这不适用于Android版本> 1.5。我在具有Android 1.6和Android 1.5的真实设备上进行了测试。将抖动添加到我的可绘制渐变中不起作用。这些设备均为320 x 480(180 ppi)。有什么建议吗?Tnx
Francesco Laurita

3
setDither()已在API级别23中弃用。此属性现在被忽略。
Tot Zam

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中弃用。此属性现在被忽略。
Tot Zam

2

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

在此处输入图片说明


2

如果抖动和RGBA_888设置在某些手机上无济于事,则解决方案是将元素设置layerTypesoftware,以禁用硬件加速

android:layerType="software"

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


0

对我来说唯一有效的方法是在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”不会抖动,这是怎么回事?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.