Android ViewSwitcher 的功能与用法

来源:互联网 发布:jquery遍历json集合 编辑:程序博客网 时间:2024/06/05 11:36


ViewSwitcher 代表了视图切换组件, 本身继承了FrameLayout ,可以将多个View叠在一起 ,每次只显示一个组件.当程序控制从一个View切换到另个View时,ViewSwitcher 支持指定动画效果.

为了给ViewSwitcher 添加多个组件, 一般通过ViewSwitcher 的setFactory 方法为止设置ViewFactory ,并由ViewFactory为之创建View 即可. 

下面通过一个实例来介绍 ViewFactory的用法.(仿Android系统Launcher 界面 实现分屏 左右滑动效果)


[java] view plaincopy
  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

[html] view plaincopy
  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

[html] view plaincopy
  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

[html] view plaincopy
  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

[html] view plaincopy
  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

[html] view plaincopy
  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>  


转:http://blog.csdn.net/aikongmeng/article/details/14129319

0 0
原创粉丝点击