前言
作為一個3-5年的Android工程師,我們經常會遇到這些瓶頸:
1.技術視野窄
長期在小型軟體公司,外包公司工作,技術視野被限制的太厲害
2.薪資提升難
國中級Android崗位薪資上升空間有限,基本上你想拿15k以上,不會點源碼層的東西是根本拿不到的
3.學習資源少
入門之後想要提升很難,靠自己接觸的簡單業務項目,去反複操練那些cv技術。部落格和書本上的技術大多比較抽象并且零散,可以借鑒和指導,但是沒辦法複制成自己的
有了這份阿裡P7大神整理的Android開發核心知識筆記,所有的瓶頸通通都能快速打破。
整個筆記都是根據進階工程師知識體系來整理的,相對于網上很多碎片化的内容,這份知識筆記是完全按照Android開發知識體系編排,更加系統,由淺入深,由簡到繁,學習起來也不會很吃力。
面試官:說說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
隻會執行到viewgroup的
action_up
,不分發的條件是
dispatchTouchEvent
直接傳回true或false,true和false的差別是true會執行
dispatchTouchEvent
、
action_down
和
action_move
,而如果直接傳回false隻會執行到action_down。并且後續的viewgroup的
action_up
後續方法都不會被執行到。
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_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是如何分發的?
最後
今天關于面試的分享就到這裡,還是那句話,有些東西你不僅要懂,而且要能夠很好地表達出來,能夠讓面試官認可你的了解,例如Handler機制,這個是面試必問之題。有些晦澀的點,或許它隻活在面試當中,實際工作當中你壓根不會用到它,但是你要知道它是什麼東西。
最後在這裡小編分享一份自己收錄整理上述技術體系圖相關的幾十套騰訊、頭條、阿裡、美團等公司2021年的面試題,把技術點整理成了視訊和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由于篇幅有限,這裡以圖檔的形式給大家展示一部分。
還有 進階架構技術進階腦圖、Android開發面試專題資料,進階進階架構資料 幫助大家學習提升進階,也節省大家在網上搜尋資料的時間來學習,也可以分享給身邊好友一起學習。
Android學習PDF+架構視訊+面試文檔+源碼筆記領取
【Android核心進階技術PDF文檔,BAT大廠面試真題解析】
【算法合集】
【延伸Android必備知識點】
【Android部分進階架構視訊學習資源】
3803712977)]
【延伸Android必備知識點】
[外鍊圖檔轉存中…(img-rXMzgN6K-1613803712980)]
【Android部分進階架構視訊學習資源】
Android精講視訊領取學習後更加是如虎添翼!進軍BATJ大廠等(備戰)!現在都說網際網路寒冬,其實無非就是你上錯了車,且穿的少(技能),要是你上對車,自身技術能力夠強,公司換掉的代價大,怎麼可能會被裁掉,都是淘汰末端的業務Curd而已!現如今市場上初級程式員泛濫,這套教程針對Android開發工程師1-6年的人員、正處于瓶頸期,想要年後突破自己漲薪的,進階Android中進階、架構師對你更是如魚得水,趕快領取吧!