2015-04-02 19 views
5

Bu kodu özel görünümümün içinde çalıştırdığımda, onAnimationStart ve onAnimationEnd tekrar tekrar aranıyor. Bu garip değil mi? Bir Android programcısı olarak, bunların sırasıyla sadece bir kez çağrılmasını bekledim. onAnimationEndViewPropertyAnimator 'ın setListener(null) tarafından çağrılır zamanViewPropertyAnimator'ın dinleyicisi kaldırılamıyor

final ViewPropertyAnimator animator = animate().setDuration(1000).alpha(0.0f); 
    animator.setListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationStart(Animator animation) { 
      Utils.log("----------------start"); 
     } 

     @Override 
     public void onAnimationEnd(Animator animation) { 
      Utils.log("--------- end"); 
     } 
    }).start(); 

Ama sonra dinleyicisi kaldırarak sorunu çözmeye çalıştı ama docs yazanlara rağmen hiç çalışmamış:

public ViewPropertyAnimator setListener (Animator.AnimatorListener listener) 

Added in API level 12 
Sets a listener for events in the underlying Animators that run the property animations. 

Parameters 
listener The listener to be called with AnimatorListener events. A value of null removes any existing listener. 
Returns 
This object, allowing calls to methods in this class to be chained. 

Bu garip soruna giren başka biri var mı? belki bir Android'in hatası mı?

+0

nerede animator.start()? – pskink

+0

özel görünümümün içinde, btw, aslında onu aramak zorunda bile değildim, animasyon bir sonraki fırsatla başlatılacak (belki bir sonraki kare). Dokümanları – Leo

+0

'un bir yerinde okudum "özel görünümümün içinde" neyin nesi var? hangi yöntem? – pskink

cevap

18

Bu sorunla karşılaştım, ancak özel görünüm olmadan.

Benim durumumda, aynı görünümde iki animasyon yaptım. Bir gösteri ve saklan.

yüzden hideView() Bittiğinde

showView(){ 
    myView.animate().translationY(myView.getHeight()).setListener(new ...{ 
    ... 
    onAnimationEnd(Animation animation){ 
    hideView(); 
    } 
    ...}).start(); 
} 
hideView(){ 
    myView.animate().translationY(0).start(); 
} 

, tekrar kendisini çağırır oldu. Bunun nedeni eski dinleyicinin hâlâ ayarlanmış olmasıdır. Düzeltmenin anahtarı, dinleyiciyi ikinci animasyonda null olarak ayarlamaya son verdi. Örneğin.

hideView(){ 
    myView.animate().translationY(0).setListener(null).start(); 
} 
+5

setListener (null) aslında dinleyicinin geri çağrılmasından kendiliğinden çağrılabilir; bu, kodun daha sonra sabit kalmasını sağlar, ardından dinleyici kendini temizler. –

+0

@SafaAlai Ne kadar? – Mauker

+0

@Mauker sadece myView.animate(). SetListener (null) öğesini kullanabilirsiniz; onAnimationEnd .. tuhaf görünüyor ama android kaynağına bakarak animate() yöntemi daha önce oluşturulmuş ViewPropertyAnimator döndürür böylece sadece bu değeri geri almak ve dinleyici null için ayarlama. –