Ответ 1
Мой первый инстинкт заключался в том, чтобы взять исходный код, добавить некоторые обратные вызовы и создать из него пользовательский чертеж. Конечно, это означало бы отсутствие поддержки xml.
Оказывается, что AnimatedVectorDrawable
использует VectorDrawable's
private method (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.