Я искал, прежде чем отправлять этот вопрос, здесь и здесь.
На вопросы даны ответы, но даже несмотря на то, что я использовал 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
Кто-нибудь может сказать мне, что я делаю не так?
Заранее спасибо!!
Я просто вижу onAnimationStart: Animation@some_memory_address.
а что это за some_memory_address ???
Ага. Я пробовал с обоими. Но у меня такая же проблема. Это хеш-код объекта Animation. Например, Animation@14da7d6. Извини, раньше я ошибался.
опубликовать весь вывод logcat
В разделе комментариев это выглядит неаккуратно. Обновлю вопрос.
также добавьте + this в onAnimationEnd - теперь я вижу немного CustomLinearLayout, какое значение у animDuration?
@pskink, уже добавил. пожалуйста, проверьте
у этого блока кода нет никаких проблем. Проблема возникает где-то еще.
Наконец, я разобрался и решил проблему.
Я думал, что представление готово для просмотра конечным пользователем в методе жизненного цикла представления 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.
Надеюсь, то, что я понял, верно. Пожалуйста, поправьте меня, если я неправильно понимаю.
замените
Log.e(TAG, "onAnimationStart: ");наLog.e(TAG, "onAnimationStart: " + this);, что вы теперь видите в журнале регистрации?