종료 애니메이션 이벤트 android


90

뷰 (조각 내부에 있음)에 페이드 아웃 애니메이션이 있으며 애니메이션이 발생할 때마다 뷰가 다시 그려집니다. 나는 view.SetVisibility(View.GONE). 그러나 애니메이션이 끝날 때까지 기다리지 않습니다. 애니메이션이 완료된 후에 만이 setVisibility 코드를 실행하고 싶습니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?


당신이 애니메이션을 보여주는 방법 코드 .... 게시
더 그랜드 Poptani

답변:


174

다음과 같이 애니메이션 객체에 애니메이션 리스너를 추가 할 수 있습니다.

anim.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation arg0) {
    }           
    @Override
    public void onAnimationRepeat(Animation arg0) {
    }           
    @Override
    public void onAnimationEnd(Animation arg0) {
    }
});

5
애니메이션이 진행되는 동안 페이드 아웃 애니메이션이 다시 시작되지 않도록하려면을 사용 if (!anim.hasStarted() || anim.hasEnded())하여 애니메이션이 아직 실행 중인지 감지합니다.
theczechsensation

35

허용되는 답변과 기능적으로 동일하지만 훨씬 더 간결한 방식으로 :

                           /* Add/Remove any animation parameter */
theView.animate().alpha(0).setDuration(2000).withEndAction(new Runnable() {
    @Override
        public void run() {
            theView.setVisibility(View.GONE);
        }
    });

즐겨 :)


3
명확하고 한 줄로. 최고의 답변! 람다의 사용과 simplyfied 수 있습니다.withEndAction(() -> theView.setVisibility(View.GONE));
theBugger

2
이것은 API 레벨 16 (4.1) 이상입니다.
Tommie dec.

놀라운 해결책, 내 친구. 감사합니다!
Vlad Ivchenko

중요 정보 :-액션은 애니메이션이 정상적으로 종료 된 경우에만 실행되며, 해당 애니메이션 중에 ViewPropertyAnimator가 취소되면 실행 파일이 실행되지 않습니다.
Sarthak_ssg5

1
실행 가능 파일에서 탐색 구성 요소를 사용할 때도 매력처럼 작동합니다. (내비게이션 구성 요소로 탐색 할 때 애니메이션 리스너 alwys가 충돌했습니다.)
Luigi_Papardelle


9

애니메이션 개체를 가져와 애니메이션 리스너를 추가하기 만하면됩니다. 다음은 예제 코드입니다.

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**


            }
        });

1

Kotlin의 예

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

당신이 사용하는 일부 라인을 절약 할 수 있습니다fade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()
longi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.