Android中View绘制优化之一---- 优化布局层次

时间:2022-09-25 09:01:41

本文原创, 转载请注明出处http://blog.csdn.net/qinjuning

前言,竟然是翻译,当然得弄的有板有眼。 照着大作家格式来咯 , - - 。

译序

最近一直在做锁屏界面,之前也写过关于锁屏界面的一些简单原理,未曾想自己真正去深入理解锁屏时,才

发觉锁屏框架真是又大又复杂,主要体现在如下两个方面:

1、界面的组成以及更新机制;

2、对电源管理的控制,在锁屏界面会禁用系统的电源管理,自己接管屏幕亮度的控制。

当然还有更多的逻辑细节处理,只能耐着性子去研究了。。

通过对本次锁屏界面的处理,才发现自己对View绘制还是不熟透,很多东西也没有去潜心研究,导致自己在

真正做项目时候才手忙脚乱的。因此,借着这次机会,也把Android 4.0 developer这些先进的知识(山人一直

沉浸在Android 2.2中)给过了一下,真是妙处多多。

开头: 为了避免歧义,先将Android “Layout”一次的意思进行说明,主要有如下三个方面:

1、统称,即如何摆放UI,UI呈现效果等;

2、布局文件  ,即/res/layout/xxx.xml  ;

3、布局过程  ,Android绘制过程中的 layout过程;

4、一些布局控件,例如LinearLayout、FrameLayout等 ;

正文:

改善布局效率(Layout Performace)

本文翻译地址:http://developer.android.com/training/improving-layouts/index.html

布局是Android应用程序重要的一部分,它与用户体验有着直接联系。如果一个布局是糟糕的,它将产生一个

消耗内存与低效UI应用程序。 Android SDK 及它包含的工具都能帮助你定位在布局过程中隐藏的问题,通过对

这些课程的学习,你能够以很小的内存代价去实现流畅的平滑界面。

课程如下:

1 、优化布局层次

同样地,一个复杂的网页会延长加载时间,你的布局层次如果太复杂也能引发一些效率问题。本课程

告知你如何利用 SDK的工具去观察你的布局以及发现布局过程的瓶颈问题。

2、使用<include />标签复用布局文件

如果应用程序的UI在多处重复某些布局结构,本课程向你展示如何创建高效、可重用的布局结构,然后

以合适的 UI布局文件包含它们。

3、按需加载View视图

除了简单地在另外的布局文件中包括一个布局组件,你可能想在需要的时候才将视图显现出来,有的时候

是在Activity运行之后。本课程告诉你如何改进布局初始化行为---- 按需加载布局文件的某个视图。

4、如何使ListView流畅滑动

如果你构建了一个ListView实例呈现那些包含复杂或者大容量数据的列表项,这可能会影响ListView的流畅

滑动。本课程提供了一些如何让滑动过程更加流畅的建议。

译一 :

优化布局层次

本文地址: http://developer.android.com/training/improving-layouts/optimizing-layout.html

一个通常的错误观念就是使用基本的布局结构(例如:LinearLayout、FrameLayout等)能够在大多数情况下

产生高效率 的布局。 显然,你的应用程序里添加的每一个控件和每一个布局都需要初始化、布局(layout)、

绘制 (drawing)。举例来说:嵌入一个LinearLayout会产生一个太深的布局层次。更严重的是,嵌入几个使

用 layout_weight属性的LinearLayout 将会导致大量的开销,因为每个子视图都需要被测量两次。这是反复解析

布局文件时重要的一点,例如在ListView或者GridView中使用时。

 

 观察你的布局

 

     Android SDK 工具箱包括一个称作“ Hierarchy Viewer”的工具,它允许你去在你的应用程序运行时分析

布局。通过使用这个工具,能帮助你发现你的布局效率上的瓶颈问题。

 

     “ Hierarchy Viewer”工具允许你在已连接的设备或模拟器中选择正在运行的进程,然后呈现出布局层次树

(layout tree)。每个正方块下的交通灯(见下图) --- 红绿蓝表现出了在测量(measure)、布局(layout)、以及绘制

(draw)过程中的效率值,这能帮助你定位潜在的问题。

 

