您的位置:首页 > 移动开发 > Android开发

Android自定义View和ViewGroup——总结于Dave Smith的视频

2016-01-09 22:05 405 查看
总述:
http://v.youku.com/v_show/id_XODM4NzA3ODMy.html?f=23088492
视频思路清晰,看完后颇有醍醐灌顶之感~十分感谢Dave Smith,还有做中文字幕的帅哥。

建议看视频前掌握一定的Android有关View绘制流程的基础,可以参考我的另一篇博客:Android View绘制:measure,layout和draw。

下面就偶的视频看后所得做个记录。

自定义View:

常用的有两个重要函数:onMeasure方法和onDraw方法 。

onMeasure方法中要获取自定义View的宽高,这个宽高是View实际值与父View约束下的调整结果,并使用setMeasuredDimension方法将宽高值存储。

onDraw方法中可以获取一个Canvas画布,这个画布是空白的,它的大小和位置是由measure后的View决定。onDraw方法需要将自定义View中的内容绘制到画布上,很多组件比如图片和文本显示一类,自身都提供了draw方法直接在画布上绘制内容,所以大可直接调用他们的draw方法。

自定义ViewGroup:

常用的有三个重要函数:onMeasure方法,onLayout方法,onDraw方法和dispatchDraw方法。

onMeasure方法中不仅要获取ViewGroup调整后的宽高值并存储,还要measure Viewgroup的所有子View。measure子 View们,首先要获取子View宽高对应的measureSpec,然后通知子View测量自身。若所有子View的宽高一致,可直接调用measureChildren方法(这是ViewGroup的方法);若不一致,就需要遍历调用子View们的onMeasure方法,分别设置宽高。

一般ViewGroup 宽高值的保存操作放在最后一步。

onLayout方法中ViewGroup需要设置所有子View的边界。也就是遍历调用子View的layout方法,调用之前,首先要计算出该子View的左上右下四个坐标值, 当然对于子View们来说,左上角的起始坐标为(0,0),然后作为参数调用子View的layout方法即可。

有几个重要的方法:getChildCount:获取子View总个数count,0~count-1就是这些子View的索引;getChildAt:获取指定索引的子View;childView.getMeasuredWidth :得到子View后,由此获取 子View的宽,高同此。

onDraw方法和dispatchDraw方法用于绘制内容,前者用于绘制ViewGroup中属于自己且不属于子View的部分,后者用于绘制ViewGroup的子View。这两个方法一般不需复写。

但当需要添加一些额外的绘制内容时,比如绘制分割线、边界线、动态背景等,就可以通过复写这两个方法实现。两者区别在于:onDraw方法先于dispatchDraw方法执行,所以若绘制内容需要在子View之下显示,就在onDraw方法中添加,若绘制内容需要在子View之上显示,就在dispatchDraw方法中添加。要注意的是要先super调用再添加自己的绘制。

还有一点不能忘记, ViewGroup的onDraw方法默认下是禁用的,所以当复写onDraw方法添加了自己的实现后,需要另这个回调生效,直接调用setWillNotDraw方法设置为false即可,即setWillNotDraw(false)。

总结:

Donnot spend time testing and overwriting states you donnot need:不要想太多,浪费时间在你并不需要的东西上。——摘自视频。

这是Dave Smith在视频中强调的观点,换句话说就是专注于真正需要的,只处理那些程序中的确会出现的情况。结合这篇blog,我们在自定义View和ViewGroup时也应专注于上面摘取的方法和流程,当我们有实现其他功能的需求时再将专注分于其他部分。

其他记录点:

1.flatten your view hierarchy:使的View层级平面化

2.自定义属性值。(后面单独介绍)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: