博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 逐帧动画isRunning 一直返回true的问题
阅读量:5172 次
发布时间:2019-06-13

本文共 2316 字,大约阅读时间需要 7 分钟。

AnimationDrawabl主要通过xml实现逐帧动画,SDK实例如下:

An AnimationDrawable defined in XML consists of a single 
element, and a series of nested
tags. Each item defines a frame of the animation. See the example below. spin_animation.xml file in res/drawable/ folder:
Here is the code to load and play this animation. // Load the ImageView that will host the animation and // set its background to our AnimationDrawable XML resource. ImageView img = (ImageView)findViewById(R.id.spinning_wheel_image); img.setBackgroundResource(R.drawable.spin_animation); // Get the background, which has been compiled to an AnimationDrawable object. AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground(); // Start the animation (looped playback by default). frameAnimation.start();

例子很简单,清楚,现在说说遇到的一个问题

最近遇到一个问题,就是设计了一个逐帧动画,但是oneshot=true,这样的话,当调用AnimationDrawable.start()的方法以后,就只播放一次。

但是我不希望在动画没有结束前,start()被重复调用,因此:

if(!mAnimation.isRunning()){      mAnimation.start();  }

我在start方法前加了一个判定条件,就是当前不处于isRunning状态时再播放。

但是问题出现了,当我下次触发,需要调用到start方法是,isRunning始终返回true;

后来我查阅源码,跟网上资料,得出结论如下:

首先看看isRunning()

/**         * 

Indicates whether the animation is currently running or not.

* * @return true if the animation is running, false otherwise */ public boolean isRunning() { return mCurFrame > -1; }

这里的mCurFrame是当前播放那一帧,当oneshot=true时,播放完成后,停留在最后一帧,也就是此时的mCurFrame保存的是最后一帧的序号,因此,当我们此时调用isRunning()的时候始终返回为true;

那么如何使得isRunning返回false呢?我们来看看stop方法:

/**         * 

Stops the animation. This method has no effect if the animation is * not running.

* * @see #isRunning() * @see #start() */ public void stop() { if (isRunning()) { unscheduleSelf(this); } } @Override public void unscheduleSelf(Runnable what) { mCurFrame = -1; super.unscheduleSelf(what); }

    我们看到调用stop方法时,会间接的将mCurFrame = -1;

      现在我们回头想先oneShot的含义是完整的播放一次动画,并不是我们理解的动画播放一次,而是只从start 到stop,才算是完整的一次动画,因此android将stop的方法开放给用户,让用户自行控制oneshot的周期。

      所以要解决最开始的问题,一定要手动显式的调用一次stop方法就可以了,具体的,要自己定义一个延时,比如handler或者timer都可以。

 

 

转载于:https://www.cnblogs.com/qgli/p/3311978.html

你可能感兴趣的文章
BT1120时序,可以用于自测用
查看>>
解决微信小程序要求TLS版本不低于1.2问题
查看>>
20155204《网络对抗》Exp 6 信息搜集与漏洞扫描
查看>>
WSP (无线会话协议)
查看>>
制造业悖论 -- 一些难解而又必须解的问题
查看>>
Python代码书写规范
查看>>
为什么你应该开始学习编程了
查看>>
BP人工神经网络的介绍与实现
查看>>
从44.556677想到的
查看>>
创建第一个Djiago
查看>>
OpenFire 安装及配置
查看>>
jquery.blockUI.2.31.js 弹出层项目介绍
查看>>
MongoDB应用上的坑
查看>>
【转】commons-lang.jar包简介
查看>>
【转】拉勾网 - 《2016互联网职场生态白皮书》
查看>>
java生成随机验证图片的实现
查看>>
javascript——创建对象模型1
查看>>
[asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的
查看>>
Unity Behaviors for Interception
查看>>
Servlet & JSP - 转发与重定向的区别
查看>>