Android控件架构与自定义控件详解

基于 《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

  侧滑效果

你可能感兴趣的:(android)