View的工作原理筆記

一昔榴、說明

? ? ? 筆記主要是《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)碍现。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幅疼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子昼接,更是在濱河造成了極大的恐慌爽篷,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辩棒,死亡現(xiàn)場(chǎng)離奇詭異狼忱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)一睁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門钻弄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人者吁,你說我怎么就攤上這事窘俺。” “怎么了复凳?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵瘤泪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我育八,道長(zhǎng)对途,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任髓棋,我火速辦了婚禮实檀,結(jié)果婚禮上惶洲,老公的妹妹穿的比我還像新娘。我一直安慰自己膳犹,他們只是感情好恬吕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著须床,像睡著了一般铐料。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上豺旬,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天钠惩,我揣著相機(jī)與錄音,去河邊找鬼哈垢。 笑死妻柒,一個(gè)胖子當(dāng)著我的面吹牛扛拨,可吹牛的內(nèi)容都是我干的耘分。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼绑警,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼求泰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起计盒,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤渴频,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后北启,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卜朗,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年咕村,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了场钉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懈涛,死狀恐怖逛万,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情批钠,我是刑警寧澤宇植,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站埋心,受9級(jí)特大地震影響指郁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拷呆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一闲坎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦箫柳、人聲如沸手形。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽库糠。三九已至,卻和暖如春涮毫,著一層夾襖步出監(jiān)牢的瞬間瞬欧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工罢防, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艘虎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓咒吐,卻偏偏與公主長(zhǎng)得像野建,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恬叹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • [Disclaimer]: 以下是讀 Chapter4的筆記 4.1 ViewRoot和DecorView Vie...
    DrunkPian0閱讀 562評(píng)論 0 1
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,181評(píng)論 25 707
  • 用兩張圖告訴你候生,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,732評(píng)論 2 59
  • 文\碎瑤 不適合的圈子是怎樣的呢?志不同道不合還處處讓你感到不舒服硅确。如此目溉,此地不宜久留,...
    唐澤碎瑤閱讀 2,184評(píng)論 0 1
  • 保證有效傾聽的四條重要原則 1菱农、尊重傾聽伙伴缭付,相信自己的注意力的效力。 2大莫、傾聽時(shí)蛉腌,專注于對(duì)方的問題,不要因自己的...
    若水柳柳柳閱讀 5,234評(píng)論 0 1