SeekBar拇指上方的TextView已移动

时间:2019-10-21 19:32:16

标签: android android-seekbar

我正在制作一个自定义SeekBar,其拇指上方具有TextView,如下所示:

enter image description here

我使用的代码是(-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会越来越多地移位:

enter image description here

(不是因为有-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>

谢谢

1 个答案:

答案 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)
    }

enter image description here         这是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);

enter image description here