直接上干貨!技術水平真的很重要!復習指南

開頭

25歲那年,我從京東離職,入職百度。

在百度認識了當時的架構師久哥(T9級別),因為他的一番話,徹底改變了我的職業生涯,短短三年的時間,我從一枚普通程序員成長為別人眼中的技術大咖。

當時因為業務需要,也承蒙久哥照顧,他跟我說過這樣一段話:

他問,“如果用5年的時間學習數據庫,你能不能成為這個領域的專家?”

我說,“應該可以吧”

他說,“你現在25,5年后也才30,30歲就能成為某個領域的專家,為什么不去做呢?你看看周圍有多少30歲的人還一事無成,而那個時候的你已經是數據庫專家了。”

當時的我,剛剛進入別人夢寐以求的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高級工程師系統學習資料的,我可以免費分享給大家,需要完整版的朋友,【點這里可以看到全部內容】。

《系列學習視頻》

《系列學習文檔》

《我的大廠面試之旅》

》**

[外鏈圖片轉存中…(img-t7ok84Nc-1621871216486)]

《我的大廠面試之旅》

[外鏈圖片轉存中…(img-c2wn0NDd-1621871216490)]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386257.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實戰HMM-Viterbi角色標注地名識別

http://www.hankcs.com/nlp/ner/place-names-to-identify-actual-hmm-viterbi-role-labeling.html 命名實體識別(Named Entity Recognition)也是自然語言處理中的一個難關,特別是中文這樣沒有大小寫等固定形態的語言。上次介紹過《實戰HMM-Vi…

看完99%的人都學會了!9次Android面試經驗總結,我先收藏為敬

我們都是被圈養的人? 我的朋友程序員K,說他在電力行業的一家軟件公司做了八年Android開發,用到的各種技術,數據庫,網絡請求,事件傳遞,響應框架都很熟悉,甚至JNI/NDK/Framework&…

從外包公司到今日頭條offer,含BATJM大廠

前言 最近有不少人問我這樣一個問題:「我剛接觸編程,準備學習下Android開發,但是擔心現在市場飽和了,Android開發的前景怎么樣?」 想著可能有很多人都有這樣的擔心,于是就趕緊寫篇文章,來跟你…

PTA -- A1046 Shortest Distance

題意及思路 題意:有N個節點(1至N),求給定的st號到en號的距離最小值,這些點構成一個環,即1->2 ... ->N ->1。 思路:第一步,預處理操作,以dis[ i ] 表示&#xff…

從外包公司到今日頭條offer,聰明人已經收藏了!

開頭 讓我們一起來看看,字節跳動的第三面,面試官都問了什么?(第一二面的題目及答案已整理,需要的可以在文末領取) 從七月中旬開始,我前前后后差不多一共投遞了八十份簡歷,到目前為…

程序從高版本降到2.0,數據集報錯 TypedTableBase

錯誤 命名空間“System.Data”中不存在類型或命名空間名稱“TypedTableBase”(是缺少程序集引用嗎?) 解決&#xff1a; 該錯誤出現在自動生成的XXX.Designer.cs里。 .NET 3.5 : public partial class T_OPERATOR_WLDataTable : global::System.Data.TypedTableBase<T_OPER…

從外包月薪5K到阿里月薪15K,原理+實戰+視頻+源碼

前言 轉眼間&#xff0c;2020 年已過去一大半了&#xff0c;2020 年很難&#xff0c;各企業裁員的消息蠻多的&#xff0c;降職&#xff0c;不發年終獎等等。2020 年確實是艱難的一年。然而生活總是要繼續&#xff0c;時間不給你喪的機會&#xff01;如果我們能堅持下來&#x…

C#編寫的發送手機短信的類庫 C#開發短信的方法和簡介 短信編程實例

發送手機短信源代碼(針對國內短信編碼) / ///文 件&#xff1a;PDUdecoding.cs ///概 要&#xff1a;針對國內短信編碼&#xff08;USC2&#xff09; ///組成結構&#xff1a;包含四個函數&#xff1a; /// smsDecodedCenterNumber(string srvCenterNumber) …

從新手到Flutter架構師,一篇就夠!吐血整理

在開始回答前&#xff0c;先簡單概括性地說說Linux現有的所有進程間IPC方式&#xff1a; 1. **管道&#xff1a;**在創建時分配一個page大小的內存&#xff0c;緩存區大小比較有限&#xff1b; 2. 消息隊列&#xff1a;信息復制兩次&#xff0c;額外的CPU消耗&#xff1b;不合…

