关闭

Android-优化UI性能(4)-使用ViewStub

标签: androidViewStub优化UI
537人阅读 评论(0) 收藏 举报
分类:

Android-优化UI性能(4)-使用ViewStub
ViewStub概念:
ViewStub是一个看不见的,轻量级的View。它没有尺寸,也不会绘制以及以某种形式参与到布局中来。只有当调用了inflate的之后其中的view才会被实例化,
这意味着ViewStub保留View层次的结构的代价是很低的

1,延时加载不常用的UI控件
当某些控件只在很多好的情况下才会使用,我们可以抵用ViewStub来延迟加载
以提高UI加载的速度及减少内存的消耗
下面是一个Demo:
主Activity类:

public class MainActivity extends Activity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //加载按钮布局
        setContentView(R.layout.layout_delay);
        //建立按钮对象和点击事件
        Button _button = (Button)findViewById(R.id.buttonLoad);
        _button.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View arg0)
            {
                // TODO Auto-generated method stub
                //使得按钮不可见
                arg0.setEnabled(false);
                //得到Stub对象
                ViewStub _viewStub = (ViewStub)findViewById(R.id.viewStubLoad);
                //压入当前布局
                View inflate = _viewStub.inflate();
            }
        });
    }

两个布局文件:
1,layout_delay.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ViewStub
        android:id="@+id/viewStubLoad"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:inflatedId="@+id/viewStub"
    //应用activity_main.xml
        android:layout="@layout/activity_main"/>

    <Button
        android:id="@+id/buttonLoad"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="load" />

</LinearLayout>

2,activity.xml

<RelativeLayout xmlns: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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

结果如下:
这里写图片描述
这里写图片描述

2,提高改变布局的速度
需要的使用场景:界面需要频繁的切换,提高切换速度

使用的方法:以频繁改变横竖屏Demo来解释
1,设置Activity
android:configChanged=”keyboardHidden|orientation”

<activity android:name=".MyConfigureChangedActivity"

            android:configChanges="keyboardHidden|orientation">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

2,为横竖屏编写不同的layout
land:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/textViewLand"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <SeekBar
        android:id="@+id/seekBarLand"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

</LinearLayout>

如下图:
这里写图片描述
port:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textViewPort"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextViewPort" />

    <SeekBar
        android:id="@+id/seekBarPort"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

如下图:
这里写图片描述
3,创建一个layout,并且只包含两个View Stub分别对应横竖屏

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ViewStub
        android:id="@+id/StubLand"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"  
        android:inflatedId="@+id/inflateStubLand"
        android:layout="@layout/layout_land"/>
    <ViewStub
        android:id="@+id/StubPort"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:inflatedId="@+id/inflateStubPort"
        android:layout="@layout/layout_port"/>

</LinearLayout>

4,在横竖屏的时候,通过调用ViewStub.inflate创建当前的View并将另外一个设为GONE

private void setOrientationlayout(int orientation)
    {
        //如果系统状态为水平方向
        if (orientation == Configuration.ORIENTATION_LANDSCAPE)
        {
            //水平方向没有布局,就创建布局
            if (null == mLanderView)
            {
                ViewStub _viewStub = (ViewStub)findViewById(R.id.StubLand);

                mLanderView = _viewStub.inflate();
            }
            //如果当前布局低竖直布局的话就设置为不可见
            if (null != mPortView)
            {
                mPortView.setVisibility(View.GONE);

            }
            //绑定界面布局
            bindView(mLanderView);
        }
        else
        {
            //如果系统状态为竖直方向

            //当前布局为水平布局,就设置为不可见
            if (null != mLanderView)
            {
                mLanderView.setVisibility(View.GONE);

            }
            //竖直布局为空,就压入竖直布局
            if (null == mPortView)
            {
                ViewStub _viewStub = (ViewStub)findViewById(R.id.StubPort);

                mPortView = _viewStub.inflate();
            }
            //绑定界面
            bindView(mPortView);

        }
    }

