Android 布局優化 [復制鏈接]

2019-10-14 10:55
littleRed 閱讀:341 評論:0 贊:0
Tag:  布局優化

布局是一個App非常關鍵的一部分,布局性能的好壞可直接影響到用戶的體驗。試想下如果一個RecyclerView滑動時異常卡頓,那用戶估計也沒有心情去住下滑了,可能就直接強制殺掉App了去,然后回過頭去應用商店給個差評“卡的不要不要的”。雖然現在手機內存、CPU等各項性能都上來了看起來很強,實際上還是卡的不行,所以我們還是要多學習下性能優化方面的知識。

本文將分三個部分來介紹Android布局優化的相關知識:

  • 優化布局層級
  • 布局重用
  • 按需加載布局

優化布局層級

優化布局的層級是非常重要,大家都知道Android的布局元素主可分為View和ViewGroup,其他LinearLayout、FrameLayout都是ViewGroup的子類。每個View在顯示之前都會有測量(measure)、布局(layout)、繪制(draw)這三步,布局層次越深相應的帶來的層級遍歷的消耗就越多。要優化布局的層級可以使用Layout Inspector來分析某個View的測量、布局、繪制所消耗的時間,幫助開發時定位布局性能較差的點。

使用Layout Inspector非常方便,只需要簡單的幾步就能使用:

  1. 在連接的設備或模擬器上運行您的應用
  2. 點擊 Tools > Android > Layout Inspector。
  3. 在出現的 Choose Process 對話框中,選擇您想要檢查的應用進程,然后點擊 OK。
  4. 選擇需要分析的Activity頁面
  5. 選擇Layout Inspector分析完成就可以查看各項數據了。

如下圖所示Layout Inspector的主界面可分為三個部分:

  • View Tree:視圖在布局中的層次結構。
  • Screenshot:帶每個視圖可視邊界的設備屏幕截圖。
  • Properties Table:選定視圖的布局屬性。

使用Layout Inspector分析布局層次后就可以對布局的層次做一些改動,以下是一些小技巧大家可參考優化布局層級:

  • 使用 ConstraintLayout
  • 使用merge標簽
  • 使用compound drawable

布局重用

布局重用是開發過程中非常重要的一部分,這樣能減少多余的布局文件和維護成品。在Android中布局重用可以使用<include>標簽,它可以高效重用完整的布局,比如有多個Activity中都有一個底部的Button除了文字不同以外其余的樣式都基本相同,這樣只需要建立一個底部按鈕布局文件,然后在Activity的布局中通過<include>標簽引用按鈕的布局就可以實現一個統一按鈕。

根據上面提到的例子新建一個layout_bottom_button.xml的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:background="@android:color/white"```
<include
layout="@layout/layout_bottom_button"
android:layout_width="match_parent"
android:layout_height="match_parent"

/>
>
<Button
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="5dp"
android:background="#36b7f7"
android:textColor="@android:color/white"
tools:text="下一步"
/>
</FrameLayout>
復制代碼

然后再建立一個新的布局文件,使用<include>標簽包含上面的布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<include layout="@layout/layout_bottom_button"/>
</FrameLayout>
復制代碼

只需要簡單幾步就能實現布局的重用,同時還可以重新覆蓋布局參數:

<include 
layout="@layout/layout_bottom_button"
android:layout_width="match_parent"
android:layout_height="match_parent"

/>
復制代碼

需要注意的是,覆蓋布局參數時必需要覆蓋layout_width和layout_height這兩個參數。

按需加載布局

有些時候布局會需要一些其它的View,但它們不是一開始就顯示到界面上,比如進度條、提示消息等元素,它們只會在特點的場景下才會出現,類似這樣的場景可以使用<ViewStub>標簽來處理在需要的時候加載View。

ViewStub是一個輕量級的View,它不會顯示到界面上,它只會在你需要的時候加載將布局加載到布局層次中。ViewStub的使用非常簡單只需要一個android:layout屬性來指定需要替換的布局文件就可以了:

<ViewStub
android:id="@+id/stub_import"
android:inflatedId="@+id/panel_import"
android:layout="@layout/progress_overlay"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
復制代碼

當你需要加載android:layout指定的布局文件時,只需要調用setVisibility(View.VISIBLE)或inflate()方法就能將ViewStub替換成android:layout指定的布局:

findViewById(R.id.stub_import).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
復制代碼

用setVisibility(View.VISIBLE)或inflate()方法后,ViewStub將不再是布局層次中的一部分,它會被android:layout指定的布局文件替換掉。


我來說兩句
您需要登錄后才可以評論 登錄 | 立即注冊
facelist
所有評論(0)
領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

安卓版28杠游戏