




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發技術】詳解Android布局優化
怎樣才能寫出優秀的AndroidApp,是每一個程序員追求的目標。那么怎么才能寫出一個優秀的App呢?相信很多初學者也會有這種迷茫。一句話來回答這個問題:細節很重要。今天我們就從最基礎的XML布局來談談怎么提高Android性能問題吧!也許你經常會遇到比較復雜的布局,這種情況下,最簡單的方法就是多層嵌套實現效果,但是最簡單的方法是否是最優的方法呢?這里需要打一個大大的問號?????經驗告訴我們,往往簡單的方法,得到的結果不是最優解,那么我們通過一個例子來研究一下怎么去優化我們的XML布局吧,下面通過經典微信中的“發現”tab頁面中的布局來看看怎么實現。上面這張圖片是微信界面截圖,看到這張效果圖的第一眼會讓開發者想到使用線性布局實現這種左邊圖片,右邊文字,一行白色背景效果很方便。那么我們就按照一般思路寫出如下布局代碼:以上布局的效果圖如下:是不是差不多實現了微信一樣的效果?那么我們怎么來判斷以上布局是不是最優的呢?當然,我們是有工具來查看的。相信很多童鞋用過了,第一個就是HierarchyView,第二個就是顯示GPU過度繪制。HierarchyView檢測布局嵌套層次如果你是使用AS開發的話,你可以在AS工具欄中點擊Tools–>Android–>AndroidDeviceMonitor–>HierarchyView。(至于HierarchyView怎么使用這里就不仔細介紹了)你可以通過這個工具來查看當前布局的層次結構,如下圖的布局的層次結構就是上面微信的布局:ContentFrameLayout接點之后就是我們上面XML代碼的布局了,從上圖可以看到,我們布局最多有5層,其實你從代碼中也可以看到是5層,那么我們是否能減少以上的布局的嵌套層次呢?答案是肯定的,廢話不多說,我們直接上一份我優化過的布局代碼吧。哇,代碼量少了很多啊,代碼也簡潔了許多,讓人看著就很舒服,那么我們到底進行了怎樣的優化呢?從以下幾點總結:使用style主題來定義一個通用的屬性,從而重復利用代碼,減少代碼量。上面代碼使用了兩個style,一個是textStyle和LinerLayoutStyle,代碼如下:2.減少布局嵌套的層次,上面布局使用TextView可以設置四個方向圖片來直接替代LinerLayout下包裹一個ImageView和TextView。從而這里減少了一層嵌套布局,再次利用RelativeLayout相對布局又減少了一層橋套,提高了加載布局的效率。看圖:從圖中看出,不僅減少了兩層嵌套布局,而且組件數目也減少,從而減少布局繪制的時間,大大提高了布局加載效率。3.使用LinearLayoutCompat組件來實現線性布局元素之間的分割線,從而減少了使用View來實現分割線效果。LinearLayoutCompat的具體內容請參考/article/137253.htm4.使用include標簽加載底部菜單欄布局,include標簽的目的是重復利用布局,來減少代碼了。5.使用merge減少布局嵌套層次。使用merge的前提條件就是merge標簽必須是當前xml布局的根標簽,例如:也就是merge標簽必須是當前布局的父布局。一般merge標簽和include結合使用來減少布局嵌套層次。例如有如下布局:兩個Button,以上一下。該布局層次如下:
由上圖看出除了根布局,我們自己寫的布局有三層,兩層都是RelativeLayout。那么能否優化呢?(1)首先我們可以利用include標簽簡化xml布局。結果變成如下:代碼很清爽有木有,一目了然。然后layout_item布局如下:到此,其實布局的嵌套層次和上面一樣沒有任何改變。那么我們利用merge標簽來試試看結果怎樣?merge標簽代碼如下:此處僅僅把RelativeLayout標簽換成merge標簽,效果卻大有不同。利用merge標簽以后的布局層次如下:
很明顯減少了一層RelativeLayout布局,從而優化了布局。總結:當父布局和子布局的根布局是同一種布局時,可以利用merge標簽來減少一層嵌套布局。比如:你父布局是LinerLayout,此時子布局也是LinerLayout,就可以考慮使用merge來減少布局嵌套層次。顯示GPU過度繪制你可以在手機打開設置—->開發者選項—->顯示GPU過度繪制,這個開關的作用是按不同顏色值來顯示布局的過度繪制,繪制的層次從最優到最差:藍,綠,淡紅,紅。給出一張直觀的形象圖片來表示吧圖片從上到下代表不同層次的OverDraw,我們在布局時候,盡量減少紅色Overdraw,看到更多的藍色區域。來看看微信的Overdraw圖和我們自定義的布局Overdraw圖吧
第一張圖是騰訊微信的Overdraw圖,第二張圖片是我們自定義的Overdraw圖片。從上面兩張圖片看出,我們自己的布局和微信原版的布局Overdraw過度繪制情況差不多,沒啥區別。那么我們能不能去減少紅色部分的過度繪制呢?試試吧!我們先去掉最頂端布局RelativeLayout的背景然后修改每個item選擇資源selector之前的item_bg_select.xml資源是如下代碼:修改之后的item_bg_select1.xml資源代碼如下:我們發現,新的selector資源去除了因為整個背景是白色的,無需重復設置正常情況下item的背景顏色。修改之后的效果圖如下:看出,基本沒有紅色區域,從而提高布局的繪制效率。總結:現在看來,我們通過減少背景顏色的設置來減少Overdraw的情況。我們自己布局過度繪制的情況比微信本身的情況有很大的改善,是不是感覺很nice~~。懶加載布局ViewStub除了以上兩種方法來優化布局,還有其他辦法來繼續優化布局,在某些情況下,有些布局是僅在需要時才加載,比如小米手機的添加聯系人功能就有在編輯姓名的時候有一個下拉按鈕顯示更多輸入信息,看圖
遇到這種情況,我們首先想到的就是將不常用的元素使用INVISIBLE或者GONE進行隱藏,這樣是否真的好呢?是否達到了布局優化的最終效果呢?利用INVISIBLE只是隱藏布局,但是布局還是占居當前位置,且系統在加載布局的時候這一部分還是會繪制出來,同樣花費繪制時間。那么有沒有好的辦法來解決這一問題呢?不言而喻,我們可以使用懶加載布局ViewStub。ViewStub是Android為此提供了一種非常輕量級的控件。ViewStub雖說也是View的一種,但是它沒有大小,沒有繪制功能,也不參與布局,資源消耗非常低,將它放置在布局當中基本可以認為是完全不會影響性能的。下面我們來學習一下ViewStub的使用方法吧!item_name.xml布局如下:然后你在代碼中這么使用即可效果圖如下:
從效果圖可以看出,當用戶點擊姓名下拉按鈕時,其他關于姓名的布局就加載出來了,而且原來的布局是顯示在ViewStub布局之下的,位置顯示沒有任何異常。當然你可以通過setVisibility(View.VISIBLE)或者viewStub.inflate()方來來讓其顯示,通過setVisibility(View.INVISIBLE)來隱藏
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CHTS 10061-2022雄安新區高速公路房建工程裝配式近零能耗建筑技術標準
- T/CHC 1006-2023靈芝孢子油軟膠囊
- T/CECS 10378-2024建筑用輻射致冷涂料
- T/CECS 10288-2023水泥及混凝土用玻璃粉
- T/CECS 10261-2022綠色建材評價一體化預制泵站
- T/CECS 10143-2021高分子量高密度聚乙烯(HMWHDPE)雙波峰纏繞結構壁排水管
- T/CECS 10105-2020商用燃氣全預混冷凝熱水爐
- T/CCOA 23-2020食用鴨油
- T/CCMS 008-2024智能控制施工升降機安全技術規程
- T/CCAS 014.8-2022水泥企業安全管理導則第8部分:水泥工廠有限空間作業安全管理
- 家具供貨結算協議書
- 2025屆湖南省邵陽市高三下學期第三次聯考物理試卷(含答案)
- 2025年公證員資格考試全國范圍真題及答案
- 叉車作業安全協議書
- 房屋解除轉讓協議書
- 小學生美術講課課件
- 新聞采訪考試試題及答案
- 2025年北京市西城區高三語文二模考試卷附答案解析
- JJF 2215-2025移動源排放顆粒物數量檢測儀校準規范
- 選擇性必修1 《當代國際政治與經濟》(主觀題答題模版)
- 河北單招試題及答案英語
評論
0/150
提交評論