5,绑定并设置控件的状态

//绑定函数
    private void bindView(View p_v)
    {
        //要绑定的View设置为可见
        p_v.setVisibility(View.VISIBLE);
        //两个控件采用系统的布局
        mSeekBar = (SeekBar)findViewById(android.R.id.progress);
        mTextView = (TextView)findViewById(android.R.id.text1);
    }

onCreate

//onCreate
 protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_land);

        Display _disPlay = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
         //得到布局的方向
        setOrientationlayout(_disPlay.getOrientation());

    }
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android 性能优化 三 布局优化ViewStub标签的使用

小黑与小白的故事,通过虚拟这两个人物进行一问一答的形式来共同学习ViewStub的使用 小白:Hi,小黑,ViewStub是什么?听说可以用来进行布局优化。 小黑:ViewStub 是一个隐藏...
  • love_world_
  • love_world_
  • 2014-07-08 07:19
  • 6628

ViewStub动态加载布局提高UI加载性能

ViewStub 定位:ViewStub 是一个不可见,size 大小为0 的一个View ,用于运行时 延迟inflate layout布局的。当ViewStub 变为可见,或者 调用了inflat...
  • u011733020
  • u011733020
  • 2016-06-14 16:18
  • 1503

iOS性能调优(全)---内存优化和UI优化

iOS应用性能调优的25个建议和技巧   本文来自iOSTutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员。这是他的个人网站:http://www....
  • github_34613936
  • github_34613936
  • 2016-05-03 10:24
  • 629

Unity3D性能优化 (五)——UI

一、DrawCall优化 ①UI层级 三张图对比发现场景中UI的数目一样,布局有变化,导致了其DrawCall数目不一样。当出现重叠时,会影响空间拓扑关系,从而影响了Unity对DrawCall的...
  • PirateCode
  • PirateCode
  • 2016-08-27 12:13
  • 2978

Android布局优化之<merge>与<ViewStub>标签使用

merge标签:使用merge标签可以达到减少布局层级的作用,特别在配合include标签进行使用的时候,通过减少布局的层级数,可以优化APP在加载布局文件时的资源消耗,从而达到提高APP性能的效果。...
  • u011771755
  • u011771755
  • 2015-09-21 15:54
  • 1082

Android最佳性能实践——布局优化技巧之<include>、<merge>标签及仅在需要时才加载布局的:ViewStub

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43376527 在前面几篇文章当中,我们学习了如何通过合理管理内存,以及高性能...
  • aiguoguo000
  • aiguoguo000
  • 2016-05-16 12:02
  • 411

Unity+NGUI性能优化方法总结

一共9招。
  • zzxiang1985
  • zzxiang1985
  • 2015-01-31 22:52
  • 35545

UI优化技巧:使用ViewStub

布局技巧:使用ViewStub 多亏了标签,在Android里,很容易就能做到共享和重用UI组件。在Android开发中,很容易就能创建出复杂的UI结构,结果呢,用了很多的View,且其中的一些...
  • langjian2012
  • langjian2012
  • 2015-09-13 19:35
  • 252

Android UI性能优化实战 识别绘制中的性能问题

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45556391; 本文出自:【张鸿洋的博客】 1、概述 201...
  • lmj623565791
  • lmj623565791
  • 2015-05-07 10:04
  • 57295

使用ViewStub需要注意的一些问题

关于ViewStub的使用方法网络上有很多,但是某些细节不注意的话,运行时就会出现不可预知的错误。 1.引用布局文件的属性为android:layout,而不是layout(与incluce的区别) ...
  • shaziln
  • shaziln
  • 2015-11-02 23:39
  • 4675
    个人资料
    • 访问:152829次
    • 积分:3269
    • 等级:
    • 排名:第12047名
    • 原创:209篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    博客专栏
    最新评论