在 Android SeekBar 中,您通常可以将拇指向左或向右拖动,并且黄色进度颜色位于拇指的左侧。我希望完全相反,即将黄色进度颜色翻转到拇指的右侧并将整个 SeekBar 在 y 轴上翻转。
有人能指引我正确的方向吗?谢谢!
在调试一些代码后,我得到了以下的解决方案,看起来效果相当不错。希望它能对其他人以后有所帮助。
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);
}
}
以下内容是在这两个问题的帮助下组合而成的:
你尝试在xml中设置过这个吗?
android:rotationY="180"
你应该考虑制作自定义进度条。鉴于你想要做的事情,你已经在Android SDK中拥有所需的图像。我会将它们提取出来并进行相应的编辑。这里有一个教程可以帮助你入门。
这应该解决了@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
}
}