Android Touch事件传递机制

Touch事件传递等级

事件的传递分为ViewGroup、View、Activity三个等级
顺序为ViewGroup->View->Activity

布局结构

如下,最外层为Activity:

<EventLinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >
    <EventTextView
       android:id="@+id/tvEvent"
       android:layout_width="fill_parent"
       android:layout_height="200dp"/>
</EventLinearLayout>

整体上看,事件传递顺序为ViewGroup::onInterceptTouchEvent() –> ViewGroup或View的onTouchEvent() –> Activity::onTouchEvent()

需要注意的点:
* onInterceptTouchEvent()返回true,那么这个方法只会拦截动作ACTION_DOWN。
* onInterceptTouchEvent()负责事件分发(事件传递方向),
onTouchEvent()负责事件处理(消费)。
* onInterceptTouchEvent()默认返回false,onTouchEvent默认返回false
* onInterceptTouchEvent()返回false且目标控件View::onTouchEvent()返回true
那么事件的每一个动作会都会首先传递到onInterceptTouchEvent()中

具体分析

ViewGroup的onInterceptTouchEvent()
返回false:

默认实现方式。事件(按下、移动、抬起等)将直接传递给目标view(用户触摸的view)。
在ViewGroup触发时,调用ViewGroup::onTouchEvent(),在View触发时,调用View::onTouchEvent()。

ViewGroup的onInterceptTouchEvent()返回false

这里ViewGroup和view的onTouchEvent均返回false,表示都没处理完,则向上传递事件给Activity,由Activity处理

返回true:

表示ViewGroup将拦截子View的Touch事件。事件会直接传递到ViewGroup::onTouchEvent()处理。
也就是说,事件后面的移动、抬起动作不会经过ViewGroup的onInterceptTouchEvent(),而是直接传到ViewGroup的onTouchEvent()。

ViewGroup的onInterceptTouchEvent()返回true

ViewGroup/View的onTouchEvent()
返回false:
表示View或ViewGroup不处理事件,系统将把事件传递给其父级处理。

如果View返回false,那么将由其父容器ViewGroup处理。如果ViewGroup不处理,最终将交给Activity来处理。

View的onTouchEvent()返回false

如果ViewGroup返回false,将交给最后一级Activity来处理。

ViewGroup的onTouchEvent()返回false

返回true:
表示事件按下动作被处理,意味着事件的移动、抬起等后续动作将会传到此方法。

如果是View处理,那么ViewGroup的onTouchEvent()将不会获得该事件。

View的onTouchEvent()返回true

注意:针对view来说只要onInterceptTouchEvent()返回false,而且目标控件View::onTouchEvent()返回true,
那么事件的每一个动作(按下、移动、抬起等)会都会首先传递到onInterceptTouchEvent()中。这是一个特殊的地方。

如果是ViewGroup处理,那么Activity不会获得事件。

ViewGroup的onTouchEvent()返回true

Activity的onTouchEvent()
这个方法是事件最后被处理的地方。如果不处理,系统将抛弃这个事件。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值