Android布局及代码优化

零、Android布局渲染原理

1、setContentView方法设置布局资源。

2、布局加载的过程中使用到了一个布局加载器:LayoutInflater。

3、Android去解析和展示一个布局是需要消耗时间的,布局嵌套的越多,那么解析起来就越耗时,性能也就越差,因此我们在编写布局文件时应该让嵌套的层数越少越好。

一、重用布局文件

Android系统中提供了非常多的控件,这让我们在编写布局的时候可以很轻松。但是有些时候我们可能需要反复利用某个已经写好的布局,如果你总是使用复制粘贴的方式来进行布局重用,这显然是一种很笨的做法。因此Android考虑到了布局重用的重要性,提供了<include>和<merge>这两个非常有用的标签。

include 标签

include标签可以允许在一个布局当中引入另外一个布局。

比如说程序的所有界面都有一个公共的部分,这个时候最好的做法就是将这个公共的部分提取到一个独立的布局文件当中,然后在每个界面的布局文件当中来引用这个公共的布局。

举例:所有页面的通用标题栏

merge标签

1、include标签的缺点:非常容易造成多余的布局嵌套。

View Hierarchy工具:在实际的开发过程中,我们可以通过来查看自己页面布局的一个复杂度。

2、解决方案merge标签是作为include标签的一种辅助扩展进行使用。它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。

二、布局按需加载

某个布局当中的元素非常多,但并不是所有元素都一起显示出来的,而是普通情况下只显示部分常用的元素,而那些不常用的元素只有在用户进行特定操作的情况下才会显示出来。

Android提供了一种轻量级的控件:ViewStub。ViewStub虽然也是View的一种,但是它没有大小,没有绘制功能,也不参与布局,资源消耗非常低,将它放置在布局当中基本可以认为是完全不会影响性能的。

三、使用约束布局ConstraintLayout

前文已经介绍过几种常见的UI布局,在Android9以后提供了约束布局。目前新建Android项目,生成的布局文件,默认也是约束布局。因此,可以在进行布局的时候,使用约束布局来进行控件的摆放,和约束条件的限制。

优点:可以通过布局文件的可视化的视图,按照简单粗暴的"拖拉拽"的形式进行控件的摆放,和位置的约束,前文已经演示和介绍过,此处不再赘述。

四、常用UI布局的特点

Android布局渲染原理:Android每个视图的显示,需要经过测量(Measure)、布局(Layout)、绘制(View)三个步骤和过程。因此布局的复杂程度,布局的嵌套深度都会影响UI视图的绘制和流畅度。

  • LinearLayout线性布局的weight属性,会引起视图的重新测量。
  • 常见的LinearLayout和RelativeLayout布局相比,完成相同效果,Linearlayout往往嵌套层级会过多,RelativeLayout相对可以减少嵌套的层数。
  • 视图可见性的设置:视图的隐藏与展示,有visible、invisible和gone三个可选值。使用gone属性值时,视图不再占用空间,此时会引起视图的重新测量、布局和绘制;invisible属性值仅仅是改变可变性,仍然占用空间位置,因此,不会引起布局的重新测量和绘制。推荐invisible。

五、Android Studio布局优化工具

Layout Inspector:通过该工具可以查看布局层级,方便开发者优化布局层级嵌套。

Lint:Android Studio 提供一个名为Lint的静态代码扫描工具,可以发现并纠正代码结构中的质量问题,而无需实际执行该应用,也不必编写测试用例。Lint 工具可检查 Android 项目源文件是否包含潜在错误,以及在正确性、安全性、性能、易用性、便利性和国际化方面是否需要优化改进。