ViewSwitcher的功能和用法

ViewSwitcher的功能和用法
表示视图切换组件,可以将多个view层叠在一起,每次只显示一个组件,当控制从一个view切换到另一个view时,可以指定动画效果,
为了给viewswitcher添加多个组件,使用viewswitcher的setfactory方法设置viewfactory,并由viewfactory创建view

public class MainActivity extends Activity {
// 定义一个常量,用于每屏显示的应用程序数
public static final int NUMBER_PER_SCREEN = 12;

    // 代表应用程序的内部类
    public static class DataItem {
            // 应用程序名称
            public String dataName;
            // 应用程序图标
            public Drawable drawble;
    }

    // 保存系统所有应用程序的list集合
    private ArrayList<DataItem> items = new ArrayList<MainActivity.DataItem>();
    // 记录当前正在显示第几屏,
    private int sceeNo = -1;
    // 保存程序所占的总屏数
    private int screenCount;
    ViewSwitcher vs;
    // 创建Layoutinflater对象
    LayoutInflater inflater;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.viewswitcher);
            inflater = LayoutInflater.from(MainActivity.this);
            // 创建一个包含40个元素的liset集合,用于模拟包含40个应用程序
            for (int i = 0; i < 40; i++) {
                    String label = "" + i;
                    Drawable dr = getResources().getDrawable(R.drawable.mia5);
                    DataItem dt = new DataItem();
                    dt.dataName = label;
                    dt.drawble = dr;
                    items.add(dt);
            }
            //计算应用程序所占的总屏数
            //计算应用程序的能量能够整除NUMBER_PER_SCREEN;
            //如果不能整除,总屏数应该是除法的结果加1;
            screenCount=items.size()%NUMBER_PER_SCREEN == 0?
                            items.size()/NUMBER_PER_SCREEN:
                                    items.size()/NUMBER_PER_SCREEN +1;
                            vs=(ViewSwitcher) findViewById(R.id.viewswitcher);
                            vs.setFactory(new ViewFactory() {
                                    //返回一个GridView组件
                                    @Override
                                    public View makeView() {
                                            // TODO Auto-generated method stub
                                    //加载组件,实际就是GridView组件

                                            return inflater.inflate(R.layout.slidelistview, null);
                                    }
                            });
                            //页面加载时先显示第一个屏
                            next(null);
    }

    public void next(View view) {
            // TODO Auto-generated method stub
            if (sceeNo < screenCount - 1) {
                    sceeNo++;
                    // 为ViewSwitcher组件显示过程设置动画
                    vs.setInAnimation(this, R.anim.slide_in_right);
                    // 为ViewSwitcher组件隐藏过程设置动画
                    vs.setInAnimation(this, R.anim.slide_out_left);
                    // 控制下一屏将要显示的GridView对应的adapter
                    ((GridView) vs.getNextView()).setAdapter(ba);
                    // 单击右边按钮,显示下一屏
                    // 学习手势检测后,也可通过手势实现显示下一屏
                    vs.showNext();
            }
    }

    public void prev(View v) {
            // TODO Auto-generated method stub
            if (sceeNo > 0) {
                    sceeNo--;
                    // 为viewswitcher组件显示过程设置动画
                    vs.setInAnimation(this, android.R.anim.slide_in_left);
                    // 为viewswitcher组件隐藏过程设置动画
                    vs.setInAnimation(this, android.R.anim.slide_in_left);
                    // 控制下一屏将要显示的gridview对应的adapter
                    ((GridView) vs.getNextView()).setAdapter(ba);
                    // 单击左边按钮显示上一屏,也可通过手势
                    // 学习手势检测之后,也可通过手势检测实现上一屏
                    vs.showPrevious();
            }

    }

    // 该baseAdapter负责为每一屏显示的GridView提供列表项
    private BaseAdapter ba = new BaseAdapter() {

            @Override
            public View getView(int arg0, View arg1, ViewGroup arg2) {
                    // TODO Auto-generated method stub
                    View view = arg1;
                    if (arg1 == null) {
                            // 加载布局文件
                            view = inflater.inflate(R.layout.labelicon,
                                            null);
                    }
                    // 获取布局我呢见中的imageview组件,并为之设置图标
                    ImageView iv = (ImageView) view
                                    .findViewById(R.id.image01);
                    iv.setImageDrawable(getItem(arg0).drawble);
                    // 获取
                    TextView tv = (TextView) view
                                    .findViewById(R.id.textview);
                    tv.setText(getItem(arg0).dataName);
                    return view;
            }

            @Override
            public long getItemId(int arg0) {
                    // TODO Auto-generated method stub
                    //
                    return arg0;
            }

            @Override
            public DataItem getItem(int arg0) {
                    // TODO Auto-generated method stub
                    // 根据screenno计算第argo个列表项数据
                    return items.get(sceeNo * NUMBER_PER_SCREEN + arg0);
            }

            @Override
            public int getCount() {
                    // TODO Auto-generated method stub
                    // 如果已经到了最后一屏,且应用程序的数量不能整除number——per_screen
                    if (sceeNo == screenCount - 1
                                    && items.size() % NUMBER_PER_SCREEN != 0) {
                            // 最后一屏显示的程序数为应用程序的数量对number_per_screen求余
                            return items.size() % NUMBER_PER_SCREEN;
                    }
                    // 否则每屏显示的程序数量为number_per_screen
                    return NUMBER_PER_SCREEN;
            }
    };

}

