简介
帧动画(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实现逐帧动画的常用方式,希望与大家一起共勉。
项目地址 ☞ 传送门
本文介绍了Android中如何使用animation-list实现帧动画,包括XML和代码两种实现方式。XML实现涉及animation-list的属性解释,代码实现则讲解了相关方法的使用。同时,文章讨论了同一个animation-list对象作为不同组件背景时的显示与动画效果。
488

被折叠的 条评论
为什么被折叠?



