Android性能优化之流畅度优化实用系列

5. 使用结合Hierarchy Viewer减少布局嵌套

2018-03-29  本文已影响74人  真胖大海

一.使用Hierarchy Viewer减少布局层级

1.1直接删除多余的布局

场景:发现LinearLayout下只有一个SmartRefreshLayout布局,所以可以直接将LinearLayout这个布局去掉


优化前 优化后

1.2使用merge标签减少多余的布局

原理:系统会忽略merge标签,将merge标签下的视图直接放入include所在的布局中

场景 :

外层是一个vertical的LinearLayout,include的布局文件的根布局也是一个个vertical的LinearLayout,此时就可以将include的布局文件的根布局改成merge

setVisibility(int visibility)
When visibility is set to VISIBLE or INVISIBLE, inflate() is invoked and this StubbedView is replaced in its parent by the inflated layout resource.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/app_bg"
    android:gravity="center_horizontal">
    <include layout="@layout/titlebar"/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/add"/>
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/delete"/>
</LinearLayout>

改成

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/add"/>
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/delete"/>
</merge>

1.3 使用RelativeLayout/ConstraintLayout减少UI层次

constraint-layout使用介绍
constraint-layout API

1.4 使用ViewStub实现懒加载

ViewStub
注意:一个控件为GONE或者INVIVILE,即使它不被绘制,也会创建对象,初始化,占用资源

一.作用

ViewStub是一个不可见的,大小为0的视图,当ViewStub被设置为View.VISIBLE或调用inflate时,ViewStub会用inflate的视图替换自己在父容器中的位置。

二.使用

 <ViewStub 
               android:id="@+id/stub"  //ViewStub的id
               android:inflatedId="@+id/subTree"  //可以使用此属性替换待填充的布局的根视图的id
               android:layout="@layout/mySubTree" //待填充的布局
               android:layout_width="120dip" //必须
               android:layout_height="40dip"  //必须
/>
//使用inflate()与setVisibility(View.VISIBLE)都可以使视图填充,但是inflate可以获取待填充视图的对象,便于后续操作
 ViewStub stub = findViewById(R.id.stub);
 View inflated = stub.inflate();
//或者    stub.setVisibility(View.VISIBLE)

三.使用场景

一个页面可能有一个布局在某些情况下才显示,有些情况下不显示。此时就可以使用ViewStub,在需要时将布局加载出来而是在页面初始时就将布局全部加载出来

四.例子

  1. 未使用ViewStub时,即使无评论,无评论的布局也被填充了


    未使用ViewStub
  2. ViewStub时,无评论时,无评论布局被填充;有评论时,无评论布局不被填充


    使用ViewStub 有评论
使用ViewStub 无评论
上一篇下一篇

猜你喜欢

热点阅读