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

本文介绍了Android中如何使用animation-list实现帧动画,包括XML和代码两种实现方式。XML实现涉及animation-list的属性解释,代码实现则讲解了相关方法的使用。同时,文章讨论了同一个animation-list对象作为不同组件背景时的显示与动画效果。
摘要由CSDN通过智能技术生成

简介

帧动画(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实现逐帧动画的常用方式,希望与大家一起共勉。

项目地址 ☞ 传送门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值