编程语言
首页 > 编程语言> > Android程序员如何有效提升学习效率?终局之战

Android程序员如何有效提升学习效率?终局之战

作者:互联网

### 最后 **一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因: 他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。 刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。 **技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!** **点击:**[Android 学习,面试文档,视频收集大整理](https://docs.qq.com/doc/DSkNLaERkbnFoS0ZF) **来获取学习资料提升自己去挑战一下BAT面试难关吧** ![](http://www.icode9.com/i/li/?n=2&i=images/20210705/1625484703819802.jpg) 对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,**不成体系的学习效果低效漫长且无助**。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。 > **不论遇到什么困难,都不应该成为我们放弃的理由!** 如果有什么疑问的可以直接私我,我尽自己最大力量帮助你! 最后祝各位新人都能坚持下来,学有所成。## 面试官:说说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/1625484703433554.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/1625484703695609.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是如何分发的? ## **建议** 当我们出去找工作,或者准备找工作的时候,我们一定要想,我面试的目标是什么,我自己的技术栈有哪些,近期能掌握的有哪些,我的哪些短板 ,列出来,有计划的去完成,别看前两天掘金一些大佬在驳来驳去 ,他们的观点是他们的,不要因为他们的观点,膨胀了自己,影响自己的学习节奏。基础很大程度决定你自己技术层次的厚度,你再熟练框架也好,也会比你便宜的,性价比高的替代,很现实的问题但也要有危机意识,当我们年级大了,有哪些亮点,与比我们经历更旺盛的年轻小工程师,竞争。 * 无论你现在水平怎么样一定要 **持续学习** 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!!!!!!! * 准备想说怎么样写简历,想象算了,我觉得,**技术就是你最好的简历** * 我希望每一个努力生活的it工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。 * 有什么问题想交流,欢迎给我私信,欢迎评论 ### **【附】相关架构及资料** ![Android高级技术大纲](http://www.icode9.com/i/li/?n=2&i=images/20210705/1625484703688360.jpg) ![面试资料整理](http://www.icode9.com/i/li/?n=2&i=images/20210705/1625484703906670.jpg) ### **资料领取** ###### **[点击这里免费获取](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高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术**

标签:viewgroup,dispatchTouchEvent,程序员,child,action,Android,true,终局,view
来源: https://blog.51cto.com/u_15289532/2984581