安卓framework,最全的BAT大厂面试题整理,看看这篇文章吧!

第一次观看我文章的朋友,可以关注、点赞、转发一下,每天分享各种干货技术和程序猿趣事

前言

职场的金三银四跳槽季又来了,不同的是今年比往年「冷」一些,形式更加严峻一些,大家多多少少可能都听到或看到一些信息,就是好多公司在优化裁员,作为求职者来说,面试是一道坎,很多人会恐惧面试,即使是工作很多年的老鸟,可能仍存在面试的焦虑。

这些题目是我之前的面试去腾讯、虎牙、美团、阿里、快手等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

由于涉及到的面试题较多导致篇幅较长,我根据这些面试题所涉及到的常问范围总结了并做出了一份学习进阶路线图​​​​​​​及面试题答案免费分享给大家,文末有免费领取方式!

面试官:说说view中的事件分发?

android中事件分发机制是android中常见的问题,一般大家都知道view的分发事件是从view的Viewgroup(Parent)#dispatchTouchEventViewgroup(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_downaction_moveaction_up只会执行到viewgroup的dispatchTouchEvent,不分发的条件是dispatchTouchEvent直接返回true或false,true和false的区别是true会执行action_downaction_moveaction_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;
}

紧接着在在后面又会调用了:

这句只有在view/viewgroup的dispatchTouchEvent返回false的时候,才会走这里,所以后面的action_moveaction_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相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BATJ 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。

节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一键领取:【Android超硬核面试资料】

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

16waUak-1619265639067)]

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

[外链图片转存中…(img-2sxbMfQY-1619265639069)]

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图,大家可以点击这里自行获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值