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 布局优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32的语音识别_基于stm32循迹
- 下一篇: android sina oauth2.