Android帧动画FrameAnimation使用解析

概要

上一篇博客Android 动画学习笔记一我们介绍了TweenAnimation,本篇博客继续讲解Android动画FrameAnimation,FrameAnimation是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画。我们知道电影或电视画面一秒24帧,事实上就是24张连续的画面,当然了在Android实际开发中不可能会给出这么多的图片,否则动画的加入会很大程度的增加了apk大小,因此一般我们都会放入有限帧进行循环播放即可。FrameAnimation可以被定义在XML文件中,也可以完全编码实现,实际上本篇博客就是针对一个类使用的讲解–AnimationDrawable

AnimationDrawable

XML中定义动画

如果在XML中定义帧动画,我们将自定义的XML文件放在res/drawable/目录下面,在XML中每一帧动画都是有顺序的,并且每一帧都可以自定义播放时长。

XML定义语法如下:

<animation-list>元素是必须的,并且必须要作为根元素,可以包含一或多个<item>元素;android:onshot如果定义为true的话,此动画只会执行一次,如果为false则一直循环。<item>元素代表一帧动画,android:drawable指定此帧动画所对应的图片资源,android:druation代表此帧持续的时间,整数,单位为毫秒。

下面是一个XML定义的一个帧动画:

在XML中定义的动画,我们在代码中如何引入并执行动画呢,代码如下:

animationdrawable

当然了上述代码是需要放在事件处理方法中,如果我们放在Activity生命周期的onCreate()或者onStart()方法中仍然不起作用,因为此时AnimationDrawable还没有完全附着在Window窗体上,有兴趣的可以查看一下Activity学习笔记这篇文章,看看Activity每个生命周期方法都在执行什么机制。如果想要页面显示出来就执行动画,我们可以放在onWindowFocusChanged()方法中执行,下图展示了onWindowFocusChanged()位于Activity生命周期方法的哪个阶段。

life

代码实现帧动画

纯代码实现帧动画也相当简单,先定义一个AnimationDrawable实例,然后通过方法addFrame加入逐帧动画图片。

其它

逐帧动画FrameAnimation对于执行一些特殊的动画效果确实不错,不过通过上面的代码我们也发现如果一个系统当中植入太多的这种动画,图片资源太多会增加APP的大小,因此对于有限帧播放的重复动画一般情况下我们不需要采用AnimationDrawable,直接使用上一节中我们讲解的Tween Animation。

实现一个正在加载中的旋转动画,对于这种一直重复旋转的动画我们使用RotateAnimation就可以了。

rotate

实现效果如下:

progress_rotate01

达不到我们想要的效果,如果我们直接通过ProgressBar来自定义旋转的图片,在res/anim目录下新建一个动画执行文件,效果也不理想。

系统内置的一直都是匀速旋转的,我们找到系统 XML动画文件如下:

好吧,系统用这个动画文件,我们也照着葫芦画瓢,可是报错了,因为android:framesCountandroid:frameDuration这两个属性是Android内置的,开发者是没有权限来使用的。
匀速旋转的Loading我们使用动画总是不理想,接下来我们做一个带有有限帧的旋转动画总可以了吧,我们假设8个帧,然后自定义一个插值器Interpolator,有关插值器Interpolator我们在后面的文章中再另起一篇介绍。

progress_rotate02

效果就是这样的,如果我们用AnimationDrawable,得使用8张图片,而在这里我们一张图片就搞定了。

如果我们真想实现一个跟系统当中一样的匀速旋转的进度条,最好的方式就是使用一个自定义控件,网上也有许多各种自定义进度条,包过一些很炫的MaterialProgressBar。

本文地址:www.sunnyang.com/380.html

示例源代码下载

参考资料

详解Android动画之Frame Animation

Android Animate Rotate

Material design进度条:MaterialProgressBar

Drawable Animation

One comment

发表评论