View事件分发流程

1,事件分发机制

  • 事件分发:dispatchTouchEvent(),每个view只要事件能够到达,就会触发这个方法,返回结果受当前view的onTouchEvent的返回结果和下级View的dispatchTouchEvent的结果影响,结果表示是否消耗了当前事件。
  • 事件拦截:onInterceptTouchEvent():在dispatchTouchEvent的处理中,处理是否拦截当前的事件,如果拦截当前的事件,就在当前view中处理当前的事件,结果表示是否拦截此事件。
  • 事件响应:onTouchEvent():如果当前ViewGroup拦截了事件,或分发到当前View中,会触发此事件,结果表示是否消耗此事件。
  • 三者关系如下
//伪代码
public boolean dispatchTouchEvent(MotionEvent ev)
{
    boolean consume = false;
    if (onInterceptTouchEvent(ev))
    {
        consume = onTouchEvent(ev);
    }
    else
    {
        consume = child.dispatchTouchEvent(ev);
    }

    return consume;
}

2,事件分发机制的一些总结:

  • 某个View一旦开始处理事件,但是没有消耗ACTION_DOWN,该事件会重新交给父级元素处理。其它事件,则不会交给父级元素处理,事件直接结束。

  • ViewGroup默认不拦截任何事件,View没有onInterceptTouchEvent方法,一旦接收到事件,直接触发onToucheEvent,且View默认不消耗事件,除非它可点击的。

  • onTouchEvent和onToucheListener,onClickListener,setTouchDelegate之间的关系:

    1. onTouchListener自定义了事件处理方法,它的优先级最高,会先响应它的方法。如果没有定义,才会执行系统的onTouchEvent的方法
    2. onClickListener是由多个onTouchEvent事件组成,所以它的触发是最晚的,优先级最低
    3. setTouchDelegate自定义的View的作用范围,如果设置它,会优先响应它的onTouchEvent.

你可能感兴趣的:(View事件分发流程)