編輯:關於Android編程
布局是直接影響用戶體驗的關鍵部分。如果實現的不好,那麼布局很有可能會導致內存的緊張。Android的SDK包含的一些工具可以用來檢查布局性能上的問題。結合本章的課程學習,你將有能力以低成本的內存開銷實現更為順暢的UI體驗。
有一個常見的誤解就是使用基本的布局結構會使布局更高效。然而卻不是這樣的,每一個控件、布局容器都需要執行初始化、排布、繪制等過程。舉個例子,使用內嵌的LinearLayout會使布局層級過度加深。進一步講,內嵌多個使用了layout_weight參數的控件所花費的代價尤其高昂,因為每個子View都需要被測量兩次。這在布局被重復加載時尤為重要,比如使用在ListView或GridView中的時候。
在這節課我們將會學習如何使用Hierarchy Viewer工具及Layoutopt工具來檢查、優化布局。
Android的SDK包含了一個名為Hierarchy Viewer的工具。使用該工具可以幫助發現影響布局性能的瓶頸。
Hierarchy Viewer工作於所選擇的進程上,它會顯示一個布局樹。每個View節點上的信號燈代表了該View在測量、排布、繪制上的性能優劣,這可以幫助你發現潛在的問題。
舉個例子說明:下圖是ListView的一個Item。該Item左邊用於顯示圖片,而右邊則顯示兩行文本。因為該Item會被進行多次加載,所以對其優化的話,那麼UI性能會有顯著的提升。
Hierarchy Viewer工具位於< sdk>/tools/目錄下。打開後,Hierarchy Viewer會列出當前的可用設備以及設備上運行的組件。點擊Load View Hierarchy來浏覽所選組件的布局層級。下圖是上圖位於ListView中的運行效果演示:
vcO/uPa917bOy/m7qLfRtcTKsbzkKMjnz8LNvMv5yr4poaPEx8O0ztLDx77Nv8nS1Lrcx+XO+rXE1qq1wMTEuPZJdGVt1Nqy4sG/oaLFxbK8oaLk1si+yc+7qLfRtcTKsbzk1+6zpKOsy/nS1M7Sw8e+zdDo0qq7qLXjyrG85Neow8W21Mbk08W7r6GjPC9wPg0KPHA+PGltZyBhbHQ9"" src="/uploadfile/Collfiles/20160913/20160913092158757.png" title="\" />
這裡我們可以看到每個階段所花費的時間:
Measure: 0.977ms Layout: 0.167ms Draw: 2.717ms因為上面的示例說布局的性能慢是由於內嵌了一個LinearLayout,所以改進這部分性能只能通過扁平化來處理。要盡量使布局變淺變寬,杜絕變窄變深。RelativeLayout可以實現這樣的布局。所以當使用RelativeLayout實現這樣的布局時,那麼可以看到布局的層級變為了2。我們所看到的布局圖就是這個樣子:
下面是優化後的時間開銷:
Measure: 0.598ms Layout: 0.110ms Draw: 2.146ms我們可能會看到很微小的改進。
在改進時間上的大部分差別是由於LinearLayout的權重造成的,它會降低測量的速度。這裡的示例僅僅是個優化手段的演示,在開發過程中應當認真考慮是否有必要使用權重。
開發者應該使用lint工具來檢查布局層級是否有可優化的地方。Lint 與Layoutopt 相比有更加強大的功能。一些Lint的檢查規則如下:
使用組合圖形 - 一個包含了ImageView和TextView的LinearLayout作為組合圖形處理起來更加高效。 合並根幀布局 - 如果一個FrameLayout是根布局,並且它沒有提供背景色或內邊距什麼的,那麼可以使用合並標簽將其替換,這可以稍微的改進性能。 無用的葉子節點 - 如果一個布局沒有子View,沒有背景色,那麼通常可以將其移除。 無用的中間節點 - 如果一個布局內部只含有一個子View,並且不是ScrollView或者根布局,也沒有背景色,那麼可以將它移除,並將其子View移動到它的父容器內。 非常深的布局嵌套 - 一個被嵌套很深的布局通常不利於性能。考慮使用RelativeLayout或者GridLayout這種扁平化布局來改進性能。默認的最大深度為10。Lint的另一個好處就是它被集成進了Android Studio。Lint會在程序編譯時自動運行。
你也可以管理檢查Lint的配置,在Android Studio內通過File>Settings>Project Settings路徑可以找到。
Lint可以自動的修復一些問題,並且會對余下的問題提供一些優化建議,以便使開發者手動修復。
(1)布局文件:用於彈出菜單的處罰button: (2)res-menu目錄下的main.xml文件: (3)類的文
版本控制是項目開發過程中必不可少的部分,不管是個人還是團隊,靈活的使用版本控制將會使項目開發變得更加輕松。Android Studio集成了版本控制系統,目前支持CVS、
從意圖返回結果 startActivity()方法調用另一個活動,但並沒有返回結果給當前活動。此時如想從一個活動中回傳數據,就要使用startActivityFo
廢話不多說,先看效果圖: package com.example.circlemenuofbottom.anim;import android.v