首页 > 代码库 > ViewSwitcher的功能和用法
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>
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。