一、概念
帧动画是顺序播放一组预先定义好的图片,类似于电影播放。
系统提供了AnimationDrawable类来使用帧动画。
二、实现
1. XML实现:
//定义AnimationDrawable,res/drawable/frame_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
android :oneshot="false">
<item android:drawable="@color/colorAccent" android:duration="500"/>
<item android:drawable="@color/colorPrimaryDark" android:duration="500"/>
<item android:drawable="@color/colorPrimary" android:duration="500"/>
</animation-list>
//布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/animate_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textColor="#FFFFFF"
android:text="Hello Android!"
android:background="@drawable/frame_animation"/>
</RelativeLayout>
//代码,MainActivity
private void startAnimateXML() {
mAnimationDrawable = (AnimationDrawable) mAnimate_tv.getBackground();
if(!mAnimationDrawable.isRunning()) {
mAnimationDrawable.start();
}
}
private void stopAnimate() {
if(mAnimationDrawable.isRunning()) {
mAnimationDrawable.stop();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
startAnimateXML();
}
@Override
protected void onDestroy() {
super.onDestroy();
stopAnimate();
}
2. 代码实现:
//布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/animate_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textColor="#FFFFFF"
android:text="Hello Android!" />
</RelativeLayout>
//代码,MainActivity
private void startAnimateCode() {
mAnimationDrawable = new AnimationDrawable();
mAnimationDrawable .addFrame(getResources().getDrawable(R.color.colorAccent), 500);
mAnimationDrawable .addFrame(getResources().getDrawable(R.color.colorPrimaryDark), 500);
mAnimationDrawable .addFrame(getResources().getDrawable(R.color.colorPrimary), 500);
mAnimationDrawable .setOneShot(false);
mAnimate_tv.setBackgroundDrawable(mAnimationDrawable);
if(!mAnimationDrawable.isRunning()) {
mAnimationDrawable.start();
}
}
private void stopAnimate() {
if(mAnimationDrawable.isRunning()) {
mAnimationDrawable.stop();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
startAnimateCode();
}
@Override
protected void onDestroy() {
super.onDestroy();
stopAnimate();
}
三、AnimationDrawable
AnimationDrawable继承DrawableContainer,并实现Runnable接口(表明自己是一个可执行命令)、Animatable(表明自己支持动画接口)接口。其主要接口有:
boolean setVisible( boolean visible, boolean restart):
visible,表示AnimationDrawable是否可见,值为false则暂停当前动画。
restart,表示动画是否从头开始,值为true则从头开始播放动画,值为false则从最近的帧开始播放动画。
void start():
开始动画执行,如果动画正在执行,此方法无效。
void stop():
停止动画执行,如果动画不再执行,此方法无效。
boolean isRunning():
返回动画是否正在执行。
int getNumberOfFrames():
获取当前动画的帧数量。
Drawable getFrame( int index):
获取指定位置的帧。
int getDuration( int i):
获取指定位置帧的展示时长。
boolean isOneShot():
获取动画是执行性一次还是无限循环,true只执行一次,false无限循环。
void setOneShot( boolean oneShot):
设置动画是执行一次还是无限循环。
void addFrame(@NonNull Drawable frame, int duration):
添加一个帧到动画序列中。