我正在制作一些需要大约10个动画一个接一个地播放的内容,但是在每个动画结束时都要检查一些条件,所以我不能使用动画集或setStartDelay。
我发现使用新方法在Jelly Bean上很容易做到,当我把它作为一个实验时使用EndAction,但现在我要在一个带有minSdk 10的应用程序中实现它。
我正在使用Nine Old Android并且效果很好,但使用setListner非常困难,并且会创建难以为10个连续动画维护的代码。
所以我在想,创建一个继承自九个旧机器人的适配器,我可以添加执行runnable的EndAction函数吗?
有人可以指导我如何做到这一点,还有更好的方法吗?
由于
答案 0 :(得分:26)
我使用了setListener
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
viewPropertyAnimator.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
doSomething();
}
});
} else {
viewPropertyAnimator.withEndAction(new Runnable() {
@Override
public void run() {
doSomething();
}
});
}
答案 1 :(得分:7)
您现在可以使用ViewCompat
并附加您想要的任何动画。
ViewCompat.animate(yourView).scaleY(3).withEndAction(yourRunnable).start();
答案 2 :(得分:0)
我可以想到两个选项:
ViewPropertyAnimatorCompat
)。该类似乎与其他Android内容没有太多耦合,所以应该按原样运行:)代码:
public class AnimationQueue extends LinkedList<Animation> implements
AnimationListener {
private View mView;
public static AnimationQueue ready(Animation... animations) {
AnimationQueue queue = new AnimationQueue();
for (Animation animation : animations) {
queue.add(animation);
}
return queue;
}
public AnimationQueue steady(View view) {
mView = view;
return this;
}
public void go() {
Animation animation = poll();
animation.setAnimationListener(this);
mView.startAnimation(animation);
}
@Override public void onAnimationEnd(Animation animation) {
go();
}
@Override public void onAnimationStart(Animation animation) {
}
@Override public void onAnimationRepeat(Animation animation) {
}
}
用法:
AnimationQueue.ready(anim1, anim2, anim3).steady(view).go();
干杯
答案 3 :(得分:0)
我的解决方案也使用了梦幻般的九角龙
相反 的
starsBig[4].animate().rotation(3600).setDuration(2000).withEndAction(runnable)
我做了
animate(starsBig[4]).rotationBy(3600).setDuration(2010);
this.runOnUiThread(new Runnable() {
public void run() {
for (int i = 0; i < 5; i++) {
starReset(stars[i]);
starReset(starsBig[i]);
}
}
});
它适用于一个动画
答案 4 :(得分:0)
我认为我有更好的解决方案:
view.animate().setDuration(2000).alpha(0);
//timAnimDelay.purge();
timAnimDelay.schedule(new TimerTask() {
@Override
public void run() {
// on UI thread
runOnUiThread(new Runnable() {
@Override
public void run() {
// here animation
}
});
}
// delay start
} , 2000);
timAnimDelay.purge();
答案 5 :(得分:0)
基本上,为了使代码更具可读性,您可以使用内置的AnimatorListenerAdapter来避免匿名内部类乱。您甚至可以将其抽象出来,使其看起来像这样withEndAction
:
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.Application;
import android.support.v4.view.ViewPropertyAnimatorListener;
import android.view.View;
public class AnimatorActionListener extends AnimatorListenerAdapter {
public enum ActionType {
START, END;
}
final private ActionType type;
final private Runnable action;
public AnimatorActionListener(Runnable action, ActionType type) {
this.action = action;
this.type = type;
}
@Override
public void onAnimationEnd(Animator animation) {
if (type == ActionType.END) {
action.run();
}
}
@Override
public void onAnimationStart(Animator animation) {
if (type == ActionType.START) {
action.run();
}
}
}
然后用法变为:
view.animate()./*...some parameters...*/.setListener(new AnimatorActionListener(new Runnable() {
@Override
public void run() {
// do stuff
}
}, ActionType.END)); // or ActionType.START
对于那些必须使用平台内置函数的人(withStartAction, withEndAction
),只需将SDK检查代码放在AnimatorActionListener
中,以便保护客户端类免于混乱。