布局优化主要从以下几点进行着手

减少布局层次 和 复杂度

优化绘制流程

按需加载布局

减少布局层次 和 复杂度

首先我们可以通过以下工具分析界面布局的结构

查看布局树工具: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 布局优化相关推荐

  1. android 程序界面美化,Android性能优化之界面优化总结

    一.Android UI渲染机制 人眼所能感觉到流畅的画面,最佳帧数为60帧每秒.在Android中,系统通过VSYNC信号触发对UI的渲染以及重绘,间隔时间为16ms,其实就是1000ms内显示60 ...

  2. 源码分析 merge 标签减少布局层级的秘密(Android Q)

    源码分析 merge 标签减少布局层级的秘密(Android Q) 我在<Android 渲染性能优化--你需要知道的一切!>一文中介绍过,merge 标签用于减少 View 树的层次来优 ...

  3. Android官方开发文档Training系列课程中文版:布局性能优化之布局层级优化

    原文地址:http://android.xsoftlab.net/training/improving-layouts/index.html 引言 布局是直接影响用户体验的关键部分.如果实现的不好,那 ...

  4. android textview 文字居中_Android布局优化,看这3点就够了

    码个蛋(codeegg)第 712 次推文 作者:Android技术 博客:https://www.jianshu.com/p/2ee61b88175e 前言 在编写Android布局时总会遇到这样或 ...

  5. Android高级开发-布局渲染流程与优化

    扩展知识 CPU(中央处理器)与GPU(图像处理器) 主要是设计目标不同,针对不同的应用场景.多缓存多分支,适用于复杂的逻辑运算,主要负责Measure,Layout,Record,Execute的计 ...

  6. Android代码、图片、布局、网络和电量优化

    这篇文章分为五个部分代码优化.图片优化.布局优化.网络优化.电量优化,尽量每个方法都写了小的Demo! 代码优化:不要做多余的工作,尽量避免次数过多的内存的分配,(需要对api有一定的熟悉) 数据集合 ...

  7. 2.4万字长文!Android代码、图片、布局、网络和电量优化

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 https://wei ...

  8. android layout include merge,Android 布局优化之include与merge

    Android 官方提供了三个用来优化布局的标签,分别是include.merge与ViewStub,其中ViewStub是动态加载视图到内存,大家可以查阅:Android UI布局优化之ViewSt ...

  9. 使用层级观察器hierarchyviewer综合各种布局实现Android QQ2012登陆界面和注册界面...

    最近工作比较轻松,项目不忙,所以闲着的时间去研究了自己比较感兴趣的UI界面,确实漂亮的UI能给用户带来良好的体验,在android应用中一直尤为重要,这次模仿的是QQ2012Android版的的最新登 ...

最新文章

  1. 深度神经网络中的Inception模块介绍
  2. 《sql必知必会》读书笔记
  3. Android中点击按钮获取string.xml中内容并弹窗提示
  4. 一阶电路暂态响应的结果分析。_阻尼比测试方法及谐响应分析
  5. PHP精美列表商城发卡网站源码响应式
  6. vue 实现任意组件之间的通信
  7. 前端开发桌面终极工具(FastStone Capture)推荐(转)
  8. 白天做安全,晚上去挖洞
  9. golang中的异常如何捕获?
  10. 大搜车:云上多地域高可用消息系统的构建 | 凌云时刻
  11. 专题导读:基于大数据的知识图谱及其应用
  12. python读取文本后如何加拼音_[编程心得]用Python给汉字加上带音调的拼音
  13. My 10 favorite APPs
  14. 小米手机开发者选项在哪?小米手机怎么打开开发者选项
  15. python中def main是什么意思_python - 为什么要使用def main()?
  16. IEEE trans模板格式中左下角添加脚注的方法
  17. MacBook邮件登陆163邮箱,解决无法验证账户名或密码的问题
  18. 葫芦娃各平台以及微信hook分析汇总
  19. 宽带信号的DOA估计学习笔记(四):空间分辨率
  20. [1.24] T3-人品问题

热门文章

  1. python模拟postman发https请求_【接口测试】Postman入门01-特点和简介
  2. Scratch第四十九讲:完美的下落和反弹
  3. 九、SpringBoot集成Thymeleaf模板引擎
  4. python中变量的基本使用及命名规则
  5. Linux系统中fflush,sync,syncfs,fdatasync,fsync的比较
  6. 【leetcode】Word Break(python)
  7. 新版ADT出现appcompat_v7的问题
  8. opengl环境配置
  9. Socket的select制作多客户端传输(Qt)
  10. 错误日志类-也可以用于查看输出结构