美文网首页
Android触摸时间的传递机制

Android触摸时间的传递机制

作者: lovefo | 来源:发表于2018-10-24 15:53 被阅读0次
    一次完整的事件传递主要包括三个阶段:分别是事件的分发、拦截和消费
    
    在Android系统中拥有事件传递处理能力的类有三个:
      Activity:拥有dispatchTouchEvent和OnTouchEvent二个方法
      ViewGroup:拥有dispatchTouchEvent、onINterceptTouchEvent和onTouchEvet三个方法
      View:拥有dispatchTouchEvent和onTouchjEvent二个方法
    
    1.触摸事件的类型
    触摸事件对应的是MotionEvent类,事件的类型主要有以下三种:
    1:ACTION_DOWN:用户手指的按下操作,一个按下操作标志着一个触摸事件的开始。
    2:ACTION_MOVE:用户手指按压屏幕后,在松开之前,如果移动的距离超出一定的阈值,
    那么会被判定为ACTIION_MOVE操作
    3:ACTION_UP:用户手指离开屏幕的操作,一次抬起操作标志着一次触摸事件的结束。
    
    2.事件传递的三个阶段

    1.分发(dispatch)

        方法:dispatchTouchEvent方法,原型如下:
    
            public boolean dispatchTouchEvent(MotionEvent ev) 
    
         在这个方法中根据视图的具体实现逻辑来决定是直接消费掉这个事件还是将事件继续分发给
         子视图处理,方法的返回值是true,表示事件被当前视图消费掉,不再继续分发事件;方法
         的返回的值为super.dispatchTouchEvent表示继续分发该事件。如果当前视图是
         ViewGroup及其子类,则会调用onInterceptTouchEvent方法判定石佛拦截该事件。
    
    

    2.拦截(Intercept)

    事件的拦截对应着onInterceptTouchEvent方法,这个方法只在ViewGroup及其子类中才存在,
    在View和Activity中是不存在的,方法的原型如下:
    
    public boolean onInterceptTouchEvent(MotionEvent ev)
    
    同样,这个方法也是通过返回的布尔值决定是否拦截对应的事件,根据具体的实现逻辑,返回true
    表示拦截这个事件,不再继续分发给子视图,同事交由自身的onTouchEvent方法进行消费,
    返回false或super.onInterceptTouchEvent表示不对事件进行拦截,需要继续传递给子视图。
    

    3.消费(consume)

    事件的消费对用着onTouchEvent方法,方法的原型如下:
    
    public boolean onTouchEvent(MotionEvent event)
    
    该方法返回值为true表示当前视图可以处理对应的事件,事件不再向上进行传递给父视图,返回
    false表示当前视图不再处理这个事件,事件会被传递给父视图的onTouchEvent方法进行处理。
    
    3.结论

    1.View的触摸事件

    1.触摸事件的传递流程是从dispatchTouchEvent开始的,如果不进行人为的干预(也就是默认返回
    父类的同名函数),则事件将会依次按照嵌套层次从外层向内层传递,到达最内层的view时,就由
    他的onTouchEvent方法处理,该方法如果能够消费该事件,则返回true,如果处理不了,就返回
    false,这时事件重新向外层传递,并由外层view的onTouchEvent方法进行处理,依次类推。
    
    2.如果事件在内层传递过程中由于人为的干预,事件处理函数返回true,则会导致事件被提前消费
    掉,内层view将不会收到这个事件
    
    3.view控件的事件触发顺序时先执行onTouch方法,在最后才执行onClick方法,如果onTouch
    返回false,则事件继续传递。
    

    ViewGroup的触摸事件

    1.触摸事件的传递顺序是从Activity到ViewGroup,再由ViewGroup递归传递到它的子布局View
    2.ViewGroup通过onInterceptTouchEvent方法对事件进行拦截,如果该方法返回true,则事件
    不会继续传递给子View,如果返回false或super.onInterceptTouchEvent,则事件会继续传递给
    子View
    3.在子View中对事件进行消费后,ViewGroup将不再接收到任何事件。
    

    Android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()总结

    Android触摸事件传递机制系列详解

    相关文章

      网友评论

          本文标题:Android触摸时间的传递机制

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