標籤: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