Android-анимация одна за другой - PullRequest
20 голосов
/ 19 августа 2010

У меня есть две TranslateAnimations в TextView, и я хочу, чтобы они выполнялись одна за другой. Однако, используя приведенный ниже код, выполняется только второй.

Как я могу решить это?

TranslateAnimation animation = new TranslateAnimation(
    Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f,
    Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, -150.0f);
animation.setDuration(200);
wave.startAnimation(animation);

TranslateAnimation animation1 = new TranslateAnimation(
    Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f,
    Animation.ABSOLUTE, 150.0f, Animation.ABSOLUTE, 0.0f);
animation1.setDuration(200);
wave.startAnimation(animation1);

Ответы [ 6 ]

52 голосов
/ 07 сентября 2011

Свяжите их вместе с Набор анимации

AnimationSet as = new AnimationSet(true)
TranslateAnimation animation = new TranslateAnimation(
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f,
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, -150.0f);
animation.setDuration(200);
as.addAnimation(animation);

TranslateAnimation animation1 = new TranslateAnimation(
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f,
Animation.ABSOLUTE, 150.0f, Animation.ABSOLUTE, 0.0f);
animation1.setDuration(200);
animation1.setStartOffset(200);
as.addAnimation(animation1);

wave.startAnimation(as);
32 голосов
/ 19 августа 2010

РЕДАКТИРОВАТЬ: Ответ Энди Ботс ниже, лучший ответ, IMO.


Просто установите свой первый, как этот, и он запустит другой, как только анимация закончится:

animation.setAnimationListener(new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            wave.startAnimation(animation1);

        }
    });

edit: Причина, по которой только ваша вторая анимация выполняется с вашим текущим кодом, заключается в том, что она перекрывает воспроизведение первой анимации (на самом деле воспроизводятся обе, но вы видите только самую последнюю, чтобы начать). Если вы сделаете так, как я написал, они будут воспроизводиться последовательно, а не параллельно.

10 голосов
/ 12 февраля 2015

также вы можете сделать это самим XML, используя атрибут android:startOffset, и есть экзамен:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:duration="300"
        android:fromXScale="0%"
        android:fromYScale="0%"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="100%"
        android:toYScale="100%" />
    <alpha
        android:duration="300"
        android:fromAlpha="0"
        android:toAlpha=".5" />
    <alpha
        android:duration="300"
        android:fromAlpha=".5"
        android:startOffset="300"
        android:toAlpha="1" />

</set>
7 голосов
/ 21 ноября 2013

Существует еще один подход для достижения этой цели, который может быть полезен, когда вам нужно анимировать множество просмотров один за другим.Вы можете использовать метод setStartOffset, чтобы установить задержку перед началом анимации.Итак, если вы знаете, сколько времени потребуется для завершения вашей первой анимации, вы можете установить это как задержку для вашей второй анимации.Это пример, где я анимировал шесть ImageButtons и шесть TextViews под ними один за другим:

public void animateButtons() {
    // An array of buttons
    int[] imageButtonIds = {R.id.searchButton, R.id.favoriteButton, R.id.responseButton, R.id.articleButton, R.id.resumeButton, R.id.subscribeButton};
    // Array of textViews
    int[] textViewIds = {R.id.searchTextView, R.id.favoriteTextView, R.id.responseTextView, R.id.articleTextView, R.id.resumeTextView, R.id.subscribeTextView};

    int i = 1;

    for (int viewId : imageButtonIds) {

        ImageButton imageButton = (ImageButton) findViewById(viewId);
        // Animation from a file fade.xml in folder res/anim
        Animation fadeAnimation = AnimationUtils.loadAnimation(this, R.anim.fade);
        // Delay for each animation is 100 ms bigger than for previous one
        fadeAnimation.setStartOffset(i * 100);
        imageButton.startAnimation(fadeAnimation);

        // The same animation is for textViews
        int textViewId = textViewIds[i-1];
        TextView textView = (TextView) findViewById(textViewId);
        textView.startAnimation(fadeAnimation);

        i ++;
    }
}

В моей папке res/anim у меня есть файл с именем fade.xml со следующим содержанием:

<?xml version="1.0" encoding="utf-8"?>

<!--  Fade animation with 500 ms duration -->

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_decelerate_interpolator"
       android:fromAlpha="0.0" android:toAlpha="1.0"
       android:duration="500" />
2 голосов
/ 31 мая 2016

Создайте массив анимации и используйте метод для создания AnimationSet.

    Animation[] animations = { 
            getScaleAnimation(0.4f, 1.3f, 2000), 
            getScaleAnimation(1.3f, 1.0f, 500), 
            getScaleAnimation(0.4f, 1.3f, 1000),
            getScaleAnimation(1.3f, 1.0f, 3000), 
            getScaleAnimation(0.4f, 1.3f, 500), 
            getScaleAnimation(1.3f, 1.0f, 1700), 
            getScaleAnimation(0.4f, 1.3f, 2100),
            getScaleAnimation(1.3f, 1.0f, 3400)  
    };
    AnimationSet animationSet = addAnimationAr(animations);
    view.startAnimation(animationSet);

Метод:

public static AnimationSet addAnimationAr(Animation[] animations) {
    AnimationSet animationSet = new AnimationSet(false);
    long totalAnimationDuration = 0;

    for (int i = 0; i < animations.length; i++) {
        Animation a = animations[i];
        a.setStartOffset(totalAnimationDuration);
        totalAnimationDuration += a.getDuration();
        animationSet.addAnimation(a);
    }

    return animationSet;
}
1 голос
/ 19 января 2016

Если вы используете код, вы можете позвонить

Animation.setStartOffset() 

для задержки второй анимации.

если вы используете xml, вы можете android:ordering="sequentially" свойство, чтобы две анимации выполнялись последовательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...