假设ListView 中的一项Item 存在如下(见图 1)布局 :

                                 Android中View绘制优化之一---- 优化布局层次

                                        图1:ListView某项Item的布局效果图

     “Hierarchy Viewer工具可以在 <sdk>/tools路径下找到。当打开它时,“ Hierarchy Viewer”工具显示了

所有可用的设备以及运行在这些设备上的进程。点击”Load View Hierarchy”来显示某个你选择的组件的UI布局

层次。举例来说,图2展现了图1的布局层次树。

                             Android中View绘制优化之一---- 优化布局层次

                                           图2:使用LinearLayout的布局树

 

      在图2中,你可以直观看到这个三层的布局结构是存在一些问题的。点击项体现出了在每个测量(measure)、

布局(layout)、以及绘制(draw)过程中的时间消耗(见图3)。很明显,该项(LinearLayout)花费了最长的时间去

测量、布局、绘制,你应该花点精力去优化它们。

Android中View绘制优化之一---- 优化布局层次

图3: 某个LinearLayout的绘制时间

 

     完成该布局文件渲染的时间分别为:

测量过程:0.977ms

布局过程: 0.167ms

绘制过程:2.717ms

 

 修改布局文件

 

       由于上图中布局效率的低下是因为一个内嵌的 LinearLayout控件,通过扁平化布局文件----让布局变得

更浅更宽,而不是变得更窄更深层次 ,这样就能提升效率了。 一个RelativeLayout 作为根节点也能提供如上

的布局效果(即图1)。 因此,  使用RelativeLayout 改变布局的设计,你可以看到现在我们的布局层次只有2层了。

新的布局层次树如下:

                         Android中View绘制优化之一---- 优化布局层次

                                    图4:使用RelativeLayout的布局树

 

现在,完成该布局文件渲染的时间分别为:

测量过程:0.977ms

布局过程:0.167ms

绘制过程:2.717ms

   

也许它只是一点点微小的改进,但这次它会被多次调用,因为是ListView会布局所有的Item,累积起来,

改进后效果还是非常可观地。

大部分的时间差异是由于使用了带有layout_weight 属性的LinearLayout ,它能减缓测量过程的速度。这仅仅

是一个例子,即每个布局都应该合适地被使用以及你应该认真考虑是否有必要采用“layout_weight" 属性。

 

使用Lint工具 (译者注:ADT插件更新到最新的16.0后的工具)

 

       关于Lint的使用更多请看:Android Lint(官方代码优化利器)

     

一个好的实践就是在你的布局文件中使用Lint工具去寻求可能优化布局层次的方法。Lint已经取代了Layoutopt

工具并且它提供了更强大的功能。一些Lint规则如下:

1、使用组合控件 --- 包含了一个  ImageView 以及一个 TextView 控件的 LinearLayout 如果能够作为一个

组合控件将会被更有效的处理。

关于这点,更多请看:  http://*.com/questions/8318765/how-do-i-use-a-compound-drawable-instead-of-a-linearlayout-that-contains-an-imag

 

 2、合并作为根节点的帧布局(Framelayout)  ----如果一个帧布局时布局文件中的根节点,而且它没有背景图片

或者padding等,更有效的方式是使用<merge />标签替换该< Framelayout />标签 。

          关于这点,更多请看 : <<android merge之布局>>

 <<Android里merge和include标签的使用>>

                                        

 3、无用的叶子节点----- 通常来说如果一个布局控件没有子视图或者背景图片,那么该布局控件时可以被移除

(由于它处于 invisible状态)。

 

 4、无用的父节点 -----  如果一个父视图即有子视图,但没有兄弟视图节点,该视图不是ScrollView控件或者

根节点,并且它没有背景图片,也是可以被移除的,移除之后,该父视图的所有子视图都直接迁移至之前父视图

的布局层次。同样能够使解析布局以及布局层次更有效。

 

 5、过深的布局层次  ----内嵌过多的布局总是低效率地。考虑使用一些扁平的布局控件,例如 RelativeLayout、

GridLayout ,来改善布局过程。默认最大的布局深度为10 。

 

 

当使用Eclipse环境开发时,Lint能够自动解决一些问题,提供一些建议以及直接跳转到出错的代码中去核查。

如果你没有使用Eclipse,Lint也可以通过命令行的方式运行。更多关于Lint的可用信息请参看:《Android Lint》  

 

 

      Hi  ~~~

