Android搜索栏自定义拇指卡在开始

时间:2013-05-29 08:48:03

标签: android seekbar android-2.3-gingerbread android-4.2-jelly-bean

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设备上测试它:

  • Android 2.3.6
  • Android 4.2.2

在4.2.2上,它可以正常工作。显示drawable,并在其上绘制进度值。在2.3.6上,拇指卡在开头。当我试图移动它时,拇指上的值会发生变化,但它仍然卡住了。

我可以移除setBounds,它仍然适用于4.2.2,但在2.3.6上,当我触摸它时,拇指将完全消失。

有什么想法吗?

1 个答案:

答案 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()为我解决了它。