妈妈再也不用担心我的面试,顺利收获Offer

# 最后,面试前该准备哪些资源复习? 其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。 **这里再分享一下我面试期间的复习路线:**(以下体系的复习资料是我从各路大佬收集整理好的) **《Android开发七大模块核心知识笔记》** ![面试字节两轮后被完虐,字节面试官给你的技术面试指南,请查收](http://www.icode9.com/i/li/?n=2&i=images/20210705/1625499024846317.jpg) ![面试字节两轮后被完虐,字节面试官给你的技术面试指南,请查收](http://www.icode9.com/i/li/?n=2&i=images/20210705/1625499024262527.jpg) **《960全网最全Android开发笔记》** ![面试字节两轮后被完虐,字节面试官给你的技术面试指南,请查收](http://www.icode9.com/i/li/?n=2&i=images/20210705/1625499025750685.jpg) **《379页Android开发面试宝典》** 历时半年,我们整理了这份市面上最全面的安卓面试题解析大全 包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。 **《507页Android开发相关源码解析》** 只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。 真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。 **资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图,[戳这里免费领取](https://docs.qq.com/doc/DSkNLaERkbnFoS0ZF)**## 面试官:说说view中的事件分发? android中事件分发机制是android中常见的问题,一般大家都知道view的分发事件是从view的`Viewgroup(Parent)#dispatchTouchEvent`到`Viewgroup(Parent)#onInterceptTouchEvent`再到`View#dispatchTouchEvent`,然后到view的`onTouchEvent`,最后又回到了`Viewgroup(Parent)#onTouchEvent`。如果大家记不住方法名,可以直接说**先是parent的分发到拦截再到view的分发,再到view的消费,最后到parent的消费** ![](http://www.icode9.com/i/li/?n=2&i=images/20210705/1625499025377423.jpg) ### viewgroup分发 这样回答肯定是很浅显的,因为没有说出是否拦截、是否分发、是否消费的各种条件,没有涉及到各种action的分发情况,上面说的默认分发只是针对action_down的,因为`view/viewgroup`各种super调用都是不进行分发、拦截、消费的,所以在没找到处理touch事件的view时候,是一直往上层view传递的,一直传到activity里面,下面我们再来整理一下: > 如果viewgroup不进行分发,那么`action_down`、`action_move`和`action_up`只会执行到viewgroup的`dispatchTouchEvent`,不分发的条件是`dispatchTouchEvent`直接返回true或false,true和false的区别是true会执行`action_down`、`action_move`和`action_up`,而如果直接返回false只会执行到action_down。并且后续的viewgroup的`onInterceptTouchEvent`后续方法都不会被执行到。 关于为什么view/Viewgroup的`dispatchTouchEvent`返回true的时候三个action都能执行到,而返回false的话,只能执行到action_down,这个需要到view/Viewgroup的父类中`dispatchTouchEvent`找答案,该方法中会在action_down的时候调用`dispatchTransformedTouchEvent`方法,而该方法是通过子view的dispatchTouchEvent方法的返回值来决定父类的`dispatchTransformedTouchEvent`方法的返回值,而`dispatchTransformedTouchEvent`的返回值会决定`mFirstTouchTarget`是否为空,所以在action_down的过程中实际中通过子view的`dispatchTouchEvent`方法返回值来确定`mFirstTouchTarget`是否为空。这里贴出viewgroup中`dispatchTransformedTouchEvent`方法的删减代码: ``` private boolean dispatchTransformedTouchEvent(MotionEvent event, boolean cancel, View child, int desiredPointerIdBits) { ------------------ //省略了cancel部分的代码 ------------------------ //如果child为空,直接调用自己的dispatchTouchEvent方法,此时自己就相当于一个view,touch事件走自己的 if (child == null) { handled = super.dispatchTouchEvent(transformedEvent); } else { final float offsetX = mScrollX - child.mLeft; final float offsetY = mScrollY - child.mTop; transformedEvent.offsetLocation(offsetX, offsetY); if (! child.hasIdentityMatrix()) { transformedEvent.transform(child.getInverseMatrix()); } //返回值直接通过孩子来获取返回值 handled = child.dispatchTouchEvent(transformedEvent); } transformedEvent.recycle(); return handled; } ``` 所以如果view/viewgroup的`dispatchTouchEvent`方法返回false,表示在action_down的时候,父类的`dispatchTransformedTouchEvent`方法返回false;如果返回true会调用`addTouchTarget`方法,给`mFirstTouchTarget`设置值: ``` private TouchTarget addTouchTarget(@NonNull View child, int pointerIdBits) { final TouchTarget target = TouchTarget.obtain(child, pointerIdBits); target.next = mFirstTouchTarget; mFirstTouchTarget = target; return target; } ``` 紧接着在在后面又会调用了: ![](http://www.icode9.com/i/li/?n=2&i=images/20210705/1625499026818649.jpg) 这句只有在view/viewgroup的`dispatchTouchEvent`返回false的时候,才会走这里,所以后面的`action_move`和`action_up`都会走这里,而此时传入的child=null,从上面代码可以看到,直接调用了父类的`dispatchTouchEvent`方法。所以从这里不难看出在view/viewgroup的`dispatchTouchEvent`返回false的时候直接调用了父类的`dispatchTouchEvent`方法,因此只有action_down事件。 ## 面试官:如果我只想有view的拖拽事件,而不想要view的点击事件,让你重写这个view的拖拽怎么设计 其实这道题考察大家对view的dispatchTouchEvent和view的onTouchEvent事件的处理流程,上面已经分析了想要view能执行到view的touch事件,那么必须要求view的`dispatchTouchEvent`返回true,而`dispatchTouchEvent`返回true要么是`dispatchTouchEvent`直接返回true或者view的`onTouchEvent`返回true。如果从效率上看,直接将`dispatchTouchEvent`返回true就ok,而不需要再去关心`onTouchEvent`方法。 ### viewgroup拦截 **关于拦截无非就是拦截或不拦截,而拦截的条件是返回true,不拦截是返回false或返回super.onInterceptTouchEvent,默认的super是返回false的,因此可以用super表示不拦截** viewgroup拦截实际是通过在`dispatchTouchEvent`方法中,设置intercepted变量,如果在拦截方法里面返回true,那么intercepted为true,如果为true则在action_down的时候mFirstTouchTarget=null,那么此时是直接调用`dispatchTransformedTouchEvent`传入的child=null,因此将事件交给了`super.dispatchTouchEvent`,此时把它当成一个view来处理了。 ## 面试官:有个viewgroup,里面有个view,如果view在dispatchTouchView中不分发事件,并且只在action_move中拦截touch事件向下分发,说说viewgroup到view的各个action是如何分发的? ### 最后说一下我的学习路线 **其实很简单就下面这张图,含概了Android所有需要学的知识点,一共8大板块:** 1. **架构师筑基必备技能** 2. **Android框架体系架构(高级UI+FrameWork源码)** 3. **360°Androidapp全方位性能调优** 4. **设计思想解读开源框架** 5. **NDK模块开发** 6. **移动架构师专题项目实战环节** 7. **移动架构师不可不学习微信小程序** 8. **混合开发的flutter** ![](http://www.icode9.com/i/li/?n=2&i=images/20210705/1625499026613820.jpg) **Android学习的资料** 我呢,把上面八大板块的分支都系统的做了一份学习系统的资料和视频,大概就下面这些,我就不全部写出来了,不然太长了影响大家的阅读。需要的小伙伴可以私信我【进阶】我免费分享给大家,或者直接点击下面链接领取,谢谢大家这么久以来的支持。 [Android学习PDF+架构视频+面试文档+源码笔记](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md) 如果你有其他需要的话,也可以在GitHub上查看,下面的资料也会陆续上传到Github **330页PDF Android学习核心笔记(内含上面8大板块)** ![](http://www.icode9.com/i/li/?n=2&i=images/20210705/1625499026339517.jpg) **Android学习的系统对应视频** ![](http://www.icode9.com/i/li/?n=2&i=images/20210705/1625499026271748.jpg) # 总结 我希望通过我自己的学习方法来帮助大家去提升技术: * 1、多看书、看源码和做项目,平时多种总结 * 2、不能停留在一些基本api的使用上,应该往更深层次的方向去研究,比如activity、view的内部运行机制,比如Android内存优化,比如aidl,比如JNI等,并不仅仅停留在会用,而要通过阅读源码,理解其实现原理 * 3、同时对架构是有一定要求的,架构是抽象的,但是设计模式是具体的,所以一定要加强下设计模式的学习 * 4、android的方向也很多,高级UI,移动架构师,数据结构与算法和音视频FFMpeg解码,如果你对其中一项比较感兴趣,就大胆的进阶吧! **[进阶学习资料领取方式:GitHub](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)** > 希望大家多多点赞,转发,评论加关注,你们的支持就是我继续下去的动力!加油!
上一篇:Android View的事件分流源码,安卓app启动速度优化


下一篇:Android事件分发(一)