2012-02-22 3 views
16

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

У меня есть 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); 
    } 

}); 

ответ

50

У меня была такая же проблема и через несколько дней я нашел решение ... 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); 
    } 
+0

Это нужно отметить как ответ. +1 –

+0

Большое вам спасибо за решение этой проблемы! –

+1

Большое спасибо. Я слишком долго искал это. – braden

3

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

Попробуйте это:

  1. Использование setFillBefore(true) и setFillAfter(true) на как анимации
  2. Установите правильные свойства макета при запуске и при окончании как анимации
+0

Я все еще закончил с мерцанием при перемещении панели вверх. Я столкнулся с проблемой, поставив за ней манекен, содержащий тот же контент, что и перед ним. – JRod

+0

У меня такая же проблема, кажется, что настройка view.layout() вызывает мерцание. – Jeroen

0

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

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

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

2

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

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

view_you_want_to_animate.setDrawingCacheEnabled(true); 

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

view_you_want_to_animate.setDrawingCacheEnabled(false); 

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

+0

Это сработало для меня .. Спасибо! –

+0

Это работало и для меня, и для автономной альфа-анимации, и для набора анимации трансляции + масштабирования. – BVB

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

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

+1

Большое вам спасибо. – Sayka