解读AbsSeekBar【一】

        继续上次的“垂直SEEKBAR探讨”。

        因为上次讲到查过了资料后虽然实现了效果,但是在利用按钮控制音量上滑块效果不佳,所以继续搜索。最后根据网络中的查找结果:http://blog.youkuaiyun.com/saintswordsman/article/details/5248233得出最终完整效果。既然效果实现,那么接下来的事情就是研究它,看看为什么能实现的。在该篇博文中也提到了一个方法,就是追本溯源,从一个个的继承找到母体类。上次效果不佳的垂直SEEKBAR是继承自SeekBar的,然后SeekBar又是继承自AbsSeekBar的,最后AbsSeekBar又是继承自ProgressBar(ProgressBar继承自View可停止追溯了)。这里我们就以AbsSeekBar为母体来进行继承。这个理由就是ProgressBar是没有滑块的,我们这里就是为了使用滑块。所以我们到AbsSeekBar就行了,而且,理论上ProgressBar和SeekBar也是两样控件了,我们这里本质上还是做SeekBar的。同时看到AbsSeekBar我才知道滑块就是Thumb,难怪以前在百度也好,GOOGLE也好,搜索SEEKBAR滑块总找不到想要的答案。

        利用网络中找到的代码:http://hi.baidu.com/zuiaiyunchang/item/3a5f9b2e5659f886b632632c 先实现了效果之后现在就来研究下,首先我们来看AbsSeekBar的API吧。

        AbsSeekBarAPI原文地址:http://developer.android.com/reference/android/widget/AbsSeekBar.html

        翻译如下:

        继承自ProgressBar,直接的子类有RatingBar和SeekBar。继承过来的XML形式的属性分ProgressBar和View这两个部分(这里不详列了,查看原文即可),继承过来的常量和字段,都是从View那里继承来的(这里也不详列了,查看原文即可)

        公共的构造函数有3个,分别是一个参数Context;两个参数Context、AttributeSet;三个参数Context、AttributeSet、DefStyle

        公共的方法总共有14个,其中和滑块Thumb有关的是:getThumb、getThumbOffset、setThumb、setThumbOffset和onTouchEvent。

        另外还有5个受保护的方法:其中onDraw方法中可以通过旋转重画后让SeekBar垂直,onMeasure方法用来控制SeekBar的宽高【这里也要注意下,前面网上写的那个垂直SeekBar还有一个唯一的缺憾,就是该方法中固定死了宽和高,无法自动适应了】

        其他那些继承过来的方法就不再详列了,查看原文吧。

        可能用到的方法说明如下:

        public Drawable getThumb():返回一个表示滑块的Drawable对象,滑块能前后拖动标志当前的progress值
        public int getThumbOffset()【类似于Public void setThumbOffset(int offset)】:这里的OFFSET就是表示允许滑块超出进度条的范围,get方法就是获取,set方法就是设置
        public void setThumb(Drawable thumb):设置滑块绘制在进度条的最后面。如果thumb不为空,则它的宽度的一半为新的OFFSET值
        public boolean onTouchEvent(MotionEvent event):处理触屏事件。在该事件中我们主要就是实现拖动滑块时进度条的表现。

        protected synchronized void onMeasure (int widthMeasureSpec, int heightMeasureSpec):对控件及其内容进行测量,得到测量宽高,它一般由measure(int,int)引发。在那些继承的子类中需要重写该方法,以便更为准确及高效的得到测量值。【PS:如果重写了该方法,就需要调用 setMeasuredDimension(int, int) 来保存宽高值,否则就会由measure(int,int)抛出异常。有个合理的用法就是直接调用父类的onMeasure方法】。
        看到这里我觉得可以在onMeasure中直接调用super.onMeasure就行了。但尝试了下还是不行,算了,暂时先定死好了。现在至少宽能实现wrap_content的值,但是高不行,我估计就是旋转的缘故。留待有缘人讨论,呵呵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值