简介
帧动画(Frame Animation
又称Drawable Animation
)是最简单的Android
动画效果,其与电影多重连续帧播放原理相似,通过视觉残留来让人感知到动画效果。其实现方式是将一张张Drawable
图片按顺序排列并逐张按时播放来达到实现的动画效果,对应的实现类是AnimationDrawable
。它有两种实现方式:代码实现和XML
实现,其中XML
实现方式较为简单。
使用方式
XML实现
1、定义
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@drawable/arrow_down01"
android:duration="150" />
<item
android:drawable="@drawable/arrow_down02"
android:duration="150" />
<item
android:drawable="@drawable/arrow_down03"
android:duration="150" />
<item
android:drawable="@drawable/arrow_down04"
android:duration="150" />
</animation-list>
其根标签为animation-list
,它有几个自定义属性,其中oneshot
属性表示是否只显示一次,设置为false
时将会循环播放动画,设置为true
时动画只执行一次且执行之后停在最后一帧;visible
属性为布尔值,设置动画的可见性,true
为可见,false
为不可见,在XML
中定义的visible
属性无用,因为它没有解析;variablePadding
属性也为布尔值,表示是否支持可变的Padding
,默认为false
,表示使用所有帧中最大的Padding
,当设置为true
时表示drawable
的Padding
值随当前选择的状态而改变。
在根标签下通过item
标签对动画中的每一帧进行声明,每帧中包含其需要展示的Drawable
以及其展示的时间,drawable
可以是图片或者颜色,duration
表示展示该帧动画所用的时间长度。
2、使用
- 获取动画对象
AnimationDrawable animationDrawable = (AnimationDrawable) mIvView.getDrawable();
AnimationDrawable animationDrawable = (AnimationDrawable) mTvView.getBackground();
- 开始动画
if (!animationDrawable.isRunning()) {
animationDrawable.start();
}
- 结束动画
if (animationDrawable.isRunning()) {
animationDrawable.stop();
}
代码实现
1、定义
AnimationDrawable mAnimationDrawable = new AnimationDrawable();
mAnimationDrawable.addFrame(getResources().getDrawable(R.color.blue01), 150);
mAnimationDrawable.addFrame(getResources().getDrawable(R.color.blue02), 150);
mAnimationDrawable.addFrame(getResources().getDrawable(R.color.blue03), 150);
mAnimationDrawable.addFrame(getResources().getDrawable(R.color.blue04), 150);
mAnimationDrawable.addFrame(getResources().getDrawable(R.color.blue05), 150);
mAnimationDrawable.setOneShot(false);
boolean setVisible(boolean visible, boolean restart)
:visible
表示动画是否可见,restart
的值设置为true
时表示从第一帧开始播放动画,设置为false
时表示从最近的帧开始执行动画。
2、使用
- 设置动画
mTvAnimation.setBackgroundDrawable(mAnimationDrawable);
mIvArrow.setImageDrawable(mAnimationDrawable);
- 开始动画
if (!mAnimationDrawable.isRunning()) {
mAnimationDrawable.start();
}
- 结束动画
if (mAnimationDrawable.isRunning()) {
mAnimationDrawable.stop();
}
- 若同一个动画既给
TextView
做背景,又给ImageView
做前景,此时调用start
方法会出现什么情况呢?
mIvAnimation.setImageDrawable(mAnimationDrawable);
mTvAnimation.setBackgroundDrawable(mAnimationDrawable);
if (!mAnimationDrawable.isRunning()) {
mAnimationDrawable.start();
}
此时ImageView
显示的是动画的第一帧,TextView
执行动画效果。
mTvAnimation.setBackgroundDrawable(mAnimationDrawable);
mIvAnimation.setImageDrawable(mAnimationDrawable);
if (!mAnimationDrawable.isRunning()) {
mAnimationDrawable.start();
}
此时TextView
显示的是动画的第一帧,ImageView
执行动画效果。
综上所述:同一个AnimationDrawable
对象的start()
方法只在最后一个应用它的View
上生效。
以上就是animation-list
实现逐帧动画的常用方式,希望与大家一起共勉。
项目地址 ☞ 传送门