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);
}
});
To musi być oznaczone jako odpowiedź. +1 –
Dziękuję bardzo za rozwiązanie tego problemu! –
Dziękuję bardzo. Zbyt długo trwało mi na znalezienie tego. – braden