Android中View绘制优化之一---- 优化布局层次的更多相关文章

  1. Android中View绘制流程以及invalidate&lpar;&rpar;等相关方法分析

    [原文]http://blog.csdn.net/qinjuning 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简 ...

  2. Android中View绘制流程以及invalidate&lpar;&rpar;等相关方法分析(转载的文章,出处在正文已表明)

    转载请注明出处:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时 ...

  3. Android中View绘制流程以及invalidate&lpar;&rpar;等相关方法分析(转)

    转自:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴 ...

  4. Android中View的layout mechanism(布局机制)

    layout mechanism Android中View的layout mechanism主要分为两个阶段:measure阶段和layout阶段.layout mechanism按照一定的顺序进行, ...

  5. Android中View绘制优化二一---- 使用&lt&semi;include &sol;&gt&semi;标签复用布局文件

    本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning   译二:   使用<include />标签复用布局文件      翻译地址:http://de ...

  6. Android中View绘制优化之三---- 优化View

    本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 译三: 优化视图 关于如何设计自定义View以及响应触摸时间等,请看Android developer : 地 ...

  7. Android中View绘制优化

    1.优化布局层次 http://www.2cto.com/kf/201209/154108.html 2.使用<include />标签复用布局文件 http://www.2cto.com ...

  8. 【转载】Android 中 View 绘制流程分析

    创建Window 在Activity的attach方法中通过调用PolicyManager.makeNewWindo创建Window,将一个View add到WindowManager时,Window ...

  9. Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

    Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...

随机推荐

  1. Boost学习笔记(六) progress&lowbar;display注意事项

    progress_display可以用作基本的进度显示,但它有个固有的缺陷:无法把进度显示输出与程序的输出分离. 这是因为progress_display和所有C++程序一样,都向标准输出(cout) ...

  2. 如何使用JCONSOLE 监控eclipse的tomcat

    在默认情况下,使用jconsole 监控本地tomcat 是不需要任何配置的,直接连接就可以监控tomcat.   但是在eclipse 下启动是监控不了.   解决方法:   设置jvm参数:   ...

  3. wifi详解(五)

    1        Android平台的Wifi模块移植要点 1.1      Wifi结构 user interface Android WiFiService WPA_Supplicant DHD ...

  4. (转)VS2012网站发布详细步骤

    2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 4. 在配置中,要选择“Release”——发布模式(Release   称为发布版本,它往往是进行了各种优化,使得程序 ...

  5. 解决mybatis空字段null字段不返回

    Mybatis在使用resultMap来映射查询结果中的列,如果查询结果中包含空值的列(不是null),则Mybatis在映射的时候,不会映射这个字段,例如 查询 name,sex,age,数据库中的 ...

  6. inception v1-v3 &amp&semi; Xception

    inception v1-v3:通过多尺度卷积核学习不同尺度的空间信息并进行耦合:通过多个小卷积核来代替大卷积核的功能从而降低计算量: 通常,在一组特征图上进行卷积需要三维的卷积核,也即卷积核需要同时 ...

  7. Android学习之Spinner

    Android给我们提供了一个spinner控件,这个控件主要就是一个列表,那么我们就来说说这个控件吧,这个控件在以前的也看见过,但今天还是从新介绍一遍吧.Spinner位于 android.widg ...

  8. linux查找系统中占用磁盘空间最大的文件

    Q:下午有一客户磁盘空间占用很大,使用df查看磁盘剩余空间很小了,客户想知道是哪些文件占满了文件. Q1:在Linux下如何查看系统占用磁盘空间最大的文件? Q2:在Linux下如何让文件夹下的文件让 ...

  9. 在一个jsp页面中引用另一个jsp文件的路径的问题

    为了提高代码的重用性,经常需要在一个jsp页面中引用另一个jsp文件的代码.关于引用时的路径的问题.下面只介绍动态引用的,我觉得静态引用的应该也一样. 相对路径: 一.在同一个文件夹下,a.jsp中引 ...

  10. JMeter性能测试的基础知识和个人理解

    JMeter性能测试的基础知识和个人理解 1. JMeter的简介   JMeter是Apache组织开发的开源项目,设计之初是用于做性能测试的,同时它在实现对各种接口的调用方面做的比较成熟,因此,常 ...