小程序自定義組件中observer函數的應用

<!-- 單個數據監聽 --> <view>白菜</view> <view>價格&#xff1a;{{price}}</view> <!-- bindinput輸入時觸發方法 --> <view>數量&#xff1a; <input type"number" bindinputchangee value"{{num1}}">…

從新手到Flutter架構師,一篇就夠!學習路線+知識點梳理

前言 IT行業薪水高&#xff0c;這是眾所周知的&#xff0c;所以很多人大學都選擇IT相關專業&#xff0c;即使非該專業的人&#xff0c;畢業了也想去一個培訓機構鍍鍍金&#xff0c;進入這一行業。 但是有關這個行業35歲就退休的說法&#xff0c;也一直盛傳。 加上這幾年不斷…

Es6常用方法filter

1. filter針對數組起過濾作用篩選出符合條件的一個或多個元素 lvar newarr [ { num: 1, val: ceshi, flag: aa }, { num: 2, val: ww } ] console.log(newarr.filter(item > item.num2 )) // [{num:2,val:ww}] 2 .filter 自動多慮數組中 空字符串、undefined、null var …

從新手到Flutter架構師,一篇就夠!幫你突破瓶頸

前言 馬上快到金三銀四都春招階段了&#xff0c;在這本就是跳槽、找工作的年后黃金時間&#xff0c;大多數求職者都早早做好年后求職的準備&#xff0c;其中不乏有年前早早辭了工作準備年后跳槽的有經驗的職場老人們&#xff0c;也有一批即將畢業的應屆畢業生的職場新人們。 …

從新手到Flutter架構師,一篇就夠!附贈課程+題庫

導語 Android 音視頻開發這塊目前的確沒有比較系統的教程或者書籍&#xff0c;網上的博客文章也都是比較零散的。只能通過一點點的學習和積累把這塊的知識串聯積累起來。 音視頻的開發&#xff0c;往往是比較難的&#xff0c;而這個比較難的技術就是NDK里面的技術。音視頻/高…

微信小程序之視圖容器(swiper)組件創建輪播圖

一、視圖容器&#xff08;Swiper&#xff09; 1、swiper&#xff1a;滑塊視圖容器 微信官方文檔&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html 二、swiper應用 1、頁面邏輯&#xff08;index.js&#xff09; Page({data: {imgUrls: [{l…

從草根到百萬年薪程序員的十年風雨之路,使用指南

前言 文章篇幅較長&#xff0c;建議耐心食用&#xff0c;相信對你有幫助。碼字不易&#xff0c;如果有誤&#xff0c;歡迎指出。 前部分是面試經歷&#xff0c;后部分是附帶的問題筆記/推薦回答/書籍。 我的微信小號有一組特殊的朋友。他們從 CSDN上看到我之前發布的《從阿里到…

修復png bug的腳本

代碼 //IE5.5 PNG Alpha Fix v2.0 Alpha: Background Tiling Support//(c) 2008 Angus Turnbull http://www.twinhelix.com//This is licensed under the GNU LGPL, version 2.1 or later.//For details, see: http://creativecommons.org/licenses/LGPL/2.1/varIEPNGFix windo…

從草根到百萬年薪程序員的十年風雨之路,吊打面試官系列!

開頭 大家好&#xff0c;我是G哥&#xff0c;目前人在荊州辦事&#xff0c;但是干貨還是要安排上&#xff01; 國外有一個爆火的開發人員學習路線&#xff0c;目前已經在 Github收獲了 131 k star&#xff0c;Star 數量在 Github 所有倉庫中排名第 9 。這個倉庫有多火就不用說…

Android View系列(二):事件分發機制源碼解析

概述 在介紹點擊事件規則之前&#xff0c;我們需要知道我們分析的是MotionEvent&#xff0c;即點擊事件&#xff0c;所謂的事件分發就是對MotionEvent事件的分發過程&#xff0c;即當一個MotionEvent生成以后&#xff0c;系統需要把這個事件傳遞給具體的View&#xff0c;而這個…

從零開始系統化學Android,值得收藏!

前言 每年的3、4月份是各大企業為明年拓展業務大量吸納人才的關鍵時期&#xff0c;招聘需求集中、空缺崗位多&#xff0c;用人單位也習慣在初秋進行大規模招聘。 金九銀十&#xff0c;招聘旺季&#xff0c;也是一個求職旺季。 不打無準備的仗&#xff0c;在這種關鍵時期&…