在Android中,View是所有的控件的基类,是控件这一概念的抽象,代表了一个控件。
View坐标系
如图所示:
top:View在父组件中的上边距,可以通过getTop方法获得。
left:View在父组件中的左边距,可以通过getLeft方法获得。
right:View在父组件中的右边距,可以通过getRight方法获得。
bottom:View在父组件中的下边距,可以通过getBottom方法获得。
工作流程
View共有三大流程:
measure
测量View的宽高,只是测量的值,不一定未最终值。并且在ViewGroup中还要便利子元素的measure方法,然后递归执行直至叶子节点。
普通View的MeasureSpec的创建规则
layout
在layout方法中初始化mLeft、mBottom、mRight、mTop来确定组件位置与实际宽高。
如果是ViewGroup组件还要调用onLayout方法来计算子组件的位置与宽高。之后便利子组件的layout方法并传入计算后的位置与大小。
直接继承于View与ViewGroup的自定义控件的padding值是默认不生效的,需要自己处理,如果直接继承于ViewGroup的控件不但要处理padding值,还要处理子组件的margin值
draw
-
绘制背景background.draw(canvas)
-
绘制自己(onDraw)
-
绘制children(dispatchDraw)
-
绘制装饰(onDrawScrollBars)
通过dispatchDraw来调用子元素的draw方法,来一层层的往下传。