Android:在Nine Old Androids的帮助下,我们如何使用EndAction向旧版本支持

时间:2013-01-14 10:08:55

标签: android

我正在制作一些需要大约10个动画一个接一个地播放的内容,但是在每个动画结束时都要检查一些条件,所以我不能使用动画集或setStartDelay。

我发现使用新方法在Jelly Bean上很容易做到,当我把它作为一个实验时使用EndAction,但现在我要在一个带有minSdk 10的应用程序中实现它。

我正在使用Nine Old Android并且效果很好,但使用setListner非常困难,并且会创建难以为10个连续动画维护的代码。

所以我在想,创建一个继承自九个旧机器人的适配器,我可以添加执行runnable的EndAction函数吗?

有人可以指导我如何做到这一点,还有更好的方法吗?

由于

6 个答案:

答案 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)

我可以想到两个选项:

  1. 使用外观模式创建自己的动画池(这可能需要很多工作)
  2. 从ADT获取源代码并进行修改。如果您找不到它,请执行以下操作:http://pastebin.com/9nCPC4aR。在您自己的包中复制它(类似ViewPropertyAnimatorCompat)。该类似乎与其他Android内容没有太多耦合,所以应该按原样运行:)
  3. UPDATE:这是另一个选项,一个动画队列。与第一个想法类似,但更直接:
  4. 代码:

    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中,以便保护客户端类免于混乱。