![Android App开发进阶与项目实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/109/44510109/b_44510109.jpg)
上QQ阅读APP看书,第一时间看更新
3.1.1 帧动画的实现
Android的动画分为3大类:帧动画、补间动画和属性动画。其中,帧动画是实现原理最简单的一种,跟现实生活中的电影胶卷类似,都是在短时间内连续播放多张图片,从而模拟动态画面的效果。
Android的帧动画由动画图形AnimationDrawable生成。下面是AnimationDrawable的常用方法:
- addFrame:添加一幅图片帧,并指定该帧的持续时间(单位毫秒)。
- setOneShot:设置是否只播放一次,为true表示只播放一次,为false表示循环播放。
- start:开始播放。注意,设置宿主视图后才能进行播放。
- stop:停止播放。
- isRunning:判断是否正在播放。
有了动画图形,还得有一个宿主视图显示该图形,一般使用图像视图承载AnimationDrawable,即调用图像视图的setImageDrawable方法加载动画图形。
下面是利用动画图形播放帧动画的代码片段:
(完整代码见animation\src\main\java\com\example\animation\FrameAnimActivity.java)
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P81_17345.jpg?sign=1739356267-3HrIzGli7A0QbrhfVgOBxUisWAfikFjX-0-1e931b92548997df7bff45e739d91c0e)
帧动画的播放效果如图3-1~图3-3所示。这组帧动画由8张瀑布图片构成,这里的3张画面为其中的3个瀑布帧,单看画面区别不大,连起来播放才能看到瀑布的流水动画。
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P81_7100.jpg?sign=1739356267-7tnhOfzhyCZ4jyt6LGG4KG65b5JrogAQ-0-e4af5e9cbf42da6a51cc76c88e69c7eb)
图3-1 瀑布动画帧1
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P81_7101.jpg?sign=1739356267-9mgFopZN8S45QKeZxB1CsoTA4SHk4nma-0-1d64808ae001b53ee6c11a2f6f5f7f5f)
图3-2 瀑布动画帧2
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P81_7102.jpg?sign=1739356267-67dNZ8us5b18Fw4TMD9T7agEbyJZqRmd-0-fe59ac74f20ebf0b28d16620471f42b9)
图3-3 瀑布动画帧3
除了在代码中添加帧图片外,可以先在XML文件中定义帧图片的排列;然后在代码中调用图像视图的setImageResource方法,加载指定的XML图形定义文件;再调用图像视图的getDrawable方法,获得动画图形的实例,并进行后续的播放操作。
下面是定义帧图片排列的XML示例文件:
(完整代码见animation\src\main\res\drawable\frame_anim.xml)
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P82_17350.jpg?sign=1739356267-ts6oX8I5IrbltK4tXeJMiSAJhWtK0KW2-0-b4bdac03e10e5132c057c83b7a830a82)
根据图形定义文件播放帧动画的效果与在代码中添加帧图片是一样的,播放的示例代码如下:
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P82_7111.jpg?sign=1739356267-1hax3kFgnJRX9lcE1rn9nAG9RVgpzRgd-0-ff6e8747d411b8afa76f06ec76692ff9)