bản năng đầu tiên của tôi là để lấy mã nguồn, thêm một số callbacks, và tạo ra một drawable tùy chỉnh ra khỏi nó. Tất nhiên, điều đó có nghĩa là không hỗ trợ xml.
Nó chỉ ra rằng AnimatedVectorDrawable
sử dụng phương pháp riêng tư VectorDrawable's
. Vì vậy, cách tiếp cận này sẽ không hoạt động.
Chúng ta có thể tạo ra một lớp wrapper đơn giản xung quanh AnimatedVectorDrawable
và thêm callbacks:
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();
}
}
Mã của bạn sẽ trông như thế:
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();
Nhưng, đây là chính xác những gì bạn đang làm với setStartDelay
. Vì vậy, tôi không biết làm thế nào hữu ích này sẽ được.
Edit: Tất cả điều này cũng có thể được thực hiện bên trong một AnimatedVectorDrawable mở rộng. Tuy nhiên, bạn sẽ mất hoàn toàn hỗ trợ xml.
Off the cuff, tôi nghĩ rằng bạn sẽ cần đến ngã ba nó, để có được quyền truy cập! cho các trường hợp 'Animator' và có thể đăng ký người nghe cho những người đó – CommonsWare
Cảm ơn, nhưng tôi đã hy vọng điều gì đó đơn giản hơn một chút –
Tôi đã gửi yêu cầu tính năng cho điều này: https://code.google.com/p/android/ các vấn đề/chi tiết? id = 158780 – CommonsWare