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
.