ViewSwitcher仿安卓系统Launcher界面

来源:互联网 发布:centos 移动目录 编辑:程序博客网 时间:2024/05/16 04:38

java代码

package com.example.zhang.viewswitchertest;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 java.util.ArrayList;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);        }        //类似于if else        // 计算应用程序所占的总屏数        // 如果应用程序的数量能整除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 ViewSwitcher.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;        }        //获取数据集里面与指定postion索引对应的数据项        @Override        public DataItem getItem(int position)        {            // 根据screenNo计算第position个列表项的数据            return items.get(screenNo * NUMBER_PER_SCREEN + position);        }        //获取在列表中与指定索引相对应的Id        @Override        public long getItemId(int position)        {            return position;        }        //获取视图        @Override        public View getView(int position                , View convertView, ViewGroup parent)        {            View view = convertView;            if (convertView == null)//采用这种方法,通过converView,如果缓存中没有View,怎创建View,避免浪费,提升性能            {                // 加载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;        }    };}

xml代码

<!--content_main.xml--><?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    app:layout_behavior="@string/appbar_scrolling_view_behavior"    tools:context="com.example.zhang.viewswitchertest.MainActivity"    tools:showIn="@layout/activity_main">    <ViewSwitcher        android:id="@+id/viewSwitcher"        android:layout_width="match_parent"        android:layout_height="match_parent"/>    <Button        android:id="@+id/prev"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_alignParentRight="true"        android:onClick="prev"        android:text="&lt;"/>    <Button        android:id="@+id/next"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_alignParentLeft="true"        android:onClick="next"        android:text="&gt;"/></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><!--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_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><!--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>

效果
效果

0 0