Как я могу повторить анимацию свойства?

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

bub.animate();
bub.animate().x(x2).y(y2);
bub.animate().setDuration(animationTime);       
bub.animate().setListener(new AnimatorListenerAdapter() {

    @Override
    public void onAnimationStart(Animator animation) {
        animators.add(animation); 
    } 

    @Override
    public void onAnimationRepeat(Animator animation) {
    }

    @Override
    public void onAnimationEnd(Animator animation) {
    }
});

person user3901032    schedule 17.08.2014    source источник
comment
возможный дубликат Как создать циклическую анимацию с помощью ViewPropertyAnimator?   -  person kaka    schedule 17.08.2014
comment
Вы также можете использовать ValueAnimator, который поддерживает повторы, developer.android.com/reference/android. /анимация/   -  person    schedule 09.04.2018


Ответы (6)


Поскольку ViewPropertyAnimator подходит только для простых анимаций, используйте более продвинутый класс ObjectAnimator — в основном метод setRepeatCount и дополнительно setRepeatMode.

person asylume    schedule 17.08.2014
comment
Да, ViewPropertyAnimator используется для простых анимаций, для более сложного использования попробуйте ObjectAnimator. Извините за неясный ответ. - person asylume; 17.08.2014
comment
@asylume, судя по дюжине тем здесь, до сих пор нет хорошего способа повторить AnimatorSet, состоящий из двух ObjectAnimator. Если я что-то пропустил, стукните меня, пожалуйста - person ivan8m8; 26.02.2019

Это действительно возможно. Вот пример поворота вида:

        final ViewPropertyAnimator animator = view.animate().rotation(360).setInterpolator(new LinearInterpolator()).setDuration(1000);

        animator.setListener(new android.animation.Animator.AnimatorListener() {
            ...

            @Override
            public void onAnimationEnd(final android.animation.Animator animation) {
                animation.setListener(null);
                view.setRotation(0);
                view.animate().rotation(360).setInterpolator(new LinearInterpolator()).setDuration(1000).setListener(this).start();
            }

        });

Вы также можете использовать "withEndAction< /strong>" вместо слушателя.

person android developer    schedule 06.01.2016

Вы можете использовать CycleInterpolator. Например, вот так:

    int durationMs = 60000;
    int cycleDurationMs = 1000;
    view.setAlpha(0f);
    view.animate().alpha(1f)
            .setInterpolator(new CycleInterpolator(durationMs / cycleDurationMs))
            .setDuration(durationMs)
            .start();
person Dmide    schedule 02.11.2016
comment
Как бы вы сделали его бесконечно живым? - person android developer; 30.03.2017

Вот пример в Kotlin с простым способом повторить анимацию, рекурсивно вызвав ее в withEndAction.

Пример

private var animationCount = 0

private fun gyrate() {
    val scale = if (animationCount++ % 2 == 0) 0.92f else 1f
    animate().scaleX(scale).scaleY(scale).setDuration(725).withEndAction(::gyrate)
}

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

person Trevor    schedule 28.06.2020

в котлине можно сделать так. создать исполняемый файл. внутри него анимируйте представление и установите для withEndAction значение runnable. и в конце запустите runnable для запуска анимации.

var runnable: Runnable? = null
runnable = Runnable {
    view.animate()
        .setDuration(10000)
        .rotationBy(360F)
        .setInterpolator(LinearInterpolator())
        .withEndAction(runnable)
        .start()
}
runnable.run()
person codegames    schedule 12.10.2020

person    schedule
comment
Хотя этот код может ответить на вопрос, предоставление информации о том, как и почему он решает проблему, повышает его ценность в долгосрочной перспективе. - person L_J; 30.06.2018