事件传递机制
View
- dispatchTouchEvent():分发事件
- onTouchEvent():处理事件
ViewGroup
- dispatchTouchEvent():分发事件
- onInterceptTouchEvent():拦截事件
- onTouchEvent():处理事件
事件从树根传递到树叶。比如ViewGroup0里面嵌套了ViewGroup1再嵌套View,当点击View的时候,最先获取到响应是最里层的ViewGroup0。
- ViewGroup0.onInterceptTouchEvent()是否拦截此事件,返回true拦截,viewGroup0.onTouchEvent()处理事件,返回false交给ViewGroup1.dispatchTouchEcent()处理
- ViewGroup1.onInterceptTouchEvent()是否拦截此事件,返回true拦截,viewGroup1.onTouchEvent()处理事件,返回false交给View.dispatchTouchEcent()处理
- View.onTouchEvent()是否处理此事件,true处理此事件,传递结束。false不处理此事件,交给ViewGroup1.onTouchEvent()处理
- ViewGroup1.onTouchEvent()是否处理此事件,true处理此事件,传递结束。false不处理此事件,交给ViewGroup0.onTouchEvent()处理
- ViewGroup0.onTouchEvent()是否处理此事件,true处理此事件,传递结束。false不处理此事件,事件丢失
自定义View
- 实现一个继承自View的类
- 添加类的构造方法,把布局初始化
- 把自定义属性定义在attrs.xml中
- 重写父类的onMeasure(), onLayout(), onDraw()方法
View的绘制流程
View的绘制流程在ViewRoot.java中实现的
判断是否需要重新计算视图大小(measure)、是否重新需要安置视图的位置(layout)、以及是否需要重绘(draw)
onMeasure()
onLayout()
onDraw()
如果是viewGroup类型还要: dispatchDraw()
网友评论