Android手势传递一般过程及其规则研究

1.手势传递一般过程

Android 手势传递通过dispatchTouchEvent 、onInterceptTouchEvent(ViewGroup特有)、onTouchEvent
View手势过程传递为  dispatchTouchEvent   ----》》onInterceptTouchEvent ----》》onTouchEvent
多嵌套手势传递过程为如图所示   ParentView 包含 SonView 包含 ChildView

手势传递过程由最外层 父view 往最内层 子View 传递,view内部执行拦截检验 dispatch 和 intercept,返回false(不拦截处理)的时候,view继续将手势往下传递,直到到达最内层子view后,由子view执行onTouch事件,如果子view不做处理返回false,则向上级父类传递,执行父类onTouch事件。

2.手势 拦截处理

2.1 Android 基础手势为 ACTION_DOWN , ACTION_MOVE,  ACTION_UP 
ANCTION_MOVE,ACTION_UP以ACTION_DOWN是否做处理而出现,即拦截ACTION_DOWN后,才依次出现ACTION_MOVE,ACTION_UP.

2.2 onInterceptTouchEvent 拦截处理对象为View, dispatchTouchEvent和onTouchEvent 则面对传递过程。
onInterceptTouchEvent ACTION_DOWN 返回true,手势不会向ChildView传递,而是执行son的onTouch事件,然后继续向上级传递。




dispatchTouchEvent  ACTION_DOWN 返回true,因为dispatch是对过程进行拦截,并且告诉系统,此处需要进行手势处理,不需要再进行手势传递,所以,系统直接进行下个手势的传递。同理 onTouchEvent 也是如此





前面说过,手势的传递开始于ACTION_DOWN,当系统接收到手势拦截的反馈之后,才会将ACTIOIN_MOVE,ACTION_UP传递出来,并且确认拦截的当前View中的 onInterceptTouchEvent 不再执行。


所以,个人觉得,做手势拦截和解决手势冲突问题,要明确手势传递的过程还有其本身处理规则,我认为做拦截,先是在Intercept处确定拦截规则,在把具体实现放在touch中。

Android中,自定义View通常涉及处理用户交互事件,如触摸事件。`ACTION_DOWN`、`ACTION_MOVE`和`ACTION_UP`是一些常见的MotionEvent类型的常量,它们代表了手指按下、移动和抬起的不同阶段。 - ACTION_DOWN:当用户的触控设备按下屏幕时触发,这是手指接触屏幕的开始,标志着一个触摸操作的开始。 - ACTION_MOVE:当用户的手指在屏幕上滑动时触发,这个事件会不断发送,直到手指离开屏幕,记录了手指移动的过程。 - ACTION_UP:当用户的触控设备从屏幕上抬起时触发,表示手指已经离开了屏幕,触摸操作结束。 在自定义View中,你可以重写`onTouchEvent(MotionEvent event)`方法来处理这些事件。例如: ```java @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 手指按下处理 handleDown(event); break; case MotionEvent.ACTION_MOVE: // 手指移动处理 handleMove(event); break; case MotionEvent.ACTION_UP: // 手指抬起处理 handleUp(event); break; default: return super.onTouchEvent(event); // 默认处理其他未列出的事件 } return true; // 返回true继续接收后续事件,false则停止接收 } private void handleDown(MotionEvent event) { // 下方代码在此处编写,处理按下动作 } private void handleMove(MotionEvent event) { // 下方代码在此处编写,处理移动动作 } private void handleUp(MotionEvent event) { // 下方代码在此处编写,处理抬起动作 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值