Android ViewSwitcher

自己尝试着编写了Android ViewSwitcher, 希望对新手有所帮助

MainActivity.java

package ao.viewswitcher;   //自己所建的包名


import java.util.ArrayList;


import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
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 MainActivity 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.activity_main);  
        inflater = LayoutInflater.from(MainActivity.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.layout.slide_in_right);  
            // 为ViewSwitcher的组件隐藏过程设置动画  
            switcher.setOutAnimation(this, R.layout.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;  
        }  
    };  
}  



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



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>  



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> 


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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值