package com.xxx; import java.lang.reflect.Field; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.util.Log; import android.widget.ImageView; import android.widget.RelativeLayout; import com.XXX.R;//自己工程中的R public class FishAnimationView extends RelativeLayout { private final static String TAG="TAG"; private Context context; private static AnimationDrawable fishAnim = null; private static ImageView fishIV = null; private int speed = 200;//How long in milliseconds the frame should appear private boolean isPlayOnce = false;//是否只播放一次 public FishAnimationView(Context context) { super(context); this.context = context; } /** * 带有动画信息的构造函数 * @param context 上下文 * @param speed 动画播放的速度(默认为200毫秒) * @param isplayonce 动画是否只播放一次(默认为false,即循环播放) */ public FishAnimationView(Context context, int speed, boolean isplayonce) { super(context); this.context = context; this.speed = speed; this.isPlayOnce = isplayonce; } public FishAnimationView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } public FishAnimationView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; } /** * 初始化动画信息 * 注意:在开始播放动画之前必须先调用此函数初始化动画信息 */ public boolean initFishAnimInfor(){ // Log.i(TAG, "initFishAnimInfor"); fishIV = new ImageView(this.context); this.addView(fishIV); fishAnim = new AnimationDrawable(); Field[] fields = R.drawable.class.getDeclaredFields(); for(Field field:fields){ if(field.getName().startsWith("XXX")){//查找以XXX为开头的文件 // Log.i(TAG, "name="+field.getName()); int id = this.context.getResources().getIdentifier(field.getName(), "drawable", this.context.getPackageName()); Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), id); BitmapDrawable bmppd=new BitmapDrawable(srcBitmap); fishAnim.addFrame(bmppd, speed); } } fishAnim.setOneShot(isPlayOnce); //设置为loop fishIV.setBackgroundDrawable(fishAnim);//将动画设置为ImageView背景 // Log.i(TAG, "initFishAnimInfor over"); return true; } /** * 开始动画 */ public void startFishAnim(){ if(fishAnim == null || fishIV == null || fishAnim.isRunning()) return; fishAnim.start(); Log.i(TAG, "startAnim"); } /** * 停止动画 */ public void stopCartoon(){ if(fishAnim == null || fishIV == null) return; if(fishAnim.isRunning()){ fishAnim.stop(); Log.i(TAG, "stopAnim"); } } /** * 设置播放速度 * 注意: 如果已经开始播放动画则此设置无效 */ public void setSpeed(int speed){ if(fishAnim == null || fishIV == null || fishAnim.isRunning()) return; this.speed = speed; } /** * 获取播放速度 * @return int 速度 */ public int getSpeed(int speed){ return this.speed; } /** * 设置是否只播放一次 * 注意: 如果已经开始播放动画则此设置无效 * @param loopFlag 循环标志(true则只播放一次,false反之;默认是循环播放动画) */ public void setIsPlayOnce(boolean loopFlag){ if(fishAnim == null || fishIV == null || fishAnim.isRunning()) return; this.isPlayOnce = loopFlag; } /** * 获取是否只播放一次 * @return boolean true则只播放一次,false反之 */ public boolean getIsPlayOnce(){ return this.isPlayOnce; } } 以上方法初始化时由于加载图片所以启动会很慢,可以自己根据时间更换图片,如下: import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import android.R.integer; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.BitmapDrawable; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.util.Log; import android.widget.ImageView; import android.widget.RelativeLayout; public class FishAnimationView extends RelativeLayout { private final static String TAG="sxy"; private Context context; //private AnimationDrawable fishAnim = null; private ImageView fishIV = null; private int speed = 200;//How long in milliseconds the frame should appear private boolean isPlayOnce = false;//是否只播放一次 private List<integer> idlist = new ArrayList<integer>(); private int curFrame = 0; private Timer timer; private TimerTask timerTask; public FishAnimationView(Context context) { super(context); this.context = context; } /** * 带有动画信息的构造函数 * @param context 上下文 * @param speed 动画播放的速度(默认为200毫秒) * @param isplayonce 动画是否只播放一次(默认为false,即循环播放) */ public FishAnimationView(Context context, int speed, boolean isplayonce) { super(context); this.context = context; this.speed = speed; this.isPlayOnce = isplayonce; } public FishAnimationView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } public FishAnimationView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; } /** * 初始化动画信息 * 注意:在开始播放动画之前必须先调用此函数初始化动画信息 */ public boolean initFishAnimInfor(){ Log.i(TAG, "initFishAnimInfor"); if(fishIV != null ) return false; fishIV = new ImageView(this.context); this.addView(fishIV); Field[] fields = R.drawable.class.getDeclaredFields(); for(Field field:fields){ if(field.getName().startsWith("fish")){ Log.i(TAG, "name="+field.getName()); int id = this.context.getResources().getIdentifier(field.getName(), "drawable", this.context.getPackageName()); Log.i(TAG, "id="+id); idlist.add(id); } } Log.i(TAG, "initFishAnimInfor over"); return true; } /** * 开始动画 */ public void startFishAnim(){ if (timer == null) { timerTask = new TimerTask() { @Override public void run() { // TODO Auto-generated method stub handler.sendEmptyMessage(MSG_ANIM_TIME); } }; timer = new Timer(); timer.schedule(timerTask, this.speed, this.speed); } Log.i(TAG, "startAnim"); } /** * 停止动画 */ public void stopCartoon(){ if(fishIV == null) return; if(timer == null) return; timer.purge(); timer.cancel(); timer = null; timerTask = null; } /** * 设置播放速度 * 注意: 如果已经开始播放动画则此设置无效 */ public void setSpeed(int speed){ if(fishIV == null) return; this.speed = speed; } /** * 获取播放速度 * @return int 速度 */ public int getSpeed(int speed){ return this.speed; } /** * 设置是否只播放一次 * 注意: 如果已经开始播放动画则此设置无效 * @param loopFlag 循环标志(true则只播放一次,false反之;默认是循环播放动画) */ public void setIsPlayOnce(boolean loopFlag){ if(fishIV == null) return; this.isPlayOnce = loopFlag; } /** * 获取是否只播放一次 * @return boolean true则只播放一次,false反之 */ public boolean getIsPlayOnce(){ return this.isPlayOnce; } private final int MSG_ANIM_TIME = 1; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.what) { case MSG_ANIM_TIME: int id = idlist.get(curFrame); fishIV.setBackgroundResource(id); curFrame++; if(curFrame == idlist.size()) curFrame = 0; break; } } }; }