Kotlin-如何在函数内执行函数?

时间:2018-11-13 08:27:36

标签: android kotlin

我有一个为动画创建的类,如下所示:

    class MyAnimations(val view: View) {

fun fadeAnimation() {
    val fadeAnimator = ValueAnimator.ofFloat(0.2f, 1f)

    fadeAnimator.addUpdateListener {
        val value = it.animatedValue as Float
        view.alpha = value
    }

    fadeAnimator.interpolator = DecelerateInterpolator(1.4f)
    fadeAnimator.duration = 400


    fun postAnimation() {

        fadeAnimator.addListener(object : Animator.AnimatorListener {
            override fun onAnimationRepeat(animation: Animator?) {
                //empty
            }

            override fun onAnimationEnd(animation: Animator?) {
                -- I WANT TO RUN CODE HERE --
            }

            override fun onAnimationCancel(animation: Animator?) {
                //empty
            }

            override fun onAnimationStart(animation: Animator?) {
                //empty
            }
        })
    }

    fadeAnimator.start()
    }
}

在“活动”中,我的目标是制作类似的动画并在动画结束后运行 myfunction()

    MyAnimations(goPiano).fadeAnimation().postAnimation(myfunction())

或这样,并编写动画结束后要运行的任何代码:

    MyAnimations(goPiano).fadeAnimation().postAnimation() {
            //Block of code here
        }

我需要在MyAnimations类中添加和更改什么才能允许我执行此操作?我是Kotlin的新手,很想知道如何在课堂上做到这一点。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用高阶函数来执行此操作。您不需要为此而在函数内部

fun fadeAnimation(postAnimCallback: () -> Unit) {
    val fadeAnimator = ValueAnimator.ofFloat(0.2f, 1f)

    fadeAnimator.addUpdateListener {
        val value = it.animatedValue as Float
        view.alpha = value
    }

    fadeAnimator.interpolator = DecelerateInterpolator(1.4f)
    fadeAnimator.duration = 400

    fadeAnimator.addListener(object : Animator.AnimatorListener {
        override fun onAnimationRepeat(animation: Animator?) {
            //empty
        }

        override fun onAnimationEnd(animation: Animator?) {
            postAnimCallback()
        }

        override fun onAnimationCancel(animation: Animator?) {
            //empty
        }

        override fun onAnimationStart(animation: Animator?) {
            //empty
        }
    })

    fadeAnimator.start()
}

现在您可以像调用它一样

MyAnimations(goPiano).fadeAnimation() {
     // post animation code
}

MyAnimations(goPiano).fadeAnimation(::postAnimation)

fun postAnimation() {
}