第5组UI "让你的界面酷炫到底"-ViewAniMator之ViewSwitcher、ImageSwitcher(图像切换器)、TextSwitcher(文本切换器)、ViewFlipper

ViewAniMator是一个基类,它继承了FrameLayout,因此它表现了FrameLayout的一些特征,可以将多个View组件“叠”在一起。额外的功能是:在View切换时表现出动画效果。
ViewAnimator及其子类的继承关系:
这里写图片描述
支持的xml属性:
animateFirstView=”” //设置显示的第一个View组件时是否使用动画
inAnimation=”“//设置显示组件时使用的动画
putAnimation=”“//是指隐藏组件时使用的动画

ViewSwitcher(视图切换)

1.概述:

当程序控制从一个View切换到另一个View时,ViewSwitcher支持指定动画效果。
为了给ViewSwitcher添加多个组件,一般通过调用ViewSwitcher的setFactory(ViewSwitcher.ViewFatory factory)的方法为之设置ViewFactory,并由该ViewFactory为之创建View即可。

ImageSwitcher(图像切换器)

1.概述:

ImageSwitcher继承了ViewSwitcher,并重写了ViewSwitcher的showNext()和showPrevios()方法。因此ImageSwitcher使用起来更简单一些。
区别在于:ImageSwitcher更炫,可以指定图片切换时的动画效果。

2.步骤:

1>为ImageSwitcher提供一个ViewFactory,该ViewFactory生成的View必须是ImageView.
2>需要切换图片时,只要调用ImageSwitcher的setImageDrawable(Drawable drawable),setImageResource(int resid)和setImageURL(Uri uri)的方法更换图片即可。

3.范例:

功能:结合gallery,点击列表项时,显示图片
xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" 
    android:orientation="vertical">
    <GridView 
        android:id="@+id/gridView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:numColumns="4"
        android:gravity="center"></GridView>
    <ImageSwitcher 
        android:id="@+id/imageSwitcher"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:inAnimation="@android:anim/fade_in"
        android:outAnimation="@android:anim/fade_out"
        ></ImageSwitcher>


</LinearLayout>

java:

public class MainActivity extends Activity {
    private GridView mGridView;
    private ImageSwitcher mImageSwitcher;
    List<Map<String, Object>> mListItems;
    private int[] imageIds;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mGridView = (GridView) findViewById(R.id.gridView);
        mImageSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitcher);
        mListItems = new ArrayList<Map<String,Object>>();

        init();
        /**
         * 设置图片切换的动画效果
         * */
        mImageSwitcher.setFactory(new ViewFactory() {

            @Override
            public View makeView() {//重写方法makeView
                //创建ImageView对象
                ImageView imageView = new ImageView(MainActivity.this);
                imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);//设置图片居中显示
                //imageView.setLayoutParams(new ImageSwitcher(getApplicationContext().))
                return imageView;//返回imageView对象。
            }
        });

        /**创建一个SimpleAdapter适配器
         * 
         * */
        SimpleAdapter adapter = new SimpleAdapter(this, mListItems, R.layout.item_cell, new String[]{"image"}, new int[]{R.id.imageView});

        mGridView.setAdapter(adapter);
        /**添加列表项被选中的监听器
         * 
         * */
        mGridView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View view, int positon,
                    long id) {
              //列表项被选中后,显示当前被选中的图片
                mImageSwitcher.setImageResource(imageIds[positon]);

            }
        });


    }



    /**对数据进行初始化
     * 
     * */
    private void init() {
        imageIds = new int[]{
                R.drawable.baby, R.drawable.fanbingbing2,R.drawable.kero,R.drawable.liuyifei,
                R.drawable.zhaowei,R.drawable.liminhao2,R.drawable.fanbingbing1,R.drawable.liminhao,
                R.drawable.liuyifei,R.drawable.liyifeng,R.drawable.zhengshuang,R.drawable.yangmi2,
                R.drawable.xxietingfeng

        };
        for (int i = 0; i < imageIds.length; i++) {


        Map<String, Object> listItem = new HashMap<String, Object>();//注:要建立多个对象。
        listItem.put("image", imageIds[i]);
        mListItems.add(listItem);
        }

    }

}

