Kotlin - Как сделать функцию внутри функции? - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть класс, который я создал для анимации:

    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 голосов
/ 13 ноября 2018

Вы можете использовать функции более высокого порядка, чтобы сделать это.Для этого вам не нужна функция внутри функции

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() {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...