Android触摸事件传递机制

这里将会详细介绍activity,View,Viewgroup三者的触摸事件传递机制.一次完整的事件传递主要包括三个阶段,分别是事件的分发、拦截和消费。我们首先来了解下Android中触摸事件的主要类型。

1.1触摸事件的主要类型                                                                                                           

触摸事件对应的是MotionEvent类,事件的类型主要有如下三种。

    · ACTION_DOWN:用户手指按下操作,一个按下操作标志着一次触摸事件的开始。

    · ACTION_MOVE:用户手指按压屏幕后,在松开之前,如果移动的距离超过移动的阈值,那么会被判定

      为ACTION_MOVE操作,一般情况下,手指的轻微移动都会触发一系列的移动事件。

    · ACTION_UP:用户手指离开屏幕的操作,一次抬起操作标志着一次触摸事件的结束。 

    在一次屏幕触摸操作中,ACTION_DOWN和ACTION_UP这两个事件是必需的,而ACTION_MOVE视情况而定,如果用户仅仅是点击了一下屏幕,那么可能只会检测到按下和抬起的动作。

1.2事件传递的三个阶段                                                                                                           

     ·分发(Dispatch):事件的分发对应着dispatchTouchEvent方法,在Android系统中,所有的触摸事件都是通过这个方法来分发的,方法原型如下。

public boolean dispatchTouchEvent(MotionEvent ev)

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

    ·拦截(Intercept):事件的拦截对应着onInterceptTouchEvent方法,这个方法只在ViewGroup及其子类中才存在,在View和Activity中是不存在的。方法的原型如下。

public boolean onInterceptTouchEvent(MotionEvent ev)

    这个方法也是通过返回的布尔值来决定是否拦截对应的事件,根据具体的实现逻辑,返回true表示拦截这个事件,不继续分发给子视图,同时交由自身的onTouchEvent方法进行消费;返回false或super.onInterceptTouchEvent表示不对事件进行拦截,需要继续传递给子视图。

    ·消费(Consume):事件的消费对应着onTouchEvent方法,方法原型如下。

public boolean onTouchEvent(MotionEvent event)

    该方法返回值为true表示当前视图可以处理对应的事件,事件将不会向上传递给父视图;返回值为false表示当前视图不处理这个事件,事件会被传递给父视图的onTouchEvent方法进行处理。

    在Android系统中,拥有事件传递处理能力的类有一下三种。

    ·Acitivty:拥有dispatchTouchEvent和onTouchEvent两个方法。

    ·ViewGroup:拥有dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三个方法。

    ·View:拥有dispatchTouchEvent和onTouchEvent两个方法。

1.3View事件传递机制                                                                 

   虽然ViewGroup是view的子类,但是这里所说的View专指除ViewGroup外的View控件,如TextView、Button、ImageView等,View本身是最小的单位,不能再作为其他View的容器。


       ·触摸事件的传递流程是从dispatchTouchEvent开始的,如果不进行认为干预(也就是默认返回父类的同名函数),则事件将会依照嵌套层次从外层向内层传递,到达最内层的View时,就由它的onTouchEvent方法处理,该方法如果能够消费该事件,则返回true,如果处理不了,则返回false,这时事件会重新向外层传递,并由外层View的onTouchEvent方法进行处理,依此类推。

      ·如果事件在向内层传递过程中由于人为干预,事件处理函数返回true,则会导致事件提前被消费掉,内层View将不会收到这个事件。

      ·View控件的事件触发顺序是先执行onTouch方法,在最后才执行onClick方法。如果onTouch返回true,则事件不会继续传递,最后也不会调用onClick方法;如果onTouch返回false,则事件继续传递。

1.4ViewGroup的事件传递机制                                                                          
       ·触摸事件的传递顺序是由Activity到ViewGroup,再由ViewGroup递归传递给它的子View。

       ·ViewGroup通过onInterceptTouchEvent方法对事件进行拦截,如果该方法返回true,则事件不会继续传递给子View,如果返回false或者super.onInterceptTouchEvent,则事件会继续传递给子View。

      ·在子View中对事件进行消费后,ViewGroup将接收不到任何事件。



 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值