android Seekbar沿搜索栏显示进度值

use*_*786 2 android android-seekbar

我有一个listviewseekbar每个seekbar代表产品的值的100%.通过移动seekbar可以更改%值,我想在用户拖动时显示沿搜索条的值的变化seekbar.我希望再添加一个文本框,值被更新.

我更关注在seekbar指针顶部显示一个小视图的选项,它会出现onStartTracking并消失onStopTracking事件.

有没有办法实现这个目标?

Cha*_*ruක 18

这是一个简单的方法,

  • textView在XML中添加一个
  • 通过移动来改变它的位置 seekBar
  • 这将使用它 setX()
  • 如果你想要,你也可以给setY()它的Y位置
  • 如果你想隐藏写一些逻辑,并textView在你需要时使Visibility GONE.

例:

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

                    int val = (progress * (seekBar.getWidth() - 2 * seekBar.getThumbOffset())) / seekBar.getMax();
                    textView.setText("" + progress);
                    textView.setX(seekBar.getX() + val + seekBar.getThumbOffset() / 2);
                    //textView.setY(100); just added a value set this properly using screen with height aspect ratio , if you do not set it by default it will be there below seek bar 

                }
Run Code Online (Sandbox Code Playgroud)

或者你可以使用Paint与你的自定义SeekBar类没有任何TextView

创建一个类

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.SeekBar;


public class MySeekBar extends SeekBar {
    public MySeekBar (Context context) {
        super(context);
    }

    public MySeekBar (Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MySeekBar (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas c) {
        super.onDraw(c);
        int thumb_x = (int) (( (double)this.getProgress()/this.getMax() ) * (double)this.getWidth());
        float middle = (float) (this.getHeight());

        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setTextSize(20);
        c.drawText(""+this.getProgress(), thumb_x, middle, paint);
    }
}
Run Code Online (Sandbox Code Playgroud)

SeekBar在XML中设置/创建您的

  <yourPackageName.MySeekBar
            android:id="@+id/my_seek_bar"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginTop="26dp"
            android:max="10"/>
Run Code Online (Sandbox Code Playgroud)

现在来自你的活动

seekBar = (MySeekBar) findViewById(R.id.my_seek_bar);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 超级好,谢谢!我认为文本视图的正确位置计算如下(Kotlin):`val offset = (seekBar.width -eekBar.paddingLeft -seekBar.paddingRight)*progress/seekBar.max`然后`textView.x =eekBar。 x+seekBar.paddingLeft+offset` (2认同)
  • PS:加上 `textView.x = [...] - textView.width / 2` 使文本视图居中。 (2认同)