Android: onAnimationStart и onAnimationEnd выполняются дважды для настраиваемого LinearLayout

Я искал, прежде чем отправлять этот вопрос, здесь и здесь.

На вопросы даны ответы, но даже несмотря на то, что я использовал 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

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

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

замените Log.e(TAG, "onAnimationStart: "); на Log.e(TAG, "onAnimationStart: " + this);, что вы теперь видите в журнале регистрации?

pskink 04.12.2018 12:48

Я просто вижу onAnimationStart: Animation@some_memory_address.

Uma Sankar 04.12.2018 12:52

а что это за some_memory_address ???

pskink 04.12.2018 12:53

Ага. Я пробовал с обоими. Но у меня такая же проблема. Это хеш-код объекта Animation. Например, Animation@14da7d6. Извини, раньше я ошибался.

Uma Sankar 04.12.2018 13:00

опубликовать весь вывод logcat

pskink 04.12.2018 13:01

В разделе комментариев это выглядит неаккуратно. Обновлю вопрос.

Uma Sankar 04.12.2018 13:09

также добавьте + this в onAnimationEnd - теперь я вижу немного CustomLinearLayout, какое значение у animDuration?

pskink 04.12.2018 13:18

@pskink, уже добавил. пожалуйста, проверьте

Uma Sankar 04.12.2018 13:21

у этого блока кода нет никаких проблем. Проблема возникает где-то еще.

A Farmanbar 07.12.2018 20:21
0
9
443
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Я думал, что представление готово для просмотра конечным пользователем в методе жизненного цикла представления 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.

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

Другие вопросы по теме