前言

现在的app中根本上都有轮播的需求,比方广告banner、最新音讯tips等等。

其间咱们熟悉的顶部广告一般左右轮播,这种情况大部分经过ViewPager完成。而那种上下轮播的音讯tips(一般是条状)则能够使用ViewFlipper完成。

说到ViewFlipper,就不得不先说ViewAnimator,它是ViewFlipper的父类,ViewFlipper的功用便是在它基础上扩展出来的。

ViewAnimator

ViewAnimator继承FrameLayout,所以它的子View都是堆叠的。它的首要作用便是能够切换这些子view,且切换时有动画过渡。

咱们能够直接在xml中给它增加子view,也能够经过addView系列函数动态增加子view。因为ViewAnimator重写了最终的addView函数。

然后能够调用showNextshowPrevious来切换下一个或上一个子view。

还能够使用setInAnimationsetOutAnimation设置切换动画。

能够看到这些就满意了咱们轮播的根本需求:切换+动画。

ViewAnimator有几个子类:TextSwitcher,ImageSwitcher,ViewSwitcher,ViewFlipper。

经过源码能够知道TextSwitcher,ImageSwitcher其实便是严格限定子view是TextView和ImageView,一起提供更方便的函数来处理text或image。

而ViewSwitcher约束子view个数不能超过2个,所以它只是两个view来回切换。

而ViewFlipper便是本文的主角,它完成来守时切换功用。

ViewFlipper

ViewFlipper在ViewAnimator的基础上完成来守时切换的功用,咱们能够设置切换时间。一起也支撑开启自动切换。

这样就正好用来完成咱们的上下轮播功用。

使用ViewFlipper切换时默许是瞬时的,但是因为它继承ViewAnimator,所以能够增加过渡动画,经过两个函数即可:

flipper.setInAnimation(mContext, R.anim.in_bottom);
flipper.setOutAnimation(mContext, R.anim.out_top);

in_bottom是从底部飞入:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300">
    <translate
        android:fromYDelta="100%p"
        android:toYDelta="0" />
    <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
</set>

out_top是从顶部飞出:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300">
    <translate
        android:fromYDelta="0"
        android:toYDelta="-100%p" />
    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>

这样就完成了轮播动画。

但是ViewFlipper或ViewAnimator没有任何关于切换的监听器,所以咱们无法监听切换。有一个巧妙的办法能够简单的监听切换,便是在设置了Animation的前提下,经过监听动画来完成:

flipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
            //do something
        }
        @Override
        public void onAnimationEnd(Animation animation) {
        }
        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });

留意:上面代码必须设置了setInAnimation,否则会null指针异常。