<?xml version="1.0" encoding="utf-8"?>

<!-- 定义一个Viewswitcher -->

<ViewSwitcher
    android:id="@+id/viewswitcher"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</ViewSwitcher>
<!-- 定义滚动到上一屏的按钮 -->

<Button
    android:id="@+id/but01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:onClick="prev"
    android:text="&amp;1t" />

<Button
    android:id="@+id/but02"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:onClick="next"
    android:text="&amp;gt" />
<?xml version="1.0" encoding="utf-8"?>

<ImageView
    android:id="@+id/image01"
    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" />
<?xml version="1.0" encoding="utf-8"?>
<!-- 设置从右边拖进来的动画,duration指定动画的持续时间 -->
<translate
    android:duration="@android:integer/config_mediumAnimTime"
    android:fromXDelta="100%p"
    android:toXDelta="0" />
<?xml version="1.0" encoding="utf-8"?>
<!-- 设置从左边拖进来的动画,duration指定动画的持续时间 -->
<translate
    android:duration="@android:integer/config_mediumAnimTime"
    android:fromXDelta="-100%p"
    android:toXDelta="0" />
<?xml version="1.0" encoding="utf-8"?>


在这里插入图片描述

ViewFlipperViewSwitcher的使用:屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面;一个个性化设置页面。 通过查看OPhone API文档可以发现,有个android.widget.ViewAnimator类继承至FrameLayout,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果。该类有如下几个和动画相关的函数: l setInAnimation:设置View进入屏幕时候使用的动画,该函数有两个版本,一个接受单个参数,类型为android.view.animation.Animation;一个接受两个参数,类型为Context和int,分别为Context对象和定义Animation的resourceID。 setOutAnimation: 设置View退出屏幕时候使用的动画,参数setInAnimation函数一样。 showNext: 调用该函数来显示FrameLayout里面的下一个View。 showPrevious:调用该函数来显示FrameLayout里面的上一个View。 一般不直接使用ViewAnimator而是使用它的两个子类ViewFlipperViewSwitcherViewFlipper可以用来指定FrameLayout内多个View之间的切换效果,可以一次指定也可以每次切换的时候都指定单独的效果。该类额外提供了如下几个函数: isFlipping: 用来判断View切换是否正在进行 setFilpInterval:设置View之间切换的时间间隔 startFlipping:使用上面设置的时间间隔来开始切换所有的View,切换会循环进行 stopFlipping: 停止View切换 ViewSwitcher 顾名思义Switcher特指在两个View之间切换。可以通过该类指定一个ViewSwitcher.ViewFactory 工程类来创建这两个View。该类也具有两个子类ImageSwitcher、TextSwitcher分别用于图片和文本切换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值