普京当街被问月薪发生什么事了?普京当街被问月薪令人震惊( 二 )


小 A:好 , 最后我再问你一个具体的问题 , 一个 LinearLayout 内部有两个 Button , 当我第一个手指按在第一个 Button 上 , 第二个手指按在第二个 Button 上 , 这两个 Button哪个会收到 ACTION_DOWN?分别抬起每个手指 , 哪个 Button 的 Click 会被触发?
小 B:当然是第一个收到 ACTION_DOWN , 那么应该也是第一个能触发 click 。
小 A:不错不错 , 你先去做个实验 , 再决定要不要我去买可乐 。
对话结束 。
到这里大家觉得小 B 回答的怎么样?
先别往下看 , 自己想想自己的回答应该是什么 , 如果错了 , 麻烦给我买瓶可乐 。
小 B 回去测试 。
大吼一声:为了可乐!
快速写完 Demo , 分为自定义了一个 MyLinearLayout , MyButton , 复写dispatchTouchEvent , 打上 Event 日志 , 再加上 onclick 事件日志 。
按照之前的描述实验:
一个 LinearLayout 内部有两个 Button , 当我第一个手指按在第一个 Button 上 , 第二个手指按在第二个 Button 上 , 这两个 Button哪个会收到 ACTION_DOWN?分别抬起每个手指 , 哪个 Button 的 Click 会被触发?
看到 Log , 心凉了 。
第一个手指按下第一个 Button 上 , 第一个 Button 收到 ACTION_DOWN 。
第二个手指按在第二个 Button 上 , 第二个 Button 竟然也收到了 ACTION_DOWN 。
分别抬起时 , 两个 Button 的 Click 依次触发 。
注意:大家测试的时候 , Button 可以搞大一些 , 两个 Button 距离远一些 , 防止误触 。
小 B带着两瓶可乐来到小 A 面前 , 大哥赶紧给我讲讲 。
小 A:
好 , 在非常早期 , 很多博客的事件分发代码都是基于 2.x 系列的 , 那会代码是这样的:
普京当街被问月薪发生什么事了?普京当街被问月薪令人震惊
文章图片

mMotionTarget 就是一个 View 。
而在后续的代码 , "targetView"已经不再是一个独立的 View 了 , 而是一个类似于链表 。
// First touch target in the linked list of touch targets.
privateTouchTarget mFirstTouchTarget;
privatestaticfinalclassTouchTarget{
// The touched child view.
publicView child;
// The next target in the target list.
publicTouchTarget next;
}
你顺着这个差异去看源码就明白了 。
小 B:这波不亏 , 虽然亏了两瓶可乐 , 但是学到了 。
好了 , AB 角色结束 , 对话内容基本上是同事间日常对话 , 当然我故意润色了一些 。
这个问题其实我也放在 wanandroid 每日一问上 , 小缘这个小伙已经在 wanandroid 上详细分析了源码 , 大家对着源码和小缘的解析一起看吧 。
源码太长了 , 我就不再 copy 过来了 , 大家自己访问去看吧 。
普京当街被问月薪发生什么事了?普京当街被问月薪令人震惊
文章图片

因为无法访问外链 , 给你们来个二维码:
PC 端阅读体验更好 。
注意:如果遇到网站短时间无法访问 , 那么就等会 , 顶不住太多并发 。
再次友情提示:
在面试的时候 , 不要故意显摆你知道一个事件分发逻辑可能有多个 ACTION_DOWN , 一定要分情况说清楚 , 因为面试官很可能没看过这篇文章 , 把你挂了别怪我...
加餐结束 , 各位用餐愉快 , 弥补下周内推广给大家造成的不好的心情 。
如果你和小B错的一样 , 可乐我就不要了 , 点个 在看可以吧 。


推荐阅读