MicroKibaco / CrazyDailyQuestion

每日一问: 水滴石穿,聚沙成塔,坚持数月, 必有收获~
35 stars 1 forks source link

2019-10-28: 有一个ViewGroup, 然后手指头接触Button,手指头滑开了,滑开又松手的过程,整个事件发生了什么?经历了什么? ViewGroup 拖拽不让其拖出屏幕,说说你的实现思路和注意事项 #54

Open MicroKibaco opened 5 years ago

MicroKibaco commented 5 years ago

阿里巴巴面试原题

MicroKibaco commented 5 years ago

小木箱不完全解答

daishengda2018 commented 5 years ago

一开始 ViewGroup 会接受到整个事件序列的第一个事件:ACTION_DOWN,ViewGroup#dispatchTouchEvent 收到 ACTION_DOWN 后开始询问 ViewGroup#onInterceptTouchEvent 是否需要拦截,默认情况下 ViewGroup#onInterceptTouchEvent 返回 false 不拦截,开始向下传递 ACTION_DOWN 事件,Buttton#dispatchTouchEvent 收到 ACTION_DOWN 询问 onTouchEvent 是否处理,Button 默认处理,此后的所有事件序列都直接跨过 ViewGroup#onInterceptTouchEvent 的判断直接传递给 Button,但 ViewGroup#dispatchTouchEvent 会收到所有事件。

在 move 过程中 Button#onTouchEvent 发现当前坐标已经移出 Button 区域,会 remove 掉 onClick 的回调(源码位于 View#onTouchEvent 尾部 case MotionEvent.ACTION_MOVE 中),虽然 Button 收到并处理了 ACTION_DOWN -> ACTION_MOVE -> ACTION_UP 整个事件过程,但是并不会触发 onClick 回调。

这个事件过程并没有网上所说的 ACTION_CANCEL,ACTION_CANCEL 出现的条件是:ViewGroup 在传递过程中拦截了本应交由 Button 处理的事件,此时 Button 会收到 ACTION_CANCEL 表示事件中断。

firehell commented 5 years ago

杭州-张钊

事件自下往上,先进viewgroup的onintercept方法,不拦截然后给子view,到了button,button消费这个事件,手指划开了,调用button的oncancel,事件就取消了,松手再ontouchup,整个时间流程。

ViewGroup 拖拽不让其拖出屏幕,说说你的实现思路和注意事项

这个是不是滑动撞边的动画效果类似?思路:通过ondrophelper或者另一个方法实现拖拽效果,然后判断和屏幕的边距

daishengda2018 commented 5 years ago

杭州-张钊

事件自下往上,先进viewgroup的onintercept方法,不拦截然后给子view,到了button,button消费这个事件,手指划开了,调用button的oncancel,事件就取消了,松手再ontouchup,整个时间流程。

ViewGroup 拖拽不让其拖出屏幕,说说你的实现思路和注意事项

这个是不是滑动撞边的动画效果类似?思路:通过ondrophelper或者另一个方法实现拖拽效果,然后判断和屏幕的边距

你的意思是说 Button 会接收到 ACTION_CANCEL 事件吗?