我正在制作一个自定义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>
谢谢
答案 0 :(得分:1)
在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,获取搜索栏的最大长度,并用它除以搜索栏的宽度,然后乘以进度以获得x轴的准确值,向x轴添加不同的值,以便文本可以停留在中间。 从y轴减去-50,这样它就可以保持在顶点上。
您可以根据需要调整if / else。
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);