码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Android如何实现轮播效果:ViewFlipper 和 ViewAnimator


    前言

    现在的app中基本上都有轮播的需求,比如广告banner、最新消息tips等等。

    其中我们熟悉的顶部广告一般左右轮播,这种情况大部分通过ViewPager实现。而那种上下轮播的消息tips(一般是条状)则可以使用ViewFlipper实现。

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

    ViewAnimator

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

    我们可以直接在xml中给它添加子view,也可以通过addView系列函数动态添加子view。因为ViewAnimator重写了最终的addView函数。

    然后可以调用showNext和showPrevious来切换下一个或上一个子view。

    还可以使用setInAnimation和setOutAnimation设置切换动画。

    可以看到这些就满足了我们轮播的基本需求:切换+动画。

    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);
    
    • 1
    • 2

    in_bottom是从底部飞入:

    
    
        
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    out_top是从顶部飞出:

    
    
        
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这样就实现了轮播动画。

    但是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) {
    
            }
        });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    注意:上面代码必须设置了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

  • 相关阅读:
    C++-openssl-aes-加密解密
    聊聊分布式架构06——[NIO入门]简单的Netty NIO示例
    【Javascript】设计模式之单例模式
    给Series、DataFrame的索引增加前缀:add_prefix()函数
    植物大战僵尸各种僵尸攻略
    6.S081 附加Lab3 线程切换——源代码实现(trap,yeild,context,Scheduler)
    MYSQL8 pt-online-schema-change在线修改大表结构--附带Shell脚本实战
    jenkins自动化部署安装
    4.HMM和CRF的使用和应用
    0104行列式的性质-行列式-线性代数
  • 原文地址:https://blog.csdn.net/weixin_61845324/article/details/133135162
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号