私の最初の直感は、ソース コードを取得し、いくつかのコールバックを追加して、そこからカスタム ドローアブルを作成することでした。もちろん、それは xml のサポートがないことを意味します。
プライベートメソッドをAnimatedVectorDrawable
使用していることがわかりました。VectorDrawable's
したがって、このアプローチは機能しません。
シンプルなラッパー クラスを作成して、AnimatedVectorDrawable
コールバックを追加できます。
public class AVDWrapper {
private Handler mHandler;
private Animatable mDrawable;
private Callback mCallback;
private Runnable mAnimationDoneRunnable = new Runnable() {
@Override
public void run() {
if (mCallback != null)
mCallback.onAnimationDone();
}
};
public interface Callback {
public void onAnimationDone();
public void onAnimationStopped();
}
public AVDWrapper(Animatable drawable,
Handler handler, Callback callback) {
mDrawable = drawable;
mHandler = handler;
mCallback = callback;
}
// Duration of the animation
public void start(long duration) {
mDrawable.start();
mHandler.postDelayed(mAnimationDoneRunnable, duration);
}
public void stop() {
mDrawable.stop();
mHandler.removeCallbacks(mAnimationDoneRunnable);
if (mCallback != null)
mCallback.onAnimationStopped();
}
}
コードは次のようになります。
final Drawable drawable = circle.getDrawable();
final Animatable animatable = (Animatable) drawable;
AVDWrapper.Callback callback = new AVDWrapper.Callback() {
@Override
public void onAnimationDone() {
tick.setAlpha(1f);
}
@Override
public void onAnimationStopped() {
// Okay
}
};
AVDWrapper avdw = new AVDWrapper(animatable, mHandler, callback);
//animatable.start();
avdw.start(2000L);
tick.setAlpha(0f);
//tick.animate().alpha(1f).setStartDelay(2000).setDuration(1).start();
// One wrapper is sufficient if the duration is same
final Drawable drawable2 = tick.getDrawable();
final Animatable animatable2 = (Animatable) drawable2;
animatable2.start();
しかし、これはまさにあなたが でやっていることですsetStartDelay
。したがって、これがどの程度役立つかはわかりません。
編集:これはすべて、拡張された AnimatedVectorDrawable 内に実装することもできます。ただし、xml サポートは完全に失われます。