Android事件分发机制

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拦截某种事件。

你可能感兴趣的:(Android事件分发机制)