今天给大家分享一个安卓的逐帧动画.下面就简称帧动画了.
先说一下优点,代码简单,设置简单,而且动画流畅.
再说一个最大的缺点,只能用于轻量级的动画,图片过大,过多都有可能导致内存溢出!!!
常见使用情景.新界面空白页的加载动画,下拉刷新动画,网络请求加载动画等等.
说完了基础介绍,下面就介绍一下帧动画吧.
首先最简单的使用.只需要把图片都放到资源目录下.
Drawablel创建资源文件 比如我这个 level_up_1_anim.xml
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <item android:drawable="@drawable/level_up1_00" android:duration="125" /> <item android:drawable="@drawable/level_up1_01" android:duration="125" /> <item android:drawable="@drawable/level_up1_02" android:duration="125" /> <item android:drawable="@drawable/level_up1_03" android:duration="125" /> </animation-list>
标签使用 animation-list
这里重点注意一个属性,android:oneshot,这个属性是用来设置动画是否循环播放的.其他的没什么难点.就按照Ui定的时间以及资源图片,对应起来,设置好动画资源就好了.
下面说一下使用这个动画,超简单的使用,直接创建ImageView,src设置这个资源目录.在代码中,先强转成 (AnimationDrawable) mImageView.getDrawable(); 调用start()方法即可.另外,我这边自己封装了一个类供大家使用.拓展了动画的start 和end方法.以及代码设置动画资源的方法.原理都差不多.
@SuppressWarnings("unused") public class AnimationImageView extends ImageView { private FrameAnimationListener mListener; private AnimationDrawable mAnimation; public AnimationImageView(Context context) { this(context, null, 0); } public AnimationImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public AnimationImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); startPlay(); } private void startPlay() { Drawable drawable = getBackground(); if (!(drawable instanceof AnimationDrawable)) { return; } mAnimation = (AnimationDrawable) getBackground(); post(new Runnable() { @Override public void run() { if (mAnimation == null) { return; } mAnimation.start(); if (mListener != null) { mListener.onStart(); } if (mAnimation.isOneShot()) { postDelayed(new Runnable() { @Override public void run() { if (mListener != null) { mListener.onEnd(); } } }, getTotalDuration()); } } }); } public void setAnimationDrawable(@DrawableRes int drawableRes) { if (drawableRes == 0) { return; } setBackgroundResource(drawableRes); startPlay(); } public int getTotalDuration() { int totalTime = 0; if (mAnimation != null) { for (int i = 0; i < mAnimation.getNumberOfFrames(); ++i) { totalTime += mAnimation.getDuration(i); } } return totalTime; } public void setAnimationListener(FrameAnimationListener listener) { this.mListener = listener; } }
public interface FrameAnimationListener { void onStart(); void onEnd(); }