是否可以抖动渐变可绘制?

时间:2010-05-07 19:05:45

标签: android graphics

我正在使用以下drawable:

<?xml version="1.0" encoding="utf-8"?>
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >

    <gradient 
        android:startColor="@color/content_background_gradient_start"
        android:endColor="@color/content_background_gradient_end" 
        android:angle="270"
        />

</shape>

问题是我在hdpi设备(如Nexus One和Droid)上出现严重的条带,因为渐变从屏幕顶部到最底部。

根据http://idunnolol.com/android/drawables.html#shape_gradient,渐变没有“抖动”属性。我能做些什么来平滑渐变吗?

注意:向形状添加dither =“true”似乎不起作用。

3 个答案:

答案 0 :(得分:11)

我写了你引用的文档。我再看一下代码,遗憾的是除了在代码中显式调用GradientDrawable.setDither()之外,没有办法在GradientDrawable上启用抖动。

(代码看起来的方式,技术上你可以将Gradient包含为<selector>唯一子项,并在整个选择器上启用抖动;然而,这肯定是一个黑客。)

我不相信启用抖动实际上可以解决您的问题,因为抖动(至少在官方Android文档中已经注意到)是用于在设备太小的调色板时解决条带问题。由于梯度的大小,这似乎是一个条带问题。

答案 1 :(得分:7)

大家好我有同样的问题,有一个解决方案可行,但不是很好。

getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);

它适用于我,但问题是整个窗口都是抖动的。我正在寻找一种方法来抖动渐变,但我找不到任何东西。 xml中的android:dither =“true”无效,GradientDrawable.setDither(true)也无法正常工作。所以任何想法我怎么能只抖动渐变?

答案 2 :(得分:2)

我去年遇到了一个非常类似的问题,并且在android-developers列表中没有得出有用的结论。

但是,前一段时间我发现 - 在尝试<gradient>和各种Drawable具有各种dither属性并手动创建抖动的PNG之后 - 如果我手动创建新图像在创建图像时,使用GIMP指定此时的密度(即显式输入120或240等),即使在hdpi设备上也看起来很棒。尽管它是一个灰度梯度,但没有那么多颜色。

保存后的PNG最终比较大(至少240dpi),但看起来很棒。