一昔榴、說明
? ? ? 筆記主要是《Android開發(fā)藝術(shù)探索》的閱讀筆記和自己的理解枕扫,筆記中部分內(nèi)容引自《Android開發(fā)藝術(shù)探索》卵酪。
? ? ? 因此需要著重感謝任玉剛先生和他所著的《Android開發(fā)藝術(shù)探索》的诵;然后感謝任玉剛先生授權(quán)我使用小部分《Android開發(fā)藝術(shù)探索》原文望众。
? ? ? 推薦Android開發(fā)者購(gòu)買正版《 Android開發(fā)藝術(shù)探索》匪补,該書是初級(jí)Android開發(fā)者進(jìn)階的必備良品!
? ? 由于本人水平有限烂翰,其中出現(xiàn)的錯(cuò)誤或者不合理的地方望各位讀者多多包含夯缺,并指出其中不合理和錯(cuò)誤的地方,以便我來修正甘耿。謝謝踊兜!
二、筆記時(shí)間
? ? 2018年10月11日
三佳恬、簡(jiǎn)述
? ? 本文主要記錄《Android開發(fā)藝術(shù)探索》中第四章中的重要知識(shí)點(diǎn)捏境,其中包含measure于游、layout、draw垫言、自定義View等一些重要知識(shí)細(xì)節(jié)贰剥。
? ? 文中加入了一些個(gè)人理解,可能有一些說明不合理或者錯(cuò)誤之處筷频,望各位讀者指出錯(cuò)誤的地方蚌成,以便我來修改錯(cuò)誤,避免誤導(dǎo)讀者凛捏。謝謝担忧!
四、詳情
? ? ?ViewRoot是連接WindowManager和DecorView的紐帶坯癣,View的三大流程均是通過ViewRoot來完成的涵妥。
? ? ?View的回執(zhí)流程是從ViewRoot的performTraversals方法開始的,它經(jīng)過measure坡锡、layout和draw三個(gè)過程才能最終將一個(gè)View繪制出來蓬网,其中measure用來測(cè)量View的寬高,layout用來確定View中父容器中的位置鹉勒,而draw則負(fù)責(zé)將View繪制在屏幕上帆锋。
1、View的工作流程
1.1禽额、measure過程
1)View的measure過程:View的measure過程由其measure方法來完成锯厢,measure方法是一個(gè)final類型的方法,也就是說子類不能被重寫此方法脯倒,這View的measure方法中會(huì)去調(diào)用View的onMeasure方法实辑,可以在onMeasure自測(cè)算寬高。
2)ViewGroup的measure過程:對(duì)于ViewGroup來說藻丢,除了自己的measure過程以外剪撬,還會(huì)遍歷子元素的measure方法,各個(gè)子元素再遞歸去執(zhí)行這個(gè)過程悠反。和View不同的是残黑,ViewGroup是一個(gè)抽象類,因此它沒有重寫View的onMeasure方法斋否,但是它提供了measureChildren的方法梨水。
1.2、layout過程
? ? ?Layout的作用是ViewGroup用來確定子元素的位置茵臭,當(dāng)ViewGroup的位置被確定后疫诽,它在onLayout中遍歷所有的子元素并調(diào)用其他layout方法,在layout方法中onLayout方法又會(huì)被調(diào)用。layout方法確定View本身的位置奇徒,而onLayout方法則確定所有子元素的位置雏亚。
1.3、draw過程
? ? Draw是將View繪制到屏幕上逼龟。View的繪制過程遵循以下幾步:
1)繪制背景background.draw(canvas)评凝;
2)繪制自己(onDraw)追葡;
3)繪制children(dispatchDraw)腺律;
4)繪制裝飾(onDrawScrollBars)。
2宜肉、自定義View
2.1匀钧、自定義View的分類
1)繼承View重寫onDraw方法:這種方法主要用于實(shí)現(xiàn)一些不規(guī)則的效果。這些效果需要通過重寫onDraw方法來實(shí)現(xiàn)谬返。采用這種方法需要自己支持warp_content之斯、padding。
2)繼承ViewGroup派生特殊的Layout:此方法主要用于實(shí)現(xiàn)自定義布局遣铝,適合幾種View組合在一起的情況佑刷。這種方式需要合理的處理ViewGroup的測(cè)量、布局這兩個(gè)過程酿炸,并處理子元素的測(cè)量和布局過程瘫絮。
3)繼承特定的View:這種適合擴(kuò)展某種已有的View的功能,比如TextView填硕。這種不需要自己支持warp_content和padding麦萤。
4)繼承特定的ViewGroup(比如 LinearLayout):這種方法和第二種是一樣的,只是第二種更加接近View的底層扁眯。這種方法不需要自己處理ViewGroup的測(cè)量和布局這兩個(gè)過程壮莹。
2.2、自定義View須知
? ? ?以下問題處理不好姻檀,有些會(huì)影響View的正常使用命满,有些則會(huì)導(dǎo)致內(nèi)存泄露等。
1)讓View支持warp_content:這是因?yàn)橹苯永^承View或者ViewGroup的控件绣版,如果不在onMeasure中對(duì)warp_content做特殊處理周荐,那么當(dāng)布局中使用warp_content時(shí)就無法達(dá)到預(yù)期的效果。
2)如果有必要僵娃,讓View支持padding:這是因?yàn)橹苯永^承View的控件概作,如果不在draw中處理padding,那么padding屬性是無法起到作用的默怨。另外讯榕,直接繼承ViewGroup的控件需要在onMeasure和onLayout中考慮padding和子元素的margin對(duì)其造成的影響,不然將導(dǎo)致padding和子元素的margin失效。
3)盡量不要在View中使用Handler:因?yàn)閂iew內(nèi)部本身提供了post系列的方法愚屁,完全可以代替Handler的作用济竹,除非非常明確的使用Handler來發(fā)送消息。
4)View中如果有線程或動(dòng)畫霎槐,需要及時(shí)停止:如果不及時(shí)處理這種問題送浊,有可能會(huì)造成內(nèi)存泄露。如果有線程或者動(dòng)畫需要停止時(shí)丘跌,可以在onDetachedFromWindow中處理袭景,因?yàn)楫?dāng)包含此View的Activity退出或者View被remove時(shí),都會(huì)調(diào)用onDetachedFromWindow方法闭树;和此方法對(duì)應(yīng)的是onAttachedToWindow耸棒,當(dāng)包含此View的Activity啟動(dòng)時(shí),onAttachedToWindow方法會(huì)被調(diào)用报辱。
5)View帶有滑動(dòng)嵌套時(shí)与殃,需要處理好滑動(dòng)沖突:如果不處理好滑動(dòng)沖突,會(huì)影響View的效果和體驗(yàn)碍现。