web-dev-qa-db-ja.com

androidシークバーは、シークバーに沿って進行状況の値を表示します

listviewseekbarがあり、各seekbarは製品の値の100%を表します。 seekbarを移動することで、%値を変更できます。ユーザーがseekbarをドラッグしているときに、シークバーに沿って値の変化を表示したいと思います。 not値が更新される別のテキストボックスを追加したいのですが。

シークバーポインタの上に小さなビューを表示するオプションをもっと探しています。これはonStartTrackingに表示され、onStopTrackingイベントが消えます。

これを達成する方法はありますか?

3
user2622786

xmlファイルにテキストビューを追加すると、次のようなlinrarlayoutを使用できます。

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="horizontal">

        <SeekBar
            Android:id="@+id/seekBar"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_weight="1"
            Android:max="1000" />

        <TextView
            Android:id="@+id/textView4"
            Android:layout_width="80dp"
            Android:layout_height="wrap_content"
            Android:layout_weight="1" />

    </LinearLayout>

およびJavaファイルで、seekbarのonProgressChangedメソッドのテキストビューテキストを変更します。

    SeekBar sk = (SeekBar) findViewById(R.id.seekBar);
    sk.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            TextView t=(TextView)findViewById(R.id.textView4);
            t.setText(String.valueOf(i));
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });
1
Amir Abbasaa

これをチェックしてください library out。 '単一の親指でtrueに範囲シークバー'を使用できます。

0
Abhriya Roy

受け入れられた答えは、おそらくほとんどの状況で十分です。ただし、テキストがシークバーの親指の真ん中に正確に収まるように精度が必要な場合は、もう少し計算する必要があります。これは、テキストの幅が異なるためです。たとえば、0から150までの数字を表示したいとします。188の幅は111とは異なります。このため、表示するテキストは常にある側に傾いています。

それを解決する方法は、テキストの幅を測定し、シークバーの親指の幅からそれを削除し、それを2で割って、受け入れられた回答で与えられた結果にそれを追加することです。これで、数値範囲がどれだけ大きいかは気になりません。コードは次のとおりです。

 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
                    val value = progress * (seekBar.width - 2 * seekBar.thumbOffset) / seekBar.max
                    label.text = progress.toString()
                    label.measure(0, 0)
                    val textWidth =  label.measuredWidth
                    val firstRemainder = seekThumbWidth - textWidth
                    val result = firstRemainder / 2
                    label.x = (seekBar.x + value + result)
                }
0
Sermilion

テキストビューを親指の中心位置Xに実際に揃えるには

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
    progressTextView.setText(String.valueOf(progress));

    int width = seekBar.getWidth() - seekBar.getPaddingLeft() - seekBar.getPaddingRight();
    int thumbPos = seekBar.getPaddingLeft() + width * seekBar.getProgress() / seekBar.getMax();

    progressTextView.measure(0, 0);
    int txtW = progressTextView.getMeasuredWidth();
    int delta = txtW / 2;
    progressTextView.setX(seekBar.getX() + thumbPos - delta);
}
0
xuanzhui