android 在3.0之前经常使用的tween animation在网上已经有人实现了动画的暂停效果,但是对于property animation的暂停尚未实现,由于项目需要,我将属性动画的暂停、停止、播放的三个操作整理如下

对于视图和属性动画的实例化和事件,请直接看代码

暂停animator首先要达到时间停止,把动画停留在某个时间点,继续播放的时候要从这个时间点继续执行。很幸运的是animator给U我们提供了setCurrentPlayTime的方法,但是这个方法只能让动画回到一个指定的时间点,然后继续执行,所以我们需要寻找一个机制,在动画到达下一个时间点之前,将动画的时间点重新设置到暂停的时间点。ValueAnimator提供了addUpdateListener的方法,我们定义一个AnimatorUpdateListener,在onAnimationUpdate中,调用setCurrentPlayTime回置到暂停的时间点即可。这个时候需要注意,直接调用setCurrentPlayTime会触发onAnimationUpdate会造成死循环,在这里需要使用CountDownTimer来调用setCurrentPlayTime来规避。

要暂停视图的状态就比较容易,同样我们在AnimatorUpdateListener中的onAnimationUpdate,做一些手脚。暂停的时候我们通过ValueAnimator.getAnimatedFraction(); 获取动画当前的状态值临时保存起来。并且在暂停的时候设置 停止状态的TimeInterpolator,在这个TimeInterpolator里面的getInterpolation方法我们直接返回之前临时保存的fraction,这样就能达到状态的暂停。

重新播放怎么办?

重新播放的时候我们要判断当前如果是暂停的状态,我们就需要将onAnimationUpdate中不再设置setCurrentPlayTime,同时去掉我们设置的暂停TimeInterpolator。

语言组织比较乱,还是直接上代码吧。

[mw_shl_code=java,true]        TextView text;
        Button btnPause;
        Button btnStop;
        Button btnPlay;
        ObjectAnimator animator;
        static final int ID_BTN_PLAY=1001,ID_BTN_PAUSE=1002,ID_BTN_STOP=1003;
        MyAnimatorUpdateListener updateListener = new MyAnimatorUpdateListener();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

//初始化页面视图,以及增加事件监听
                LinearLayout container = new LinearLayout(this);
                container.setOrientation(LinearLayout.VERTICAL);
                container.setBackgroundColor(Color.rgb(192, 192, 192));
                
                setContentView(container);
                
                btnPlay = new Button(this);
                btnPlay.setText("播放");
                btnPlay.setId(ID_BTN_PLAY);
                btnPlay.setOnClickListener(this);
                container.addView(btnPlay);
                
                btnPause = new Button(this);
                btnPause.setText("暂停");
                btnPause.setId(ID_BTN_PAUSE);
                btnPause.setOnClickListener(this);
                container.addView(btnPause);
                
                btnStop = new Button(this);
                btnStop.setText("停止");
                btnStop.setId(ID_BTN_STOP);
                btnStop.setOnClickListener(this);
                container.addView(btnStop);
                
                text = new TextView(this);
                text.setText("我是文本");
                container.addView(text);
                
                animator = ObjectAnimator.ofFloat(text, "x", 0f,200f);
                animator.setRepeatCount(ValueAnimator.INFINITE);
                animator.setDuration(2000l);
                //为了增加
                animator.addUpdateListener(updateListener);
        }

@Override
        public void onClick(View v) {
                int id = v.getId();
                switch(id){
                case ID_BTN_PLAY:
                        //如果已经暂停,是继续播放
                        if(updateListener.isPause)updateListener.play();
                        //否则就是从头开始播放
                        else animator.start();
                        break;
                case ID_BTN_STOP:
                        //如果点击停止,那么我们还需要将暂停的动画重新设置一下
                        updateListener.play();
                        animator.end();
                        break;
                case ID_BTN_PAUSE:
                        updateListener.pause();
                        break;
                }
        }
        
        class MyAnimatorUpdateListener implements AnimatorUpdateListener{
                /**
                 * 暂停状态
                 */
                private boolean isPause = false;
                /**
                 * 是否已经暂停,如果一已经暂停,那么就不需要再次设置停止的一些事件和监听器了
                 */
                private boolean isPaused = false;
                /**
                 * 当前的动画的播放位置
                 */
                private float fraction = 0.0f;
                /**
                 * 当前动画的播放运行时间
                 */
                private long mCurrentPlayTime = 0l;
                
                /**
                 * 是否是暂停状态
                 * @return
                 */
                public boolean isPause(){
                        return isPause;
                }
                
                /**
                 * 停止方法,只是设置标志位,剩余的工作会根据状态位置在onAnimationUpdate进行操作
                 */
                public void pause(){
                        isPause = true;
                }
                public void play(){
                        isPause = false;
                        isPaused = false;
                }
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                        /**
                         * 如果是暂停则将状态保持下来,并每个刷新动画的时间了;来设置当前时间,让动画
                         * 在时间上处于暂停状态,同时要设置一个静止的时间加速器,来保证动画不会抖动
                         */
                        if(isPause){
                                if(!isPaused){
                                        mCurrentPlayTime = animation.getCurrentPlayTime();
                                        fraction = animation.getAnimatedFraction();
                                        animation.setInterpolator(new TimeInterpolator() {
                                                @Override
                                                public float getInterpolation(float input) {
                                                        return fraction;
                                                }
                                        });
                                        isPaused =  true;
                                }
                                //每隔动画播放的时间,我们都会将播放时间往回调整,以便重新播放的时候接着使用这个时间,同时也为了让整个动画不结束
                                new CountDownTimer(ValueAnimator.getFrameDelay(), ValueAnimator.getFrameDelay()){

@Override
                                        public void onTick(long millisUntilFinished) {
                                        }

@Override
                                        public void onFinish() {
                                                animator.setCurrentPlayTime(mCurrentPlayTime);
                                        }
                                }.start();
                        }else{
                                //将时间拦截器恢复成线性的,如果您有自己的,也可以在这里进行恢复
                                animation.setInterpolator(null);
                        }
                }
                
        }

