就好像演电影一样,播放实现准备好的图片,来实现动画效果。
逐帧动画需要用到AnimationDrawable类,该类主要用于创建一个逐帧动画,然后我们把这个动画设置为view的背景即可。
android提供两种方法为AnimationDrawable添加帧:XML定义和JAVA代码创建。
XML
因为动画帧的资源需要是一个Drawable对象,所以需要把它放到Drawable目录下。在<animation-list>使用<item>来添加一帧
anima.xml
<?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/a" android:duration="100"/> <item android:drawable="@drawable/b" android:duration="100"/> <item android:drawable="@drawable/c" android:duration="100"/> <item android:drawable="@drawable/d" android:duration="100"/> <item android:drawable="@drawable/e" android:duration="100"/> </animation-list>
MainActivity.java
package cn.lixyz.animator; import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.widget.ImageView; @SuppressLint("NewApi") public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView iv = (ImageView) findViewById(R.id.image); AnimationDrawable ad = new AnimationDrawable(); ad = (AnimationDrawable) getResources().getDrawable(R.drawable.anima); iv.setBackground(ad); ad.start(); } }
JAVA
在Android中,除了可以通过XML文件定义一个逐帧动画之外,还可以通过AnimationDrawable.addFrame()方法为AnimationDrawable添加动画帧
package cn.lixyz.animator; import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.widget.ImageView; @SuppressLint("NewApi") public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView iv = (ImageView) findViewById(R.id.image); AnimationDrawable ad = new AnimationDrawable(); ad.addFrame(getResources().getDrawable(R.drawable.a), 500); ad.addFrame(getResources().getDrawable(R.drawable.b), 500); ad.addFrame(getResources().getDrawable(R.drawable.c), 500); ad.addFrame(getResources().getDrawable(R.drawable.d), 500); ad.addFrame(getResources().getDrawable(R.drawable.e), 500); ad.setOneShot(false); iv.setBackground(ad); ad.start(); } }
常用方法
AnimationDrawable还有一些其他的方法:
void start():开始播放逐帧动画。
void stop():停止播放逐帧动画。
void addFrame(Drawable frame,int duration):为AnimationDrawable添加一帧,并设置持续时间。
int getDuration(int i):得到指定index的帧的持续时间。
Drawable getFrame(int index):得到指定index的帧Drawable。
int getNumberOfFrames():得到当前AnimationDrawable的所有帧数量。
boolean isOneShot():当前AnimationDrawable是否执行一次,返回true执行一次,false循环播放。
boolean isRunning():当前AnimationDrawable是否正在播放。
void setOneShot(boolean oneShot):设置AnimationDrawable是否执行一次,true执行一次,false循环播放