SeekBar Thumb 上方的 TextView 已移动
TextView above SeekBar Thumb is shifted
我正在制作一个自定义的 SeekBar,它在拇指上方有一个 TextView,如下所示:
我使用的代码是(-30 是文本视图居中的宽度):
SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
int val = (progress * (seekBar.getWidth() - 2 * seekBar.getThumbOffset())) / seekBar.getMax();
Tv_SbDistanceText.setText(progress + " Km");
Tv_SbDistanceText.setX(seekBar.getX() + val + seekBar.getThumbOffset() / 2 - 30);
Show_Map(dpWidth, dpHeight, Lat, Lon, progress*1000);
}
事实是,当我移动拇指时,textview 移动得越来越多:
(不是因为-30,有无我都测试过)
有什么方法可以确保它始终位于拇指中心的正上方?
xml是:
<SeekBar
android:id="@+id/sb_radius"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progress="10"
android:min="1"
android:max="300"
android:layout_marginTop="48dp"
android:layout_marginStart="40dp"
android:layout_marginEnd="40dp"
android:thumb="@drawable/sb_thumb"
android:progressDrawable="@drawable/sb_style"
app:layout_constraintTop_toBottomOf="@+id/sb_text"
android:splitTrack="false">
</SeekBar>
谢谢
它在 Kotlin 中,您可以轻松转换它。
如果对您有帮助,请采纳。
sbTest.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener
{
override fun onProgressChanged(seekBar: SeekBar?, p1: Int, p2: Boolean) {
val value = seekBar?.progress
tvPos.text = "$value Km"
if(value!=0) {
val cur = seekBar!!.width/seekBar.max
tvPos.x = (cur * value!!).toFloat() +10
}
tvPos.y = seekBar?.pivotY!! + 10
Log.d("Pos", tvPos.x.toString() + ": " +seekBar!!.width+":" +seekBar.x)
}
这里是 java,获取 seekbar 的最大长度并将 seekbar 的宽度除以它并乘以 progress 以获得 x 轴的精确值,将不同的值添加到 x 轴以便文本可以停留在点的中间。
从 y 轴减去 -50,因此它可以保持在点的顶部。
You can adjust if/else according to your need.
float value = seekBar.getProgress();
float currentPosition = (float)seekBar.getWidth() / seekBar.getMax();
currentPosition = currentPosition * value;
Tv_SbDistanceText.setText(value + " Km");
if(value<100)
Tv_SbDistanceText.setX(currentPosition +50);
else
Tv_SbDistanceText.setX(currentPosition+10);
Tv_SbDistanceText.setY(seekBar.getY() - 50);
我正在制作一个自定义的 SeekBar,它在拇指上方有一个 TextView,如下所示:
我使用的代码是(-30 是文本视图居中的宽度):
SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
int val = (progress * (seekBar.getWidth() - 2 * seekBar.getThumbOffset())) / seekBar.getMax();
Tv_SbDistanceText.setText(progress + " Km");
Tv_SbDistanceText.setX(seekBar.getX() + val + seekBar.getThumbOffset() / 2 - 30);
Show_Map(dpWidth, dpHeight, Lat, Lon, progress*1000);
}
事实是,当我移动拇指时,textview 移动得越来越多:
(不是因为-30,有无我都测试过)
有什么方法可以确保它始终位于拇指中心的正上方?
xml是:
<SeekBar
android:id="@+id/sb_radius"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progress="10"
android:min="1"
android:max="300"
android:layout_marginTop="48dp"
android:layout_marginStart="40dp"
android:layout_marginEnd="40dp"
android:thumb="@drawable/sb_thumb"
android:progressDrawable="@drawable/sb_style"
app:layout_constraintTop_toBottomOf="@+id/sb_text"
android:splitTrack="false">
</SeekBar>
谢谢
它在 Kotlin 中,您可以轻松转换它。 如果对您有帮助,请采纳。
sbTest.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener
{
override fun onProgressChanged(seekBar: SeekBar?, p1: Int, p2: Boolean) {
val value = seekBar?.progress
tvPos.text = "$value Km"
if(value!=0) {
val cur = seekBar!!.width/seekBar.max
tvPos.x = (cur * value!!).toFloat() +10
}
tvPos.y = seekBar?.pivotY!! + 10
Log.d("Pos", tvPos.x.toString() + ": " +seekBar!!.width+":" +seekBar.x)
}
You can adjust if/else according to your need.
float value = seekBar.getProgress();
float currentPosition = (float)seekBar.getWidth() / seekBar.getMax();
currentPosition = currentPosition * value;
Tv_SbDistanceText.setText(value + " Km");
if(value<100)
Tv_SbDistanceText.setX(currentPosition +50);
else
Tv_SbDistanceText.setX(currentPosition+10);
Tv_SbDistanceText.setY(seekBar.getY() - 50);