欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android动画之animation-list实现逐帧动画

程序员文章站 2022-03-16 16:29:33
...

简介

帧动画(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时表示drawablePadding值随当前选择的状态而改变。

在根标签下通过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实现逐帧动画的常用方式,希望与大家一起共勉。

项目地址 ☞ 传送门