结果演示:

这里写图片描述

TextSwitcher(文本切换器)

1.概述:

与ImageSwitcher不同的是,它所需的ViewFactory的makeView()方法必须返回一个TextView组件。
与TextViewr的区别:都可以显示文本内容,但效果更炫,可以指定文本切换时的动画效果。

2.范例:

点击gallery,显示名字:(在上面例子的基础上更改)

//上面java代码更改:
strs = new String[]{
                "baby","fanbingbing2","kero","liuyifei","zhaowei","liminhao2",
                "fanbingbing1","liminhao","liuyifei","liyifeng","zhengshuang",
                "yangmi2","xxietingfeng"
        };

        mTextSwitcher.setFactory(new ViewSwitcher.ViewFactory() {

            @Override
            public View makeView() {//创建返回的图片对象,并进行设置。
                TextView textview = new TextView(MainActivity.this);
                textview.setTextSize(40);
                textview.setTextColor(Color.MAGENTA);
                return textview;
            }
        });



-------------------------------------------------------
//列表项中更改:
mGridView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View view, int position,
                    long id) {
              //列表项被选中后,显示当前被选中的图片
            //  mImageSwitcher.setImageResource(imageIds[position]);
                mTextSwitcher.setText(strs[position]);
            }
        });

结果演示:
这里写图片描述

ViewFlipper

1.概述:

可以使用动画控制多个组件之间的切换。

2.用法:

xml中,需要在ViewFlipper之间添加多个控件;
可以利用addView(View v)添加组件。

范例:

功能:通过按钮控制上下播放,或者自动播放
xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ViewFlipper 
        android:id="@+id/viewFlipper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:flipInterval="1000"
        android:layout_gravity="center_vertical"
        >
        <ImageView 
            android:id="@+id/imageview1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/liminhao"
            />
        <ImageView 
            android:id="@+id/imageview2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/zhaowei"
            />
        <ImageView 
            android:id="@+id/imageview3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/baby"
            />
    </ViewFlipper>
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <Button 
            android:id="@+id/buttonPrev"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="上一张"/>
        <Button 
            android:id="@+id/buttonAuto"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="自动播放"/>
        <Button 
            android:id="@+id/buttonNext"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="下一张"/>
    </LinearLayout>


</LinearLayout>

java:

public class SecondActivity extends Activity implements OnClickListener {
    private Button mButtonPrev;
    private Button mButtonAuto;
    private Button mButtonNext;
    private ViewFlipper mViewFlipper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        mButtonPrev = (Button) findViewById(R.id.buttonPrev);
        mButtonAuto = (Button) findViewById(R.id.buttonAuto);
        mButtonNext = (Button) findViewById(R.id.buttonNext);
        mViewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper);
        mButtonPrev.setOnClickListener(this);
        mButtonAuto.setOnClickListener(this);
        mButtonNext.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.buttonPrev:
            prev(v);
            break;
        case R.id.buttonAuto:
            auto(v);
            break;
        case R.id.buttonNext:
            next(v);
            break;

        default:
            break;
        }

    }

    public void prev(View source) {
        mViewFlipper.setInAnimation(this, android.R.anim.slide_in_left);// 设置播放效果
        mViewFlipper.setOutAnimation(this, android.R.anim.slide_out_right);
        mViewFlipper.showPrevious();// 显示上一组件
        mViewFlipper.stopFlipping();// 停止自动播放

    }

    public void next(View source) {
        mViewFlipper.setInAnimation(this, android.R.anim.slide_in_left);// 设置播放效果
        mViewFlipper.setOutAnimation(this, android.R.anim.slide_out_right);
        mViewFlipper.showNext();// 显示下一组件
        mViewFlipper.stopFlipping();// 停止自动播放

    }

    public void auto(View source) {
        mViewFlipper.setInAnimation(this, android.R.anim.slide_in_left);// 设置播放效果
        mViewFlipper.setOutAnimation(this, android.R.anim.slide_out_right);
        mViewFlipper.showNext();// 显示下一组件
        mViewFlipper.startFlipping();// 开始自动播放

    }

}

结果演示:
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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。该类也具有两个子类ImageSwitcherTextSwitcher分别用于图片和文本切换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值