在进行Android应用开发时,界面优化问题至关重要,它严重影响了应用的加载效率,今天我简单谈论一下Android开发中UI界面的优化问题。
添加到应用中的每一个布局和控件都需要经过初始化、排列位置、绘制三个过程。
通常遇到的问题:比如说,使用嵌套的线性布局可能导致你的布局层级变得十分冗余。此外,如果在嵌套的线性布局中使用了 layout_weight 参数的话,那么他的每一个子 view 都需要被重新测量两次。特别是当他们被用在 ListView 和 GridView 中时,他们会被反复的测量。
可以使用Hierarchy Viewer 以及 Layoutopt来检测(可以查看UI生成树)和优化我们布局,对于工具的具体用法在这里不细说了。
总的来说,要想优化界面,通常的可以使用的方法是:
1、 优化布局层次,尽可能使界面扁平化。
通过修改ui布局来减少界面嵌套层次。例如:多使用相对布局来设计界面。
2、 使用标签。
<merge/>
当LayoutInflater遇到<merge/>标签时,它会跳过它,并将<merge />内的元素添加到<merge />的父元素里。
<merge/>只能作为XML布局的根标签使用,只能替换<FrameLayout/>
当Inflate以<merge/>开头的布局文件时,必须指定一个父ViewGroup,并且必须设定attachToRoot为true。参看LayoutInflater.inflate(int resource, ViewGroup root, booleanattachToRoot)。
<include/>
标签内不能设置RelativeLayout属性,如android:layout_alignParentBottom,因为不起作用
include标签内设置id属性后(android:id),其引用的布局layout内的id属性就不起作用了,怀疑是其引用的layout外层包裹了一层include标签或者是覆盖了其内的属性id
如果没有include标签,所有布局代码都写在一个xml文件中,界面会显得很冗余,可读性很差。而且界面加载的时候是按照顺序加载的,前面的布局不能调用其后面的布局id。而采用include后,一个include中可以引用其后的include中的布局id属性
3、按需加载View视图。
使用< ViewStub />标签来加载一些不常用的布局。
ViewStub:可以理解成一个非常轻量级的View,有着自己的属性及特定的方法。当ViewStub使用在布局文件中时,当程序inflate布局文件时,ViewStub本身也会被解析,且占据内存控件,但是与其他控件相比,主要区别体现在以下几点:
1.当布局文件inflate时,ViewStub控件虽然也占据内存,但是相相比于其他控件,ViewStub所占内存很小;
2.布局文件inflate时,ViewStub主要是作为一个“占位符”的性质,放置于view tree中,且ViewStub本身是不可见的。ViewStub中有一个layout属性,指向ViewStub本身可能被替换掉的布局文件,在一定时机时,通过viewStub.inflate()完成此过程;
3.ViewStub本身是不可见的,对ViewStub setVisibility(..)与其他控件不一样,ViewStub的setVisibility成View.VISIBLE或INVISIBLE如果是首次使用,都会自动inflate其指向的布局文件,并替换ViewStub本身,再次使用则是相当于对其指向的布局文件设置可见性。
上面简单谈论了一下布局优化的方法和部分方法的简介,作为概述,没有深入研究。若有不足之处,还请批评指正。