精华内容
参与话题
问答
  • 布局优化

    2019-05-06 17:04:37
    布局优化 布局的选择 能用ConstraintLayout就用ConstraintLayout FrameLayout能实现的优先使用FrameLayout 最简单高效的 查看源代码的行数,是最少的 其次是RelativeLayout和LinearLayout优先选择...

    布局优化

    布局的选择

    • 能用ConstraintLayout就用ConstraintLayout

    • FrameLayout能实现的优先使用FrameLayout 最简单高效的 查看源代码的行数,是最少的

    • 其次是RelativeLayout和LinearLayout优先选择LinearLayout

    • RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,也会调用子View2次onMeasure

    优化标签

    include:提高代码的复用性,减少代码,将布局中的公共部分抽取其他的layout使用

    merge:解决布局层级的优化,,减少布局嵌套的层次,提高布局加载得效率

    viewStub:只有加载该布局的时候才占用资源,,INVISIBLE状态时不会绘制出来的

    展开全文
  • Android 布局优化

    2018-08-30 18:17:37
    Android 布局优化,(含 include、Viewstub、merge的用法)
  • 飞机驾驶舱在人机布局优化过程中具有显著的特殊性和较高的复杂性,因而有必要采取合适的优化程序和优化方法以提高优化效率。利用组合排序方法,结合多目标优化问题的求解思路,建立了高度非线性的目标函数,为避免...
  • 论文研究-基于枢纽魅力度的城市公交枢纽布局优化方法.pdf, 本文提出一个两阶段的城市公交枢纽布局优化方法, 该方法首先从备选点易达度、公交线路聚集程度和公交线路的...
  • android 优化之布局优化

    千次阅读 2016-08-08 22:38:46
    布局优化中,Androi的官方提到了这三种布局、、,并介绍了这三种布局各有的优势,下面也是简单说一下他们的优势,以及怎么使用,简单复习下。 1、布局重用 标签能够重用布局文件,简单的使用如下: android:...

    布局优化的思路很简单,尽量减少布局文件的层级,看过系统源码的都知道,Android view绘制都是逐层绘制的,所以布局的层级少了,decodeview的时候绘制工作自然就少了。

    那么如何进行布局的优化呢?首先删除无用的布局后,我们会优先选择性能较高的ViewGroup,比如在一个界面中,既可以用LinearLayout,也可以用RelativeLayout,那么我们优先选择LinearLayout,因为RelativeLayout绘制时候更加耗时。 

     在布局优化中,除了上面我们应该遵守的基本准则外,Androi的官方提到了这三种布局<include />、<merge />、<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一下他们的优势,以及怎么使用,简单复习下。

    1、布局重用<include />

    <include />标签能够重用布局文件,简单的使用如下:

    <span style="font-size:12px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:orientation="vertical"   
        android:layout_width=”match_parent”  
        android:layout_height=”match_parent”  
        android:background="@color/app_bg"  
        android:gravity="center_horizontal">  
      
        <include layout="@layout/titlebar"/>  
     ...
      
    </LinearLayout> </span>

    说明: 1)<include />标签可以使用单独的layout属性,这个也是必须使用的。

        2)可以使用其他属性。<include />标签若指定了ID属性,而你的layout也定义了ID,则你的layoutID会被覆盖,解决方案

        3)在include标签中所有的android:layout_*都是有效的,前提是必须要写layout_widthlayout_height两个属性

        4)布局中可以包含两个相同的include标签。


    2、减少视图层级<merge />

        <merge/>标签在UI的结构优化中起着非常重要的作用,它可以删减多余的层级,优化UI。<merge/>多用于替换FrameLayout或者当一个布局包含另一个时,<merge/>标签消除视图层次结构中多余的视图组。例如你的主布局文件是垂直布局,引入了一个垂直布局的include,这是如果include布局使用的LinearLayout就没意义了,使用的话反而减慢你的UI表现。这时可以使用<merge/>标签优化。

    <span style="font-size:12px;"><merge xmlns:android="http://schemas.android.com/apk/res/android">  
        <Button  
            android:layout_width="fill_parent"   
            android:layout_height="wrap_content"  
            android:text="@string/add"/>  
        <Button  
            android:layout_width="fill_parent"   
            android:layout_height="wrap_content"  
            android:text="@string/delete"/>  
    </merge> </span>

    <merge />介绍可以参考点击打开链接

    3、需要时使用<ViewStub />

        <ViewStub />标签最大的优点是当你需要时才会加载,使用他并不会影响UI初始化时的性能。各种不常用的布局想进度条、显示错误消息等可以使用<ViewStub />标签,以减少内存使用量,加快渲染速度。<ViewStub />是一个不可见的,大小为0View。<ViewStub />标签使用如下:

    <span style="font-size:12px;"><ViewStub  
        android:id="@+id/stub_import"  
        android:inflatedId="@+id/panel_import"  
        android:layout="@layout/progress_overlay"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:layout_gravity="bottom" /> </span>
    说明:

    当调用inflate()函数的时候,ViewStub被引用的资源替代,并且返回引用的view 这样程序可以直接得到引用的view而不用再次调用函数findViewById()来查找了。

    ViewStub目前有个缺陷就是还不支持 <merge /> 标签。
    更多<ViewStub />标签介绍可以参考:点击打开链接


    界面绘制优化的基本准则:

    onDraw方法尽量不要创建新的临时对象,从而造成Gc的频繁回收影响系统性能。

    另一个方面,onDraw不要做耗时操作,在google的优化典范中,view的绘制保证在60fps为最佳,这就要求每一帧的时间不超过16ms.


    展开全文
  • 论文研究-高山流域降水无线传感器网络节点布局优化方法.pdf, 降水无线传感器网络节点布局对于准确分析降水时空分布规律和降低运维成本至关重要,是智慧流域物联网观测...
  • Android布局优化

    2014-08-29 17:58:11
    文章来自:http://www.infoq.com/cn/articles/android-optimise-layout

    文章来自:http://www.infoq.com/cn/articles/android-optimise-layout

    在Android开发中,我们常用的布局方式主要有LinearLayout、RelativeLayout、FrameLayout等,通过这些布局我们可以实现各种各样的界面。与此同时,如何正确、高效的使用这些布局方式来组织UI控件,是我们构建优秀Android App的主要前提之一。本篇内容就主要围绕Android布局优化来讨论在日常开发中我们使用常用布局需要注意的一些方面,同时介绍一款SDK自带的UI性能检测工具HierarchyViewer。

    布局原则

    通过一些惯用、有效的布局原则,我们可以制作出加载效率高并且复用性高的UI。简单来说,在Android UI布局过程中,需要遵守的原则包括如下几点:

    • 尽量多使用RelativeLayout,不要使用绝对布局AbsoluteLayout;
    • 将可复用的组件抽取出来并通过< include />标签使用;
    • 使用< ViewStub />标签来加载一些不常用的布局;
    • 使用< merge />标签减少布局的嵌套层次;

    由于Android的碎片化程度很高,市面上存在的屏幕尺寸也是各式各样,使用RelativeLayout能使我们构建的布局适应性更强,构建出来的UI布局对多屏幕的适配效果越好,通过指定UI控件间的相对位置,使在不同屏幕上布局的表现能基本保持一致。当然,也不是所有情况下都得使用相对布局,根据具体情况来选择和其他布局方式的搭配来实现最优布局。

    1、< include />的使用

    在实际开发中,我们经常会遇到一些共用的UI组件,比如带返回按钮的导航栏,如果为每一个xml文件都设置这部分布局,一是重复的工作量大,二是如果有变更,那么每一个xml文件都得修改。还好,Android为我们提供了< include />标签,顾名思义,通过它,我们可以将这些共用的组件抽取出来单独放到一个xml文件中,然后使用< include />标签导入共用布局,这样,前面提到的两个问题都解决了。例如上面提到的例子,新建一个xml布局文件作为顶部导航的共用布局。
    xml common_navitationbar.xml
    
    <RelativeLayout mlns:android=
    "http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:padding="10dip" >
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:text="Back"
            android:textColor="@android:color/black" />
        
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="Title"
            android:textColor="@android:color/black" />
    
    </RelativeLayout>

    然后我们在需要引入导航栏的布局xml中通过< include />导入这个共用布局。

    xml main.xml
    <RelativeLayout mlns:android=
    "http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        
        <include 
            android:layout_alignParentTop="true"
            layout="@layout/common_navitationbar" />
        
    </RelativeLayout>

    通过这种方式,我们既能提高UI的制作和复用效率,也能保证制作的UI布局更加规整和易维护。布局完成后我们运行一下,可以看到如下布局效果,这就是我们刚才完成的带导航栏的界面。

    接着我们进入sdk目录下的tools文件夹下,找到HierarchyViewer并运行(此时保持你的模拟器或真机正在运行需要进行分析的App),双击我们正在显示的这个App所代表的进程。

    接下来便会进入hierarchyviewer的界面,我们可以在这里很清晰看到正在运行的UI的布局层次结构以及它们之间的关系。

    分析刚刚我们构建的导航栏布局,放大布局分析图可以看到,被include进来的common_navitationbar.xml根节点是一个RelativeLayout,而包含它的主界面main.xml根节点也是一个RelativeLayout,它前面还有一个FrameLayout等几个节点,FrameLayout就是Activity布局中默认的父布局节点,再往上是一个LinearLayout,这个LinearLayout就是包含Activity布局和状态栏的整个屏幕显示的布局父节点,这个LinearLayout还有一个子节点就是ViewStub,关于这个节点我们在后面会详细介绍。

    2、< merge />的使用

    < merge />标签的作用是合并UI布局,使用该标签能降低UI布局的嵌套层次。该标签的主要使用场景主要包括两个,第一是当xml文件的根布局是FrameLayout时,可以用merge作为根节点。理由是因为Activity的内容布局中,默认就用了一个FrameLayout作为xml布局根节点的父节点,这一点可以从上图中看到,main.xml的根节点是一个RelativeLayout,其父节点就是一个FrameLayout,如果我们在main.xml里面使用FrameLayout作为根节点的话,这时就可以使用merge来合并成一个FrameLayout,这样就降低了布局嵌套层次。

    我们修改一下main.xml的内容,将根节点修改为merge标签。

    xml main.xml
    
    <merge xmlns:android=
        "http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:background="@android:color/darker_gray"
        android:layout_height="match_parent" >
        
        <include layout="@layout/common_navitationbar" />
        
    </merge>

    重新运行并打开HierarchyViewer查看此时的布局层次结构,发现之前多出来的一个RelativeLayout就没有了,直接将common_navigationbar.xml里面的内容合并到了main.xml里面。

    使用< merge />的第二种情况是当用include标签导入一个共用布局时,如果父布局和子布局根节点为同一类型,可以使用merge将子节点布局的内容合并包含到父布局中,这样就可以减少一级嵌套层次。首先我们看看不使用merge的情况。我们新建一个布局文件commonnaviright.xml用来构建一个在导航栏右边的按钮布局。

    xml common_navi_right.xml
    
    <RelativeLayout mlns:android=
    "http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="Ok"
            android:textColor="@android:color/black" />
        
    </RelativeLayout>

    然后修改common_navitationbar.xml的内容,添加一个include,将右侧按钮的布局导入:

    xml common_navitationbar.xml
    
    <RelativeLayout mlns:android=
    "http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:padding="10dip" >
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:text="Back"
            android:textColor="@android:color/black" />
        
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="Title"
            android:textColor="@android:color/black" />
            
        <include layout="@layout/common_navi_right" />
    
    </RelativeLayout>

    运行后的效果如下图,在导航栏右侧添加了一个按钮“ok”

    然后再运行HierarchyViewer看看现在的布局结构,发现commonnaviright.xml作为一个布局子节点嵌套在了common_navitationbar.xml下面。

    这时我们再将commonnaviright.xml的根节点类型改为merge。

    xml common_navi_right.xml
    
    <merge xmlns:android=
        "http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="Ok"
            android:textColor="@android:color/black" />
        
    </merge>

    重新运行并打开HierarchyViewer查看布局结构,发现之前嵌套的一个RelativeLayout就没有了,这就是使用merge的效果,能降低布局的嵌套层次。

    3、< ViewStub />的使用

    也许有不少同学对ViewStub还比较陌生,首先来看看ViewStub在官方文档里是怎么介绍的:

    A ViewStub is an invisible, zero-sized View that can be used to lazily inflate layout resources at runtime. When a ViewStub is made visible, or when inflate() is invoked, the layout resource is inflated. The ViewStub then replaces itself in its parent with the inflated View or Views. Therefore, the ViewStub exists in the view hierarchy until setVisibility(int) or inflate() is invoked. The inflated View is added to the ViewStub's parent with the ViewStub's layout parameters.

    大致意思是:ViewStub是一个不可见的,能在运行期间延迟加载的大小为0的View,它直接继承于View。当对一个ViewStub调用inflate()方法或设置它可见时,系统会加载在ViewStub标签中引入的我们自己定义的View,然后填充在父布局当中。也就是说,在对ViewStub调用inflate()方法或设置visible之前,它是不占用布局空间和系统资源的。它的使用场景可以是在我们需要加载并显示一些不常用的View时,例如一些网络异常的提示信息等。

    我们新建一个xml文件用来显示一个提示信息:

    xml common_msg.xml
    
    <RelativeLayout mlns:android=
    "http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    
       <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:background="@android:color/white"
            android:padding="10dip"
            android:text="Message"
            android:textColor="@android:color/black" />
        
    </RelativeLayout>

    然后在main.xml里面加入ViewStub的标签引入上面的布局:

    xml main.xml
    
    <merge xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:background="@android:color/darker_gray"
        android:layout_height="match_parent" >
        
        <include layout="@layout/common_navitationbar" />
        
        <ViewStub
            android:id="@+id/msg_layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout="@layout/common_msg" />
        
    </merge>

    修改MainActivity.java的代码,我们这里设置为点击右上角按钮的时候显示自定义的common_msg.xml的内容。

    java MainActivity.java
    
    public class MainActivity extends Activity {
    
    	private View msgView;
    	private boolean flag = true;
    	
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            this.findViewById(R.id.rightButton).
    setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View arg0) {
    				System.out.print("111");
    				if(flag){
    					showMsgView();
    				}else{
    					closeMsgView();
    				}
    				flag = !flag;
    			}
    		});
        }
        
        private void showMsgView(){
        	if(msgView != null){
        		msgView.setVisibility(View.VISIBLE);
        		return;
        	}
        	ViewStub stub = (ViewStub)findViewById(R.id.msg_layout);
            msgView = stub.inflate();
        }
        
        private void closeMsgView(){
        	if(msgView != null){
        		msgView.setVisibility(View.GONE);
        	}
        }
    }

    代码中我们通过flag来切换显示和隐藏common_msg.xml的内容,然后我们运行一下并点击右上角按钮来切换,效果如下:

    总结

    好了,到目前为止,我们就介绍了Android中关于布局优化的一些内容以及工具HierarchyViewer的使用。将前文提及的布局原则再列一下,欢迎大家补充更多的关于Android布局优化的实用原则。

    • 尽量多使用RelativeLayout,不要使用绝对布局AbsoluteLayout;
    • 将可复用的组件抽取出来并通过< include />标签使用;
    • 使用< ViewStub />标签来加载一些不常用的布局;
    • 使用< merge />标签减少布局的嵌套层次;

    展开全文
  • android布局优化

    2014-11-07 10:00:29
    开始布一个局

    1、开始布一个局

      1,新建一个android项目,把新建一个Activity那个选项选上!然后用模拟器运行项目!什么?!!

       你没看错,记住照着做就没错了…因为,今天,我们要讲如何优化和兼容View ,所以,一切从研究View开始!

      2,打开hierarchyviewer

       这是一个帮助我们优化view的非常重要的工具的,接下来的大部分时间,都会借住这个工具进行讲解,这个工具沉睡在android sdk 目录 tools下 hierarchyviewer.bat,或者用Everything这样的搜索硬盘的工具直接找到!

    3,分析

      还记得我们第一步运行的项目吗?接着用hierarchyviewer这样的神器,就可以导出这样的图!

    H

     

       这么一张图就是我们一个Hello,World项目的View 布局结构,在HierarchyViewer上你点击每个按钮就会有非常详细的布局信息,所以,这里对于hierarchyViewer的介绍到此为止!关于这个工具的详细使用,请查阅Debugging and Profiling User Interfaces 这里不做赘述!

    2、如何布好一个局

    1.熟读API文档!

      布局这东西不是比酷的东西,不是比谁的布局越复杂,那个人就越牛叉,以最少的步骤完成,设计图的要求,这应该是每个android开发程序员的宗旨!!

      案例一:做一个带箭头的返回按钮

       经理:那个小与啊,你根据这设计图搞一个按钮

        image

       小与:这还不简单三分钟搞定

    于是小于程序猿,敲下了如下代码

    <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center" >
    
            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/btn_headtita"
                android:textColor="#ffffff"
                android:text="@string/back" />
    
            <ImageView
                android:id="@+id/imageView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true"
                android:src="@drawable/header_back" />
    
        </RelativeLayout>


    看代码多累啊,我们用刚刚介绍的hierarchyviewer来分析一下,这个按钮有什么问题!

    image

    我们从这个图中,我们可以看到,为了这么一个按钮我们用了view的三个节点去完成!假设,我们的一个view 有三个类似的按钮就意味着我们要用9个节点去完成,我们可以简单得出这是一个3N级的复杂度布局,我们可以尝试去优化吗?

    技巧一:熟读官方的API文档!

    个人建议,常用的Widget的所有参数都尽量了解一遍!在阅读官方文档的时候我们发现了Button,有一个可以把图绘制在左边的参数:android:drawableLeft

    于是,我们优化了一下小与的代码

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/btn_headtita"
            android:drawableLeft="@drawable/header_back"
            android:gravity="center"
            android:padding="10dp"
            android:text="@string/back"
            android:textColor="#ffffff" />

    用hierarchyviewer来分析一下

    image

    瞬间一个3N级复杂度的布局,变成了一个N级复杂的!所以,我建议各位android开发朋友,在考虑优化的时候先把api文档里面的内容烂熟与心,不然,这样折腾下去,很浪费时间!

    有细心的朋友可能会问:android:padding="10dp"  这个用来做什么了?

    我先告诉大家,不用这个参数:你将会看到:

    image

    用了以后:

    image

    这下大家能够明白了吧?

    所以,当你在进行布局的时候,如果碰到比较繁琐的时候,你先想想会不会已经API本身就有这样的参数呢?

    简单是所有布局开始最重要的原则!

    简单意味着不容易出现兼容问题!

    简单意味着性能不错!

    2.模块化布局

    480x800_MarkMan

      所谓,模块化布局就是要你熟悉使用<include /> 这个标签!

    一个经典的Tab类布局由三部分组成,我们可以根据这三部分创建三个可以重用的布局

    head_menu.xml

    content_showweibo.xml

    bottom_menu.xml

    然后我们可以很灵活的组合我们要显示的,例如要完成上面的那个weibo布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
          android:orientation="vertical"
         >
     <include android:id="@+id/head_menu" layout="@layout/head_menu" />
     <include android:id="@+id/content" layout="@layout/content_showweibo" />
     <include android:id="@+id/bottom_menu" layout="@layout/bottom_menu" />
    
       
    </LinearLayout>

     

    熟练的使用<include />标签就可以大大的减少我们日后都维护工作!

    3.合并没必要的节点

    还记得我们一开始的那个项目吗?

    image


    在高效布局里面,有一条准则就是,尽量的减少节点!!!!如图,我们发现,其实LinearLayout其实啥都没干,我们却耗费了那么一点性能去绘制了这么没用的节点!

    接下来,我们为了消灭这个节点,我们需要一个这么的标签

    <merge ></merge>

    修改咱们的代码让它,性能更好!

    <?xml version="1.0" encoding="utf-8"?>
    <merge xmlns:android="http://schemas.android.com/apk/res/android"
    >
    
    
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/btn_headtita"
            android:drawableLeft="@drawable/header_back"
            android:gravity="center"
            android:layout_gravity="center_vertical|center_horizontal"
            android:padding="10dp"
            android:text="@string/back"
            android:textColor="#ffffff" />
    
    </merge>


    打开hierarchyviewer 一看!

    image 

    哦也!优化了一个节点!并且显示快了那么一点点...

    4.ViewStub

           这是什么玩应儿呢?其实就是一个轻量级的页面,我们通常使用它来做预加载处理,来改善页面加载速度和提高流畅性,ViewStub本身不会占用层级,它最终会被它指定的层级取代。
           还是说说演出项目吧,还说?对了,实践才能发现问题嘛,在哪儿发现问题就在那儿改进。由于项目中用到了比较多的动画,而且嵌套布局比较复杂,所以在Android低端机上进行页面切换时候经常让人感觉卡卡的,不怎么流畅,因为页面切换动画和标题旋转动画是同时进行的,所以为了达到更好的体验就需要使用一种方法,在动画进行时尽量的减少其他操作,特别是页面加载重绘。赶紧想办法,起初我想先将要加载的页面所有的组件都初始为gone显示状态,整个页面只留一下加载滚动条,后来发现这是不行滴,因为在Android的机制里,即使是将某一个控件的visibility属性设置为不可见的gone,在整个页面加载过程中还是会加载此控件的。再后来就用到了ViewStub,在做页面切换动画时,只在页面中放一个loading加载图标和一个ViewStub标签,像下面这样:

           layout_loading.xml布局文件:

    [html] view plaincopy
    1. <merge xmlns:android="http://schemas.android.com/apk/res/android">  
    2.     <ViewStub  
    3.         android:id="@+id/viewstub"  
    4.         android:layout_width="fill_parent"  
    5.         android:layout_height="fill_parent"/>  
    6.     <NetErrAndLoadView  
    7.         android:id="@+id/start_loading_lay"  
    8.         android:layout_width="fill_parent"  
    9.         android:layout_height="fill_parent" />  
    10. </merge>  
    这个页面是相当轻量级的,所以导致动画加载速度非常快、而且流畅。等页面切换动画完成之后,我们再指定ViewStub的资源,来加载实际的页面,这个资源就是实际要加载的页面的布局文件。比如要加载MainActivity的布局文件layout_main.xml,onCreate实现如下:
    protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.layout_loading);  
              
            mLoadHandler = new Handler();  
            mLoadingView = (NetErrAndLoadView)findViewById(R.id.start_loading_lay);  
            mLoadingView.startLoading();  
            mViewStub = (ViewStub)findViewById(R.id.viewstub);  
            mViewStub.setLayoutResource(R.layout.layout_main);  
              
            mLoadHandler.postDelayed(new Runnable() {  
                @Override  
                public void run() {  
                    mViewStub.inflate();  
                    mLoadingView.hide();  
                }  
            },500);  
    }  
    上面的500单位是ms,就是延迟加载的时间。上面使用的是动态添加ViewStub指向布局资源的方法(mViewStub.setLayoutResource(R.layout.layout_main)),当然根据需要可以直接在ViewStub的布局块儿中设置,需要设置ViewStub标签下的layout属性(android:layout="@layout/ layout_main")。
            ViewStub也是有少许缺点的,下面所说:
            1、  ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不能够再通过ViewStub来控制它了。所以它不适用于需要按需显示隐藏的情况。
           2、  ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。如果想操作一个具体的view,还是使用visibility属性吧。
           3、  VIewStub中不能嵌套merge标签。(前面好像说过)
    不过这些确定都无伤大雅,我们还是能够用ViewStub来做很多事情。
            有时候真的不得不佩服google的Android团队的远见性和架构性,这种细微的设计都能考虑的到,想用就有。

    3、总结  

    讲了,这么一大堆东西,貌似,没怎么如何去优化?都是在说一些操作性的东西,其实,这世上没有绝对的优化方案,所谓的优化方案都是基于一个最初的基本原则出发,例如,内存用得再少一点!那么如何才能将这内存用得再少一点做的了,这样就需要一些最基本的方法,关于布局这部分的基本方法,我在上面已经很详细的说了一遍了,当进行布局的时候你要牢记

    1,尽量使用view自身的参数

    2,减少一个布局的不必要节点

    3,尽量重用一个布局文件

      兼容问题呢?兼容问题出现的原因千奇百怪,没有一套通用的法则!关于这点谈一下自己的看法

    1,减少复杂度,往往,兼容问题的出现,就是布局太复杂了,例如,我举的那个按钮布局,本来一个View就能完成,你却用了三个view完成,在使用的时候,出现问题的概念也大幅度提升!所以,布局以简单为本,那样兼容问题就可以尽量避免!

    2,熟练使用工具,还记得hierarchyviewer 吗?当出现兼容问题的时候,用这个软件可以快速定位到错误位置!




    展开全文
  • 论文研究-城市道路单行系统布局优化的双层规划模型和混合算法.pdf, 研究了基于出行者路径选择行为的单行道布局优化问题.借助于双层规划思想,以最小化研究区域内的总旅行...
  • 为解决复杂情况下制造系统的生产设备布局优化问题,提出了一种将模糊决策与进化算法相结合的设备布局优化方法。进一步完善了优化模型,优化目标包括总成本最小、设备相邻要求最大化和面积利用率最大化等优化目标;...

空空如也

1 2 3 4 5 ... 20
收藏数 10,884
精华内容 4,353
关键字:

布局优化