1、自定义属性的声明与获取
2、测量onMeasure:
测量自身,决定自身大小。
- 什么时候调用onMeasure方法?
当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec.(带约束的空间大小)
这两个参数指明控件可获得的空间以及关于这个空间描述的元数据.
更好的方法是你传递View的高度和宽度到setMeasuredDimension方法里,这样可以直接告诉父控件,需要多大地方放置子控件.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measuredHeight = measureHeight(heightMeasureSpec);
int measuredWidth = measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredHeight, measuredWidth);
}
在处理大小之前,先要通过静态方法getMode和getSize获取mode 和 默认尺寸。
经过代码测试就知道,当我们设置width或height为fill_parent时,容器在布局时调用子
view的measure方法传入的模式是EXACTLY,因为子view会占据剩余容器的空间,所以它大小是确定的。 而当设置为
wrap_content时,容器传进去的是AT_MOST,
表示子view的大小最多是多少,这样子view会根据这个上限来设置自己的尺寸。当子view的大小设置为精确值时,容器传入的是EXACTLY。
特别的,在一些情况下,我们可能会返回超出这些限制的尺寸,在这种情况下,你可以让父元素选择如何对待超出的View,使用裁剪还是滚动等技术。
3、布局onLayout (ViewGroup)
决定子view位置,如果只是一个view,不是ViewGroup则不需要考虑onLayout 。
进来将onMeasure中的一些操作移到这里处理。onMeasure可能会多次调用。
requestLayout() 方法 刷新。
4、绘制onDraw
Canvas:
postInvalidate();子线程里调用刷新
Invalidate();UI线程调用刷新
5、onTouchEvent
VelocityTracker:加速度检测
activePoniter:多点触控下的,活跃的点
6、onInterceptTouchEvent (ViewGroup)