Android Chain Animations

Я пытаюсь "объединить" две анимации вместе, поэтому, когда все завершается, начинается другая. Это работает, за исключением одной проблемы. После того как первая анимация будет завершена, она вернется к исходной позиции. Я настраиваю заполнение после истины. Что еще мне не хватает?

Вот код, который я использую. Обратите внимание: это класс, который расширяет LinearLayout.

// FIRST ANIMATION
mAnimation = new TranslateAnimation(0, PANEL_END_X, 0, 0);
mAnimation.setDuration(PANEL_TRANSITION_TIME);
mAnimation.setFillAfter(true);

mAnimation.setAnimationListener(new Animation.AnimationListener() {
    public void onAnimationEnd(Animation animation) {

        // FIRST ANIMATION COMPLETE, CALL THE SECOND ANIMATION
        startAnimation(mAlphaAnimation);
    }
});

// SECOND ANIMATION     
mAlphaAnimation = new AlphaAnimation(1.0f, 0.0f);
mAlphaAnimation.setDuration(PANEL_ALPHA_TRANSITION_TIME);
mAlphaAnimation.setFillAfter(true);

Решение:

Единственный способ, которым я мог бы получить это, чтобы удовлетворить мое удовлетворение, состоял в том, чтобы использовать AnimationSet, но установить начальное смещение второй анимации, чтобы начать смещение + длительность первой анимации плюс небольшое дополнение. В моем случае они не должны были быть полностью точными.

Я попробовал играть с различными значениями, как предлагал CommonsWare, но я всегда получал бы какой-то эффект "привязки", когда значения возвращались бы к их первоначальному значению, прежде чем брать новый.

Ответ 1

После завершения первой анимации он возвращается к исходной позиции. Я настраиваю заполнение после истины. Что еще мне не хватает?

Анимация - это временные эффекты. Если вы хотите, чтобы эффекты были постоянными, вы должны сделать это самостоятельно в onAnimationEnd(). В случае TranslateAnimation вам нужно изменить LayoutParams или что-то вроде виджета, чтобы он постоянно оставался в своем конечном положении. Или, если вы переводите его с экрана, установите видимость на View.GONE.

Ответ 2

Я нашел то, что считаю идеальным решением в API уровня 11 и выше, используя класс AnimationSet.Builder.

Объект Builder - это класс утилиты, который облегчает добавление анимаций в AnimatorSet вместе с отношениями между различными анимациями. Намерение методов Builder вместе с методом play() AnimatorSet заключается в том, чтобы естественным образом выразить отношения зависимостей анимаций. Разработчики также могут использовать методы playTogether() и playSequential(), если они соответствуют потребностям, но в некоторых ситуациях может быть проще выразить AnimatorSet анимаций в парах.

Например, это устанавливает AnimatorSet для одновременного воспроизведения анимации и анимации2, anim3 для воспроизведения, когда anim2 заканчивается, и anim4 для воспроизведения, когда anim3 заканчивается:

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

Ответ 3

Попробуйте объединить их в AnimationSet.