安卓动画开始,暂停和停止相关推荐

  1. 安卓简单音乐播放器——上一首、下一首、暂停和停止

    安卓超简单音乐播放器 功能上一首.下一首.暂停和停止 歌曲状态控制语句: switch (control){// 播放或暂停case 1:// 原来处于没有播放状态if (status == 0x11 ...

  2. 移动应用程序设计基础——安卓动画与视音频播放器的实现

    <移动应用程序设计基础>实验6 安卓动画与视音频播放器的实现 实验名称: 实验6 安卓动画与视音频播放器的实现 所使用的工具软件及环境: JDK1.8,Android Studio 一.实 ...

  3. 安卓动画全解:补间动画(视图动画)、布局动画、属性动画、逐帧动画。动画Animation属性、Alpha属性、Scale属性、Translate属性、Rotate属性,动画集AnimationSet

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓动画全解:补间动画(视图动画).布局动画.属性动画.逐帧动画. 主要内容包含:动画Animation属性.Alpha属性.Scale属性.Tran ...

  4. Unity3D 控制动画播放暂停

    思路 通过记录当前播放位置,来实现动画的暂停播放. void Update(){if (Input.GetKeyUp(KeyCode.Space) && !pause){//Take ...

  5. [css] 使用纯CSS代码实现动画的暂停与播放

    [css] 使用纯CSS代码实现动画的暂停与播放 一个属性:animation-play-state 取值:paused(暂停)|running(播放) hover取代点击 .stop:hover~. ...

  6. HTML5如何控制暂停播放停止

    本篇教程探讨了HTML5如何控制暂停播放停止,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . <!DOCTYPE HTML> <html> &l ...

  7. 安卓案例:启动和停止服务

    安卓案例:启动和停止服务 一.服务(Service) Service生命力顽强,它有两方面的作用:后台运行.跨进程访问.学习Service基础,利用它可以在后台完成一些耗时的工作,比如网络连接.下载数 ...

  8. 谈谈一些有趣的CSS题目(十四)-- 纯 CSS 方式实现 CSS 动画的暂停与播放!

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  9. html 放上去动画停止,使用jQuery的animate()+CSS样式实现动画效果及stop()停止动画

    01第1节:jQuery动画概述 #JavaScript#在jQuery中,除了可以淡入淡出.滑动效果之外,还可以使用animate()方法创建自定义的动画效果. 对于自定义的动画函数animate( ...

最新文章

  1. Spring Cloud Alibaba 消息队列:基于 RocketMQ 实现服务异步通信
  2. svn patch 功能
  3. 使用 Bamboo 构建项目的 CICD 过程文档
  4. 我理解Docker的过程2
  5. MySQL安装之没有配置向导
  6. 1 QM配置-基本配置-维护工厂等级设置
  7. Python实现红黑树的删除操作
  8. 解决docker数据文件过大导致根磁盘满的问题
  9. 【Java从0到架构师】SpringBoot - MyBatis
  10. [置顶]mybatis分页插件实现分页...
  11. 如何使用Tipard 3D Converter转换2D视频格式
  12. Sublime Text编辑器设置中文
  13. 微型计算机基础知识,第1章微型计算机基础知识
  14. 深度学习入门基础讲义
  15. 计算机基础知识(基础入门小白专属)四
  16. 【JAVA】GUI常用组件
  17. python读取20万数据Excel文件+拆分数据
  18. 为什么要使用 spring?
  19. SQL常用基础语句(SQL常用增删改查语句及案例)
  20. 文件比对工具对比两种数据的差距

热门文章

  1. Trinity(3)
  2. namedtuple
  3. Kolmogorov–Smirnov test
  4. Linux中断分析2
  5. 数学运算符和运算符的优先级
  6. 【07月15日】A股滚动市盈率PE最低排名
  7. python 结合百度识图识别文字
  8. 软考高级(信息系统项目管理师)(四)--中间件技术
  9. 用python实现csdn博主全部博文下载,html转pdf,有了学习的电子书了。。。(附源码)
  10. 计算机视觉中的Transformer