动画 -- 帧动画

一、概念

帧动画是顺序播放一组预先定义好的图片,类似于电影播放。
系统提供了AnimationDrawable类来使用帧动画。

二、实现

1. XML实现:

//定义AnimationDrawable,res/drawable/frame_animation.xml


    android :oneshot="false">
    
    
    


//布局


    


//代码,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. 代码实现:

//布局


    


//代码,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):
添加一个帧到动画序列中。

你可能感兴趣的:(动画 -- 帧动画)