当前位置: 首页 > 科技观察

Android布局优化

时间:2023-03-12 07:01:19 科技观察

布局原则在AndroidUI布局过程中,通过遵循一些惯用且有效的布局原则,我们可以创建高效且高度可重用的UI。一般来说,包括以下几点:尽量使用RelativeLayout和LinearLayout,不要使用绝对布局AbsoluteLayout,在布局层次相同的情况下,推荐使用LinearLayout而不是RelativeLayout,因为LinearLayout的性能是稍微高一点,但往往RelativeLayout可以简单的实现只能嵌套LinearLayout才能实现的布局。提取可复用组件,通过include标签使用;使用ViewStub标签加载一些不常见的布局;使用合并标签减少布局的嵌套层次;RelativeLayoutVSLinearLayout的第一个原则说的是布局层级相同下面的LinearLayout比RelativeLayout好,但是往往RelativeLayout可以简单的实现那些只能嵌套LinearLayout才能实现的布局。假若需要现实如下布局:用LinearLayout来现实xml代码如下:而用RelativeLayout实现代码如下:可以看到是用RelativeLayout实现的,布局层级明显少了,所以大部分时候推荐使用RelativeLayout查看布局层次毛布如何查看布局层次?有两种方式:一种是通过手机的开发者选项。对于Android4.0及以上版本,可以通过Settings->DeveloperOptions->ShowLayoutBoundary开启页面布局显示,查看是否有不必要的节点和嵌套。二是使用SDK自带的UI性能检测工具HierarchyViewer。进入sdk目录下的tools文件夹,找到HierarchyViewer并运行(让你的模拟器或真机运行需要分析的app),双击我们显示的app代表的进程。接下来,我们将进入hierarchyviewer界面,在这里我们可以清楚的看到运行UI的布局层次以及它们之间的关系。大体展示如下:通过布局图,我们可以看到根节点DecorView包含了一个LinearLayout。这个LinearLayout是包括Activity布局和状态栏在内的整个屏幕显示的布局父节点。这个LinearLayout有两个子节点,一个是FrameLayout,FrameLayout是Activity布局中默认的父布局节点。该节点包含我们自己编写的xml布局。还有一个子节点就是ViewStub。我们稍后会详细介绍这个节点。的使用在实际开发中,我们经常会遇到一些常见的UI组件,比如带有返回按钮的导航栏。如果对每个xml文件都设置这部分布局,一是工作量大,二是如果有变化,每个xml文件都要修改。幸运的是,Android为我们提供了include标签。顾名思义,通过它,我们可以将这些共享组件提取出来,放到一个xml文件中,然后使用include标签导入共享布局。这样,上面提到的两个问题都解决了。下面是在一个布局main.xml中使用include引入另一个布局header.xml的例子。header.xml文件:layout_height="match_parent"><按钮android:id="@+id/button"android:layout_width="match_parent"android:layout_height="@dimen/dp_40"android:layout_above="@+id/text"/>然后我们在需要引入footer的布局xml中通过include导入这个普通布局。main.xml文件:layout_height="wrap_content"android:text="helloworld"/>这样一来,我们既可以提高UI制作和复用的效率,又可以保证制作出来的UI布局更加规整,易于维护。使用合并标签的作用是合并UI布局。使用这个标签可以减少UI布局的嵌套层次。merge标签可以在两种典型情况下使用:布局的根节点是FrameLayout,不需要设置background或padding属性。可以改用merge,因为Activity内容布局的父视图是一个FrameLayout,所以可以用merge只消掉一个。从上图可以看出这一点。当一个布局被其他布局作为子布局包含时,使用merge作为布局的顶级节点,这样引入时顶级节点会自动忽略,其所有子节点都会合并到主布局中.以第一种情况为例,main.xml布局可以优化如下:mergexmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent">以第二种情况为例,header.xml布局可以优化如下:会有是多余的FrameLayout和RelativeLayout节点,ViewStub标签和include标签一样,可以用来引入外部布局,不同的是viewstub引入的布局默认不会展开,即不会占用显示也不会占用位置。从而在解析布局时节省cpu和内存。viewstub常用于引入默认不显示,仅在特殊情况下显示的布局,例如进度布局,网络故障显示的刷新布局,并提示排版信息错误。我们新建一个xml文件来显示网络错误信息error.xml:...传入java(ViewStub)findViewById(id)找到ViewStub,通过stub.inflate()展开ViewStub,然后得到子View,如下:privateViewerrorView;privatevoidshowError(){//notrepeatedinfalteif(errorView!=null){errorView.setVisibility(View.VISIBLE);返回;}ViewStubstub=(ViewStub)findViewById(R.id.error_layout);errorView=stub.inflate();}privatevoidshowContent(){if(errorView!=null){errorView.setVisibility(View.GONE);}}在上面的showError()中扩展了ViewStub,我们把errorView保存下来,这样下次就不用继续inflate了。总结本篇博客没有详细介绍HierarchyViewer工具的使用,相信如果你对布局原则更加熟练,你对工具的依赖就会大大减少,开发效率会大大提高。另外除了这些布局原则,你还需要熟悉Android组件的属性。比如要做这样一个布局,一个图片一个文字的布局,新手往往使用一个Layout嵌套ImageView和TextView来做,但是当我们知道TextView有drawableLeft,drawableRight等属性时,就非常快了并且高效地实现这样的布局。简而言之,学习和实践!