前言
面试经典问题Android中的事件分发机制。有很多人分析过这个问题。今天咱们从面试角度来剖析面试官想要听到的是什么,以及回答到什么程度可以及格,回答到什么程度达到优秀。
自闭模式
我不清楚这个机制,第一次听说。
点评
如果是真不会的话,也不要胡乱说,这样回答,面试官估计会很欣赏你的诚实。如果你反问一下,您能给我讲一下这个机制吗,也算是面试过程中的收获 。
及格模式
我了解Android中的事件分发机制,事件传递过程是Activity把事件传递给ViewGroup,然后ViewGroup把事件传递给View,如果下级不处理这个事件在返回给上级处理。
点评
回答到这里,说明你基本了解Android中事件分发的机制,但仅限于浅尝辄止。
优秀模式
Android事件分发机制
三个重要角色
1、Activity:接收Down点击事件,传递给Phonewindow和DecorView
2、ViewGroup:拦截事件,或者继续传递给子View
3、View:决定消费这个事件或者不消费从而返回给上一级
三个核心事件
1、dispatchTouchEvent():分发点击事件,return false 事件停止往子View传递和分发
2、onTouchEvent() : return false 是不消费事件,并让事件往父控件的方向从下往上流动。return true 是消费事件。
3、onInterceptTouchEvent():拦截点击事件, return false 不拦截,允许事件向子View传递, return true拦截事件,不在向子View传递事件。
点评
回答到这里,面试官基本听到了他想要的,也说明了你对这个问题进行了比较深入的研究。
那么是不是这样就结束了呢?当然不是,因为目前为止也仅仅纸上谈兵而已
精彩模式
通过刚才优秀模式的一番回答之后,追加使用场景就完美了。
通常可以利用事件分发机制解决滑动冲突问题
比如ScrollView嵌套ListView都是竖向滑动的时候,滑动方向相同。就需要使用到拦截事件的方法onInterceptTouchEvent(),来决定listview要不要滑动。
需要重写ScrollView的onInterceptTouchEvent方法。代码如下
这里我们看到Down事件里我们并没有返回false而是返回super.onInterceptTouchEvent(event),这是因为ScrollView在Down方法时需要初始化一些参数如果我们直接返回false,会导致滑动出现问题。并且前面说过ViewGroup的onInterceptTouchEvent方法是默认返回false的,所以我们这里要返回super方法才可以。
当然还有很多其他案例不赘述。
点评
理论指导实践,经过这样一番庖丁解牛,面试官会很满意了。
总结
这样由浅入深,并且附带亮点的回答,会让面试官在短暂的时间里面,了解到你不仅深入研究系统知识,而且学以致用,能解决实际问题。那么距离Offer也就更近了。