营销网站做的好的公司,建筑工地老板直招工人,做网站价格ihanshi,微信管理软件哪个最好开头
25岁那年#xff0c;我从京东离职#xff0c;入职百度。
在百度认识了当时的架构师久哥#xff08;T9级别#xff09;#xff0c;因为他的一番话#xff0c;彻底改变了我的职业生涯#xff0c;短短三年的时间#xff0c;我从一枚普通程序员成长为别人眼中的技术…开头
25岁那年我从京东离职入职百度。
在百度认识了当时的架构师久哥T9级别因为他的一番话彻底改变了我的职业生涯短短三年的时间我从一枚普通程序员成长为别人眼中的技术大咖。
当时因为业务需要也承蒙久哥照顾他跟我说过这样一段话 他问“如果用5年的时间学习数据库你能不能成为这个领域的专家” 我说“应该可以吧” 他说“你现在255年后也才3030岁就能成为某个领域的专家为什么不去做呢你看看周围有多少30岁的人还一事无成而那个时候的你已经是数据库专家了。” 当时的我刚刚进入别人梦寐以求的BAT处于各种浮躁的时期虽然每天也在学习看起来也很努力但是效果极其有限今天想学大数据明天想学云计算后天又要研究机器学习心境变化无常不知道自己未来究竟该是什么样。
面试官:说说view中的事件分发?
android中事件分发机制是android中常见的问题一般大家都知道view的分发事件是从view的Viewgroup(Parent)#dispatchTouchEvent到Viewgroup(Parent)#onInterceptTouchEvent再到View#dispatchTouchEvent然后到view的onTouchEvent最后又回到了Viewgroup(Parent)#onTouchEvent。如果大家记不住方法名可以直接说先是parent的分发到拦截再到view的分发再到view的消费最后到parent的消费 viewgroup分发
这样回答肯定是很浅显的因为没有说出是否拦截、是否分发、是否消费的各种条件没有涉及到各种action的分发情况上面说的默认分发只是针对action_down的因为view/viewgroup各种super调用都是不进行分发、拦截、消费的所以在没找到处理touch事件的view时候是一直往上层view传递的一直传到activity里面下面我们再来整理一下: 如果viewgroup不进行分发那么action_down、action_move和action_up只会执行到viewgroup的dispatchTouchEvent不分发的条件是dispatchTouchEvent直接返回true或falsetrue和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方法此时自己就相当于一个viewtouch事件走自己的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;
}紧接着在在后面又会调用了: 这句只有在view/viewgroup的dispatchTouchEvent返回false的时候才会走这里所以后面的action_move和action_up都会走这里而此时传入的childnull从上面代码可以看到直接调用了父类的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的时候mFirstTouchTargetnull那么此时是直接调用dispatchTransformedTouchEvent传入的childnull因此将事件交给了super.dispatchTouchEvent此时把它当成一个view来处理了。
面试官:有个viewgroup里面有个view如果view在dispatchTouchView中不分发事件并且只在action_move中拦截touch事件向下分发说说viewgroup到view的各个action是如何分发的
新的开始
改变人生没有什么捷径可言这条路需要自己亲自去走一走只有深入思考不断反思总结保持学习的热情一步一步构建自己完整的知识体系才是最终的制胜之道也是程序员应该承担的使命。
如果有需要进阶Android高级工程师系统学习资料的我可以免费分享给大家需要完整版的朋友【点这里可以看到全部内容】。
《系列学习视频》
《系列学习文档》 《我的大厂面试之旅》 》**
[外链图片转存中…(img-t7ok84Nc-1621871216486)]
《我的大厂面试之旅》
[外链图片转存中…(img-c2wn0NDd-1621871216490)]