Optimizing Layout Hierarchies [优化Layout层级]
-
【Layout是Android程序影响用户体验最关键的一部分。如果布局文件不好会使得程序比较卡。SDK里面包含了一些工具用来帮助我们发现布局文件的性能问题】
-
【这里有一个共同的误区:使用基本的Layout结构是最有效的。但是,每一个添加到系统的组件都需要初始化,进行布局,绘制的过程。比如,使用在LinearLayout里面使用子组件会导致一个过于deep的层级结构。而且内嵌使用包含layout_weight属性的LinearLayout会在绘制时花费昂贵的系统资源,因为每一个子组件都需要被测量两次。在使用ListView与GridView的时候,这个问题显的尤其重要,因为子组件会重复被创建】
这一课我们会学习使用Hierarchy Viewer andLint 来检查并最优化布局文件。
Inspect Your Layout[查看Layout]
Android SDK里面包含了一个叫做Hierarchy Viewer的工具,在程序运行的时候分析布局文件,从而找住性能瓶颈
连接上设备,打开Hierarchy Viewer(定位到tools/目录下,直接执行hierarchyviewer的命令,选定需要查看的Process,再点击Load View Hierarchy会显示出当前界面的布局Tree。在每个模块的Traffic light上有三个灯,分别代表了Measure, Layout and Draw三个步骤的性能。
Figure 1. ListView每个Item的常见布局.
Figure 2. 上面显示了对应与图片1的布局层级信息.可以看到中间LinearLayout的Measure的灯是红色的,这就是因为上面说到的:使用内嵌layout_weight的属性的LinearLayout会导致测量时花费了双倍的时间。
Figure 3. 点击某个模块会显示具体每个步骤所花费的时间。
Revise Your Layout [修改你的Layout]
【使得Layout宽而浅,而不是窄而深(在Hierarchy Viewer的Tree视图里面体现)】
上面的布局我们可以使用RelativeLayout来替代LinearLayout,从而实现shallow and wide.
Figure 4. 改用RelativeLayout来实现图片1的布局。
可以看到这是一个小的优化,可是这带来的效果是明显的,因为在ListView里面会出现很多这样的布局。
导致前面的case会出现花费时间比较多的愿意是使用了layout_weight在LinearLayout。我们需要仔细评估到底是否需要使用那样的
布局,尽量避免使用layout_weight。
Use Lint [使用Lint]
Lint是一款在ADT 16才出现用来替代layoutopt的新型工具,具有更强大的功能。
Lint的使用规则如下:
-
Use compound drawables - A
LinearLayout
which contains an ImageView
and a TextView
can be more efficiently handled as a compound drawable.
-
【使用compound drawables - 一个包含了ImageView与TextView的LinearLayout可以被当作一个compound drawable来处理】
-
Merge root frame - If a
FrameLayout
is the root of a layout and does not provide background or padding etc, it can be replaced with a merge tag which is slightly more efficient.
- 【使用merge根框架 - 如果FramLayout仅仅是一个纯粹的(没有设置背景,间距等)布局根元素,我们可以使用merge标签来当作根标签】
-
Useless leaf - A layout that has no children or no background can often be removed (since it is invisible) for a flatter and more efficient layout hierarchy.
- 【无用的分支 - 如果一个layout并没有任何子组件,那么可以被移除,这样可以提高效率】
-
Useless parent - A layout with children that has no siblings, is not a
ScrollView
or a root layout, and does not have a background, can be removed and have its children moved directly into the parent for a flatter and more efficient layout hierarchy.
- 【无用的父控件 - 如果一个layout只有子控件,没有兄弟控件,并且不是一个ScrollView或者根节点,而且没有设置背景,那么我们可以移除这个父控件,直接把子控件提升为父控件】
-
Deep layouts - Layouts with too much nesting are bad for performance. Consider using flatter layouts such as
RelativeLayout
or GridLayout
to improve performance. The default maximum depth is 10.
- 【深层次的layout - 尽量减少内嵌的层级,考虑使用更多平级的组件
RelativeLayout
or GridLayout来提升布局性能,默认最大的深度是10
】
Eclipse会自动运行Lint的工具,并给出相应的提醒,不管是在导出APK,编辑,保存XML还是在使用layout编辑器的时候。如果想
强制运行,请参看上面的图标,点击运行。
如果没有安装ADT 16,需要在命令行中执行。
分享到:
相关推荐
Lesson10-1.pdf涵盖了MQL4的高级特性,如多线程、动态内存管理和DLL调用。这些内容将帮助你开发更强大、更灵活的交易系统。 总的来说,这个MQL4开发课程是一条从入门到精通的学习路径,通过学习,交易者不仅可以...
在Lesson 1的“课程介绍”中,特权同学首先会讲解FPGA的基本概念,包括什么是FPGA,它的特性、优势以及在电子设计中的重要地位。此外,还会介绍FPGA开发环境和常用工具,如Xilinx的Vivado或Intel的Quartus II,以及...
Lesson1---TinyOS入门.ppt
新概念英语第一册lesson25-26_精品课件PPT课件.pptx
Lesson---Xsteel-Batch-File-Setup.doc
深度学习与PyTorch入门实战视频教程 配套源代码和PPT深度学习与PyTorch入门实战视频教程 配套源代码和PPT深度学习与PyTorch入门实战视频教程 配套源代码和PPT深度学习与PyTorch入门实战视频教程 配套源代码和PPT深度...
opengl简单教程前五课pdf,
本视频教程“OpenGL简单视频教程Lesson1-Lesson5”涵盖了初学者必须掌握的基本概念和技术,帮助他们踏入这个充满可能性的世界。在这个教程中,我们将深入探讨以下几个关键知识点: 1. **OpenGL安装与环境配置**: ...
这篇文档是针对五年级学生设计的一份英语学习资料,涵盖了冀教版五年级下学期Lesson 9和Lesson 10的精选习题。这些习题旨在帮助学生巩固和提升他们的英语听说读写能力,同时也注重培养他们的实际应用能力。 在...
Lesson11---TOSSIM仿真.ppt
Lesson 1到20的PDF版涵盖了该课程的初期阶段,旨在提供全面的基础知识,帮助初学者逐步建立起对ODI的理解。 Oracle Data Integrator(ODI)是一款强大的ETL(提取、转换、加载)工具,用于企业级的数据整合项目。它...
lesson03-简单回归案例pytorchlesson03-简单回归案例pytorchlesson03-简单回归案例pytorchlesson03-简单回归案例pytorchlesson03-简单回归案例pytorchlesson03-简单回归案例pytorchlesson03-简单回归案例...
四年级英语上册 Lesson 1-Lesson 24教案 冀教版.doc
Lesson5---传感检测.ppt 学习tinyos经典例程讲解
新概念英语第一册Lesson 55-56的PPT课件主要涵盖了英语的基本语法和词汇,特别是关于家庭日常生活活动的表达。以下是其中的核心知识点: 1. 时间表达法: - "When does mother visit her friends?" 这句话展示了...
Lesson4---串口通信与SerialForwarder.ppt
显示列表 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53823 Lesson 13-lesson 14 图像字体 图形字体 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53880 Lesson 15-lesson 16 图形字体的纹理映射 雾 ...
ML-lesson3-Scikit-learn.mhtml
显示列表 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53823 Lesson 13-lesson 14 图像字体 图形字体 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53880 Lesson 15-lesson 16 图形字体的纹理映射 雾 ...
新概念英语第一册Lesson15--16PPT课件.pptx