码迷,mamicode.com
首页 > 其他好文 > 详细

New UI-关于布局优化集锦

时间:2015-02-01 13:35:07      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:android   布局   优化   ui   coder-pig   

New UI-关于布局优化集锦

 ——转载请注明出处:coder-pig,欢迎转载,请勿用于商业用途!


小猪Android开发交流群已建立,欢迎大家加入,无论是新手,菜鸟,大神都可以,小猪一个人的

力量毕竟是有限的,写出来的东西肯定会有很多纰漏不足,欢迎大家指出,集思广益,让小猪的博文

更加的详尽,帮到更多的人,O(∩_∩)O谢谢!

小猪Android开发交流群:小猪Android开发交流群群号:421858269

新Android UI实例大全目录:http://blog.csdn.net/coder_pig/article/details/42145907


本节引言:


前面已经介绍了三个与布局优化有关的三个标签:include,ViewStub,merge;

相信大家对布局优化有了一些认识,在这一章节的最后一节里,我们就来唠叨唠叨

关于布局优化的一些建议!大家在实际开发中可以参考下,从而制作出更高效,

复用性更高的布局UI,好了废话就到这里,开始本节的内容吧!



本节正文:


1.布局优先考虑RelativeLayout:

①在规划最外层的布局的时候,我们优先考虑RelativeLayout,坚决不使用AbsoluteLayout

(当然基本上没人会这样做),要么RelativeLayout要么LinearLayout!


②在布局层次相同的情况下,就是线性布局与相对布局层次一样的时候,建议使用LinearLayout,因为

前者的性能比RelativeLayout的性能要高!


③当布局比较复杂的时候,这个时候使用LinearLayout实现效果可能需要多重嵌套,而实现相同的效果,

RelativeLayout却仅仅需要一层,这种情况下用哪个好就不言而喻了吧!

ps:当然,根据不同的情况你可以用FrameLayout,TableLayout,GridLayout啦,按需使用~




2.用好三个布局优化的标签:

①多次复用的组件,抽取出来到一个布局文件上,通过include标签引入

②对于不常用,又可能会用到布局,又或者页面中东西太多,某些部分可以暂时不显示,等用户交互再加载,

从而提高页面加载速度,这个时候你可以用<ViewStub>

③对于有用到FrameLayout的布局可以考虑使用merge来替代,又或者include进来的布局,可以使用

merge作为最外面的标签,从而可以达到减少视图层次的目的!



3.内嵌时少用LinearLayout的weight属性:

当多层嵌套的时候,尽量少使用LinearLayout的weight权重属性,因为系统需要花费很多

系统资源,因为每一个子控件都需要被测量两次,在使用GridView,ListView等控件的时候,

这个问题更加严重,因为子控件会被重复创建,所以,当多层内嵌时尽量避免使用weight属性!



4.书写规范的优化:

对id,资源,以及通用资源的命名,尽量规范化,比如:

一个登陆的输入框:login_edit_username

一个添加的按钮:ic_add  ...等等

当然,不一定使用上面这种写法,但是你必须有遵循一个规范

另外,还是建议给不同的控件设置不同的id!!!




5.提高控件的查找效率:

在前面的学习中,我们通过Hierarchy Viewer可以知道,当我们加载布局文件后,会生成一个以

PhoneWindow$DecorView为根节点的控件树,而我们在操作控件时,必须查找到对应的控件!

我们通常会在Activity的onCreate()中通过findViewById找到相应控件,然后对其进行初始化!

再执行相关操作,设置相关属性或者加事件监听等,而findViewById方法是从控件树的根节点开始

递归查找。由于树形结构的特殊性,我们可以根据控件树的特点来选择查找控件的策略,减少查找次数

优化查找路径!


①先查找外层:

比如一个LinearLayout布局,定义了多个Button控件,如:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮1" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮2" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮3" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮4" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮5" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮6" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮7" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮8" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮9" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮10" />

</LinearLayout>


如果需要初始化所有的Button,你会怎么写?大部分朋友可能会先为每个按钮设置一个id

直接这样写:

Button btn1 = (Button) findViewById(R.id.btn1);
Button btn2 = (Button) findViewById(R.id.btn2);
Button btn3 = (Button) findViewById(R.id.btn3);
Button btn4 = (Button) findViewById(R.id.btn4);
Button btn5 = (Button) findViewById(R.id.btn5);
Button btn6 = (Button) findViewById(R.id.btn6);
Button btn7 = (Button) findViewById(R.id.btn7);
Button btn8 = (Button) findViewById(R.id.btn8);
Button btn9 = (Button) findViewById(R.id.btn9);
Button btn10 = (Button) findViewById(R.id.btn10);


再对每个Button完成相关操作,但是机智的你肯定会发现,代码的重复的太高了,而且定义了很多变量

对于按钮这种东西,很多时候我们仅仅是为他设置一个点击事件而已,于是乎我们可以这样来查找控件:

找到外部LinearLayout的容器控件,然后调用getChildAt方法获得按钮控件,并完成初始化:

		ViewGroup parent = (ViewGroup)findViewById(R.id.parent);
		int count = parent.getChildCount();
		for(int i = 0;i < count;i++)
		{
			Button button = parent.getChildAt(i);
			//为Button执行相关操作
		}

明显后者的代码由于前者的代码,而且当子控件越多,控件树层次越多的时候,优势更加明显;

从改善后的代码,我们可以发现另外一个更加重要的原则:

再查找控件的时候,尽可能从远离控件最近的节点开始!



②从离控件最近的节点开始

要查找一个嵌套层次较深的布局中的一个控件,比如在有一个Button和TextView中三层

嵌套的LinearLayout中,要找这两个组件,你要怎么找呢?直接:

		Button btn = (Button)findViewById(R.id.btn);
		TextView txt = (TextView)findViewById(R.id.txt);
上面的写法肯定能组成工作的,但是当控件嵌套层次很深的时候,而且查找控件的次数很多的

时候,这种方法会降低控件查找的性能,而对于这种情况,我们仅仅需要添加一行代码就可以进行

优化:

View parent = findViewById(R.id.parent);   //找到控件所在的节点(前置容器)

在查找组件的前面添加这个语句,当控件数量很多的时候,他的优势就会很明显,而且有些情况下

都必须这样写,尽管不建议大家给不同的控件设置相同的id,但当使用ListView这样的空间的时候

就会一直这样做,而findViewById的查找策略是:查找到第一个与id匹配的控件就停止查找,所以

查找结果可能不是实际需要的空间,所以从靠近控件的节点开始,不但提高查找速度,而且还能

更加精确的查找到控件,当然,还是建议大家给不同的控件设置不同的id值!!!

                                                           ---第五点内容摘自:http://www.devdiv.com






最后说几句:

关于布局优化的东西,肯定不止上面这些,限于笔者水平,现在知道的就这些,以后有什么新

学到的东西一定分享给大家,另外关于ListView等控件优化的就不在这篇东西里面进行

阐述了,可见listView章节的内容!谢谢~技术分享










New UI-关于布局优化集锦

标签:android   布局   优化   ui   coder-pig   

原文地址:http://blog.csdn.net/coder_pig/article/details/43317619

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!