美文网首页
android事件传递机制

android事件传递机制

作者: andorid_xiao | 来源:发表于2016-05-27 17:23 被阅读67次
    Sample Flowchart Template.png
    Touch事件相关方法 方法功能 所在对象
    dispatchTouchEvent(MotionEvent ev) 事件分发 Activity、View、Viewgroup均有此方法
    onInterceptTouchEvent(MotionEvent ev) 事件拦截 仅在Viewgroup中有此方法
    onTouchEvent(MotionEvent ev) 事件消费 Activity、View、Viewgroup中均有此方法
    • dispatchTouchEvent():上层传递过来的事件,均首先到达此方法,由此方法进行分发处理。在其中会调用onInterceptTouchEvent()方法和onTouchEvent()方法;在Activity、View和Viewgroup中,该方法的实现不同。

      1. 在Activity中:dispathcTouchEvent()默认会将事件传递给其下层控件,若下层控件(包括该控件及其子控件)均不消费此事件,则会调用Activity的onTouchEvent()方法。
      2. 在View中:dispatchTouchEvent()会直接将事件传递给本控件的onTouchEvent()方法,onTouchEvent()返回false表示当前控件不消费该事件,事件交由父控件的onTouchEvent()处理。onTouchEvent()返回true表示消费该事件,事件停止传递。

      注意:onTouchEvent()返回false后,下一个事件将不会再传递至该控件

      3.在Viewgroup中:dispatchTouchEvent()先调用onIterceptTouchEvent()方法,判断是否需要拦截该事件。若onIntercepTouchEvent()方法返回true,表示需要拦截该事件,然后调用本控件的onTouchEvent()方法对事件进行处理;若onIntercepTouchEvnet()方法返回false,表示不拦截该事件,交由其下层对应的子控件去处理。

    • onInterceptTouchEvent():事件拦截,Viewgroup的特有方法,用以判断是否拦截当前事件。即是由本控件自行处理事件,还是继续向下传递,由其子控件处理该事件。默认返回false,不拦截。

    • onTouchEvent():事件消费。用以响应处理上层传递过来的事件。返回true表示消费该事件;返回false表示不消费该事件,交由父控件处理。

    注意:
    事件消费的顺序:控件的onTouch()监听--->onTouchEvent()方法--->控件的onClick()监听
    即,若控件设置了setOnTouchListener(),则事件最先派发到监听器的onTouch()方法。若onTouch()方法返回true,则事件被消费,停止传递,onToucnEvent()方法将不会收到事件;若onTouch()方法返回false,则事件可继续传递至onTouchEvent()方法。
    onClick()方法响应的两个必要条件:1.ACTION_DOWNACTION_UP动作发生后;2.控件super.onTouchEvent()得到调用。

    总结:

    • dispatchTouchEvent()

      1. 一般使用系统默认的处理即可,无需改动。

      2.父控件可调用其任意子控件的dispatchTouchEvent()方法,让指定子控件响应事件。

    • onInterceptTouchEvent()
      一般用以处理父控件与子控件之间事件响应的冲突。若父控件想自行处理事件,而不希望子控件响应事件,则让onInterceptTouchEvent()方法返回true进行事件拦截即可。默认返回false,不拦截。

    • onTouchEvent()

      1. 用以响应事件,自己消费事件,返回true;希望父控件消费事件,返回false;
      2. 最好先调用super.onTouchEvent()方法。(只用当super.onTouchEvent()得到执行,onClick()方法才能响应事件)。
    Touch事件传递.jpg

    参考链接:
    http://blog.csdn.net/yanzi1225627/article/details/22592831
    http://blog.csdn.net/leewenjin/article/details/22928363

    相关文章

      网友评论

          本文标题:android事件传递机制

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