Android 触摸事件的分发与处理流程:onInterceptTouchEvent和onTouchEvent

参考:Android事件传递机制【Touch事件】


我们对触摸事件的处理,印象最深的就是两个方法: onInterceptTouchEvent() 和 onTouchEvent(). 
其中,
1. onInterceptTouchEvent()是ViewGroup中的方法, 返回值决定该事件是否需要被 intercept
2. onTouchEvent()是 ViewGroup 和 View,以及Activity都有的 用来处理触摸事件的方法。但是并不是所有的onTouchEvent都会被调用。


具体的分发处理的过程见以下分析:

1. onInterceptTouchEvent

    onInterceptTouchEvent 是ViewGroup 及其相关子类(LinearLayout,FrameLayout等) 中的方法。实现代码为:

    frameworks/base/core/java/android/view/ViewGroup.javacopy

  

public boolean onInterceptTouchEvent(MotionEvent ev) {  
        return false;  
}  

返回值的意义如下,
    true: 1. 该事件不再传递给子View处理,而是由当前ViewGroup的onTouchEvent处理。

                 2. 该ViewGroup的onInterceptTouchEvent,不再接受UP和Move事件。


    false:继续分发该事件给子View。子View当然也可能是一个ViewGroup。


2. onTouchEvent

有一个层次的关系如下:

Activity ---> ViewGroup---> View. (按照相反的优先级处理事件)

假设ViewGroup没有在onInterceptTouch中返回true拦截该事件(拦截后就不会分发给View), 传递事件到View处理,则响应流程如下:

View.onTouchEvent:

返回 true:  1.  View(这里代指末端的View) 处理该事件,ViewGroup的onTouchEvent不再处理。

                    2. ViewGroup的onInterceptTouchEvent还是继续接收 触摸消息的(特指后续的 MOVE, UP事件)(此处仍有一些疑惑,需要代码调试)

返回false:  1. View返回false, 则ViewGroup的onTouchEvent会处理该事件。

                    2. ViewGroup返回false, 则Activity的onTouchEvent会处理该事件。


还需要排查错误和扩展相关。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值