1

ジャワ

        @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" />

私は2つの異なるバージョンのAndroidデバイスでテストしています:

  • アンドロイド 2.3.6
  • アンドロイド 4.2.2

4.2.2 では、正常に動作します。ドローアブルは、その上に描画された進捗値とともに表示されます。2.3.6 では、親指が最初に動かなくなります。動かそうとするとつまみの値が変わりますが、動かなくなったままです。

setBounds を削除でき、4.2.2 でも動作しますが、2.3.6 では親指に触れると完全に消えてしまいます。

何か案は?

4

1 に答える 1

1

Android < 2.3.x では、進行状況が変更されたときに親指の境界が更新されるだけのようですが、呼び出し時には更新されませんsetThumb()setBounds()そのため、Drawable を Thumb として設定する前に、Drawableを呼び出して、まったく表示できるようにする必要があります。しかし、あなたが電話するとき

bd.setBounds(0, 0, bd.getIntrinsicWidth(), bd.getIntrinsicHeight());

位置も設定するため、最初にロックします。Android > 4.0 では、この場合のsetBounds()呼び出し時に呼び出されるため、ドローアブルを呼び出しても何もしません。setThumb()setBounds()

これを解決するには、自分で計算して正しい境界を与えることができます。例については、こちらを参照してください。

私は SeekBar を拡張する独自のクラスを持っていたのでsuper.onSizeChanged()、親指を設定した後に呼び出すと解決しました。

于 2013-07-15T21:40:30.903 に答える