注意其中红框里面的代码,看注释也能知道,定义了一个 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 的事件分发示意图
- 事件分发工作流程总结
最后
面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责!
金九银十面试季,赶快去为自己的面试做足准备吧!
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~
快来获取学习资料提升自己去挑战一下BAT面试难关吧!
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
![](https://i-blog.csdnimg.cn/blog_migrate/60725903ac91f716d57cfd3b68719b0e.jpeg)
结尾
如何才能让我们在面试中对答如流呢?
答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?为此我整理了一份Android学习资料路线:
这里是一份BAT大厂面试资料专题包:
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
的面试以及工作经验完善自己的之后的面试计划及职业规划。