LinearLayout中child View被測(cè)量次數(shù)分析

本文會(huì)分析【垂直布局】的LinearLayout中child 被測(cè)量次數(shù)。

圖1.1 垂直布局的LinearLayout 的onMeasure()流程圖

圖1.1為 垂直布局的LinearLayout 中的onMearsure()方法的大體流程(由于是垂直布局,onMearsure()方法實(shí)際上回調(diào)用measureVertical()方法)。在measureVertical()方法中總共有3個(gè)地方會(huì)進(jìn)行測(cè)量。分別需要滿足【A為假】,【B為真】,【C為真】三個(gè)條件。

1 Use a layout_height of 0dp instead of for bettererformance
圖1.2Android Studio 中的LinearLayout優(yōu)化提示

當(dāng)你在LinearLayout中嵌套一個(gè)使用了weight的View時(shí),Android Studio會(huì)提示你:為了更好的性能,將layout_height設(shè)置為0dp。這樣做確實(shí)可以提高性能,但僅僅是可以而不是100%。在LinearLayout中如果發(fā)現(xiàn)滿足一定條件(圖1.1中的【優(yōu)化條件A為真】)就可以讓【這些weight>0的child】跳過第一次測(cè)量,只進(jìn)行圖1.1中深紅色部分的測(cè)量,從而減少了一次測(cè)量,提升了性能。但是跳過第一次測(cè)量的條件不僅僅需要layout_height == 0,weight > 0,還需要LinearLayout的parent在高上給的mode != MeasureSpec.EXACTLY(也就是 MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY)。
當(dāng)你使用LinearLayout時(shí),parent給的mode有3種情況。所以就算你遵循了Android Studio給的優(yōu)化建議,優(yōu)化也不一定生效。

2 "盡量避免在LinearLayout中使用weight ,因?yàn)檫@樣的話child會(huì)被測(cè)量2次"

經(jīng)常在網(wǎng)上看到這句說的非常不靠譜的話,使用了weight的child也有可能只被測(cè)量1次,被測(cè)量一次的情況有如下3種:

1.chlid滿足前面1中Android Studio給的優(yōu)化提示。
2.child沒有跳過第一次測(cè)量,但是計(jì)算出來的(條件B中的delta為0)值為0。
3.滿足getVisibility() == View.GONE的child

第二種情況中的delta會(huì)被根據(jù)權(quán)重分配給使用了大于0的weight的child。其實(shí),不管child有沒有使用weight,只要為GONE,就完全不會(huì)被測(cè)量。

3總結(jié)

在LinearLayout中,如果為GONE的child和沒有weight的child在onMeasure方法中永遠(yuǎn)只會(huì)被測(cè)量一次。對(duì)于children應(yīng)該分開來看,因?yàn)橛锌赡茉谝淮蝟nMeasure()的執(zhí)行過程中,其中一部分child被測(cè)量的1次,另外的child被測(cè)量了2次。當(dāng)在說“某個(gè)LinearLayout由于使用了weight而導(dǎo)致了性能的問題”時(shí),其實(shí)是在說“由于使用了weight,這個(gè)LinearLayout中的【一部分(有可能是區(qū)青年布)】child被測(cè)量了2次”,千萬不要認(rèn)為只要使用了weight,【所有的】child都會(huì)被測(cè)量2次。如果需要判斷某個(gè)child被測(cè)量的次數(shù),只需要對(duì)照?qǐng)D1.1中的流程圖就行了(這里的流程圖針對(duì)垂直布局來畫的,水平布局可能略有不同)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容