ViewSwitcher代表了視圖切換組件, 本身繼承了FrameLayout ,可以將多個View疊在一起 ,每次只顯示一個組件.當程序控制從一個View切換到另個View時,ViewSwitcher 支持指定動畫效果.
為了給ViewSwitcher 添加多個組件, 一般通過ViewSwitcher 的setFactory 方法為止設置ViewFactory ,並由ViewFactory為之創建View 即可.
下面通過一個實例來介紹 ViewSwitcher的用法.(仿Android系統Launcher 界面 實現分屏 左右滑動效果)
第一步,新建項目,打開activity_main.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"
tools:context="com.example.viewswitchdemo.MainActivity" >
<ViewSwitcher
android:id="@+id/viewSwitcher"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
></ViewSwitcher>
<!-- 定義滾動到上一屏的按鈕 -->
<Button
android:id="@+id/button_prev"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:onClick="prev"
android:text="P" />
<!-- 定義滾動到下一屏的按鈕 -->
<Button
android:id="@+id/button_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:onClick="next"
android:text="L" />
</RelativeLayout>
在這個布局中,創建了一個ViewSwitcher,表示這里是可變的View,還有一個往前和往后的按鈕
2,新建slidelistview.xml, 這個視圖就表示ViewSwitcher中變化的View
<?xml version="1.0" encoding="utf-8"?>
<GridView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:numColumns="4"
android:layout_height="match_parent">
</GridView>
3,新建item.xml,表示gridView的子視圖
<?xml version="1.0" encoding="utf-8"?>
<!-- 定義一個垂直的LinearLayout,該容器中放置一個ImageView和一個TextView -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
/>
</LinearLayout>
4,打開MainActivity.java
public class MainActivity extends Activity {
//每一屛顯示的應用數
public static final int NUMBER_PRE_SCREEN=12;
//應用程序的內部類
public static class DataItem{
//應用名字
public String dataName;
//應用程序圖片
public Drawable drawable;
}
//保存系統應用的集合
private List<DataItem> items=new ArrayList<MainActivity.DataItem>();
//記錄當前正是顯示的第幾屏應用
private int screenNo=-1;
//程序所占的總屏數
private int screenCount;
ViewSwitcher switcher;
LayoutInflater inflater;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
inflater=LayoutInflater.from(this);
//模擬40個應用程序
for (int i = 0; i < 40; i++) {
String label=""+i;
Drawable draw=getResources().getDrawable(R.drawable.ic_launcher);
DataItem item=new DataItem();
item.dataName=label;
item.drawable=draw;
items.add(item);
}
// 計算應用程序所占的總屏數。
// 如果應用程序的數量能整除NUMBER_PER_SCREEN,除法的結果就是總屏數。
// 如果不能整除,總屏數應該是除法的結果再加1。
screenCount = items.size() % NUMBER_PRE_SCREEN == 0 ?
items.size()/ NUMBER_PRE_SCREEN :
items.size() / NUMBER_PRE_SCREEN + 1;
switcher=(ViewSwitcher) findViewById(R.id.viewSwitcher);
switcher.setFactory(new ViewFactory() {
@Override
public View makeView() {
return inflater.inflate(R.layout.slidelistview,null);
}
});
next(null);
Button b1=(Button) findViewById(R.id.button_next);
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
next(null);
}
});
Button b2=(Button) findViewById(R.id.button_prev);
b2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
pre(null);
}
});
}
public void next(View v){
if(screenNo<screenCount-1){
screenNo++;
switcher.setInAnimation(this,android.R.anim.slide_in_left);
switcher.setOutAnimation(this,android.R.anim.slide_out_right);
GridView gv=(GridView) switcher.getNextView();
gv.setAdapter(adapter);
switcher.showNext();
}
}
public void pre(View v){
if(screenNo>0){
screenNo--;
switcher.setInAnimation(this,android.R.anim.slide_in_left);
switcher.setOutAnimation(this,android.R.anim.slide_out_right);
GridView gv=(GridView) switcher.getNextView();
gv.setAdapter(adapter);
switcher.showPrevious();
}
}
private BaseAdapter adapter =new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
View view = convertView;
if (convertView == null)
{
// 加載R.layout.labelicon布局文件
view = inflater.inflate(R.layout.item, null);
}
// 獲取R.layout.labelicon布局文件中的ImageView組件,並為之設置圖標
ImageView imageView = (ImageView)
view.findViewById(R.id.imageview);
DataItem it=(DataItem) getItem(position);
imageView.setImageDrawable(it.drawable);
// 獲取R.layout.labelicon布局文件中的TextView組件,並為之設置文本
TextView textView = (TextView)
view.findViewById(R.id.textview);
textView.setText(it.dataName);
return view;
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public Object getItem(int position) {
return items.get(screenNo * NUMBER_PRE_SCREEN + position);
}
@Override
public int getCount() {
// 如果已經到了最后一屏,且應用程序的數量不能整除NUMBER_PER_SCREEN
if (screenNo == screenCount - 1
&& items.size() % NUMBER_PRE_SCREEN != 0)
{
// 最后一屏顯示的程序數為應用程序的數量對NUMBER_PER_SCREEN求余
return items.size() % NUMBER_PRE_SCREEN;
}
// 否則每屏顯示的程序數量為NUMBER_PER_SCREEN
return NUMBER_PRE_SCREEN;
}
};
}