总结
Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
【Android高级架构视频学习资源】
Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ViewGroup:
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onInterceptTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
View:
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
可以看到Activity中和View中都没有onInterceptTouchEvent,Android的事件分发就需要了解这三个方法,下面一一分析。
dispatchTouchEvent
他是事件分发处理函数,如果事件传递到了当前View,那么这个方法会被调用,返回结果表示是否消耗当前事件,false表示事件允许继续分发,返回true则表示该事件不再继续分发,有可能是当前View的onTouchEvent或者是子View的dispatchTouchEvent消费了。
不用我说,当发生点击操作时,会先从Activity的dispatchTouchEvent方法开始,然后依次传递给子视图,Activity的dispatchTouchEvent方法非常简单,首先判断是不是按下,如果是则调用一下onUserInteraction(虽然这个方法什么也没做),然后superDispatchTouchEvent方法经过层层调用,会传递到View或ViewGroup的dispatchTouchEvent中。
如果superDispatchTouchEvent返回true,则事件结束,表示有View已经消费了,false的话会传递给自身的onTouchEvent方法进行消费,表示所有的View的onTouchEvent的返回了false,没有人去处理这个事件,只能交给自己处理。
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
对上面加粗地方解释一下:如果还想深入了解,就需要看DecorView,但过程也不是很多。
在这里想象一下,在Activity中有个ViewGoup,他的dispatchTouchEvent方法true,当单击这个ViewGoup的时候,那么这里就直接结束了,如果返回false,那么会走Activity的onTouchEvent方法。
如果返回super.dispatchTouchEvent(ev),那么这里就麻烦了,会走onInterceptTouchEvent方法,如果onInterceptTouchEvent方法返回true,那么就代表他要拦截当前事件,他的onTouchEvent就会被调用。如果返回false,那么表示不拦截当前事件,会继续传递给它的子元素,子元素的dispatchTouchEvent方法就会被调用,然后反复这个过程直到事件被最终处理。
另外如果给这个View设置了OnTouchListener,那么OnTouchListener.onTouch方法就会被调用,这个事件如何处理就要看onTouch的返回值,如果返回true则onTouchEvent方法不会被调用。在onTouchEvent中,如果设置了OnClickListener,那么他的onClick就会被调用。
onInterceptTouchEvent
这个方法是在dispatchTouchEvent中调用的,用来判断是否拦截当前事件,如果当前View拦截了事件,那么在后续同一个事件序列中,这个方法不会被再次调用,默认返回false,返回true表示拦截。
所以,在上一张图
onTouchEvent
也在dispatchTouchEvent中调用,用来处理点击事件,如果返回true,则表示当前View消耗了此事件。
常见解决方案
ScrollView嵌套ScrollView
假设现在有两个ScrollView,每个ScrollView都需要上下滑动,如果不解决,那就是这个样子。
只需自定义一个ScrollView,在onInterceptTouchEvent下这样写,即可解决。requestDisallowInterceptTouchEvent用于请求父view不要拦截Touch事件,也就是让父View不要管onInterceptTouchEvent方法,直接执行向子View分发事件的逻辑。同样ListView嵌套ListView、ScrollView嵌套ListView也可以使用此办法,
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
getParent().requestDisallowInterceptTouchEvent(true);
return super.onInterceptTouchEvent(ev);
}
尾声
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
进阶学习视频
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!