ViewSwitcher的功能和用法
ViewSwitcher 代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitcher 支持指定动画效果.
为了给ViewSwitcher 添加多个组件, 一般通过ViewSwitcher 的setFactory 方法为止设置ViewFactory ,并由ViewFactory为之创建View 即可.
下面通过一个实例来介绍 ViewFactory的用法.(仿Android系统Launcher 界面 实现分屏 左右滑动效果)
1 import java.util.ArrayList;
2
3 import android.os.Bundle;
4 import android.app.Activity;
5 import android.graphics.drawable.Drawable;
6 import android.view.LayoutInflater;
7 import android.view.View;
8 import android.view.ViewGroup;
9 import android.widget.BaseAdapter;
10 import android.widget.GridView;
11 import android.widget.ImageView;
12 import android.widget.TextView;
13 import android.widget.ViewSwitcher;
14 import android.widget.ViewSwitcher.ViewFactory;
15
16
17 public class ViewSwitcherTest extends Activity
18 {
19 // 定义一个常量,用于显示每屏显示的应用程序数
20 public static final int NUMBER_PER_SCREEN = 12;
21
22 // 代表应用程序的内部类,
23 public static class DataItem
24 {
25 // 应用程序名称
26 public String dataName;
27 // 应用程序图标
28 public Drawable drawable;
29 }
30
31 // 保存系统所有应用程序的List集合
32 private ArrayList<DataItem> items = new ArrayList<DataItem>();
33 // 记录当前正在显示第几屏的程序
34 private int screenNo = -1;
35 // 保存程序所占的总屏数
36 private int screenCount;
37 ViewSwitcher switcher;
38 // 创建LayoutInflater对象
39 LayoutInflater inflater;
40
41 @Override
42 public void onCreate(Bundle savedInstanceState)
43 {
44 super.onCreate(savedInstanceState);
45 setContentView(R.layout.main);
46 inflater = LayoutInflater.from(ViewSwitcherTest.this);
47 // 创建一个包含40个元素的List集合,用于模拟包含40个应用程序
48 for (int i = 0; i < 40; i++)
49 {
50 String label = "" + i;
51 Drawable drawable = getResources().getDrawable(
52 R.drawable.ic_launcher);
53 DataItem item = new DataItem();
54 item.dataName = label;
55 item.drawable = drawable;
56 items.add(item);
57 }
58 // 计算应用程序所占的总屏数。
59 // 如果应用程序的数量能整除NUMBER_PER_SCREEN,除法的结果就是总屏数。
60 // 如果不能整除,总屏数应该是除法的结果再加1。
61 screenCount = items.size() % NUMBER_PER_SCREEN == 0 ?
62 items.size()/ NUMBER_PER_SCREEN :
63 items.size() / NUMBER_PER_SCREEN + 1;
64 switcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
65 switcher.setFactory(new ViewFactory()
66 {
67 // 实际上就是返回一个GridView组件
68 @Override
69 public View makeView()
70 {
71 // 加载R.layout.slidelistview组件,实际上就是一个GridView组件。
72 return inflater.inflate(R.layout.slidelistview, null);
73 }
74 });
75 // 页面加载时先显示第一屏。
76 next(null);
77 }
78
79 public void next(View v)
80 {
81 if (screenNo < screenCount - 1)
82 {
83 screenNo++;
84 // 为ViewSwitcher的组件显示过程设置动画
85 switcher.setInAnimation(this, R.anim.slide_in_right);
86 // 为ViewSwitcher的组件隐藏过程设置动画
87 switcher.setOutAnimation(this, R.anim.slide_out_left);
88 // 控制下一屏将要显示的GridView对应的 Adapter
89 ((GridView) switcher.getNextView()).setAdapter(adapter);
90 // 点击右边按钮,显示下一屏,也可通过手势检测实现显示下一屏.
91 switcher.showNext();
92 }
93 }
94
95 public void prev(View v)
96 {
97 if (screenNo > 0)
98 {
99 screenNo--;
100 // 为ViewSwitcher的组件显示过程设置动画
101 switcher.setInAnimation(this, android.R.anim.slide_in_left);
102 // 为ViewSwitcher的组件隐藏过程设置动画
103 switcher.setOutAnimation(this, android.R.anim.slide_out_right);
104 // 控制下一屏将要显示的GridView对应的 Adapter
105 ((GridView) switcher.getNextView()).setAdapter(adapter);
106 // 点击左边按钮,显示上一屏,也可通过手势检测实现显示上一屏.
107 switcher.showPrevious();
108 }
109 }
110
111 // 该BaseAdapter负责为每屏显示的GridView提供列表项
112 private BaseAdapter adapter = new BaseAdapter()
113 {
114 @Override
115 public int getCount()
116 {
117 // 如果已经到了最后一屏,且应用程序的数量不能整除NUMBER_PER_SCREEN
118 if (screenNo == screenCount - 1
119 && items.size() % NUMBER_PER_SCREEN != 0)
120 {
121 // 最后一屏显示的程序数为应用程序的数量对NUMBER_PER_SCREEN求余
122 return items.size() % NUMBER_PER_SCREEN;
123 }
124 // 否则每屏显示的程序数量为NUMBER_PER_SCREEN
125 return NUMBER_PER_SCREEN;
126 }
127
128 @Override
129 public DataItem getItem(int position)
130 {
131 // 根据screenNo计算第position个列表项的数据
132 return items.get(screenNo * NUMBER_PER_SCREEN + position);
133 }
134
135 @Override
136 public long getItemId(int position)
137 {
138 return position;
139 }
140
141 @Override
142 public View getView(int position
143 , View convertView, ViewGroup parent)
144 {
145 View view = convertView;
146 if (convertView == null)
147 {
148 // 加载R.layout.labelicon布局文件
149 view = inflater.inflate(R.layout.labelicon, null);
150 }
151 // 获取R.layout.labelicon布局文件中的ImageView组件,并为之设置图标
152 ImageView imageView = (ImageView)
153 view.findViewById(R.id.imageview);
154 imageView.setImageDrawable(getItem(position).drawable);
155 // 获取R.layout.labelicon布局文件中的TextView组件,并为之设置文本
156 TextView textView = (TextView)
157 view.findViewById(R.id.textview);
158 textView.setText(getItem(position).dataName);
159 return view;
160 }
161 };
162 }
slide_in_right.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <set xmlns:android="http://schemas.android.com/apk/res/android"> 3 <!-- 设置从右边拖进来的动画 4 android:duration指定动画持续时间 --> 5 <translate 6 android:fromXDelta="100%p" 7 android:toXDelta="0" 8 android:duration="@android:integer/config_mediumAnimTime" /> 9 </set>
slide_out_left.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <set xmlns:android="http://schemas.android.com/apk/res/android"> 3 <!-- 设置从左边拖出去的动画 4 android:duration指定动画持续时间 --> 5 <translate 6 android:fromXDelta="0" 7 android:toXDelta="-100%p" 8 android:duration="@android:integer/config_mediumAnimTime" /> 9 </set>
labelicon.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <!-- 定义一个垂直的LinearLayout,该容器中放置一个ImageView和一个TextView --> 3 <LinearLayout 4 xmlns:android="http://schemas.android.com/apk/res/android" 5 android:orientation="vertical" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 android:gravity="center"> 9 <ImageView 10 android:id="@+id/imageview" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 /> 14 <TextView 15 android:id="@+id/textview" 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 android:gravity="center" 19 /> 20 </LinearLayout>
main.xml
1 <RelativeLayout 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent"> 5 <!-- 定义一个ViewSwitcher组件 --> 6 <ViewSwitcher 7 android:id="@+id/viewSwitcher" 8 android:layout_width="fill_parent" 9 android:layout_height="fill_parent" /> 10 <!-- 定义滚动到上一屏的按钮 --> 11 <Button 12 android:id="@+id/button_prev" 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:layout_alignParentBottom="true" 16 android:layout_alignParentLeft="true" 17 android:onClick="prev" 18 android:text="<" /> 19 <!-- 定义滚动到下一屏的按钮 --> 20 <Button 21 android:id="@+id/button_next" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:layout_alignParentBottom="true" 25 android:layout_alignParentRight="true" 26 android:onClick="next" 27 android:text=">" /> 28 </RelativeLayout>
slidelistview.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <GridView 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:layout_width="match_parent" 5 android:numColumns="4" 6 android:layout_height="match_parent"> 7 8 </GridView>
转载于:https://www.cnblogs.com/houchuantong/p/3911352.html
本文深入解析ViewSwitcher组件的功能及使用方法,通过实例演示如何实现类似Android系统Launcher的分屏左右滑动效果,包括自定义动画和ViewFactory的运用。

被折叠的 条评论
为什么被折叠?



