Цикл в значении аниматора причина сбоя с java.lang.StackOverflowError: размер стека 8 МБ - PullRequest
0 голосов
/ 22 сентября 2018

Я использую анимацию с двумя значениями и в конце одного запускаю другой.Это нормально работает на моих протестированных устройствах, но я получаю java.lang.StackOverflowError: stack size 8MB на многих устройствах в прямом эфире.

Вот как я использовал аниматор значений:

 ObjectAnimator fadeOut = ObjectAnimator.ofInt(drawableIcon, "alpha", 255, 0);
 ObjectAnimator fadeIn = ObjectAnimator.ofInt(drawableIcon, "alpha", 0, 255);

    fadeIn.setDuration(300);
    fadeOut.setDuration(300);
    fadeOut.setStartDelay(500);

    fadeIn.start();

    fadeIn.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

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

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });

    fadeOut.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

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

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });

Я гуглил, но не могу найти причинуи решение.У какого-нибудь тела есть идея?

1 Ответ

0 голосов
/ 22 сентября 2018

Вы должны повторять анимацию вместо создания петлевой зависимости между ними.Для этого используйте AnimatorSet:

    AnimatorSet animatorSet = new AnimatorSet();
    ObjectAnimator fadeIn = ObjectAnimator.ofInt(drawableIcon, "alpha", 0, 255);
    ObjectAnimator fadeOut = ObjectAnimator.ofInt(drawableIcon, "alpha", 255, 0);
    fadeIn.setDuration(300);
    fadeOut.setDuration(300);
    fadeOut.setStartDelay(500);

    animatorSet.playSequentially(fadeIn, fadeOut);
    animatorSet.setDuration(1100);
    animatorSet.addListener(new AnimatorListenerAdapter() {

        private boolean mCanceled;

        @Override
        public void onAnimationStart(Animator animation) {
            mCanceled = false;
        }

        @Override
        public void onAnimationCancel(Animator animation) {
            mCanceled = true;
        }

        @Override
        public void onAnimationEnd(Animator animation) {
            if (!mCanceled) {
                animation.start();
            }
        }

    });
    animatorSet.start();

Вот результат:

enter image description here

...