日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 减少布局层级,Android 布局优化

發布時間:2025/3/12 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 减少布局层级,Android 布局优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

布局優化主要從以下幾點進行著手

減少布局層次 和 復雜度

優化繪制流程

按需加載布局

減少布局層次 和 復雜度

首先我們可以通過以下工具分析界面布局的結構

查看布局樹工具:Hierarchy Viewer --> SDK tools下/ 或者使用AS的 Tools-->Layout Inspector

image.png

除此之外我們可以查看界面的繪制分析

image.png

image.png

三個點分別表示:Measure , layout , draw

Mearsure 紅:嵌套RelativeLayout,或者嵌套LinearLayout 使用了weight 屬性

Layout 紅:布局嵌套層次太深

Draw 紅:自定義view 繪制有問題

打開手機的debug模式下Debug GPU overdraw可以查看過度繪制的區域

繪制.jpg

通過以上的布局分析可以使用以下方法減少布局的層次和復雜度

使用合適的布局結構,減少不必要的布局嵌套,一般的建議規則如下

1.盡量多使用 ConstraintLayout、RelativeLayout、LinearLayout

2.盡量使用 ConstraintLayout

3.在布局的層級相同的情況下,使用 LinearLayout 代替 RelativeLayout

4.在布局復雜或者層級過深的時候,使用 RelativeLayout 代替 LinearLayout 使界面層級扁平化,降低層級

通過使用 include merge 復用布局,減少布局層次

排查background,減少不必的背景色設置,減少過度繪制

移除window 的背景色\ListView 與 Item\ViewPager 與 Fragment

// 方式1:在應用的主題中添加如下的一行屬性

@android:color/transparent

@null

// 方式2:在 BaseActivity 的 onCreate() 方法中使用下面的代碼移除

getWindow().setBackgroundDrawable(null);

getWindow().setBackgroundDrawableResource(android.R.color.transparent);

優化繪制流程

對onDraw進行優化

減少onDraw中局部變量的聲明 -- 由于被頻繁調用變量的生成和銷毀會造成一定的開銷,局部變量過多會造成系統的消耗

減少onDraw 中耗時操作 -- 由于官方建議每幀繪制頻率為60fsp,即要求每幀繪制時間<=16sm,Android 系統每隔16ms發出ASYNC信號,出發對UI進行渲染

android 官方文檔:https://developer.android.google.cn/topic/performance/rendering

可以使用debug 中的工具(Profile GPU Rendering)分析每幀繪制的時間,推薦文章

https://www.jianshu.com/p/6b715f3d47e4;

也可以通過將內容輸出到文件中進行分析,推薦文章:

https://www.cnblogs.com/sinkv/p/9773256.html

使用局部繪制api

// 規定繪制區域,防止其他區域過度繪制

canvas.save();

canvas.clipRect(xx,xx,xx,xx);

canvas.restore();

//可以使用canvas.quickreject()來判斷是否沒和某個矩形相交,從而跳過那些非矩形區域內的繪制操作

按需加載布局

使用viewStub 按需加載布局,可以提高view 初始加載的速度

新加:

除了以上方法我們還可以通過使用Lint 工具進行排查,一般我們需要關注的Lint 排查點:

image.png

不要阻塞UI線程,將耗時任務放到子線程中操作,可以使用DDMS中的TraceView 進行分析,查看主線程中的耗時操作

使用AsyncLayoutInflater 異步加載布局,不過再使用中存下來一下問題

使用Factory 監控view 的創建時間

LayoutInflaterCompat.setFactory2(getLayoutInflater(), new LayoutInflater.Factory2() {

@Nullable

@Override

public View onCreateView(@Nullable View parent, @NonNull String name, @NonNull Context context, @NonNull AttributeSet attrs) {

//1.配合getDelegate().createView來做高版本控件的兼容適配。

//2.單個View創建耗時統計。

long time = System.currentTimeMillis();

View view = getDelegate().createView(parent, name, context, attrs);

Log.i("TAG", name + " cost: " + (System.currentTimeMillis() - time));

return view;

}

@Nullable

@Override

public View onCreateView(@NonNull String name, @NonNull Context context, @NonNull AttributeSet attrs) {

return null;

}

});

2020-03-11 16:43:07.389 17078-17078/com.stan.topnews I/Perf: Connecting to perf service.

2020-03-11 16:43:07.567 17078-17078/com.stan.topnews I/perf: LinearLayout cost: 13

2020-03-11 16:43:07.569 17078-17078/com.stan.topnews I/perf: ViewStub cost: 0

2020-03-11 16:43:07.634 17078-17078/com.stan.topnews I/perf: TextView cost: 16

2020-03-11 16:43:07.637 17078-17078/com.stan.topnews I/perf: TextView cost: 3

總結

以上是生活随笔為你收集整理的android 减少布局层级,Android 布局优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。