2012-02-22 25 views
16

Przeszukałem wiele wątków na ten temat, które można znaleźć w migotaniu pojawiającym się w Android 2.2 podczas pracy z AnimationListeners, ale nie mogę rozwiązać mojego problemu.Animacja migotania z Androidem

Co mam, to "popover" LinearLayout, którego dotyka użytkownik, aby przesunąć w dół o około 100 pikseli, i dotyka ponownie, aby przenieść go z powrotem. W końcu udało mi się pracować nad pierwszą częścią bez żadnego migotania (dzięki sugestii wywołania clearAnimation() na animowanym widoku), ale kiedy robię coś przeciwnego (tj. Przesuwając widok z powrotem do góry), pojawia się migotanie początek. Naprawdę nie mogę nazwać clearAnimation() w metodzie onAnimationStart(), ponieważ nie będzie animować!

Oczywiście, wszystkie animacje działają idealnie, jeśli użyłem funkcji setFillAfter() bez żadnego detektora animacji, ale wtedy obszar dotykowy widoku nie zostanie przeniesiony (ponieważ sam widok nie "faktycznie" się poruszył).

Każda pomoc zostanie bardzo doceniona.

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); 
    } 

}); 

Odpowiedz

50

miałem ten sam problem i po kilku dniach znalazłem rozwiązanie ... thanx do:

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

zorientowali się rozwiązanie tego problemu. Wskazówką był fakt, że po wyświetleniu widoku wszystko działało dobrze. Wygląda na to, że po uruchomieniu animacji wymuszona przez program aktualizacja ma miejsce w tle i nie powoduje migotania . Dodanie krótkiej animacji do końca onAnimationEnd(), gdy ukrywamy widok powoduje, że migotanie odchodzi na odległość .

Oto nowy onAndimationEnd() w kodzie roboczego

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

To musi być oznaczone jako odpowiedź. +1 –

+0

Dziękuję bardzo za rozwiązanie tego problemu! –

+1

Dziękuję bardzo. Zbyt długo trwało mi na znalezienie tego. – braden

3

Nie należy użyć clearAnimation() na onAnimationEnd().

Spróbuj tego:

  1. Korzystając setFillBefore(true) i setFillAfter(true) na zarówno animacje
  2. ustawić odpowiednie właściwości układu podczas rozruchu i kiedy kończy zarówno animacje
+0

Podczas przesuwania panelu z powrotem do góry wciąż migotałem. Obejrzałem ten problem, umieszczając za nim fikcyjny widok zawierający tę samą treść, co przed nim. – JRod

+0

Mam ten sam problem, wydaje się, że dostosowanie view.layout() powoduje migotanie. – Jeroen

0

alrite, miałem ten sam problem, która mnie szukać dla niego, skończyło się na tym stanowisku. Znaleziono rozwiązanie dla mojego problemu, myślałem o udostępnieniu mojego rozwiązania.

Miałem wiele animacji uruchomionych, ale migotanie zaczęło się niedawno, ale kiedy wyśledziłem problem stwierdził migotanie wystąpiło po narysowaniu listy animacji pod pętlą dla. (lista tablic)

Po prostu dodałem próbę catch, aby uniknąć problemu po zlokalizowaniu, problem; niektóre animacje zostały usunięte w locie, ale nie było wystarczająco dużo czasu na aktualizację wątku, więc pętla nadal była próbowana i nie powiodła się, ale nie została wyświetlona zamiast migotała, ale przy próbie złapania rysunków na tablicy uporządkowano mój problem.

2

Szukałem wszystkich postów stackoverflow dla problemu z animacją (migotanie i ospałość). Nie znalazłem żadnej idealnej odpowiedzi. Ale znalazłem rozwiązanie dla tego samego, który jest poniżej,

onStart obsługi Animacja

view_you_want_to_animate.setDrawingCacheEnabled(true); 

onEnd obsługi Animacja

view_you_want_to_animate.setDrawingCacheEnabled(false); 

Teraz moim zdaniem nie ma migotania lub powolne zachowanie, gdy mój widok jest animowany. To działa dobrze dla mnie.

+0

To zadziałało dla mnie .. Dzięki! –

+0

To również zadziałało dla mnie, zarówno z samodzielną animacją alfa, jak iz zestawem animacji z translate + scale. – BVB

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

To zadziałało dla mnie.

+1

Dziękuję bardzo .. – Sayka