ViewGroup 的事件分发机制
我们通过查看 ViewGroup
的 dispatchTouchEvent()
可以发现。
注意其中红框里面的代码,看注释也能知道,定义了一个 boolean 值变量 intercept
来表示是否要拦截事件。
其中采用到了 onInterceptTouchEvent(ev)
对 intercept
进行赋值。大多数情况下,onInterceptTouchEvent()
返回值为 false,但我们完全可以通过重写 onInterceptTouchEvent(ev)
来改变它的返回值,不妨继续往下看,我们后面对这个 intercept
做了什么处理。
暂时忽略 判断的 canceled
,该值同样大多数时候都返回 false,所以当我们没有重写 onInterceptTouchEvent()
并使它的返回值为 true 时,一般情况下都是可以进入到该方法的。
继续阅读源码可以发现,里面做了一个 For 循环,通过倒序遍历 ViewGroup
下面的所有子 View,然后一个一个判断点击位置是否是该子 View 的布局区域,当然还有一些其他的,由于篇幅原因,这里就不细讲了。
View 的事件分发机制
ViewGroup
说到底还是一个 View,所以我们不得不继续看看 View 的 dispatchTouchEvent()
。
截图中的代码是有删减的,我们重点看看没有删减的代码。
红框中的三个条件,第一个我就不用说了。
-
(mViewFlags & ENABLED_MASK) == ENABLED
该条件是判断当前点击的控件是否为 enable,但由于基本 View 都是 enable 的,所以这个条件基本都返回 true。 -
mOnTouchListener.onTouch(this, event)
即我们调用setOnTouchListener()
时必须覆盖的方法onTouch()
的返回值。
从上述的分析,终于知道「onTouch()
方法优先级高于 onTouchEvent(event)
方法」是怎么来的了吧。
再来看看 onTouchEvent()
从上面的代码可以明显地看到,只要 View 的 CLICKABLE 和 LONG_CLICKABLE 有一个为 true,那么 onTouchEvent()
就会返回 true 消耗这个事件。CLICKABLE 和 LONG_CLICKABLE 代表 View 可以被点击和长按点击,我们通常都会采用 setOnClickListener()
和 setOnLongClickListener()
做设置。接着在 ACTION_UP 事件中会调用 performClick()
方法,我们看看都做了什么。
从截图中可以看到,如果 mOnClickListener
不为空,那么它的 onClick()
方法就会调用。
总结
本来写到这就结束了,但回顾一遍还是打算给大家稍微总结一下。
需要总结的小点:
1、Android 事件分发总是遵循 Activity => ViewGroup => View 的传递顺序;
2、onTouch()
执行总优先于onClick()
原本想用文字总结的,结果发现简书上还有这样一篇神文:Android事件分发机制详解:史上最全面、最易懂,所以直接引用一下其中的图片。
- Activity 的事件分发示意图
- ViewGroup 事件分发示意图
- View 的事件分发示意图
- 事件分发工作流程总结
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
总结
算法知识点繁多,企业考察的题目千变万化,面对越来越近的“金九银十”,我给大家准备好了一套比较完善的学习方法,希望能帮助大家在有限的时间里尽可能系统快速的恶补算法,通过高效的学习来提高大家面试中算法模块的通过率。
这一套学习资料既有文字档也有视频,里面不仅仅有关键知识点的整理,还有案例的算法相关部分的讲解,可以帮助大家更好更全面的进行学习,二者搭配起来学习效果会更好。
部分资料展示:
有了这套学习资料,坚持刷题一周,你就会发现自己的算法知识体系有明显的完善,离大厂Offer的距离更加近。
4092)]
[外链图片转存中…(img-14kNRkEC-1711637994093)]
有了这套学习资料,坚持刷题一周,你就会发现自己的算法知识体系有明显的完善,离大厂Offer的距离更加近。