2025年2月14日 星期五 甲辰(龙)年 腊月十四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

Android动画之二:Frame Animation(帧动画)示例详解

时间:05-29来源:作者:点击数:53

0 摘要

接上一篇文章Android动画之一:Tween Animation(补间动画)示例详解,我们继续学习下Frame Animation(帧动画)的特点及使用。

1 Frame Animation简介

Frame Animation(帧动画、逐帧动画),又叫做Drawable Animation(绘图动画),它是一系列图片按照一定顺序展示的过程,和放幻灯片相似。它和补间动画一样,实际上也属于View Animation(视图动画),可以用编码实现,也可以定义在Xml中。下面介绍下这两种方式的实现过程及效果。

2 Frame Animation实现方式

2.1 代码方式

不管哪种方式实现帧动画,都需要我们事先把图片准备好。因此,我们需要将图片放入drawable文件夹(根据名字也可以猜到放在哪了),然后就可以写代码实现帧动画了。

第一步,把冰箱门打开,错了,是获取一个AnimationDrawable实例并为其添加每一帧动画图片,将其设置为ImageView的背景,在Activity onCreate()的时候你就可以做这件事了。

  • /**
  • * 1 通过代码添加帧动画
  • */
  • private void initAnimationDrawable1() {
  • // 创建AnimationDrawable实例
  • mAnimationDrawable = new AnimationDrawable();
  • // 为AnimationDrawable实例添加每一帧动画(这里投机取巧了,可能会有问题)
  • int startDrawableId = R.drawable.img00;
  • for (int i = 0; i < 25; i++) {
  • mAnimationDrawable.addFrame(getResources().getDrawable(startDrawableId + i), 50);
  • }
  • // 设置成循环播放
  • mAnimationDrawable.setOneShot(false);
  • mImageView.setBackground(mAnimationDrawable);
  • }

第二步,可以在点击播放按钮的时候去播放动画了,划重点mAnimationDrawable.start(),不好意思划错了

  • /**
  • * 播放帧动画
  • */
  • public void playAnimation(View view) {
  • // 解决点击播放完成后再次点击不播放动画的问题
  • if (mAnimationDrawable != null) {
  • long animTotalDuration = (long) getFrameAnimTotalDuration(mAnimationDrawable);
  • long elapseTime = System.currentTimeMillis() - mAnimationLastStartTime;
  • if (elapseTime > animTotalDuration && mAnimationDrawable.isRunning()) {
  • mAnimationDrawable.stop();// 帧动画播放完成后必须调用stop() isRunning()才为false
  • }
  • } else {
  • return;
  • }
  • if (!mAnimationDrawable.isRunning()) {
  • Log.i(TAG, "playAnimation: start");
  • mAnimationDrawable.start();
  • mAnimationLastStartTime = System.currentTimeMillis();
  • } else {
  • Log.i(TAG, "playAnimation: mAnimationDrawable = " + mAnimationDrawable + "; "
  • + "!mAnimationDrawable.isRunning() = " + !mAnimationDrawable.isRunning());
  • }
  • }

第三步,可以在播放过程中点击暂停按钮的时候去暂停动画了,划重点mAnimationDrawable.stop()

  • /**
  • * 停止帧动画
  • */
  • public void pauseAnimation(View view) {
  • if (mAnimationDrawable != null && mAnimationDrawable.isRunning()) {
  • mAnimationDrawable.stop();
  • } else {
  • Log.i(TAG, "pauseAnimation: mAnimationDrawable = " + mAnimationDrawable + "; "
  • + "mAnimationDrawable.isRunning() = " + mAnimationDrawable.isRunning());
  • }
  • }

恩,就是这么简单,你就把大象装进冰箱里了。不好意思,忘记一段代码,开下门。

  • /**
  • * 获取帧动画总时长
  • * @return 帧动画总时长
  • */
  • public int getFrameAnimTotalDuration(AnimationDrawable animationDrawable) {
  • int frameAnimTotalDuration = 0;
  • for (int i = 0; i < animationDrawable.getNumberOfFrames(); i++) {
  • frameAnimTotalDuration += animationDrawable.getDuration(i);
  • }
  • return frameAnimTotalDuration;
  • }

关于帧动画开始、结束的监听,哪位同学有更官方的方式吗?我这自己琢磨的,可能不靠谱。

2.3 Xml方式

Xml方式就更简单了,就写xml呗,Follow me!

右键res文件夹>New>Android Resource File>出现New Resource File对话框,File name自定义(如frame_animation_list)、Resource Type选择Drawable、Root element输入animation-list,OK后drawable文件夹下就多出了一个xml文件咯。

创建帧动画Xml

然后,像我一样把Xml文件写一下。注意,item的顺序就是播放顺序,不要乱搞哦(不会根据文件名排序吗?恩,你想多了)

  • <?xml version="1.0" encoding="utf-8"?>
  • <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
  • android:oneshot="true"><!--oneshot:是否循环播放-->
  • <item
  • android:drawable="@drawable/img00"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img01"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img02"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img03"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img04"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img05"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img06"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img07"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img08"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img09"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img10"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img11"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img12"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img13"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img14"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img15"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img16"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img17"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img18"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img19"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img20"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img21"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img22"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img23"
  • android:duration="50" />
  • <item
  • android:drawable="@drawable/img24"
  • android:duration="50" />
  • </animation-list>

代码当然还是要加一点的哦,只需要更改第一步的代码就行了,播放暂停动画就不用动了。

  • /**
  • * 2 通过xml添加帧动画,两种方法差别不大
  • * 2.1 通过xml添加帧动画-方法1
  • */
  • private void initAnimationDrawable2() {
  • // 通过帧动画资源文件(frame_animation_list)获得AnimationDrawable实例
  • mAnimationDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.frame_animation_list);
  • // 将AnimationDrawable实例设置为ImageView的背景
  • mImageView.setBackground(mAnimationDrawable);
  • }
  • /**
  • * 2.2 通过xml添加帧动画-方法2
  • */
  • private void initAnimationDrawable3() {
  • // 将动画资源设置为ImageView的背景资源
  • mImageView.setBackgroundResource(R.drawable.frame_animation_list);
  • // 通过get ImageView背景获得AnimationDrawable实例
  • mAnimationDrawable = (AnimationDrawable) mImageView.getBackground();
  • }

3 Frame Animation实现效果

啥也不说了,上图!

帧动画效果

4 总结

帧动画还是比较简单的,主要用于多幅图片的逐帧播放,感觉应用场景不是很多。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门