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

Fra*_*ita 81 android gradient shape

我正在尝试将线性渐变应用于ListView.这是我的drawable 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>
Run Code Online (Sandbox Code Playgroud)

所以我将它应用于我的ListView:

android:background="@drawable/shape_background_grey"
Run Code Online (Sandbox Code Playgroud)

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

有没有办法减少这种"行为"?

Fra*_*ita 82

正如Romain Guy所说:

listView.getBackground().setDither(true);
Run Code Online (Sandbox Code Playgroud)

解决了我的问题

如果这对于AMOLED和/或hdpi设备来说还不够,请试试这个:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
Run Code Online (Sandbox Code Playgroud)

  • 你能用xml做这个吗? (8认同)
  • "不行"或"现在有效"?那里差别很大. (7认同)
  • 仅onAttachedToWindow解决了这个问题 (3认同)
  • setDither()现在已弃用 (2认同)

Rom*_*Guy 38

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

  • 在API级别23中不推荐使用setDither()。此属性现在被忽略。 (2认同)

Miš*_*eić 8

把它放在你的活动中:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}
Run Code Online (Sandbox Code Playgroud)


pet*_*tos 6

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

android:layerType="software"
Run Code Online (Sandbox Code Playgroud)

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