美文网首页
View事件分发流程

View事件分发流程

作者: CodeManLB | 来源:发表于2017-11-01 17:05 被阅读0次

    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事件分发流程

          本文链接:https://www.haomeiwen.com/subject/pcugpxtx.html