【问题标题】:SeekBar: ProgressDrawable does only show after first progress ChangeSeekBar:ProgressDrawable 仅在第一次进度更改后显示
【发布时间】:2012-01-16 21:56:24
【问题描述】:

我想实现一个适合我的应用的简单 hsv 颜色选择器。作为已知的表单颜色选择器,我想根据其他 seekBars 的值更改 seekBars 的背景。

但是当我开始活动时,我看到了这个:

在第一次触摸其中一个 seekBar 之后(不管是哪个),我得到了这个结果,在第一次触摸之后,布局保持这样并且不会随着进一步的触摸而改变(这也是我根据我的预期所期望的)布局,上面的2个seekBars是20dip,下面的1个和拇指一样高):

就像在第二张图片中看到的那样,我想从一开始就拥有 seekBar。

这是我的布局:

<SeekBar
    android:id="@+id/SbColorPickerHue"
    android:layout_width="match_parent"
    android:layout_height="20dip"
    android:max="360"
    android:thumb="@drawable/colorpickerthumb" />
<SeekBar
    android:id="@+id/SbColorPickerSaturation"
    android:layout_width="match_parent"
    android:layout_height="20dip"
    android:max="255" 
    android:thumb="@drawable/colorpickerthumb"/>
<SeekBar
    android:id="@+id/SbColorPickerValue"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:max="255" 
    android:thumb="@drawable/colorpickerthumb"/>

在 onProgressChanged() 和 onCreate 中使用 OnSeekBarChangeListener(用于初始化 seekBars)我正在调用以下函数(为了保护您的大量代码,只显示了 Hue Gradient):

    private void setGradients() {
        mHueGradient = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,mColors);
        mHueGradient.setGradientType(GradientDrawable.LINEAR_GRADIENT);
        mHueGradient.setCornerRadius(mRadius);
        mHueGradient.setStroke(mStrokeWidth, mStrokeColor);
        mSbHue.setBackgroundDrawable(mHueGradient);
    }

我已经尝试了很多不同的方法:

  • 在 onCreate 中设置两次渐变
  • 在 onRescume 中再次设置渐变
  • 从布局 xml 中可以看出,我将一些 SeekBar 设置为固定高度 (20dp),其他设置为 wrap_content。行为发生了一些变化(如图所示)。但还是不满意。
  • 使 seekBar 或 Drawable 无效
  • 强制布局
  • 测量可绘制对象

结果总是一样的。

我在这里做错了什么?我错过了什么吗?

编辑 1:

SeekBar 和 ChangeListener 定义如下:

    mSbHue = (SeekBar)findViewById(R.id.SbColorPickerHue);
    setGradients();
    mSbHue.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        public void onStopTrackingTouch(SeekBar seekBar) {
        }

        public void onStartTrackingTouch(SeekBar seekBar) {
        }

        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            setGradients();
        }
    });

【问题讨论】:

  • 你能贴出声明搜索栏、它们的监听器和监听器代码的代码吗?
  • 尝试了一些进一步的事情:通过线程在 oncreate 后 1 秒更新可绘制对象:没有变化。以编程方式将搜索栏添加到视图中:没有变化。我现在完全没有想法......
  • 顺便说一句:在 4 台设备上测试此行为:2 htc、摩托罗拉、三星 Galaxy nexus:结果相同...
  • 尝试在 setGradients 中添加一些日志消息,以确保在与 seekbar 交互时调用它
  • 我之前已经检查过了。 setGradients() 肯定会在 OnCreate() 和每个 ProgressChanged 上调用。

标签: android customization seekbar


【解决方案1】:

如果将 setGradients() 移到侦听器之后,它会起作用。

mSbHue = (SeekBar)findViewById(R.id.SbColorPickerHue);
mSbHue.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    public void onStopTrackingTouch(SeekBar seekBar) {
    }

    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        setGradients();
    }
});
setGradients();

【讨论】:

  • 没有。起初我把它放在前面。然后我像你在听众之后说的 setGradients() 一样尝试了。然后我在前面和之后尝试了一次。什么都没有改变。
  • 嗯...我一开始确实遇到了和你一样的问题。然后我移动了 setGradients。也许我可以发布我的测试项目,这样你就可以看到它真的有效?
  • 当然。我不想拒绝你的回答:)如果有任何帮助,我可以上传颜色选择器类。
  • 啊,我们越来越近了:您设置了 BackgroundDrawable。如果我使用您的代码并设置progressDrawable,那么行为是相同的。这让我现在想到了一个解决方法:就像在您的代码中一样,我设置了 BackgroundDrawable 并将 Progressdrawable 设置为 colorDrawable(带有 0x00000000)作为颜色。非常感谢!
猜你喜欢
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多