Android-最佳化UI效能(4)-使用ViewStub

來源:互聯網
上載者:User

標籤:android   viewstub   最佳化ui   

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());    }

著作權聲明:歡迎交流指本文章的錯誤,必定虛心接受,QQ872785786

Android-最佳化UI效能(4)-使用ViewStub

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.