安卓SeekBar水平翻转

8

在 Android SeekBar 中,您通常可以将拇指向左或向右拖动,并且黄色进度颜色位于拇指的左侧。我希望完全相反,即将黄色进度颜色翻转到拇指的右侧并将整个 SeekBar 在 y 轴上翻转。

有人能指引我正确的方向吗?谢谢!

5个回答

20

在调试一些代码后,我得到了以下的解决方案,看起来效果相当不错。希望它能对其他人以后有所帮助。

public class ReversedSeekBar extends SeekBar {

    public ReversedSeekBar(Context context) {
        super(context);
    }

    public ReversedSeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ReversedSeekBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        float px = this.getWidth() / 2.0f;
        float py = this.getHeight() / 2.0f;

        canvas.scale(-1, 1, px, py);

        super.onDraw(canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        event.setLocation(this.getWidth() - event.getX(), event.getY());

        return super.onTouchEvent(event);
    }
}

以下内容是在这两个问题的帮助下组合而成的:

  1. 如何在Android中使用TextView显示倒置的文本?
  2. 如何在Android中使用实际的垂直SeekBar?

4
您尝试过使用seekbar.setRotation(180)吗?它可以将seekbar翻转180度,并且是倒置的,意味着左侧为最大值,右侧为0,并且滑块右侧的颜色相应改变。这样就不需要自定义seekbar了。

2
除了SeekBar在视觉上是颠倒的这个事实之外。 - mhenry
默认的 seekbar 在顶部和底部看起来是一样的,所以不确定会有多大的区别。至少在我的测试中没有发现任何差异。 - DanLBan
1
你不能假设 SeeBark 倒置时看起来会一样,因为 OEM 可以更改原生 SeekBar 视图的外观。添加简单的渐变会使外观失衡。最好像我接受的答案那样编程地覆盖 onDraw() 和 onTouchEvent() 事件。 - mhenry

2

你尝试在xml中设置过这个吗?

            android:rotationY="180"

1

1
谢谢!我是Android的新手,还在熟悉中。 - mhenry

-1

这应该解决了@mhenry答案中的一些问题

class ReverseSeekBar : SeekBar {
    constructor(context: Context) : super(context) {
        init()
    }
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        init()
    }
    constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle) {
        init()
    }

    var first = true

    override fun onTouchEvent(event: MotionEvent): Boolean {
        event.setLocation(this.width - event.x, event.y)
        return super.onTouchEvent(event)
    }

    override fun getProgress(): Int {
        return max - super.getProgress() + min
    }

    override fun setProgress(progress: Int) {
        super.setProgress(max - progress + min)
    }

    override fun onDraw(canvas: Canvas?) {
        if (first) {
            first = false
            val old = progress
            progress = min + max - progress
            super.onDraw(canvas)
            progress = old
        } else
            super.onDraw(canvas)
    }

    private fun init() {
        rotation = 180f
    }

}

欢迎来到Stackoverflow。请在您的答案中提供解释,说明为什么以及如何解决问题等等... - octobus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接