Android ProgressBar.setProgressDrawable只能运行一次吗?

Chu*_*uck 12 android seekbar

在颜色选择器中,我有3个用于色调,饱和度和值的SeekBars.在这些SeekBars上调用setProgressDrawable只能运行一次 - 在onCreate初始化时.当用户更新Hue SeekBar时,我想为Saturation和Value SeekBars调用setProgressDrawable,以向用户显示新Hue的颜色选择.

但是所有对setProgressDrawable的调用(在最初的调用之后onCreate)导致SeekBar被清空.

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

小智 43

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

解决方案是首先获取当前drawable的边界,然后设置new drawable并最终再次设置边界:

Rect bounds = mySeekBar.getProgressDrawable().getBounds();
mySeekBar.setProgressDrawable(newSeekBarBackground);
mySeekBar.getProgressDrawable().setBounds(bounds);
Run Code Online (Sandbox Code Playgroud)

  • 为了我的工作,我做了你说的,并添加:myS​​eekBar.setProgress(mySeekBar.getProgress()+ 1); mySeekBar.setProgress(mySeekBar.getProgress() - 1); 这样做我强行移动,但保持相同的位置. (2认同)

Goo*_*ner 1

嘿,我找到了解决方案,您首先必须通过调用 setProgresssDrawable(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>
Run Code Online (Sandbox Code Playgroud)

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