优化布局层次结构

使用基本布局结构导致最有效的布局是一种常见的误解。
但是,添加到应用程序的每个窗口小部件和布局都需要初始化,布局和绘图。
例如,使用LinearLayout的嵌套实例可能会导致视图层次结构过深。
此外,嵌套使用layout_weight参数的多个LinearLayout实例可能特别昂贵,因为每个子项需要测量两次。 当布局重复膨胀时(例如在ListViewGridView中使用时),这一点尤其重要。

在本课程中,您将学习如何使用Hierarchy ViewerLint来检查和优化布局。

一、检查您的布局

Android SDK工具包含一个名为Hierarchy Viewer的工具,允许您在应用程序运行时分析布局。 使用此工具可帮助您发现布局性能的瓶颈。

层次结构查看器的工作原理是允许您在连接的设备或模拟器上选择正在运行的进程,然后显示布局树。 每个街区的交通灯代表其测量,布局和绘图性能,帮助您识别潜在问题。

例如,图1显示了用作ListView中项目的布局。 此布局在左侧显示一个小位图图像,在右侧显示两个堆叠的文本项。 特别重要的是,将多次膨胀的布局(例如此布局)进行优化,因为性能优势将成倍增加。

图1. ListView中项目的概念布局。

层次结构查看器显示可用设备及其运行组件的列表。 从Windows选项卡中选择组件,然后单击“层次结构视图”以查看所选组件的布局层次结构。 例如,图2显示了图1所示的列表项的布局。

图2.使用LinearLayout的嵌套实例的图1中布局的布局层次结构。

二、修改你的布局

由于嵌套的LinearLayout导致上面的布局性能变慢,因此通过展平布局可以提高性能 - 使布局浅而宽,而不是窄而深。 作为根节点的RelativeLayout允许这样的布局。 因此,当将此设计转换为使用RelativeLayout时,您可以看到布局变为2级层次结构。 检查新布局如下所示:

图4.使用RelativeLayout的图1中布局的布局层次结构。

由于这种布局用于列表中的每个项目,因此它们的好处尽可能小。

大部分差异是由于在LinearLayout设计中使用layout_weight,这会降低测量速度。 这只是每个布局如何具有适当用途的一个示例,您应该仔细考虑是否需要使用布局权重。

在一些复杂的布局中,系统可能浪费多于一次测量相同UI元素的工作量。 这种现象称为双重征税。 有关双重征税以及如何防止双重征税的详细信息,请参阅“绩效”和“查看层次结构”。

三、使用Lint

在布局文件上运行lint工具以搜索可能的视图层次结构优化始终是一种好习惯。 Lint取代了Layoutopt工具并具有更多功能。 一些例子:

  • 使用复合drawable - 包含ImageViewTextViewLinearLayout可以作为复合drawable更有效地处理。

  • 合并根框架 - 如果FrameLayout是布局的根,并且不提供背景或填充等,则可以使用稍微更高效的合并标记替换它。

  • 无用的叶子 - 对于更平坦和更有效的布局层次结构,通常可以删除没有子项或没有背景的布局(因为它是不可见的)。

  • 无用的父级 - 具有没有兄弟姐妹的子级的布局,不是ScrollView或根布局,并且没有背景,可以删除并将其子项直接移动到父级以获得更平坦和更高效的布局层次结构。

  • 深度布局 - 嵌套太多的布局对性能不利。 考虑使用更平坦的布局(如RelativeLayout或GridLayout)来提高性能。 默认最大深度为10。

Lint的另一个好处是它已集成到Android Studio中。 无论何时编译程序,Lint都会自动运行。 使用Android Studio,您还可以针对特定构建变体或所有构建变体运行lint检查。

您还可以使用“文件”>“设置”>“项目设置”选项管理检查配置文件并在Android Studio中配置检查。 将显示“检查配置”页面,其中包含支持的检查。

图5.检查配置

Lint能够自动修复某些问题,为其他人提供建议并直接跳转到违规代码以供审核。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容