Android 佈局優化

佈局是一個App很是關鍵的一部分,佈局性能的好壞可直接影響到用戶的體驗。試想下若是一個RecyclerView滑動時異常卡頓,那用戶估計也沒有心情去住下滑了,可能就直接強制殺掉App了去,而後回過頭去應用商店給個差評「卡的不要不要的」。雖然如今手機內存、CPU等各項性能都上來了看起來很強,實際上仍是卡的不行,因此咱們仍是要多學習下性能優化方面的知識。java

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

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

優化佈局層級

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

使用Layout Inspector很是方便,只須要簡單的幾步就能使用:bash

  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>標籤包含上面的佈局:spa

<?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>
複製代碼

只須要簡單幾步就能實現佈局的重用,同時還能夠從新覆蓋佈局參數:code

<include 
    layout="@layout/layout_bottom_button"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    
    />
複製代碼

須要注意的是,覆蓋佈局參數時必須要覆蓋layout_widthlayout_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指定的佈局文件替換掉。

相關文章
相關標籤/搜索