View工作原理

view有三大工作流程:測量肢专、布局、繪制焦辅,分別對應(yīng)著方法mesure博杖、layout、draw

ViewRoot和DecorView

ViewRoot對應(yīng)的類是ViewRootImpl類筷登,是連接WindowManager和DecorView的紐帶剃根,View的三大流程都是由ViewRoot來完成的,在Activity創(chuàng)建完成之后仆抵,會將DecorView添加到Window中跟继,同時創(chuàng)建啊ViewRootImpl對象,并將此對象與DecorView連接起來

View的繪制是從ViewRoot的PerformTraversals方法開始的镣丑,這個方法會依次調(diào)用performMeasure舔糖、performLayout、performDraw方法莺匠,這三個方法分別調(diào)用頂級View的measure金吗、layout、draw方法,在后面的這三個方法中又會分別調(diào)用onMeasuer摇庙、onLayout旱物、onDraw方法,在這三個方法中會對所有子元素進行measure卫袒、layout宵呛、draw,這時候就從父容器繪制流程傳遞到了子元素中去了

performDraw的傳遞過程是在draw方法中通過dispatchDraw方法來實現(xiàn)的

measure過程決定了view的寬高夕凝,通過getMeasuredWidth和getMeasuredHeight獲得測量后的寬高宝穗,getWidth、getHeight獲得最終寬高码秉,layout決定view的位置逮矛,Draw決定view的顯示

DecorView是頂級View,本質(zhì)是一個FrameLayout转砖,一般內(nèi)部包含一個線性布局(標(biāo)題欄+內(nèi)容欄)

MeasureSpec

MeasureSpec是一個32位int值须鼎,高2位代表SpecMode,低30位代表SpecSize,要受到父容器的影響

SpecMode有3類:UNSPECIFIED、EXACTLY府蔗、AT_MOST

  • UNSPECIFIED:父容器不對View做任何限制
  • EXACTLY:父容器檢測出View的大小晋控,View的最終大小為SpecSize
  • AT_MOST:父容器指定了一個可用大小的SpecSize,View的大小不能超過這個值

MeasureSpec和LayoutParams

view的測量是系統(tǒng)通過MeasureSpec來實現(xiàn)的礁竞,我們給View設(shè)置LayoutParams后糖荒,系統(tǒng)會將LayoutParams在父容器的約束下轉(zhuǎn)化成對應(yīng)的MeasureSpec,然后根據(jù)這個MeasureSpec確定View的寬高

對于頂級DecorView模捂,MeasureSpec由窗口尺寸和其自身的LayoutParams決定捶朵,對于普通的View,MeasureSpec由父容器的MeasureSpec和自身的LayoutParams決定

View工作流程

主要指:測量狂男、布局综看、繪制

Measure過程

如果是View就通過measure方法完成測量,如果是ViewGoup完成自己測量過程外還要完成子元素的測量(調(diào)用所有子元素的measure方法)

view的measure方法是一個final類型岖食,子類不能重寫红碑,在這個方法中回去調(diào)用onMeasure方法

view的最終大小是在layout階段完成的

直接繼承View的控件需要重寫onMeasure方法并設(shè)置wrap_content時的自身大小

ViewGroup除了完成自己的measure還要遍歷子元素調(diào)用子元素的measure方法,ViewGoup是個抽象類泡垃,沒有重寫View的onMeasure方法析珊,提供了一個measureChildren方法

View的measure過程不是個activity的生命周期同步執(zhí)行的

獲取View寬高方法:

  • 在onWindowFocusChanged方法里獲取
  • 通過View.post方法
  • 使用ViewTreeObserver的回調(diào)方法中
  • 使用view.measure

Layout過程

當(dāng)ViewGroup確定位置后,在它的onLayout中會遍歷其子元素并調(diào)用其layout方法蔑穴,在layout方法中onLayout方法又會調(diào)用忠寻,layout方法確定其View的位置,onLayout確定其子元素的位置

draw過程

將View繪制在屏幕上存和,繪制過程:

  • 繪制背景
  • 繪制自己
  • 繪制children
  • 繪制裝飾

View繪制過程的傳遞是通過dispatchDraw來實現(xiàn)的奕剃,dispatchDraw會調(diào)用所有子元素的draw方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衷旅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纵朋,更是在濱河造成了極大的恐慌柿顶,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件操软,死亡現(xiàn)場離奇詭異嘁锯,居然都是意外死亡,警方通過查閱死者的電腦和手機聂薪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門猪钮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胆建,你說我怎么就攤上這事≈饨唬” “怎么了笆载?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涯呻。 經(jīng)常有香客問我凉驻,道長,這世上最難降的妖魔是什么复罐? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任涝登,我火速辦了婚禮,結(jié)果婚禮上效诅,老公的妹妹穿的比我還像新娘胀滚。我一直安慰自己,他們只是感情好乱投,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布咽笼。 她就那樣靜靜地躺著,像睡著了一般戚炫。 火紅的嫁衣襯著肌膚如雪剑刑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天双肤,我揣著相機與錄音施掏,去河邊找鬼。 笑死茅糜,一個胖子當(dāng)著我的面吹牛七芭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播限匣,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼抖苦,長吁一口氣:“原來是場噩夢啊……” “哼毁菱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锌历,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贮庞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后究西,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窗慎,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年卤材,在試婚紗的時候發(fā)現(xiàn)自己被綠了遮斥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡扇丛,死狀恐怖术吗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帆精,我是刑警寧澤较屿,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站卓练,受9級特大地震影響隘蝎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜襟企,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一嘱么、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧顽悼,春花似錦曼振、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至府蛇,卻和暖如春集索,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汇跨。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工务荆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人穷遂。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓函匕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚪黑。 傳聞我的和親對象是個殘疾皇子盅惜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

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