Posted at

animationListの切り替え時・終わりを取得するクラスの作成

More than 3 years have passed since last update.

画像やdrawableを用意すれば簡単に切り替えアニメーションが作れるanimationListの切替時・終わりを取得するクラスを作った。

参考にさせていただきました><

[アニメーションの完了が分かるAnimationDrawer]http://qiita.com/Hoshi_7/items/053af5dab53896205081


<?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/shape_progressbar_0" android:duration="1000"/>
<item android:drawable="@drawable/shape_progressbar_14" android:duration="1000"/>
<item android:drawable="@drawable/shape_progressbar_31" android:duration="1000"/>
<item android:drawable="@drawable/shape_progressbar_43" android:duration="1000"/>
<item android:drawable="@drawable/shape_progressbar_52" android:duration="1000"/>
<item android:drawable="@drawable/shape_progressbar_68" android:duration="1000"/>
<item android:drawable="@drawable/shape_progressbar_82" android:duration="1000"/>
<item android:drawable="@drawable/shape_progressbar_100" android:duration="1000"/>
</animation-list>

こちらのdurationを取得してきて操作操作しています。


public class InformStateAnimationDrawable extends AnimationDrawable{
private OnAnimationStateListener mListener;
private Handler mHandler;
private List<Integer> durationList;

public InformStateAnimationDrawable(AnimationDrawable drawable) {
mHandler = new Handler();
for (int index = 0; index < drawable.getNumberOfFrames(); index++) {
this.addFrame(drawable.getFrame(index)
, drawable.getDuration(index));

}
}

public void setOnAnimationStateListener(OnAnimationStateListener listener){
mListener = listener;
}

@Override
public void start() {
super.start();
if(mListener != null) {
mHandler.postDelayed(new Runnable() {
public void run() {
mListener.onAnimationEnd();
}
}, getTotalDuration());

}
}

public int getTotalDuration() {
int duration = 0;
for (int i = 0; i < this.getNumberOfFrames(); i++) {
//frameが変わった時を検知するため
final int finalI = i;
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mListener.onFrameChanged(finalI);
}
},duration);
duration += this.getDuration(i);
}

return duration;
}

public interface OnAnimationStateListener {
public void onAnimationEnd();
public void onFrameChanged(int i);
}

}

activity側ではstartして、OnAnimationStateListenerをimplementsして操作する。


activity.onCreate()


AnimationDrawable animation = (AnimationDrawable) mCompleteProgressView.getBackground();

InformStateAnimationDrawable frameAnimation = new InformStateAnimationDrawable(animation);
frameAnimation.setOnAnimationStateListener(this);
frameAnimation.start();
animation.start();


二重にstartしていたりもう少しスマートな方法がある気がする…。