我有listview
seekbar
,每个seekbar
代表产品价值的100%。通过移动seekbar
可以更改%值,我想在用户拖动seekbar
时显示搜索栏中值的变化。我不希望添加另一个更新值的文本框。
我更关注的是在搜索栏指针顶部显示小视图的选项,显示onStartTracking
并消失onStopTracking
事件。
有没有办法实现这个目标?
答案 0 :(得分:13)
这是一个简单的方法,
textView
seekBar
setX()
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()