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