事件分发以及冲突处理

事件
ACTION_DOWN 手指初次接触到屏幕触发
ACTION_MOVE 手指滑动触发,多次触发
ACTION_UP 手指离开屏幕后触发
ACTION_CANCLE 事件被上层拦截时触发

事件流程的主要处理:VIewGroup的分发,View的处理

事件分发的流程
在这里插入图片描述

//1.Activity#dispatchTouchEvent()
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
//空方法和屏保有关
onUserInteraction();
}
//下一步Window唯一实现类就是PhoneWindow
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}

//2.PhoneWindow.superDispatchTouchEvent()
public boolean superDispatchTouchEvent(MotionEvent event) {
//下一步 mDecor就是DecorView
return mDecor.superDispatchTouchEvent(event);
}

//3.DecorView.superDispatchTouchEvent()
public boolean superDispatchTouchEvent(MotionEvent event) {
//DecorView继承自FrameLayout,FrameLayout继承自ViewGroup,FrameLayout没有重写dispatchTouchEvent(),所以会执行ViewGroup中的dispatchTouchEvent()
return super.dispatchTouchEvent(event);
}

//4.ViewGroup的dispatchTouchEvent()
//5.ViewGroup可能会调用它子view的dispatchTouchEvent()
//6.View会调用自身的onTouchEvent()决定怎么执行

什么叫事件冲突?
事件只有一个,多个人想要处理 ,处理的对象不是我们想给的对象,发生了冲突

最常见的冲突,button的 onTouch和onClick的冲突
在这里插入图片描述
先说结论:
onTouch都会回调
若onTouch返回值为true,则onClick不会回调,
若onTouch返回值为false,则onClick会回调

通过源码分析:
View的dispatchEvent中关键代码如下
在这里插入图片描述
如上图 li.mOnTouchListener.onTouch(this, event) 就是 与onTouch返回值相关
若返回值为true,则result为true,则下一句 onTouchEvent()则不会执行

进onTouchEvent()源码中看,在MotionEvent.ACTION_UP中,
发现
if (!post(mPerformClick)) {
performClickInternal();
}

进performClickInternal()函数发现调用了performClick(),
performClick()函数中关键代码中发现会执行onClick事件
![

](https://img-blog.csdnimg.cn/20211102080030190.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2phdW5jZXh1,size_16,color_FFFFFF,t_70)

所以onTouch的返回值决定着onClick的执行
onTouch返回true时,不会执行onTouchEvent()方法,所以view的onClick不会执行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值