【移动应用开发技术】详解Android布局优化_第1页
【移动应用开发技术】详解Android布局优化_第2页
【移动应用开发技术】详解Android布局优化_第3页
【移动应用开发技术】详解Android布局优化_第4页
【移动应用开发技术】详解Android布局优化_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】详解Android布局优化

怎样才能写出优秀的AndroidApp,是每一个程序员追求的目标。那么怎么才能写出一个优秀的App呢?相信很多初学者也会有这种迷茫。一句话来回答这个问题:细节很重要。今天我们就从最基础的XML布局来谈谈怎么提高Android性能问题吧!也许你经常会遇到比较复杂的布局,这种情况下,最简单的方法就是多层嵌套实现效果,但是最简单的方法是否是最优的方法呢?这里需要打一个大大的问号?????经验告诉我们,往往简单的方法,得到的结果不是最优解,那么我们通过一个例子来研究一下怎么去优化我们的XML布局吧,下面通过经典微信中的“发现”tab页面中的布局来看看怎么实现。上面这张图片是微信界面截图,看到这张效果图的第一眼会让开发者想到使用线性布局实现这种左边图片,右边文字,一行白色背景效果很方便。那么我们就按照一般思路写出如下布局代码:以上布局的效果图如下:是不是差不多实现了微信一样的效果?那么我们怎么来判断以上布局是不是最优的呢?当然,我们是有工具来查看的。相信很多童鞋用过了,第一个就是HierarchyView,第二个就是显示GPU过度绘制。HierarchyView检测布局嵌套层次如果你是使用AS开发的话,你可以在AS工具栏中点击Tools–>Android–>AndroidDeviceMonitor–>HierarchyView。(至于HierarchyView怎么使用这里就不仔细介绍了)你可以通过这个工具来查看当前布局的层次结构,如下图的布局的层次结构就是上面微信的布局:ContentFrameLayout接点之后就是我们上面XML代码的布局了,从上图可以看到,我们布局最多有5层,其实你从代码中也可以看到是5层,那么我们是否能减少以上的布局的嵌套层次呢?答案是肯定的,废话不多说,我们直接上一份我优化过的布局代码吧。哇,代码量少了很多啊,代码也简洁了许多,让人看着就很舒服,那么我们到底进行了怎样的优化呢?从以下几点总结:使用style主题来定义一个通用的属性,从而重复利用代码,减少代码量。上面代码使用了两个style,一个是textStyle和LinerLayoutStyle,代码如下:2.减少布局嵌套的层次,上面布局使用TextView可以设置四个方向图片来直接替代LinerLayout下包裹一个ImageView和TextView。从而这里减少了一层嵌套布局,再次利用RelativeLayout相对布局又减少了一层桥套,提高了加载布局的效率。看图:从图中看出,不仅减少了两层嵌套布局,而且组件数目也减少,从而减少布局绘制的时间,大大提高了布局加载效率。3.使用LinearLayoutCompat组件来实现线性布局元素之间的分割线,从而减少了使用View来实现分割线效果。LinearLayoutCompat的具体内容请参考/article/137253.htm4.使用include标签加载底部菜单栏布局,include标签的目的是重复利用布局,来减少代码了。5.使用merge减少布局嵌套层次。使用merge的前提条件就是merge标签必须是当前xml布局的根标签,例如:也就是merge标签必须是当前布局的父布局。一般merge标签和include结合使用来减少布局嵌套层次。例如有如下布局:两个Button,以上一下。该布局层次如下:

由上图看出除了根布局,我们自己写的布局有三层,两层都是RelativeLayout。那么能否优化呢?(1)首先我们可以利用include标签简化xml布局。结果变成如下:代码很清爽有木有,一目了然。然后layout_item布局如下:到此,其实布局的嵌套层次和上面一样没有任何改变。那么我们利用merge标签来试试看结果怎样?merge标签代码如下:此处仅仅把RelativeLayout标签换成merge标签,效果却大有不同。利用merge标签以后的布局层次如下:

很明显减少了一层RelativeLayout布局,从而优化了布局。总结:当父布局和子布局的根布局是同一种布局时,可以利用merge标签来减少一层嵌套布局。比如:你父布局是LinerLayout,此时子布局也是LinerLayout,就可以考虑使用merge来减少布局嵌套层次。显示GPU过度绘制你可以在手机打开设置—->开发者选项—->显示GPU过度绘制,这个开关的作用是按不同颜色值来显示布局的过度绘制,绘制的层次从最优到最差:蓝,绿,淡红,红。给出一张直观的形象图片来表示吧图片从上到下代表不同层次的OverDraw,我们在布局时候,尽量减少红色Overdraw,看到更多的蓝色区域。来看看微信的Overdraw图和我们自定义的布局Overdraw图吧

第一张图是腾讯微信的Overdraw图,第二张图片是我们自定义的Overdraw图片。从上面两张图片看出,我们自己的布局和微信原版的布局Overdraw过度绘制情况差不多,没啥区别。那么我们能不能去减少红色部分的过度绘制呢?试试吧!我们先去掉最顶端布局RelativeLayout的背景然后修改每个item选择资源selector之前的item_bg_select.xml资源是如下代码:修改之后的item_bg_select1.xml资源代码如下:我们发现,新的selector资源去除了因为整个背景是白色的,无需重复设置正常情况下item的背景颜色。修改之后的效果图如下:看出,基本没有红色区域,从而提高布局的绘制效率。总结:现在看来,我们通过减少背景颜色的设置来减少Overdraw的情况。我们自己布局过度绘制的情况比微信本身的情况有很大的改善,是不是感觉很nice~~。懒加载布局ViewStub除了以上两种方法来优化布局,还有其他办法来继续优化布局,在某些情况下,有些布局是仅在需要时才加载,比如小米手机的添加联系人功能就有在编辑姓名的时候有一个下拉按钮显示更多输入信息,看图

遇到这种情况,我们首先想到的就是将不常用的元素使用INVISIBLE或者GONE进行隐藏,这样是否真的好呢?是否达到了布局优化的最终效果呢?利用INVISIBLE只是隐藏布局,但是布局还是占居当前位置,且系统在加载布局的时候这一部分还是会绘制出来,同样花费绘制时间。那么有没有好的办法来解决这一问题呢?不言而喻,我们可以使用懒加载布局ViewStub。ViewStub是Android为此提供了一种非常轻量级的控件。ViewStub虽说也是View的一种,但是它没有大小,没有绘制功能,也不参与布局,资源消耗非常低,将它放置在布局当中基本可以认为是完全不会影响性能的。下面我们来学习一下ViewStub的使用方法吧!item_name.xml布局如下:然后你在代码中这么使用即可效果图如下:

从效果图可以看出,当用户点击姓名下拉按钮时,其他关于姓名的布局就加载出来了,而且原来的布局是显示在ViewStub布局之下的,位置显示没有任何异常。当然你可以通过setVisibility(View.VISIBLE)或者viewStub.inflate()方来来让其显示,通过setVisibility(View.INVISIBLE)来隐藏

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论