【发布时间】: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