SeekBar:ProgressDrawable仅在首次进度更改后显示

时间:2012-01-16 21:56:24

标签: android customization seekbar

我想实现一个适合我的应用程序的简单hsv颜色选择器。作为已知形式的颜色选择器,我想根据其他搜索栏的值更改搜索栏的背景。

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

enter image description here

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

enter image description here

就像在第二张图片中看到的那样,我想从头开始使用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()中有一个OnSeekBarChangeListener,当然还有onCreate(用于初始化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
  • 中设置两次Gradients
  • 再次在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();
        }
    });

1 个答案:

答案 0 :(得分: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();