Android SeekBar:ProgressDrawable仅在第一次进度更改后显示

Android SeekBar:ProgressDrawable仅在第一次进度更改后显示,android,customization,seekbar,Android,Customization,Seekbar,我想实现一个简单的hsv颜色选择器,很适合我的应用程序。作为已知的表单颜色选择器,我想根据其他seekbar的值更改seekbar的背景 但当我开始活动时,我看到了: 在第一次触摸其中一个搜索杆(无论哪一个)后,我得到了这个结果,在第一次触摸后,布局保持不变,并且不会随着进一步触摸而改变(这也是我根据布局所期望的,顶部的2个搜索杆为20度,下面的1个与拇指一样高): 就像在第二张图片中看到的那样,我希望从一开始就拥有seekBar 以下是我的布局: <SeekBar andro

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

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

在第一次触摸其中一个搜索杆(无论哪一个)后,我得到了这个结果,在第一次触摸后,布局保持不变,并且不会随着进一步触摸而改变(这也是我根据布局所期望的,顶部的2个搜索杆为20度,下面的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"/>
我已经尝试了很多不同的东西:

  • 在onCreate中设置两次渐变
  • 在onRescume中再次设置渐变
  • 从布局xml中可以看出,我将一些SeekBar设置为固定高度(20dp),另一些设置为包装内容。行为发生了一些变化(如图所示)。但仍然不令人满意
  • 使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();
        }
    });
如果在侦听器之后移动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(),它将工作

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();


你能在声明seekbar、它们的监听器和监听器代码的地方发布代码吗?尝试了一些进一步的事情:用线程在oncreate后1秒更新可绘制的代码:无更改。以编程方式将seekbar添加到视图:无更改。我现在完全没有主意了…顺便说一句:在4台设备上测试这种行为:2台htc、摩托罗拉、三星galaxy nexus:everwhere相同的结果…尝试在setGradients中添加一些日志消息,以确保在您与seekbarI交互时调用它,之前已经检查过了。setGradients()在OnCreate()中被定义调用,并且在每次ProgressChanged中都被调用。您能在声明seekbar、其侦听器和侦听器代码的地方发布代码吗?尝试了一些进一步的事情:在OnCreate后1秒通过线程更新可绘制的内容:无更改。以编程方式将seekbar添加到视图:无更改。我现在完全没有主意了…顺便说一句:在4台设备上测试这种行为:2台htc、摩托罗拉、三星galaxy nexus:everwhere相同的结果…尝试在setGradients中添加一些日志消息,以确保在您与seekbarI交互时调用它,之前已经检查过了。setGradients()在OnCreate()中定义调用,并且每次ProgressChanged时都会调用。否。起初我把它放在我面前。然后我试着像你在听众后面说的setGradients()。然后我在前面试过一次,在后面试过一次。一点也没变。嗯……一开始我确实和你有同样的问题。然后我移动了梯度。也许我可以发布我的测试项目,这样你就可以看到它真正起作用了?当然。这并不是说我想拒绝你的回答:)如果有任何帮助,我可以上传完整的颜色选择器类。啊,我们更接近了:你设置了背景。如果我使用您的代码并设置progressDrawable,那么行为是相同的。这就给我带来了一个解决方法:就像在你的代码中一样,我将BackgroundDrawable设置为颜色,并将Progressdrawable设置为colorDrawable(0x00000000)作为颜色。谢谢!不,起初我把它放在我面前。然后我试着像你在听众后面说的setGradients()。然后我在前面试过一次,在后面试过一次。一点也没变。嗯……一开始我确实和你有同样的问题。然后我移动了梯度。也许我可以发布我的测试项目,这样你就可以看到它真正起作用了?当然。这并不是说我想拒绝你的回答:)如果有任何帮助,我可以上传完整的颜色选择器类。啊,我们更接近了:你设置了背景。如果我使用您的代码并设置progressDrawable,那么行为是相同的。这就给我带来了一个解决方法:就像在你的代码中一样,我将BackgroundDrawable设置为颜色,并将Progressdrawable设置为colorDrawable(0x00000000)作为颜色。谢谢!