自定义竖着的SeekBar

本文介绍了如何在Android中自定义竖向SeekBar,包括继承AbsSeekBar并定义监听器接口,处理触摸事件,调整画布旋转和平移以实现竖直显示,并提供向上和向下的示例。通过在onDraw()中旋转画布并调用super.onDraw(),可以在布局中得到竖直的SeekBar。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、由于android只定义了横着的SeekBar,所以竖着的SeekBar要由我们自己自定义,现在我来谈谈我自己自定义竖着的SeekBar的做法

竖着的SeekBar有分方向向上和向下,不过代码的区别不是很大,下面会细讲。

步骤:

1、首先要新建一个类来继承AbsSeekBar,类里面再自定义一个监听器接口,比如:OnSeekBarChangeListener(这个名字可以自己定义,我这样只是为了方便)

这个接口里也写三个方法onProgressChanged(SeekBar VerticalSeekBar, int progress,boolean fromUser),onStartTrackingTouch(SeekBar VerticalSeekBar),onStopTrackingTouch(SeekBar VerticalSeekBar)

首先先看android 自带的SeekBar的原理代码

所以根据android自己自带的SeekBar,我们也可以这样定义自己的竖着的SeekBar,但是我要做的是竖着的SeekBar,所以除了它有的这些方法外,我们还要让thumb上下滑动,所以还要有onTouchEvent(),trackTouchEvent(),onProgressRefresh(),setThumbPos()等一些方法。

onTouchEvent()是在View中就有定义的方法,(touch)事件处理我日后有空我会再发文章讨论,现在我们只要知道,在用户触摸seekbar(absseekbar)时,这个方法会响应touch事件就够了。onTouchEvent()会判断用户的动作,然后调用前述的一些方法(注意去看代码),注意它调用的顺序,判断是ACTION_DOWN时先调用onStartTrackingTouch()再调用trackTouchEvent(event),于是在你的程序中定义的 onStartTrackingTouch()先执行了;判断是ACTION_UP时先调用trackTouchEvent(event)再调用onStopTrackingTouch(),至于为什么我就不啰嗦了,有时候这个顺序是很重要的。

trackTouchEvent()根据touch的位置来设置进度,它计算出progress后调用setProgress(),setProgress()是progressbar中实现的方法。

当seekbar的progress改变时onProgressRefresh()会被调用,它会调用setThumbPos()来设置thumb的位置。

现在我们知道,seekbar拥有的progressbar之外的功能,都是在absseekbar中实现的。系统默认seekbar是横着的,在absseekbar中计算progress、计算thumb的位置,用到了seekbar的宽和高,我们只要改变一下计算方法就能计算出竖着的seekbar所需要的各个数值。例如:

2、我们如何画出来一个竖着的seekbar呢?

一是自己画,也就是自己写个draw,太难,而且很难和系统风格统一。另外一个办法是让系统给我们画。verticalseekbar只是seekbar转了90度或-90度,我们可以把画布转一个角度,然后交给系统去画,具体的做法就是在ondraw()时调整画布,然后调用super.onDraw()。

这个调整也就是旋转和平移。至于旋转和平移的具体实现,我跟到native部分就没有看下去了,也没有看到具体的介绍。我的理解,你要保证画布的左上角在旋转平移以后坐标不变,否者会出现很多问题。 就我们的seekbar而言,如果你要获得一个向上增长的seekbar,那么代码应该是:

 

注意:

一个View在屏幕上画出来,首先measure()会被调用,这是个final方法,measure()会调用onMeasure()。你可以重写onMeasure(),但是重写的onMeasure()中必须调用setMeasuredDimension(int,int), setMeasuredDimension()会保存该View的长和宽。我们可以重写onMeasure()方法给我们的seekbar分配一块竖直的,长宽由我们设定的区域。在画seekbar之前,我们把这个区域旋转了90度交给系统,系统给我们画一个标准的seekbar,在整个layout中,这个seekbar就成竖直的了。

 实际操作时,我们在工程中新建了类verticalSeekbar,把framework中seekbar的代码拷贝过来,做一些必须的修改(类名、构造方法什么的)。注意如果我们的verticalseekbar是在XML中定义的,在代码中使用findViewById()方法来获得,系统将使用第二个构造方法(我简单地试了一下,没有看到官方资料或权威的解释),也就是

    public SeekBar(Context context, AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.seekBarStyle);
    }

com.android.internal.R.attr.seekBarStyle在我我们的应用程序中是无法使用的,你可以换成android.R.attr.seekBarStyle,你也可以自己定义一个,但是必须包含系统本身的。

最后代码实现:

 

 

方向向上的示例图:

方向向下的示例图:

 

 

 

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值