View的绘制、事件传递过程
View绘制过程
- onMeasure()
- onLayout()
- onDraw()
过程详解
onMeasure()
计算尺寸
onLayout()
为viewGroup类型布局子视图用的。
onDraw()
执行绘制图形动作。
View事件传递
Touch事件封装在MotionEvent对象中,其中包括touch的位置、时间、历史记录以及第几个手指触摸(多点触摸)等。
Touch事件分为:
ACTION_DOWN,
ACTION_UP,
ACTION_MOVE,
ACTION_POINTER_DOWN,
ACTION_POINTER_UP,
ACTION_CANCEL。
(每个触摸事件都是以ACTION_DOWN开始,ACTION_UP结束)
事件处理包括:
传递,dispatchTouchEvent()函数;
拦截,onInterceptTouchEvent()函数;
消费onTouchEvent()函数和onTouchListener。
传递过程:
- 事件从Activity.dispatchTouchEvent()开始传递,从最上层的View(ViewGroup)开始一直往下传递。
- 如果事件从上往下传递过程中被onInterceptTouchEvent做了拦截,那么将不会再次往下传递。
- 如果在向下传递的过程中,一直没有被停止,最底层View也没有消费事件,事件会往上传传递,此时父View可以消费该Touch事件,如果一直没有被消费,会传递到Activity的onTouchEvent。
- 如果View没有对ACTION_DOWN进行消费,之后的其他事件也不会传递过来。
onTouchListener优先于onTouchEvent()对事件进行消费。