12

在颜色选择器中,我有 3 个色相、饱和度和值的 SeekBar。在这些 SeekBar 上调用 setProgressDrawable 只能工作一次——在从 onCreate 初始化时。当用户更新 Hue SeekBar 时,我想为 Saturation 和 Value SeekBars 调用 setProgressDrawable,以向用户显示他们对新 Hue 的颜色选择。

但是所有对 setProgressDrawable 的调用(在来自 的初始调用之后onCreate)都会导致 SeekBar 被空白。

如何根据用户输入更新我的 SeekBars 的背景渐变?

4

2 回答 2

43

我发现当调用 setprogressdrawable 时,drawable 不知道它的大小。当它最初设置时,它确实知道它的大小。这意味着seekbar有一个新的drawable集,但是drawable的大小是0,你什么都看不到。

解决方法是先获取当前drawable的bounds,然后设置新的drawable,最后再次设置bounds:

Rect bounds = mySeekBar.getProgressDrawable().getBounds();
mySeekBar.setProgressDrawable(newSeekBarBackground);
mySeekBar.getProgressDrawable().setBounds(bounds);
于 2011-01-12T21:19:38.043 回答
1

嘿,我得到了解决方案,您首先必须通过调用 setProgresssDrawable(drawable) 将 drawable 设置为 ProgressBar,然后才设置值,反之亦然。那会奏效的。

设置进度可绘制:

使用像这样的可绘制 xml 文件:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
    <shape>
        <corners android:radius="5dip" />
        <gradient android:startColor="#00CCCC"
            android:centerColor="#00CCCC" android:centerY="0.75"
            android:endColor="#00CCCC" android:angle="270" />
    </shape>
</item>
<item android:id="@android:id/secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient android:startColor="#00CCCC"
                android:centerColor="#00CCCC" android:centerY="0.75"
                android:endColor="#00CCCC" android:angle="270" />
        </shape>
    </clip>
</item>
<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient android:startColor="#00CCCC" android:centerColor="#00CCCC"
                android:centerY="0.75" android:endColor="#00CCCC" android:angle="270" />
        </shape>
    </clip>
</item>

将其保存到您的 /drawable 文件夹中并在 setProgressDrawable(drawable) 函数中使用它

于 2010-06-10T12:39:55.550 回答