実際のAndroid開発プロセスでは、フレームアニメーションをよく使用します
通常、フレームアニメーションの再生にはxmlを使用します
今ここに新しい方法があります
フレームアニメーションの再生を実現する
まず、カプセル化したツールクラスを使用する必要があります
具体的なコードは次のとおりです
public class AnimUtils {
private int[] resIdArr;
private int index;
private View view;
private int period;//动画间隔
private boolean isRepeatFlag = false;
// private boolean isStopFlag = false;
private boolean isStartFlag = false;
private final static int PARSE_BITMAP_MSG = 0;
private static HandlerThread sHandlerThread = new HandlerThread("anim-workThread");
private static Handler sWorkHandler;
static {
sHandlerThread.start();
sWorkHandler = new Handler(sHandlerThread.getLooper()) {
public void handleMessage(Message msg) {
Log.e("lugx", "2019-4-19 sWorkHandler Handler msg=" + msg.what);
if (msg.what == PARSE_BITMAP_MSG) {
if (msg.obj instanceof Request) {
Request request = (Request) msg.obj;
request.returnFun();
}
}
}
};
}
static class Request {
final Resources resource;
final int resId;
final Handler handler;
final int msgWhat;
public Request(Resources resource, int resId, Handler handler, int msgWhat) {
this.resource = resource;
this.resId = resId;
this.handler = handler;
this.msgWhat = msgWhat;
}
public void returnFun() {
Bitmap bitmap = BitmapFactory.decodeResource(resource, resId);
Message msg = Message.obtain();
msg.what = msgWhat;
msg.obj = bitmap;
handler.sendMessage(msg);
}
}
public interface OnAnimEndListener {
public void onAnimEnd();
}
private OnAnimEndListener listener;
//播放完成监听
public void setOnAnimEndListener(OnAnimEndListener listener) {
this.listener = listener;
}
private final static int PLAYING_ANIM_MSG = 0;
private final static int GET_BITMAP_MSG = 1;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Log.e("lugx", "2019-4-19 main Handler msg=" + msg.what);
switch (msg.what) {
case PLAYING_ANIM_MSG: {
sWorkHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (resIdArr.length<=index){
return;
}
final Bitmap bitmap = BitmapFactory.decodeResource(view.getResources(),
resIdArr[index]);
Message msg = Message.obtain();
msg.what = GET_BITMAP_MSG;
msg.obj = bitmap;
handler.sendMessage(msg);
}
});
// Request request = new Request(view.getResources(), resIdArr[index],
// handler, GET_BITMAP_MSG);
// Message requestMsg = Message.obtain();
// requestMsg.what = PARSE_BITMAP_MSG;
// requestMsg.obj = request;
// sWorkHandler.sendMessage(requestMsg);
break;
}
case GET_BITMAP_MSG: {
if (!isStartFlag) {
Log.e("lugx", "2019-4-19 main Handler stop *** " + view);
return;
}
Bitmap bitmap = (Bitmap) msg.obj;
BitmapDrawable bd = new BitmapDrawable(view.getResources(), bitmap);
view.setBackground(bd);
// Log.d("print", "宽是: "+view.getWidth());
// view.setBackground(bd);
index++;
if (index >= resIdArr.length) {
if (isRepeatFlag) {
index = 0;
} else {
if (listener != null) {
listener.onAnimEnd();
}
return;
}
}
handler.sendEmptyMessageDelayed(PLAYING_ANIM_MSG, getDelay(period));
break;
}
}
}
};
//
private long getDelay(long delayTime) {
if (delayTime <= 0) {
return 0;
} else if (delayTime < 2) {
return delayTime;
} else {
return delayTime - 1;
}
}
public AnimUtils() {
index = 0;//第几章图片
}
/**
* @param view 控件
* @param resIdArr 图片素材
* @param isRepeatFlag 是否循环播放
*/
public void setAnimInfo(View view, int[] resIdArr, boolean isRepeatFlag) {
this.view = view;
this.resIdArr = resIdArr;
this.isRepeatFlag = isRepeatFlag;
}
/**
*
* @param delayMillis 延时
* @param period 一帧持续时间
*/
public void startAnim(long delayMillis, int period) {
this.period = period;
index = 0;
handler.removeMessages(PLAYING_ANIM_MSG);
handler.sendEmptyMessageDelayed(PLAYING_ANIM_MSG, getDelay(delayMillis));
isStartFlag = true;
}
/**
* 是否正在播放
*
* @return
*/
public boolean isAniming() {
return isStartFlag;
}
//是否循环
public boolean isRepeat() {
return isRepeatFlag;
}
public void stopAnim() {
isStartFlag = false;
if (handler.hasMessages(PLAYING_ANIM_MSG)) {
Log.e("lugx", "2019-4-19 main Handler stopAnim " + view);
}
handler.removeMessages(PLAYING_ANIM_MSG);
//view.setBackgroundResource(resIdArr[0]);
}
//应用退出
public static void quit() {
sHandlerThread.quit();
}
}
使い方もとても簡単です
AnimUtils animUtil=new AnimUtils();
animUtil.setAnimInfo(exitimg,AnimDrawable.chansha,true);
animUtil.startAnim(0,10);
これら2つの方法の簡単な紹介です
setAnimInfo():最初のパラメーターはアニメーションを再生するためのコントロール、2番目のパラメーターはリソースのインデックス付けに使用されるint型の配列、3番目のパラメーターは繰り返し再生するかどうかを示します
startAnim():最初のパラメーターは再生を遅らせるミリ秒数を表し、2番目のパラメーターはフレームアニメーション間の各フレームの時間間隔を表します。
一時停止などの他の方法については、ループするかどうかを決定します。
上記のツールカテゴリに直接あります
ここでは紹介しません。
最後に、このコードを変更することもできます
たとえば、ビューの背景を変更してアニメーションを再生します。
イメージビューを渡すことができます
アニメーションを実現するために彼のsrc属性を変更するには
一般的に言って、それは比較的柔軟です。
このツールの利点は、それを使用した後です
記憶の回復を実現できる
フレームアニメーションが大きすぎるため、メモリオーバーフローが発生しません
以上です!ありがとうございました!