Android性能优化之布局优化(一)

安卓的页面展示
理想情况下是60帧/s,也就是16ms渲染一次
加入一次绘制任务耗时20ms,那么在16ms系统发出的VSYNC信号时就无法绘制,该帧就被丢弃>>卡顿

开发者选项:Profile GPURendering并选中On screen as bars那么将渲染性能以条形图的形式展示
蓝色:DisplayList的时间
红色:OpenGl渲染DisplayList所需要的时间
黄色:Cpu等待Gpu处理的时间
中间的绿色线条代表:16ms分界线

例如系统会默认绘制活动的背景,如果再次绘制背景,那么默认的背景就被覆盖无法显示属于过渡绘制
重绘检测:
开发者选项>>Enable Gpu Overdraw
重绘越多,颜色越红
我们可以通过这个工具查看到当前区域中的绘制次数,从而尽量优化绘图层次,尽量增大蓝色的区域减少红色的区域.

优化思路一:优化布局的层级

Google相比于早期的推荐使用Linearlayout,现在更推荐使用Relativelayout,其原因之一就是:相比于Linearlayout的层层嵌套,扁平化的Relativelayout有更好性能,从而提高UI渲染的效率.
所以在布局时,需要根据自身布局的特点来选择不同的Layout组件,从而避免通过某一种Layout组件的局限性,造成多次嵌套的情况的发生

使用include标签来重用layout
<include layout="@xx/xx">

不过注意,如果你需要在该标签中覆盖layout_xx的属性,就必须在该标签中同时指定layout_width和layout_height属性

优化思路二:使用ViewStub实现View的延迟加载

ViewStub是一个非常轻量级的组件,大小为0;

<?xml version="1.0" encoding="utf-8"?>
<!--第一步,创建viewstub.xml布局-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
<TextView
    android:text="你好师姐"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
</LinearLayout>



<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<!--第二步,使用ViewStub标签引用该布局-->
<ViewStub
    android:id="@+id/view_stub"
    android:layout="@layout/view_stub_demo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
</RelativeLayout>

运行程序发现,布局并没有展示,需要通过以下两种方法页面才会展示

    private void initView() {
    view_stub = (ViewStub) findViewById(R.id.view_stub);

    //1.设置Visibile
    view_stub.setVisibility(View.VISIBLE);

    //2.主动调用inflate方法
    view_stub.inflate();
}

优化思路三:使用Hierarchy View工具

*通常情况下Hierarchy View只能在工厂的demo机和模拟器上使用
*将程序在模拟器上运行起来

在AndroidStudio的打开方式为:
Tools > android > Android Device Monitor> Window>openPerspective> Hierarchy Viewer

使用方法:
通常情况下重点关注ID为content的ContentFramelayout的分支,在该分支下如果有多层layout,且这些layout没有任何分支,说明是可以直接去掉的
也可以,
点击其中的view的时候,可以显示该view的绘制情况,不过第一次点击的时候现实的时间都将是n/a,需要点击菜单中的”profile Node”进行重新计算,此时可以获得每个view的绘制时长
更多使用说明可以查询:文档

作用:
通过该工具,可以很快的在视图树中找到冗余的布局,从而有目的的优化布局;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值