android Seekbar沿搜索栏显示进度值

时间:2017-01-21 01:51:08

标签: android android-seekbar

我有listview seekbar,每个seekbar代表产品价值的100%。通过移动seekbar可以更改%值,我想在用户拖动seekbar时显示搜索栏中值的变化。我希望添加另一个更新值的文本框。

我更关注的是在搜索栏指针顶部显示小视图的选项,显示onStartTracking并消失onStopTracking事件。

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

6 个答案:

答案 0 :(得分:13)

这是一个简单的方法,

  • 在XML中添加textView
  • 通过seekBar
  • 的移动更改其位置
  • 这将使用setX()
  • 定位它
  • 如果您愿意,也可以为{Y}位置提供setY()
  • 如果你想隐藏写一些逻辑,并在需要时使textView可见性消失。

示例:

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 

                }

或者您可以在自定义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);
    }
}

在XML中设置/创建SeekBar

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

现在来自你的活动

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) {
    }
});

答案 1 :(得分:2)

要使文本视图与拇指中心位置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);
}

答案 2 :(得分:1)

在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文件中,更改搜索栏的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) {

        }
    });

答案 3 :(得分:1)

试试这个我发现的离散搜索栏库 here

最简单的方法是使用 Materila Slider,它为您添加值标签,而无需编写要跟踪的 textView。

   <com.google.android.material.slider.Slider
        android:id="@+id/continuous_slider"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:valueFrom="0"
       android:stepSize="1"
        app:labelBehavior="withinBounds"
        android:valueTo="100"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"/>

答案 4 :(得分:0)

检查此library。您可以使用“单一拇指”的“范围搜索条”来实现真正的&#39;。

答案 5 :(得分:0)

对于大多数情况,接受的答案可能已经足够了。但是,如果您希望精确度以使文本恰好位于搜索栏拇指的中间,则您需要进行更多的计算。这是因为文本的宽度不同。假设您要显示0到150之间的数字。188的宽度将不同于111。因此,您显示的文本将始终向一侧倾斜。

解决该问题的方法是测量文本的宽度,将其从搜索栏拇指的宽度中删除,将其除以2,然后将其添加到接受的答案中给出的结果中。现在,您无需担心数字范围有多大。这是代码:

@CurrentText.ToUpper()