Android View的繪制流程(2) -- 定位Layout

確定View的位置(Layout)


上一章說了有關(guān)View的一些基本知識,以及測量(Measure),就直奔主題了,有興趣的小伙伴可以到主頁看上一篇文章污茵。




layout流程圖


? ? 從第一個?Layout()開始看,點(diǎn)進(jìn)去看源碼發(fā)現(xiàn)葬项,該方法有四個參數(shù)省咨。如下圖


Layout方法源碼解析


(int?left,int?top玷室,int?right零蓉,int?bottom),代表著View對父類的上下左右距離穷缤。有意思的是和平常理解的上下左右敌蜂,有一丟的不一樣,我畫個圖表示一下津肛。


畫圖解釋上下左右

從上圖可以看出來章喉,left?和?top?與我們中國人正常想法是一樣的? 而?right 和?bottom有些不一樣,應(yīng)該是故意這樣的身坐,也很好理解秸脱,因?yàn)檫@樣可以很容易的確定view的大小,拿bottom -?top?得到View的高部蛇,拿right -?left?得到View的寬摊唇。并且,知道了left以及top涯鲁,那么view的位置也就定位到了巷查。大致就是這個樣子有序,需要注意一下。繼續(xù)往下看Layout中的源碼岛请。


layout方法部分代碼旭寿。


? ? ? ? 可以看到一開始做了個if判斷,跳過去先不管崇败,下方是一個位置的賦值不管跳過去盅称,在下方,發(fā)現(xiàn)調(diào)用了一個setFrame方法后室,這個方法可以在最上方的流程圖中看到缩膝,這個setFrame方法是一個隱藏的方法,無法重寫咧擂,內(nèi)部通過比對本次的left,top檀蹋,right松申,bottom四個值,與上次是否相同俯逾,判斷自身的位置和大小是否發(fā)生改變贸桶,如果發(fā)生了改變,會調(diào)用invalidate請求重新繪制桌肴,并記錄本次的left皇筛,top,right坠七,bottom用與下次比對水醋,如果沒發(fā)生變化,就不用重新繪制彪置,setFrame方法的源碼就不貼了拄踪,里面無非就是判斷上下左右(left,top拳魁,...)四個位置的值是否發(fā)生變化惶桐,變化就調(diào)用invalidate方法請求重新繪制,然后將保存新的位置以便下次比較潘懊,然后我們繼續(xù)往下看姚糊,onLayout()方法的源碼。截圖就不貼授舟,上張圖Layout方法中能看到調(diào)用Onlayout救恨,在倒數(shù)第四行代碼。



onLayout方法源碼解析


嗯释树?怎么是個空方法忿薇?懵了吧裙椭?看這個方法上面的英文解釋該方法,了解到這個方法是只有在ViewGroup類型(如linelayout署浩,relativelayout)中需要寫這個方法揉燃,去定位內(nèi)部View或者內(nèi)部ViewGroup的位置,從最上面的Layout定位流程圖可以看的很明白筋栋。如果是單獨(dú)的View炊汤,不需要復(fù)寫onLayout方法,所以我們進(jìn)入到ViewGroup類中弊攘,查找onLayout方法看一下做了什么操作抢腐。



ViewGroup中的onLayout

好家伙,直接變成抽象方法了襟交,我們都知道迈倍,抽象方法,子類必須重新捣域。那我們?nèi)フ乙粋€繼承了ViewGroup的類查一查啼染,拿Linelayout舉例,我們進(jìn)入Linelayout查看onLayout.



Linelayout中的onlayout


因?yàn)長inelayout集成了ViewGroup焕梅,所以必須重寫ViewGroup中的抽象方法(onLayout)迹鹅,終于能讀一下onLayout中的源碼了≌暄裕可以看到里面又調(diào)用了兩個方法斜棚,layoutVertical() 和?layoutHorizontal()?因?yàn)槲覀冇肔inelayout時(shí),要分內(nèi)部View是垂直走向该窗,還是水平走向弟蚀,是這個意思,我們隨便點(diǎn)開一個進(jìn)去看看酗失。



layoutHorizontal部分源碼

我剛剛進(jìn)的是下面那個水平的方法粗梭,這個方法源碼太多太長,只能截一個核心的位置的源碼了级零。


我們一開始在最上面的layout流程圖中可以看到断医,在onLayout之后,是調(diào)用了Child.layout方法奏纪,給ViewGroup里面的孩子(View或者ViewGroup)定位和大小鉴嗤,可在上圖中的layoutHorizontal中,并沒有發(fā)現(xiàn)Child.layout方法序调,那肯定就是調(diào)用了某個方法醉锅,在某個方法中調(diào)用了Child.layout。我們看上圖框住的setChildFrame方法发绢,在這個方法之前呢硬耍,是一些獲取當(dāng)前展示的子View垄琐,然后獲取位置什么的,傳給了setChildFrame方法经柴,我們點(diǎn)進(jìn)去看一下狸窘。



setChildFrame方法源碼

找到了,child.layout()方法坯认,給子view定位的方法翻擒。


完活!有問題小伙伴可以積極留言或私信牛哺÷看到會第一時(shí)間回復(fù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末引润,一起剝皮案震驚了整個濱河市巩趁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淳附,老刑警劉巖议慰,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異燃观,居然都是意外死亡褒脯,警方通過查閱死者的電腦和手機(jī)便瑟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門缆毁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人到涂,你說我怎么就攤上這事脊框。” “怎么了践啄?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵浇雹,是天一觀的道長。 經(jīng)常有香客問我屿讽,道長昭灵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任伐谈,我火速辦了婚禮烂完,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诵棵。我一直安慰自己抠蚣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布履澳。 她就那樣靜靜地躺著嘶窄,像睡著了一般怀跛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柄冲,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天吻谋,我揣著相機(jī)與錄音,去河邊找鬼羊初。 笑死滨溉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的长赞。 我是一名探鬼主播晦攒,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼得哆!你這毒婦竟也來了脯颜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤贩据,失蹤者是張志新(化名)和其女友劉穎栋操,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饱亮,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矾芙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了近上。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剔宪。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖壹无,靈堂內(nèi)的尸體忽然破棺而出葱绒,到底是詐尸還是另有隱情,我是刑警寧澤斗锭,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布地淀,位于F島的核電站,受9級特大地震影響岖是,放射性物質(zhì)發(fā)生泄漏帮毁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一豺撑、第九天 我趴在偏房一處隱蔽的房頂上張望烈疚。 院中可真熱鬧,春花似錦前硫、人聲如沸胞得。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阶剑。三九已至跃巡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牧愁,已是汗流浹背素邪。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猪半,地道東北人兔朦。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像磨确,于是被迫代替她去往敵國和親沽甥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353