優(yōu)化布局層次結(jié)構(gòu)

轉(zhuǎn)自: https://developer.android.com/training/improving-layouts/optimizing-layout

優(yōu)化布局層次結(jié)構(gòu)

使用基本的布局結(jié)構(gòu)可打造最高效的布局,這是一種常見的誤解。但無論如何,您添加到應(yīng)用中的每個(gè)微件和布局都需要進(jìn)行初始化、布局和繪制。例如,使用嵌套的LinearLayout 實(shí)例會(huì)導(dǎo)致視圖層次結(jié)構(gòu)過深。此外,嵌套多個(gè)使用 layout_weight 參數(shù)的 LinearLayout實(shí)例成本非常高,因?yàn)槊總€(gè)子級(jí)都需要測(cè)量?jī)纱?。如果要反?fù)膨脹布局(例如,在 ListViewGridView 中使用時(shí)),則要特別注意這方面。

在本課中,您將了解如何使用 Hierarchy ViewerLint 來檢查和優(yōu)化布局。

檢查布局

Android SDK 工具套件包含一個(gè)名為 Hierarchy Viewer 的工具,可讓您在應(yīng)用運(yùn)行時(shí)分析布局。此工具可幫助您發(fā)現(xiàn)布局性能方面的瓶頸。

利用 Hierarchy Viewer,您可以在已連接的設(shè)備或模擬器上選擇正在運(yùn)行的進(jìn)程,然后顯示布局樹。各個(gè)塊上的信號(hào)燈代表其測(cè)量、布局和繪制性能,有助于您識(shí)別潛在問題。

例如,圖 1 顯示了用作 ListView 中的一項(xiàng)元素的布局。此布局左側(cè)顯示了一張小小的位圖,而右側(cè)則顯示了兩個(gè)堆疊的文本元素。尤其重要的是,您要確保那些會(huì)多次膨脹的布局(例如此布局)經(jīng)過了充分優(yōu)化,因?yàn)閮?yōu)化的性能收益會(huì)成倍地提升。

layout-listitem.png

圖 1. ListView 中的一項(xiàng)元素的概念性布局。

Hierarchy Viewer 會(huì)顯示可用設(shè)備及其正在運(yùn)行的組件的列表。從 Windows 標(biāo)簽頁中選擇您的組件,然后點(diǎn)擊 Hierarchy View 查看所選組件的布局層次結(jié)構(gòu)。例如,圖 2 顯示了圖 1 所示列表項(xiàng)的布局。

hierarchy-linearlayout.png

圖 2. 圖 1 所示布局的布局層次結(jié)構(gòu),使用嵌套的 LinearLayout 實(shí)例。

修改布局

由于上述布局的性能因嵌套的 LinearLayout 而有所下降,因此可以通過展平布局(使布局變淺變寬,而非變窄變深)來提高性能。作為根節(jié)點(diǎn)的 RelativeLayout 支持此類布局。因此,將此設(shè)計(jì)轉(zhuǎn)換為使用 RelativeLayout 后,該布局便會(huì)成為 2 級(jí)層次結(jié)構(gòu)。檢查新布局是否如下所示:

hierarchy-relativelayout.png

圖 4. 圖 1 所示布局的布局層次結(jié)構(gòu),使用 RelativeLayout

這些收益可能看起來并不顯眼,但卻會(huì)成倍地提升性能,原因在于此布局會(huì)用于列表中的每一項(xiàng)元素。

大部分差異都是由在 LinearLayout 設(shè)計(jì)中使用 layout_weight 造成的,這會(huì)減緩測(cè)量速度。這只是如何恰當(dāng)?shù)厥褂妹總€(gè)布局的一個(gè)示例,您應(yīng)仔細(xì)考慮是否有必要使用布局權(quán)重。

在一些復(fù)雜的布局中,系統(tǒng)可能會(huì)浪費(fèi)時(shí)間和資源來多次測(cè)量同一個(gè)界面元素。這種現(xiàn)象稱為 Double Taxation。如需詳細(xì)了解 Double Taxation 以及如何防止出現(xiàn)這種情況,請(qǐng)參閱性能和視圖層次結(jié)構(gòu)

使用 Lint

一種始終很好的做法是,對(duì)布局文件運(yùn)行 lint 工具來搜索可能的視圖層次結(jié)構(gòu)優(yōu)化機(jī)會(huì)。Lint 取代了 Layoutopt 工具,并提供了更加強(qiáng)大的功能。下面顯示了 lint 規(guī)則的一些示例:

  • 使用復(fù)合可繪制對(duì)象 - 包含 ImageViewTextViewLinearLayout 作為復(fù)合可繪制對(duì)象可得到更加高效的處理。
  • 合并根框架 - 如果 FrameLayout 是一個(gè)布局的根,并且未提供背景或內(nèi)邊距等信息,則可以將其替換為稍微高效一些的 merge 標(biāo)記。
  • 無用的葉項(xiàng) - 沒有子級(jí)或沒有背景的布局通??梢砸瞥ㄒ?yàn)樗豢梢姡?,以使布局層次結(jié)構(gòu)更加扁平高效。
  • 無用的父級(jí) - 如果一個(gè)布局含有子級(jí)但沒有同級(jí)、不是 ScrollView 或根布局且沒有背景,則可以將其移除或?qū)⑵渥蛹?jí)直接移動(dòng)到父級(jí),以使布局層次結(jié)構(gòu)更加扁平高效。
  • 深層布局 - 嵌套過多的布局會(huì)降低性能。考慮使用 RelativeLayoutGridLayout 等比較扁平的布局來提高性能。默認(rèn)的深度上限為 10。

Lint 的另一項(xiàng)優(yōu)勢(shì)是,它已集成到 Android Studio 中。Lint 會(huì)在您編譯程序時(shí)自動(dòng)運(yùn)行。借助 Android Studio,您還可以針對(duì)特定構(gòu)建變體或針對(duì)所有構(gòu)建變體運(yùn)行 lint 檢查。

您還可以在 Android Studio 中使用 File > Settings > Project Settings 選項(xiàng)來管理檢查配置文件并對(duì)檢查進(jìn)行配置。系統(tǒng)會(huì)顯示“Inspection Configuration”頁面,其中包含支持的檢查。

studio-inspections-config.png

圖 5. 檢查配置

Lint 能夠自動(dòng)修復(fù)某些問題、提供有助于解決其他問題的建議,以及直接跳轉(zhuǎn)到違規(guī)代碼進(jìn)行審核。

如需詳細(xì)了解有關(guān)本課的信息,請(qǐng)參閱 XML 布局布局資源。

最后編輯于
?著作權(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ù)。

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