TextView выше SeekBar Большой палец сдвинут - PullRequest
0 голосов
/ 21 октября 2019

Я создаю пользовательский 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);

    }

Дело в том, что при перемещении большого пальца текстовое изображение смещается все больше и больше:

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 Ответ

1 голос
/ 21 октября 2019

Его в Котлине вы можете легко конвертировать. Примите ответ, если он вам помог.

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, чтобы текст мог оставаться в середине точки. Вычитая -50 из оси y, чтобы он мог оставаться на вершине точки.

Вы можете настроить, если / еще, в соответствии с вашими потребностями.

              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

...