สิ้นสุดเหตุการณ์แอนิเมชั่น Android


90

ฉันมีภาพเคลื่อนไหวที่เลือนหายไปในมุมมอง (ซึ่งอยู่ภายในส่วนย่อย) และทุกครั้งที่ภาพเคลื่อนไหวเกิดขึ้นหลังจากเสร็จสิ้นมุมมองจะวาดใหม่อีกครั้ง view.SetVisibility(View.GONE)ฉันพบว่าการทำงานรอบทำ แต่มันไม่รอให้แอนิเมชั่นจบ ฉันต้องการเรียกใช้โค้ด setVisibility นี้หลังจากภาพเคลื่อนไหวเสร็จสิ้นแล้วเท่านั้น วิธีที่ดีที่สุดคืออะไร?


โพสต์โค้ดของคุณว่าคุณแสดงภาพเคลื่อนไหวอย่างไร ....
Lalit Poptani

คำตอบ:


175

คุณสามารถเพิ่มตัวฟังแอนิเมชั่นให้กับวัตถุแอนิเมชั่นของคุณเช่น

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

39

ใช้งานได้เหมือนกับคำตอบที่ยอมรับ แต่ในทางที่กระชับกว่ามาก:

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

สนุก :)


3
ชัดเจนและซับเดียว คำตอบสุดยอด! สามารถทำได้ง่ายๆด้วยการใช้ lambda.withEndAction(() -> theView.setVisibility(View.GONE));
theBugger

2
โปรดทราบว่านี่คือ API ระดับ 16 (4.1) ขึ้นไป
Tommie

ทางออกที่ดีเพื่อนของฉัน ขอขอบคุณ!
Vlad Ivchenko

ข้อมูลสำคัญ: - การดำเนินการจะทำงานต่อเมื่อภาพเคลื่อนไหวสิ้นสุดลงตามปกติหาก ViewPropertyAnimator ถูกยกเลิกในระหว่างการเคลื่อนไหวนั้น runnable จะไม่ทำงาน
Sarthak_ssg5

1
ใช้งานได้อย่างมีเสน่ห์เช่นกันเมื่อใช้ส่วนประกอบการนำทางใน runnable (ผู้ฟังแอนิเมชั่นล้มเหลวเมื่อฉันนำทางด้วยองค์ประกอบการนำทาง)
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.