W widoku mam animację zanikania (która znajduje się wewnątrz fragmentu) i za każdym razem, gdy animacja się dzieje, po jej zakończeniu widok ponownie rysuje się od nowa. Znalazłem pracę view.SetVisibility(View.GONE)
. Ale to nie czeka na zakończenie animacji. Chciałbym wykonać ten kod setVisibility dopiero po zakończeniu animacji. Jaki jest najlepszy sposób, aby to zrobić?
android
android-fragments
android-animation
Paulo Barros
źródło
źródło
Odpowiedzi:
Możesz dodać odbiornik animacji do obiektu animacji, na przykład
anim.setAnimationListener(new Animation.AnimationListener(){ @Override public void onAnimationStart(Animation arg0) { } @Override public void onAnimationRepeat(Animation arg0) { } @Override public void onAnimationEnd(Animation arg0) { } });
źródło
if (!anim.hasStarted() || anim.hasEnded())
aby wykryć, czy animacja nadal jest uruchomiona.Funkcjonalnie to samo, co przyjęta odpowiedź, ale w dużo bardziej zwięzły sposób:
/* Add/Remove any animation parameter */ theView.animate().alpha(0).setDuration(2000).withEndAction(new Runnable() { @Override public void run() { theView.setVisibility(View.GONE); } });
Cieszyć się :)
źródło
.withEndAction(() -> theView.setVisibility(View.GONE));
Możesz to również osiągnąć za pomocą Animation.setFillAfter
źródło
Po prostu weź obiekt animacji i dodaj do niego odbiornik animacji. Oto przykładowy kod:
rotateAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { // TODO Auto-generated method stub **// WRITE HERE WHATEVER YOU WANT ON THE COMPLETION OF THE ANIMATION** } });
źródło
Przykład dla Kotlina
var fadeOutImage = findViewById<ImageView>(R.id.fade_out_Image) val fadeOutAnimation = R.anim.fade_out_animation val animation = AnimationUtils.loadAnimation(this, fadeOutAnimation) fadeOutImage.startAnimation(animation) animation.setAnimationListener(object : Animation.AnimationListener { override fun onAnimationStart(p0: Animation?) { // not implemented } override fun onAnimationRepeat(p0: Animation?) { // not implemented } override fun onAnimationEnd(p0: Animation?) { fadeOutImage.visibility = View.INVISIBLE } })
źródło
fade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()