ViewSwitcher 的作用简单来说就是:在两个视图间转换时显示动画
它的两个子类应该很熟悉,ImageSwitcher:转换图片时增加动画效果; TextSwitcher: 转换文字时增加动画效果; 其实例见apidemos中ImageSwitcher实例和TextSwitcher实例
但不要忽略ViewSwicher,在一些场合还是很有用的
在android里视图切换是一个很常见的需求,比如说加载view和后台背景,当后台加载数据时,loding view显示,数据View隐藏,加载完成,反向此过程。使用ViewSwicher提供了简单的逻辑,产生更可读的代码。
举个最常见的例子,列表底部加载
Button more
<?xml version="1.0" encoding="utf-8"?> <Button xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/btn_loadmorecontacts" android:text="Load More Items" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:minHeight="?android:attr/listPreferredItemHeight" android:textColor="#FFFFFF" android:background="@android :drawable/list_selector_background" android:clickable="true" android:onClick="onClick" />
大致是这样子
加载中视图:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:minHeight="?android:attr/listPreferredItemHeight"> <ProgressBar android:id="@+id/progressbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" /> <TextView android:text="Loading…" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_toRightOf="@+id/progressbar" android:layout_centerVertical="true" android:gravity="center" android:padding="10dip" android:textColor="#FFFFFF" /> </RelativeLayout>
public class ViewSwitcherExample extends ListActivity implements OnClickListener { //sample list items static final String[] ITEMS = new String[] { "List Item 1", "List Item 2", "List Item 3", "List Item 4", "List Item 5", "List Item 6", "List Item 7", "List Item 8", "List Item 9", "List Item 10" }; //the ViewSwitcher private ViewSwitcher switcher; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //no window title requestWindowFeature(Window.FEATURE_NO_TITLE); //create the ViewSwitcher in the current context switcher = new ViewSwitcher(this); //底部 Button: see XML1 Button footer = (Button)View.inflate(this, R.layout.btn_loadmore, null); //进度条View: see XML2 View progress = View.inflate(this, R.layout.loading_footer, null); //向viewSwitcher加入view (first added will show first) switcher.addView(footer); switcher.addView(progress); //listview底部加入swicher getListView().addFooterView(switcher); //add items to the ListView setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, ITEMS)); } @Override /* Load More Button Was Clicked */ public void onClick(View arg0) { //first view is showing, show the second progress view switcher.showNext(); //and start background work new getMoreItems().execute(); } /** Background Task To Get More Items**/ private class getMoreItems extends AsyncTask { @Override protected Object doInBackground(Void… params) { //code to add more items //... try { Thread.sleep(3000); //only to demonstrate } catch (InterruptedException e) { e.printStackTrace(); } return null; } @Override /* Background Task is Done */ protected void onPostExecute(Object result) { //go back to the first view switcher.showPrevious(); //update the ListView } } }
switcher.showNext(); // Switches to the next view switcher.showPrevious(); // Switches to the previous view
当然你也可以使用xml形式构造ViewSwicher,这里加上了系统自带的切换效果@android:anim/slide_in_left和@android:anim/slide_out_right
<?xml version="1.0" encoding="utf-8"?> <ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/profileSwitcher" android:layout_width="fill_parent" android:layout_height="fill_parent" android:inAnimation="@android:anim/slide_in_left" android:outAnimation="@android:anim/slide_out_right"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <ProgressBar android:id="@+id/progressbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" /> <TextView android:text="Loading…" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_toRightOf="@+id/progressbar" android:gravity="center"/> </RelativeLayout> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" > <TextView android:text="Finished!" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_centerVertical="true" /> </RelativeLayout> </ViewSwitcher>
你喜欢的话可以加入动画效果,使用View gone、Visible方式还是ViewSwicher还是看自己喜好了