zoukankan      html  css  js  c++  java
  • Android ViewSwitcher 的功能与用法

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

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

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


    import java.util.ArrayList;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.graphics.drawable.Drawable;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.GridView;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.ViewSwitcher;
    import android.widget.ViewSwitcher.ViewFactory;
    
    
    public class ViewSwitcherTest extends Activity
    {
    	// 定义一个常量,用于显示每屏显示的应用程序数
    	public static final int NUMBER_PER_SCREEN = 12;
    
    	// 代表应用程序的内部类,
    	public static class DataItem
    	{
    		// 应用程序名称
    		public String dataName;
    		// 应用程序图标
    		public Drawable drawable;
    	}
    
    	// 保存系统所有应用程序的List集合
    	private ArrayList<DataItem> items = new ArrayList<DataItem>();
    	// 记录当前正在显示第几屏的程序
    	private int screenNo = -1;
    	// 保存程序所占的总屏数
    	private int screenCount;
    	ViewSwitcher switcher;
    	// 创建LayoutInflater对象
    	LayoutInflater inflater;
    
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		inflater = LayoutInflater.from(ViewSwitcherTest.this);
    		// 创建一个包含40个元素的List集合,用于模拟包含40个应用程序
    		for (int i = 0; i < 40; i++)
    		{
    			String label = "" + i;
    			Drawable drawable = getResources().getDrawable(
    					R.drawable.ic_launcher);
    			DataItem item = new DataItem();
    			item.dataName = label;
    			item.drawable = drawable;
    			items.add(item);
    		}
    		// 计算应用程序所占的总屏数。
    		// 如果应用程序的数量能整除NUMBER_PER_SCREEN,除法的结果就是总屏数。
    		// 如果不能整除,总屏数应该是除法的结果再加1。
    		screenCount = items.size() % NUMBER_PER_SCREEN == 0 ? 
    				items.size()/ NUMBER_PER_SCREEN :
    				items.size() / NUMBER_PER_SCREEN	+ 1;
    		switcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    		switcher.setFactory(new ViewFactory()
    		{
    			// 实际上就是返回一个GridView组件
    			@Override
    			public View makeView()
    			{
    				// 加载R.layout.slidelistview组件,实际上就是一个GridView组件。
    				return inflater.inflate(R.layout.slidelistview, null);
    			}
    		});
    		// 页面加载时先显示第一屏。
    		next(null);
    	}
    
    	public void next(View v)
    	{
    		if (screenNo < screenCount - 1)
    		{
    			screenNo++;
    			// 为ViewSwitcher的组件显示过程设置动画
    			switcher.setInAnimation(this, R.anim.slide_in_right);
    			// 为ViewSwitcher的组件隐藏过程设置动画
    			switcher.setOutAnimation(this, R.anim.slide_out_left);
    			// 控制下一屏将要显示的GridView对应的 Adapter
    			((GridView) switcher.getNextView()).setAdapter(adapter);
    			// 点击右边按钮,显示下一屏,也可通过手势检测实现显示下一屏.
    			switcher.showNext(); 
    		}
    	}
    
    	public void prev(View v)
    	{
    		if (screenNo > 0)
    		{
    			screenNo--;
    			// 为ViewSwitcher的组件显示过程设置动画
    			switcher.setInAnimation(this, android.R.anim.slide_in_left);
    			// 为ViewSwitcher的组件隐藏过程设置动画
    			switcher.setOutAnimation(this, android.R.anim.slide_out_right);
    			// 控制下一屏将要显示的GridView对应的 Adapter
    			((GridView) switcher.getNextView()).setAdapter(adapter);
    			// 点击左边按钮,显示上一屏,也可通过手势检测实现显示上一屏.
    			switcher.showPrevious(); 
    		}
    	}
    
    	// 该BaseAdapter负责为每屏显示的GridView提供列表项
    	private BaseAdapter adapter = new BaseAdapter()
    	{
    		@Override
    		public int getCount()
    		{
    			// 如果已经到了最后一屏,且应用程序的数量不能整除NUMBER_PER_SCREEN
    			if (screenNo == screenCount - 1
    					&& items.size() % NUMBER_PER_SCREEN != 0)
    			{
    				// 最后一屏显示的程序数为应用程序的数量对NUMBER_PER_SCREEN求余
    				return items.size() % NUMBER_PER_SCREEN;
    			}
    			// 否则每屏显示的程序数量为NUMBER_PER_SCREEN
    			return NUMBER_PER_SCREEN;
    		}
    
    		@Override
    		public DataItem getItem(int position)
    		{
    			// 根据screenNo计算第position个列表项的数据
    			return items.get(screenNo * NUMBER_PER_SCREEN + position);
    		}
    
    		@Override
    		public long getItemId(int position)
    		{
    			return position;
    		}
    
    		@Override
    		public View getView(int position
    				, View convertView, ViewGroup parent)
    		{
    			View view = convertView;
    			if (convertView == null)
    			{
    				// 加载R.layout.labelicon布局文件
    				view = inflater.inflate(R.layout.labelicon, null);
    			}
    			// 获取R.layout.labelicon布局文件中的ImageView组件,并为之设置图标
    			ImageView imageView = (ImageView)
    					view.findViewById(R.id.imageview);
    			imageView.setImageDrawable(getItem(position).drawable);
    			// 获取R.layout.labelicon布局文件中的TextView组件,并为之设置文本
    			TextView textView = (TextView) 
    					view.findViewById(R.id.textview);
    			textView.setText(getItem(position).dataName);
    			return view;
    		}
    	};
    }

    slide_in_right.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- 设置从右边拖进来的动画
        android:duration指定动画持续时间  -->
    	<translate
    		android:fromXDelta="100%p"
    		android:toXDelta="0"
    		android:duration="@android:integer/config_mediumAnimTime" />
    </set>

    slide_out_left.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- 设置从左边拖出去的动画 
        android:duration指定动画持续时间 -->
    	<translate
    		android:fromXDelta="0"
    		android:toXDelta="-100%p"
    		android:duration="@android:integer/config_mediumAnimTime" />
    </set>
    


    labelicon.xml

    <?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>

    main.xml

    <RelativeLayout
    	xmlns:android="http://schemas.android.com/apk/res/android"
    	android:layout_width="fill_parent"
    	android:layout_height="fill_parent">
    	<!-- 定义一个ViewSwitcher组件 -->
    	<ViewSwitcher
    		android:id="@+id/viewSwitcher"
    		android:layout_width="fill_parent"
    		android:layout_height="fill_parent" />
    	<!-- 定义滚动到上一屏的按钮 -->
    	<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="<" />
    	<!-- 定义滚动到下一屏的按钮 -->
    	<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=">" />
    </RelativeLayout>

    slidelistview.xml

    <?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>
    


  • 相关阅读:
    云计算和大数据时代网络技术揭秘(八)数据中心存储FCoE
    云计算和大数据时代网络技术揭秘(七)大二层网络
    云计算和大数据时代网络技术揭秘(六)LISP协议
    云计算和大数据时代网络技术揭秘(五)可靠的网络
    云计算和大数据时代网络技术揭秘(四)网络加密
    云计算和大数据时代网络技术揭秘(三)安全的网络准入
    python3练习100题——027
    python3练习100题——026
    python3练习100题——025
    python3练习100题--024
  • 原文地址:https://www.cnblogs.com/aikongmeng/p/3697369.html
Copyright © 2011-2022 走看看