如何在Android中创建口袋妖怪进化类动画

问题描述

我想在我的应用程序中创建一个基本的“口袋妖怪进化”动画,如下所示:

enter image description here

我一直在玩这个:

private void evolveAnimation(Pokemon selectedToEvolvePokemon) {
    Drawable backgrounds[] = new Drawable[2];
    Resources res = getResources();
    backgrounds[0] = res.getDrawable(selectedPokemon.getimage(getContext()));
    backgrounds[1] = res.getDrawable(selectedToEvolvePokemon.getimage(getContext()));

    TransitionDrawable crossfader = new TransitionDrawable(backgrounds);

    evolveTransition.setimageDrawable(crossfader);
    crossfader.setCrossFadeEnabled(true);

    crossfader.startTransition(3000); //The animation starts slow
    crossfader.reverseTransition(3000);
    crossfader.startTransition(2000);//It gets faster slow
    crossfader.reverseTransition(2000);
    crossfader.startTransition(1000); //And faster
    crossfader.reverseTransition(1000);


}

但是,这在下面发布的 GIF 中没有按预期工作,我该如何解决

编辑:

我已将方法更改为:

 private void doEvolve(TransitionDrawable crossfader,int durationMills) {
    crossfader.startTransition(durationMills);
    Handler h = new Handler(Looper.getMainLooper());
    h.postDelayed(new Runnable() {
        @Override
        public void run() {
            crossfader.reverseTransition(durationMills);
        }
    },durationMills);
    if (durationMills != 0) {
        doEvolve(crossfader,durationMills - 100);
    } else {
        crossfader.startTransition(0);
    }
}

不过,有点奇怪。

解决方法

目前您正在一次启动所有转换,它们应该排队

例如,您可以使用一些 Handler 及其 postDelayed 方法,例如

crossfader.startTransition(3000);

Handler h = new Handler(Looper.getMainLooper());
h.postDelayed(new Runnable() {
        @Override
        public void run() {
            crossfader.reverseTransition(3000);
        }
},3000); // will start after startTransition duration

将此代码打包到一些方法中,该方法将采用 duration 参数和一些回调通知开始/反向模式结束,然后以更短的持续时间再次调用此方法