15

基本的には、進行状況が SeekBar でいつ変化したかを検出し、進行状況の値を示すサムの上にテキスト ビューを描画する必要があります。

OnSeekBarChangeListener メソッドにand を実装することでこれを行い、サムが配置されている場所を特定するためpublic void onProgressChanged(SeekBar seekBar, int progress, boolean b)に呼び出します。Rect thumbRect = seekBar.getThumb().getBounds();

これは問題なく動作しますが、明らかgetThumb()に API レベル 16+ (Android 4.1) でしか利用できないためNoSuchMethodError、以前のバージョンではエラーが発生します。

この問題を回避する方法はありますか?

4

4 に答える 4

3

うまくいけば、これは他の誰かのために数時間を節約することができます!

カスタム seekBar の代わりにこのメソッドを作成しました。

public int getSeekBarThumbPosX(SeekBar seekBar) {
    int posX;
    if (Build.VERSION.SDK_INT >= 16) {
        posX = seekBar.getThumb().getBounds().centerX();
    } else {
        int left = seekBar.getLeft() + seekBar.getPaddingLeft();
        int right = seekBar.getRight() - seekBar.getPaddingRight();
        float width = (float) (seekBar.getProgress() * (right - left)) / seekBar.getMax();
        posX = Math.round(width) + seekBar.getThumbOffset();
    }
    return posX;
}
于 2016-10-29T17:37:41.113 に答える
0

素晴らしい解決策です!ありがとう。カスタムシークバーを使用するには、xmlを変更する必要があることを追加するだけです

 <com.example.MySeekBar
      android:id="@+id/..."
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_gravity="center_vertical"
      android:layout_weight="1"
      android:minHeight="3dp"
      android:maxHeight="3dp"
      android:progressDrawable="@drawable/seek_bar_2"
      android:thumb="@drawable/thumbler_seekbart_circle"
      android:thumbOffset="8dp" />

android:thumbOffset="8dp" - 指定する方が良い親指の半分であるため、テキストの中央と親指の不一致はありません

ポジショニングは次のようになります。

int possition = (int) (seekBar.getX() //the beginning of the seekbar
+ seekBar.getThumbOffset() / 2        //the half of our thumb - the text to be above it's centre
+ ((MySeekBar) seekBar).getSeekBarThumb().getBounds().exactCenterX()); //position of a thumb inside the seek bar
于 2015-05-30T10:37:56.857 に答える