Android: onAnimationStart и onAnimationEnd выполняются дважды для пользовательского LinearLayout - PullRequest
0 голосов
/ 04 декабря 2018

Я искал до публикации этого вопроса здесь и здесь .

На вопросы даны ответы, но хотя я использовал ObjectAnimator с AnimatorListenerпроблема все еще существует.Следовательно, отправляя этот вопрос.

Я расширил LinearLayout, чтобы создать пользовательский вид.При отображении этого представления в упражнении я добавил анимацию постепенного изменения, чтобы показать это.После завершения анимации для этого представления, равной onAnimationEnd, появляется некоторая бизнес-логика, которая должна выполняться только один раз.Из-за того, что метод onAnimationEnd выполняется дважды, происходит сбой приложения.Код показан ниже.

Animation animation = AnimationUtils.loadAnimation(getContext(), animResource);
animation.setDuration(animDuration);
animation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        Log.e(TAG, "onAnimationStart: ");
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        Log.e(TAG, "onAnimationEnd: ");
        // my business logic goes here
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        Log.e(TAG, "onAnimationRepeat");
    }
});
linearLayout.startAnimation(animation);

Я наблюдал, как операторы журнала ошибок onAnimationStart: и onAnimationEnd: в logcat отображаются дважды.

12-04 17:33:16.899 16980-16980/com.myapp E/Anim: onAnimationStart: android.view.animation.AnimationSet@87af0ac
12-04 17:33:17.229 16980-16980/com.myapp E/Anim: onAnimationEnd: com.myapp.views.CustomLinearLayout@518a944

12-04 17:33:17.690 16980-16980/com.myapp E/Anim: onAnimationStart: android.view.animation.AnimationSet@87af0ac
12-04 17:33:18.097 16980-16980/com.myapp E/Anim: onAnimationEnd: com.myapp.views.CustomLinearLayout@518a944

Может кто-нибудь сказать мнечто я делаю не так?

спасибо заранее !!

1 Ответ

0 голосов
/ 07 декабря 2018

Наконец-то я разобрался и решил проблему.

Я думал, что представление готово для просмотра конечному пользователю в onLayout методе жизненного цикла представления.Итак, я переопределил метод onLayout и сохранил в нем логику анимации.

@Override
public void onLayout(boolean changed, int left, int top, int right, int bottom) {
    if (changed) {
        // Added animation logic
    }
}

Когда я отлаживал код, я обнаружил, что метод onLayout вызывается дважды в моем случае.После поиска в Google, я обнаружил, что он вызывается несколько раз для позиционирования этого представления в соответствии со всеми его родительскими представлениями.

Если условие if (changed) удалено, оно вызывается 5 раз.

Я удалил логику анимации из метода onLayout и обработал ее сам.Теперь он работает, как и ожидалось.

Итак, я узнал, что запуск или установка анимации для видов не рекомендуется в методе onLayout.

Надеюсь, то, что я понял, правильно.Пожалуйста, поправьте меня, если мое понимание неверно.

...