View的事件的调度顺序是 onTouchListener > onTouchEvent > onLongClickListener > onClickListener
MotionEvent
- Touch事件种类:
- MotionEvent.ACTION_DOWN:按下
- MotionEvent.ACTION_MOVE:滑动
- MotionEvent.ACTION_CANCEL:取消
- MotionEvent.ACTION_UP:抬起
- 事件队列,由Down开始,Up或Cancel结束,中间产生一个或者多个Move事件。
dispatchTouchEvent
- 事件分发原理:责任链模式,事件层层传递,直到被消费。
onTouchEvent
- 如果ViewGroup的onTouchEvent处理Down事件,子View不会收到后续事件;
- 如果ViewGroup的onTouchEvent不处理Down事件,则ViewGroup的onTouchEvent不会收到后续事件。
- 如果不对事件进行处理,默认是一个U型图,从Activity->ViewGroup->View再返回
- OnTouchEvent由下往上传递,当中间任何一层ViewGroup的OnTouchEvent消费该事件,则不再往上传递,表示事件已处理。
onInterceptTouchEvent
- 如果ViewGroup的onInterceptTouchEvent不拦截Down事件,把Down事件传递给子View,但是后续的事件还会传递给ViewGroup的onInterceptTouchEvent。
- 被ViewGroup的onInterceptTouchEvent拦截的事件将会被系统变成一个Cancel事件,这个Cancel事件将会传递给View的onTouchEvent方法。(如果ViewGroup拦截的是Move事件,那么后续事件也将由ViewGroup的onTouchEvent处理,子View将不会收到该事件队列产生的任何事件了)
- ViewGroup的onInterceptTouchEvent方法一旦拦截一次事件后续将不再被调用。
requestDisallowInterceptTouchEvent
- 子View可通过requestDisallowInterceptTouchEvent阻止ViewGroup拦截某种事件。
网友评论