android - SeekBar Thumb 位置问题

标签 android user-interface seekbar

我正在尝试为我的 Seekbar 做一个“带标签”的拇指。 目的是在每次 Seekbar 位置变化时自定义拇指上方的文本。

我这样做:

        ...
        seekBar = (SeekBar) findViewById(R.id.bet_seek_bar);
        seekBar.setMax(10);
        setSeekBarLabel("0");
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            @Override
            public void onStopTrackingTouch(SeekBar seekBar)
            {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar)
            {

            }

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
            {
                setSeekBarLabel(String.valueOf(progress));
            }
        });
    }

    private void setSeekBarLabel(String text)
    {
        BitmapDrawable thumb = Utils.writeOnBitmap(thumbBmp, text, 0, 0, thumbLablePaint);
        seekBar.setThumb(thumb);
    }

运行后,触摸栏,我得到这个:

screenshot

我现在不关心任何文本问题(不写一个,部分等)。

我确实关心拇指相对于进度条进度的位置。

拇指位置应该是绿色条结束的地方。我错过了什么?

问候。

最佳答案

我最终从 SeekBar 进行了扩展,并覆盖了 onMeasure() 和 onDraw 方法 (),这是我发现标签/拇指工作的唯一方法。

发布以帮助他人:

...
    @Override
    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
     {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        if (labelBackground != null)
        {

            viewWidth = getMeasuredWidth();
            barHeight = getMeasuredHeight();// returns only the bar height (without the label);
            setMeasuredDimension(viewWidth, barHeight + labelBackground.getHeight());
        }

    }



    @Override
    protected synchronized void onDraw(Canvas canvas)
    {
        if (labelBackground != null)
        {
            barBounds.left = getPaddingLeft();
            barBounds.top = labelBackground.getHeight() + getPaddingTop();
            barBounds.right = barBounds.left + viewWidth - getPaddingRight() - getPaddingLeft();
            barBounds.bottom = barBounds.top + barHeight - getPaddingBottom() - getPaddingTop();

            progressPosX = barBounds.left + ((float) this.getProgress() / (float) this.getMax()) * barBounds.width();

            labelPos.x = (int) progressPosX - labelOffset;
            labelPos.y = getPaddingTop();

            progressDrawable = getProgressDrawable();
            progressDrawable.setBounds(barBounds.left, barBounds.top, barBounds.right, barBounds.bottom);
            progressDrawable.draw(canvas);

            labelTextPaint.getTextBounds(labelText, 0, labelText.length(), labelTextRect);

            canvas.drawBitmap(labelBackground, labelPos.x, labelPos.y, labelBackgroundPaint);
            canvas.drawText(labelText, labelPos.x + labelBackground.getWidth() / 2 - labelTextRect.width() / 2, labelPos.y + labelBackground.getHeight() / 2 + labelTextRect.height() / 2, labelTextPaint);

            thumbX = (int) progressPosX - getThumbOffset();
            thumbDrawable.setBounds(thumbX, barBounds.top, thumbX + thumbDrawable.getIntrinsicWidth(), barBounds.top + thumbDrawable.getIntrinsicHeight());
            thumbDrawable.draw(canvas);
        } else
        {
            super.onDraw(canvas);
        }
    }

结果:

result

关于android - SeekBar Thumb 位置问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13887556/

相关文章:

android - 如何修复 seekbar-bar-thumb-centering-issues

java - 使 Seekbar 遵循 MPAndroidChart X 值

android - 如何在 ListView 控件中添加 Button,ImageView 小部件,它从 sqlite 数据库中获取和显示记录

java - GUI应用程序中MVC模型之间的交互

c# - 使 WPF 窗口可拖动,无论单击什么元素

vb.net - 将 VB.Net 桌面应用程序转换为移动 Web 应用程序的最快方法?

android - MPAndroidChart - 如何将搜索栏与 x 轴对齐以跳过额外的填充?

android - 如何为 android 构建 flutter 应用程序?

android - 处理略有不同的纵向和横向布局的单个 Android 布局 xml 文件?

android - Android 浏览器上的 CSS 溢出和绝对定位问题