ViewSwitcher 的作用简单来说就是:在两个视图间转换时显示动画
它的两个子类应该很熟悉,ImageSwitcher:转换图片时增加动画效果;TextSwitcher:转换文字时增加动画效果;其实例见apidemos中ImageSwitcher实例和TextSwitcher实例
但不要忽略ViewSwicher,在一些场合还是很有用的
在android里视图切换是一个很常见的需求,比如说加载view和后台背景,当后台加载数据时,loding view显示,数据View隐藏,加载完成,反向此过程。使用ViewSwicher提供了简单的逻辑,产生更可读的代码。
举个最常见的例子,模拟点击LoadMoreItems按钮或得更多数据。
1
2
3
4
5
6
7
8
9
10
11
12
|
<?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"
/>
|
大致是这样子
加载中视图:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?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>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
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
);
//footer Button: see XML1
Button footer = (Button)View.inflate(
this
, R.layout.btn_loadmore,
null
);
//progress View: see XML2
View progress = View.inflate(
this
, R.layout.loading_footer,
null
);
//add the views (first added will show first)
switcher.addView(footer);
switcher.addView(progress);
//add the ViewSwitcher to the footer
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
}
}
}
|
当然你也可以使用xml形式构造ViewSwicher,这里加上了系统自带的切换效果@android:anim/slide_in_left和@android:anim/slide_out_right
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
<?xmlversion=
"1.0"
encoding=
"utf-8"
?>
<ViewSwitcherxmlns: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>
|