`

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

 
阅读更多

 

 

 

本文原创, 转载请注明出处 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中使用时。


观察你的布局

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

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

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

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

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

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


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


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

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

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


图2:使用LinearLayout的布局树


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

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

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


图3: 某个LinearLayout的绘制时间


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

测量过程:0.977ms

布局过程:0.167ms

绘制过程:2.717ms

修改布局文件

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

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

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

新的布局层次树如下:


图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://stackoverflow.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 绘制机制的详解

    当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw。整个 View 树的绘图流程在ViewRoot.java类的performTraversals()函数展开...

    Android应用开发中View绘制的一些优化点解析

    举例来说:嵌入一个LinearLayout会产生一个太深的布局层次。更严重的是,嵌入几个使  用 layout_weight属性的LinearLayout 将会导致大量的开销,因为每个子视图都需要被测量两次。这是反复解析  布局文件时重要的...

    Android View 绘制流程(Draw)全面解析

    测量流程决定了View的大小,布局流程决定了View的位置,那么绘制流程将决定View的样子,一个View该显示什么由绘制流程完成。以下源码均取自Android API 21。 从performDraw说起 前面几篇文章提到,三大工作流程始于...

    Android布局性能优化之按需加载View

    ViewStub是一个轻量级的View,它没有高宽,也不会绘制任何东西。所以它的加载与卸载的成本很低。每个ViewStub都可以使用android:layout属性指定要加载的布局。 下面这个ViewStub用于一个半透明的ProgressBar的加载。...

    深入理解Android中View绘制的三大流程

    主要给大家介绍了关于Android中View绘制的三大流程,View的工作流程主要是指measure、layout、draw这三大流程,即测量、布局和绘制,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--view中的tag用法之存储对象 |--view常用属性 |--xml常用属性 |--xml文件的pull解析与序列化写入 |--xml的封装序列化 |--任务循环之只在Activity显示时执行 |--修改文件的最后修改时间 |--偏好设置(回显) |--内存...

    新版Android开发教程.rar

    这一联盟将会支持 Google 发布的 Android 手机操作系统或者应用软件,共同开发名为 Android 的 开 放源代码的移动系统。开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了...

    浅谈Android View绘制三大流程探索及常见问题

    View绘制的三大流程,指的是measure(测量)、layout(布局)、draw(绘制) measure负责确定View的测量宽/高,也就是该View需要占用屏幕的大小,确定完View需要占用的屏幕大小后,就会通过layout确定View的最终宽/...

    Android Studio实现个人记账系统源码.zip

    项目重要技术点: 1-绘制布局,掌握android基本view控件的属性和使用 2-熟练掌握Activity页面展示,跳转和传值 3-使用碎片加载界面,滑动视图切换页面 4-自定义对话框 5-自定义软键盘绘制和使用 6-列表视图以及网格...

    基于Android Studio开发的个记账工具APP源码,Android 个人记账APP源码

    项目重要技术点: 1-绘制布局,掌握android基本view控件的属性和使用 2-熟练掌握Activity页面展示,跳转和传值 3-使用碎片加载界面,滑动视图切换页面 4-自定义对话框 5-自定义软键盘绘制和使用 6-列表视图以及网格...

    word源码java-Android-Interview-Gathered:Android-面试-集结

    使用ViewStub减少隐藏View的绘制 Android的几种缓存方法 内存缓存(使用LruCahe类,least recent used, 通过键值对的形式将对象储存在内存中,满了以后自动提出最不常用的对象) 磁盘缓存(使用DiskLurCache,数据库...

    Android代码-FloatingView

    View布局结构 外面一个WarpFloatView 里面一个FloatView 事件处理 WrapFloatView处理长按、点击事件 FlatView处理move事件,并判断拖拽方向 绘制解析 该效果中有两个圆球,这里定义为Ball类,有两个继承类: ...

    Android应用开发揭秘pdf高清版

    C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为值得一提的是,它还以迭代的方式重现了各种...

    android View视图的绘制

    自定义的view,可以放在xml文件中和自带的控件一样的布局。有折线图、柱状图和饼图

    wxml2canvas微信根据wxml绘制海报

    ##根据wx.createSelectorQuery()获取wxml...3.data-change-top设置字在view布局的高度,可根据手机平台设置 部分机型ios高度比android略高 ##wx.createCanvasContext绘制海报,而不是canvas2d绘制海报,海报高度没限制

    如何让安卓(Android)子控件超出父控件的范围显示

    android:layout_width=match_parent android:layout_height=match_parent android:clipChildren=false&gt; &lt;ImageView android:layout_width=match_parent android:layout_height=match_parent an

    Android开发艺术探索

    《Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些...

    android-openGL-canvas:一个Android库,提供使用openGL画布在SurfaceView或TextureView上绘制内容的视图

    项目应用功能提供一个类似Android Canvas类的使用OpenGL来实现实现的canvasGL。可以像传统自定义View那样直接继承GLViews,再使用这个canvas替换需要的东西。提供类似GPUImage里的Filter的API,可以在使用画布GL画...

Global site tag (gtag.js) - Google Analytics