android应用程序优化之布局优化

52 篇文章 0 订阅
1 篇文章 0 订阅

    在我们开发APP时不仅要在代码实现上,做到对App的优化,而在我们的界面布局也有许多要优化的地方,如果布局写的很low的话,系统加载布局的速度会十分的慢,使得用户的体验非常的不好,这篇文章主要是从我平时对布局的优化方面总结一下,我认为经常可以用到的布局优化方面的一些技巧和手段。

  1.减少布局的嵌套,这一点也是最重要的

     搞android的都知道,android的整个UI布局文件最后也是要一层一层的解析成View对象的,如果层次太深的话,对导致递归的层次太深而极大的影响解析速度,所以,我们一定不能让布局文件的层次太深,要想做到布局文件的层次不深,通常用到的手段有:1)使用RelativeLayout代替LinearLayout。2)编写完布局文件时,可以使用HieracyView工具检查是否有多余的无用布局,如果有,则一定要去掉无用的布局。

   2.布局重用。

       一些可以公用的布局我们不必要每次都重写一遍,可以将其写为一个独立的布局文件,最后使用include标签将布局引用即可,然而,严格上来讲,布局重用只是减少了我们代码的编写量,并不能达到对应用的优化作用,而且,在使用include时会很容易产生第一点中的无用父布局,如下图:

       

       如何去除使用include代来的负作用,下面会有方案。

   3.使用merge标签去消除include标签所引入的无用布局

      使用merge时要注意,merge标签只能是根布局,结合2,3两点看一个示例用法:

      首先,创建一个merge标签的根布局,代码如下: 

   ?xml version="1.0" encoding="utf-8"?>  
   <merge xmlns:android="http://schemas.android.com/apk/res/android">  
  
      <Button  
        android:id="@+id/ok"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:layout_marginLeft="20dp"  
        android:layout_marginRight="20dp"  
        android:text="OK" />  
  
      <Button  
        android:id="@+id/cancel"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:layout_marginLeft="20dp"  
        android:layout_marginRight="20dp"  
        android:layout_marginTop="10dp"  
        android:text="Cancel" />  
  
   </merge> 
     接着,使用include引入布局:

   <include layout="@layout/ok_cancel_layout"/>

    4.利用 ViewStub延迟加载一些用不到的布局,在一些场合取代android:visibility="gone"的用法,因为被gone掉的布局不断是会同时创建对象的。那为什么使用ViewStub就高效呢,拿源码来说话,先看一下ViewStub源码:       

       @Override
       protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
          setMeasuredDimension(0, 0);
        }<span style="font-family: Arial, Helvetica, sans-serif;">       </span>
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Monaco; color: rgb(119, 119, 119);"><span style="color: rgb(0, 0, 0);">        </span>@Override</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Monaco;">        <span style="color: #931a68">public</span> <span style="color: #931a68">void</span> draw(Canvas <span style="color: #7e504f">canvas</span>) {</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Monaco;">        }</p>

       由onMeasure()方法和draw()方法可以看出, ViewStub的初始宽高都是零,所以他开始不会占用空间,其次draw()方法也没有执行任何的绘制,由这两个方法就可以看出,ViewStub的确很高效。

        在代码中要操纵ViewStub的时候,要首先使用viewstub.inflate()方法,将其所拥有的View初始化进去。否则会报空指针错误。

    5.减少不同层间的背景重绘,例如,如果某个view父布局的背景已经设置为了白色,则不需要再为此view设置背景色,通过这个简单的小技巧,可以非常多的提升速度。

    6.如果整个App都使用了自定义的Title和background,则我们可以使用自定义的style,永久的去掉系统默认为我们的Activity所添加的title和background,也可以提高Activity的渲染速度。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值