Как воспроизвести несколько анимаций с помощью AnimatorSet? - PullRequest
3 голосов
/ 15 апреля 2019

Я использую Sceneform для создания приложения для Android, которое воспроизводит анимацию. Я пытаюсь запустить несколько аниматоров последовательно, используя AnimatorSet. Код отлично работает при попытке воспроизвести две анимации, но всякий раз, когда я добавляю третью анимацию, воспроизводятся первые две анимации, а затем приложение вылетает.

Вот кусок кода:

    List<Animator> animatorList = new ArrayList<Animator>();

    AnimationData ad1 = JimRenderable.getAnimationData("Abm_09|A");

    Animator a = new ModelAnimator(ad1, JimRenderable);
    animatorList.add(a);

    AnimationData ad2 = JimRenderable.getAnimationData("Abm_09|B");

    a = new ModelAnimator(ad2, JimRenderable);
    animatorList.add(a);

    AnimationData ad3 = JimRenderable.getAnimationData("Abm_09|C");

    a = new ModelAnimator(ad3, JimRenderable);
    animatorList.add(a);

    AnimatorSet as= new AnimatorSet();
    as.playSequentially(animatorList);
    as.start();

Как я могу позволить ему воспроизводить больше, чем две анимации?

1 Ответ

1 голос
/ 15 апреля 2019

AnimatorSet открытый класс, который расширяет класс Animator, предоставляет механизм для группирования анимаций так, чтобы они выполнялись по отношению друг к другу. Вы можете настроить анимацию для одновременного воспроизведения , последовательно или после указанной задержки .

Вот как должен выглядеть ваш код :

AnimatorSet bouncer = new AnimatorSet();

bouncer.play(bounceAnim).before(squashAnim1);

// THESE FOUR ANIMATIONS PLAY SIMULTANEOUSLY
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);

bouncer.play(bounceBackAnim).after(stretchAnim2);

ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);

animatorSet.start();

В этом коде squashAnim1 клип воспроизводится одновременно с squashAnim2, stretchAnim1 и stretchAnim2.

И этот пример объясняет, как это работает: мы настроили AnimatorSet для игры:

  • anim1 и anim2 одновременно,
  • anim3, чтобы играть, когда anim2 заканчивается,
  • и anim4, чтобы играть, когда anim3 заканчивается:

    AnimatorSet clips = new AnimatorSet();
    clips.play(anim1).with(anim2);
    clips.play(anim2).before(anim3);
    clips.play(anim4).after(anim3);
    

Также вы можете использовать Animation listeners. Они могут слушать важные события во время анимации. Вот код, как это выглядит:

ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);

fadeAnim.addListener(new AnimatorListenerAdapter() {
    public void onAnimationEnd(Animator animation) {
        balls.remove(((ObjectAnimator)animation).getTarget());
    }
}

Надеюсь, это поможет.

...