JAVA
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
app.iMeter = progress;
Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.slider_pad_2x).copy(Bitmap.Config.ARGB_8888, true);
float scale = getResources().getDisplayMetrics().density;
float x = (int) (17 * scale + 0.5f);
int y = (int) ((b.getHeight()/2-3) * scale + 0.5f);
if(seekBar.getProgress() > 9) {
x = (int) (14 * scale + 0.5f);
}
if(seekBar.getProgress() > 99) {
x = (int) (11 * scale + 0.5f);
}
Canvas canvas = new Canvas(b);
canvas.drawText(""+progress, x, y, paint);
BitmapDrawable bd = new BitmapDrawable(b);
bd.setBounds(0, 0, bd.getIntrinsicWidth(), bd.getIntrinsicHeight());
seekBar.setThumb(bd);
}
XML
<SeekBar
android:id="@+id/seekBar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:background="@drawable/slider_background_2x"
android:max="200"
android:paddingLeft="17dp"
android:paddingRight="16dp"
android:progress="0"
android:progressDrawable="@drawable/transparant_dot"
android:thumb="@drawable/slider_pad_2x" />
我在两个不同版本的Android设备上测试它:
在4.2.2上,它可以正常工作。显示drawable,并在其上绘制进度值。在2.3.6上,拇指卡在开头。当我试图移动它时,拇指上的值会发生变化,但它仍然卡住了。
我可以移除setBounds,它仍然适用于4.2.2,但在2.3.6上,当我触摸它时,拇指将完全消失。
有什么想法吗?
答案 0 :(得分:1)
好像在Android&lt; 2.3.x拇指的边界刚刚在进度发生变化时更新,但在调用setThumb()
时则不会更新。这就是为什么你必须在Drawable上调用setBounds()
之前将其设置为Thumb以使其可见。但是当你打电话时
bd.setBounds(0, 0, bd.getIntrinsicWidth(), bd.getIntrinsicHeight());
您还设置了位置,因此将其锁定在开头。
在Android上&gt;在这种情况下调用setBounds()
时会调用4.0 setThumb()
,因此在drawable上调用setBounds()
不会执行任何操作。
要解决此问题,您可以通过自己计算来给出正确的界限。有关示例,请参阅here。
我有自己的类扩展了SeekBar,所以在设置了拇指之后调用super.onSizeChanged()
为我解决了它。