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 布局优化相关推荐
- android 程序界面美化,Android性能优化之界面优化总结
一.Android UI渲染机制 人眼所能感觉到流畅的画面,最佳帧数为60帧每秒.在Android中,系统通过VSYNC信号触发对UI的渲染以及重绘,间隔时间为16ms,其实就是1000ms内显示60 ...
- 源码分析 merge 标签减少布局层级的秘密(Android Q)
源码分析 merge 标签减少布局层级的秘密(Android Q) 我在<Android 渲染性能优化--你需要知道的一切!>一文中介绍过,merge 标签用于减少 View 树的层次来优 ...
- Android官方开发文档Training系列课程中文版:布局性能优化之布局层级优化
原文地址:http://android.xsoftlab.net/training/improving-layouts/index.html 引言 布局是直接影响用户体验的关键部分.如果实现的不好,那 ...
- android textview 文字居中_Android布局优化,看这3点就够了
码个蛋(codeegg)第 712 次推文 作者:Android技术 博客:https://www.jianshu.com/p/2ee61b88175e 前言 在编写Android布局时总会遇到这样或 ...
- Android高级开发-布局渲染流程与优化
扩展知识 CPU(中央处理器)与GPU(图像处理器) 主要是设计目标不同,针对不同的应用场景.多缓存多分支,适用于复杂的逻辑运算,主要负责Measure,Layout,Record,Execute的计 ...
- Android代码、图片、布局、网络和电量优化
这篇文章分为五个部分代码优化.图片优化.布局优化.网络优化.电量优化,尽量每个方法都写了小的Demo! 代码优化:不要做多余的工作,尽量避免次数过多的内存的分配,(需要对api有一定的熟悉) 数据集合 ...
- 2.4万字长文!Android代码、图片、布局、网络和电量优化
点击上方 "程序员小乐"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 https://wei ...
- android layout include merge,Android 布局优化之include与merge
Android 官方提供了三个用来优化布局的标签,分别是include.merge与ViewStub,其中ViewStub是动态加载视图到内存,大家可以查阅:Android UI布局优化之ViewSt ...
- 使用层级观察器hierarchyviewer综合各种布局实现Android QQ2012登陆界面和注册界面...
最近工作比较轻松,项目不忙,所以闲着的时间去研究了自己比较感兴趣的UI界面,确实漂亮的UI能给用户带来良好的体验,在android应用中一直尤为重要,这次模仿的是QQ2012Android版的的最新登 ...
最新文章
- 深度神经网络中的Inception模块介绍
- 《sql必知必会》读书笔记
- Android中点击按钮获取string.xml中内容并弹窗提示
- 一阶电路暂态响应的结果分析。_阻尼比测试方法及谐响应分析
- PHP精美列表商城发卡网站源码响应式
- vue 实现任意组件之间的通信
- 前端开发桌面终极工具(FastStone Capture)推荐(转)
- 白天做安全,晚上去挖洞
- golang中的异常如何捕获?
- 大搜车:云上多地域高可用消息系统的构建 | 凌云时刻
- 专题导读:基于大数据的知识图谱及其应用
- python读取文本后如何加拼音_[编程心得]用Python给汉字加上带音调的拼音
- My 10 favorite APPs
- 小米手机开发者选项在哪?小米手机怎么打开开发者选项
- python中def main是什么意思_python - 为什么要使用def main()?
- IEEE trans模板格式中左下角添加脚注的方法
- MacBook邮件登陆163邮箱,解决无法验证账户名或密码的问题
- 葫芦娃各平台以及微信hook分析汇总
- 宽带信号的DOA估计学习笔记(四):空间分辨率
- [1.24] T3-人品问题