Android三种动画之 帧动画笔记

Android系统中的动画主要可分为三类

1.帧动画 (传送门)

2.补间动画(传送门)

3.属性动画(传送门)

注:下图来源其他博主,仅此一张

Android三种动画之 帧动画笔记_第1张图片

 

1.帧动画(Frame Animation) 帧动画 
  帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。

这种动画更多的依赖于完善的UI资源,原理就是将一张张单独的图片连贯的进行播放,从而在视觉上产生一种动画的效果;有点类似于某些软件制作gif动画的方式。

                                    Android三种动画之 帧动画笔记_第2张图片

自己脑补 菊花不停的转动 ,手动滑稽

具体实现过程:

在res/drawable目录下一个文件XXXXX__animlist.xml,内容如下:

Android三种动画之 帧动画笔记_第3张图片

根节点是animation-list(动画列表),里面有一个或者多个item节点组成,

oneshot属性表示是否只播放一次,true表示只会播放一次,false表示一直循环播放,

内部用item节点声明一个动画帧

android:drawable指定此帧动画所对应的图片资源,

android:druation代表此帧持续的时间,整数,单位为毫秒。

Android三种动画之 帧动画笔记_第4张图片

用ImageView控件作为动画载体来显示动画

这个时候我们运行一下,发现动画没有运行而是停留在第一帧,那是因为AnimationDrawable播放动画是依附在window上面的,而在Activity onCreate方法中调用时Window还未初始化完毕,所有才会停留在第一帧,要想实现播放必须在onWindowFocusChanged中添加如下代码:

imageView.setImageResource(R.drawable.lottery_animlist);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable();
animationDrawable.start();

如果想要停止播放动画可以调用AnimationDrawable的stop方法

  imageView.setImageResource(R.drawable.lottery_animlist);
  AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable();
  animationDrawable.stop();

 

注意:(AnimationDrawable) imageView.getDrawable();和(AnimationDrawable) imageView.getBackground();

两种方法都是可以行的,但是貌似getDrawable()的效率会更高一些

AnimationDrawable 几个常见的api

void start() - 开始播放动画

void stop() - 停止播放动画

addFrame(Drawable frame, int duration) - 添加一帧,并设置该帧显示的持续时间

void setOneShoe(boolean flag) - false为循环播放,true为仅播放一次

boolean isRunning() - 是否正在播放

总结:

   Frame Animation(逐帧动画)相对来说比较简单,但是在实际开发中使用的频率还是比较高的。希望以这个小例子能够掌握逐帧动画,但是逐帧动画只能实现比较小的动画效果,如果复杂而且帧数比较多的动画不太建议使用逐帧动画,一方面是因为会造成OOM,另一方面会显得很卡,如果真是超级复杂的动画的话建议选择其他动画来实现。

 

 

 

你可能感兴趣的:(Android,Java)