Android UI消息传递机制

本文解析了Android中ViewGroup的onInterceptTouchEvent与onTouchEvent方法的工作原理。详细介绍了如何通过这两个方法来控制触摸事件的分发流程,包括down事件的处理、事件的拦截与取消等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ViewGroup.onInterceptTouchEvent() onTouchEvent()


   原文摘自 :http://blogold.chinaunix.net/u3/113134/showart_2361151.html

ViewGroup 类的 onInterceptTouchEvent(MotionEvent ev) 分析

实现这个方法去拦截所有的屏幕手势动作事件。这允许你去查看这些事件当它们被分发到 ViewGroup 的下一级 view ,并且在任何一点能拥有当前的手势。

使用这个方法要注意 :它与 View.onTouchEvent(MotionEvent) 方法有相当复杂的交互,使用它必须要同样正确的实现这个方法。事件将会以下面的顺序到达:

1、  你将会在这里接收到 down 事件

2、  Down 事件或者被该 viewGroup 的一个 child 处理,或者将被给到 viewGroup 自己的 onTouchEvent() 方法来处理。这意味着你应该实现 onTouchEvent() 从而可以返回 true ,所以你将继续看到剩余的手势 ( 而不是寻找一个 parent view 去处理它 ) 。并且,通过从 onTouchEvent() 返回 true ,你将不会在 onInterceptTouchEvent() 中接收到以下任何事件并且所有触屏处理必须在 onTouchEvent() 中像正常情况一样发生。

3、  只要从 onInterceptTouchEvent() 返回 false ,接下来的每一个事件 ( 截止到 up 并包括最后一个 up) 将会首先被传递到这里,然后到目标 view onTouchEvent()

4、  如果从 onInterceptTouchEvent() 返回 true ,你将不会接收到任何以下事件:目标 view 将会接收到相同的事件但是带着 ACTION_CANCEL 的动作,所有以后的事件将会被传递到你的 onTouchEvent() 方法中并且不再在这里出现。

返回值:返回 true childernview 那里偷取动作事件并通过 onTouchEvent() 把它们分发到这个 ViewGroup 。当前的目标 view 将会接收到一个 ACTION_CANCEL 事件,并且将来也不会再有消息被传递到这里。

ViewGroup 类的 onTouchEvent(MotionEvent event) 分析

实现这个方法去处理触屏事件

如果事件被处理则返回 true ,没有被处理则返回 false

 

基本的规则是:

1.        down 事件首先会传递到 onInterceptTouchEvent() 方法

2.        如果该 ViewGroup onInterceptTouchEvent() 在接收到 down 事件处理完成之后 return false ,那么后续的 move, up 等事件将继续会先传递给该 ViewGroup ,之后才和 down 事件一样传递给最终的目标 view onTouchEvent() 处理。

3.        如果该 ViewGroup onInterceptTouchEvent() 在接收到 down 事件处理完成之后 return true ,那么后续的 move, up 等事件将不再传递给 onInterceptTouchEvent() ,而是和 down 事件一样传递给该 ViewGroup onTouchEvent() 处理,注意,目标 view 将接收不到任何事件。

4.        如果最终需要处理事件的 view onTouchEvent() 返回了 false ,那么该事件将被传递至其上一层次的 view onTouchEvent() 处理。

5.        如果最终需要处理事件的 view onTouchEvent() 返回了 true ,那么后续事件将可以继续传递给该 view onTouchEvent() 处理。

 

注:

Q: After many experiments with these two onTouchEvent and onTouch i come up that the onTouch works everywhere you want (I mean if it's activity or view) as long as you have declare the interface and put the Listener right! On the other hand onTouchEvent is working only inside a View! Does I assume right or not?Is this the real difference?

 

A:Yes you are correct - onTouch() is used by users of the View to get touch events while onTouchEvent() is used by derived classes of the View to get touch events.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值