Android如何实现轮播效果:ViewFlipper 和 ViewAnimator

前言

现在的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指针异常。

Android 学习笔录

Android 性能优化篇:https://qr18.cn/FVlo89
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 车载篇:https://qr18.cn/F05ZCM
Android 逆向安全学习笔记:https://qr18.cn/CQ5TcL
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 往年面试题锦:https://qr18.cn/CKV8OZ
2023年最新Android 面试题集:https://qr18.cn/CgxrRy
Android 车载开发岗位面试习题:https://qr18.cn/FTlyCJ
音视频面试题锦:https://qr18.cn/AcV6Ap

相关推荐
千里马学框架12 小时前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台12 小时前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone12 小时前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc13 小时前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo14 小时前
Kotlin 协程中的 Job 结构化并发与取消
android
sun00770015 小时前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼16 小时前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone17 小时前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen17 小时前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone17 小时前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui