Android 安卓:在九个旧安卓的帮助下,我们如何将EndAction向后移植到旧版本
我正在做一件事,需要大约10个动画一个接一个地播放,但在每个动画结束时都有一些条件需要检查,所以我不能使用动画集或设置开始延迟 我发现在果冻豆上使用新方法很容易,其中的新方法是withEndAction,当时我正在做一个实验,但现在我必须用minSdk 10在一个应用程序中实现它 我使用的是九个旧的Android,它工作得很好,但是使用setListner非常困难,并且创建的代码很难维护10个连续的动画 所以我在想,创建一个从九个旧的androids继承的适配器,我可以添加withEndAction函数来执行runnable 有人能指导我怎么做吗?有没有更好的方法Android 安卓:在九个旧安卓的帮助下,我们如何将EndAction向后移植到旧版本,android,Android,我正在做一件事,需要大约10个动画一个接一个地播放,但在每个动画结束时都有一些条件需要检查,所以我不能使用动画集或设置开始延迟 我发现在果冻豆上使用新方法很容易,其中的新方法是withEndAction,当时我正在做一个实验,但现在我必须用minSdk 10在一个应用程序中实现它 我使用的是九个旧的Android,它工作得很好,但是使用setListner非常困难,并且创建的代码很难维护10个连续的动画 所以我在想,创建一个从九个旧的androids继承的适配器,我可以添加withEndActi
谢谢我可以想到两种选择:
ViewPropertyAnimatorCompat
)。该类似乎与其他Android类没有太多的耦合,因此应该按原样工作:)干杯我的解决方案也使用了神奇的九面阵 反而 的 是的
animate(starsBig[4])。rotationBy(3600)。setDuration(2010);
this.runOnUiThread(新的Runnable(){
公开募捐{
对于(int i=0;i<5;i++){
starReset(stars[i]);
starReset(starsBig[i]);
}
}
});
对于一个动画来说效果很好我想我有更好的解决方案:
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();
我曾经
if(Build.VERSION.SDK\u INT
基本上,为了使代码更具可读性,您可以使用内置命令将您从匿名内部类混乱中解救出来。您甚至可以将其进一步抽象,使其看起来像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
对于那些必须使用平台内置函数(带有StartAction的
和带有EndAction的)的用户,只需将SDK检查代码也放在AnimatorActionListener
中,就可以从混乱中保存客户端类。您现在可以使用ViewCompat
并附加任何需要的动画
ViewCompat.animate(yourView).scaleY(3).withEndAction(yourRunnable).start();
感谢您的帮助,第一个选项似乎很难实现,我尝试了第二个选项,但它似乎依赖于api级别16的视图类中的某个函数,您是否建议也复制视图,或者是否有其他解决方案?然后,将其放入项目的包android.View
。(有点小技巧,但应该可以)修改名称以避免冲突:)此外,将构造函数公开或创建静态访问器方法。此处无需使用计时器任务。。。只需使用newhandler().postDelayed()
。无论哪种方式,此方法都可能不如上面Blundell的答案好(可能动画运行时间比预期的稍长,例如,如果同时发生多个动画…如果是这种情况,则可能在动画完成之前执行runnable)。删除onAnimationEnd()中的侦听器,以防止以后在同一对象上执行动画时再次调用它。最好去掉if语句,只使用:viewPropertyAnimator.setListener(新的AnimatorListenerAdapter(){@Override public void onAnimationEnd(Animator动画){doSomething();}});
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();
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();
}
});
}
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
ViewCompat.animate(yourView).scaleY(3).withEndAction(yourRunnable).start();