基于 《android 群英传 》的读书笔记
View的测量—onMeasure()
测量的模式可以有以下三种:
EXACTLY
即精确值模式,当我们将控件的layout_width属性或layout_height属性指定为具体参数值时,系统使用的就是EXACTLY
AT_MOST
即最大值模式,当控件的layout_width属性或layout_hright属性是warp_content时,控件大小一般随着控件的子控件或内容的变化而变化,此时控件尺寸只要不超过父控件允许的尺寸即可
UNSPECIFIED
不指定其大小的测量模式,view想多大就多大,通常情况下在绘制view时才会使用。
view类默认的onMeasure()方法只支持EXACTLY的模式,所以如果在自定义控件的时候不重写onMeasure()方法的话,就只能使用EXACTLY模式
View 的 绘制——onDraw()
要想在android的界面上绘制相应的图像,就必须在Canvas上进行绘制。Canvas就像是一个画板,使用paint就可以在上面作画了。
一般情况下,可以使用重写view类中的onDraw()方法来绘图,onDraw()中有一个参数,就是Canvas canvas对象,使用这个对象就可以进行绘图。
ViewGroup的测量
viewgroup回去管理其子view,其中一个管理项目就是负责子view的显示大小。当viewgroup的大小为warp_content时,viewgroup就需要对子view进行遍历,以便获得所有子view 的大小,从而决定自己的大小,而在其他模式下会通过具体的指定来设置自身的大小
viewgroup在测量时通过遍历所有的子view,从而调用子view的Measure方法来获得每一个子view的测量结果,前面所说的对view的测量,就是这里执行的。
ViewGroup的绘制
viewgroup通常情况下不需要绘制,因为它本身没有需要绘制的东西,如果不是指定viewgroup的背景颜色,那么viewgroup的onDraw()方法都不会被调用。但是,viewgroup会使用dispatchDraw()方法来绘制其子view,其过程同样是通过遍历所有的子view,并调用子view的绘制方法来完成绘制工作。
自定义view
在自定义View时,我们通常回去重写onDraw()方法来绘制view的显示内容。如果该view还需要使用wrap_content属性,那么还必须重写onMeasure()方法。另外,通过自定义attrs属性,还可以设置新的属性值。
对现有控件的扩展
1.对TextView进行扩展
2.闪动的文字效果
创建复合控件
TopBar
1.定义属性
系统提供了TypedArray这样的数据结构来获取自定义的属性集--通
过一个方法,将你在atts.xml中定义的declare-styleable的所有
属性的值存储到TypedArray中。需要注意的是,当获取完所有属性
2.组合控件
3.引用UI模板
在引用前必须指定引用第三方控件的名字空间。
View来实现全新的控件
创建一个自定义view的难点在于绘制控件和实现交互。
通常需要继承View类,并重写它的onDraw(),onMeasure()等方法来
实现绘制逻辑,同时需要重写onTouchEvent()等触控事件来实现交互
逻辑
自定义ViewGroup
侧滑效果