Флеш анимации для Android

Я тратил столько потоков на эту тему, что я могу найти на мерцании, которое возникает в Android 2.2 при работе с AnimationListeners, но я не могу решить мою проблему.

У меня есть LinearLayout 'popover', который пользователь прикасается, чтобы опуститься примерно на 100 пикселей, и снова коснется, чтобы переместить его обратно. Я, наконец, начал работать над первой частью без какого-либо мерцания (благодаря предложению вызывать clearAnimation() на анимированном представлении), но когда вы делаете обратное (т.е. Перемещаете представление вверх), там мерцание начало. Я не могу называть clearAnimation() в методе onAnimationStart(), поскольку он не будет анимировать!

Конечно, вся анимация отлично работает, если я использовал setFillAfter() без прослушивателя анимации, но тогда сенсорная область просмотра не будет двигаться (потому что само представление не "фактически" перемещено).

Любая помощь будет принята с благодарностью.

this.popoverTab.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        popoverTab.setClickable(false);
        popoverTab.setFocusable(false);
        if (popoverHidden) {
            Log.d(TAG, "About to show popover");
            // the popover is currently hidden, show it.
            TranslateAnimation animation = new TranslateAnimation(0, 0, 100, 0);
            animation.setDuration(700);
            animation.setFillBefore(true);
            animation.setAnimationListener(new AnimationListener() {
                public void onAnimationEnd(Animation animation) {

                }

                public void onAnimationRepeat(Animation animation) {

                }

                public void onAnimationStart(Animation animation) {
                    footer.layout(footer.getLeft(), (footer.getTop() - 100), footer.getRight(), footer.getBottom());
                }
            });
            footer.startAnimation(animation);
        } else {
            Log.d(TAG, "About to hide popover");
            // the popover is showing, hide it.
            TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 100);
            animation.setDuration(700);
            animation.setFillAfter(true);
            animation.setAnimationListener(new AnimationListener() {
                public void onAnimationEnd(Animation animation) {
                    footer.clearAnimation();
                    footer.layout(footer.getLeft(), (footer.getTop() + 100), footer.getRight(), footer.getBottom());
                }

                public void onAnimationRepeat(Animation animation) {

                }

                public void onAnimationStart(Animation animation) {

                }
            });
            footer.startAnimation(animation);
        }
        // invert.
        popoverHidden = !popoverHidden;
        popoverTab.setClickable(true);
        popoverTab.setFocusable(true);
    }

});

Ответ 1

У меня была та же проблема, и через несколько дней я нашел решение... thanx:

http://www.mail-archive.com/[email protected]/msg67535.html

Я выяснил решение этой проблемы. Подсказка исходила из факта что при показе представления все работало нормально. По-видимому, когда анимация запущена, обновление, которое будет принудительное шоу происходит в фоновом режиме и не вызывает мерцать. Добавление короткой анимации в конец onAnimationEnd(), когда мы скрываем представление, заставляет мерцание прочь.

Вот новый onAndimationEnd() в рабочем коде

  public void onAnimationEnd(Animation animation) {
            animation = new TranslateAnimation(0.0f, 0.0f, 0.0f, 0.0f);
            animation.setDuration(1);
            mPlayer0Panel.startAnimation(animation);
   } 

Ответ 2

@Override
public void onAnimationEnd(Animation animation)
{
    footer.clearAnimation();
}

Это сработало для меня.

Ответ 3

Вам не нужно использовать clearAnimation() на onAnimationEnd().

Попробуйте следующее:

  • Используйте setFillBefore(true) и setFillAfter(true) в анимации
  • Задайте правильные свойства макета при запуске и завершении анимации

Ответ 4

Я искал все сообщения stackoverflow для проблемы с анимацией (мерцание и вялость). Я не нашел идеального ответа. Но я нашел решение для того же, что и ниже,

onStart of Animation использовать,

view_you_want_to_animate.setDrawingCacheEnabled(true);

onEnd использования анимации,

view_you_want_to_animate.setDrawingCacheEnabled(false);

Теперь мое представление не имеет мерцания или вялого поведения, когда мое представление анимируется. Это хорошо работает для меня.

Ответ 5

Alrite, у меня была такая же проблема, которая заставила меня искать ее, я оказался в этом посте. Нашел решение для моей проблемы, решил поделиться своим решением.

У меня было много анимаций, но в последнее время появилось мерцание, но когда я проследил возникшую проблему, мерцание произошло после рисования списка анимаций в цикле for. (список массивов)

Я просто добавил try catch, чтобы избежать проблемы после ее поиска, проблемы; некоторые из анимаций были удалены на лету, но не было достаточно времени для обновления потока, поэтому цикл все еще пытался и не удался, но не отображался, вместо этого он мерцал, но в try и catch на чертеже массива исправлена ​​моя проблема.