如何重构我的 kotlin 代码并使其更清晰

How can I refactor my kotlin code and make it more clear

我是 kotlin 的初学者,但我知道 java。所以我创建了一个程序,其中有一个 textview。它将使用淡入淡出动画每 1 秒更改一次测试。所以我的程序运行良好,但由于我是 kotlin 的初学者,你能帮助我或提供与我的代码相关的反馈吗?另外,如果我写错了,你可以毫无问题地编辑它:)

class MainActivity : AppCompatActivity() {

private lateinit var fadeInAnimation: Animation
private lateinit var fadeOutAnimation: Animation
private lateinit var handler: Handler
private lateinit var myRunnable: Runnable
private val textArray: Array<String> = arrayOf("This", "is", "fading", "text")
private var textPosition: Int = 0


companion object {
    private const val ANIM_DURATION: Long = 1000L
}


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)


    fadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in)
    fadeOutAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out)
    handler = Handler()

    initRunnable()
}


override fun onResume() {
    super.onResume()
    startAnimation()
}


override fun onPause() {
    super.onPause()
    stopAnimation()
}


private fun initRunnable() {
    myRunnable = Runnable {
        text_view.animation = fadeOutAnimation
        fadeOutAnimation.start()
        fadeOutAnimation.setAnimationListener(object : AnimationListener() {
            override fun onAnimationEnd(animation: Animation?) {
                textPosition = when (textPosition) {
                    textArray.size - 1 -> 0
                    else -> ++textPosition
                }

                startAnimation()
            }
        })
    }
}


private fun startAnimation() {
    text_view.text = textArray[textPosition]
    text_view.animation = fadeInAnimation
    fadeInAnimation.start()

    handler.postDelayed(myRunnable, ANIM_DURATION)
}


private fun stopAnimation() {
    handler.removeCallbacksAndMessages(null)
    fadeInAnimation.cancel()
    fadeOutAnimation.cancel()
}

}

请留下与我的代码相关的反馈,我怎样才能让它更清楚,或者我做的不对,或者有些事情不是实践?谢谢。

我会在 XML 中创建一个动画来执行淡入、延迟和淡出。然后您就不需要使用处理程序来 post 淡出或兼顾两个动画。但是由于我们只是在看 Kotlin 代码:

  1. 如果您不再使用 Runnable,甚至没有理由拥有 属性。此外,还有一个 postDelayed 扩展函数可以交换参数顺序,因此您可以使用尾随 lambda。 (您也可以将 Runnable 存储在 val 中,因此它只像@Mostafa 的评论中那样实例化一次,但在我看来,它非常小,如果将它放在它使用的位置,代码会更清晰。)
  2. 您可以使用余数运算符简化递减 textPosition(也适用于 Java)。
  3. 如果你的伴生对象只有私有常量,最好将它移到 class 之外,因为伴生对象会被编译为一个新的 class 并有一个实例。
  4. 您只需要设置一次动画监听器。

private const val ANIM_DURATION: Long = 1000L

class MainActivity : AppCompatActivity() {

    private lateinit var fadeInAnimation: Animation
    private lateinit var fadeOutAnimation: Animation
    private lateinit var handler: Handler
    private val textArray: Array<String> = arrayOf("This", "is", "fading", "text")
    private var textPosition: Int = 0    

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        fadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in)
        fadeOutAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out).apply {
            setAnimationListener(object : AnimationListener() {
                override fun onAnimationEnd(animation: Animation?) {
                    textPosition = (textPosition - 1 + textArray.size) % textArray.size
                    startAnimation()
                }
            })
        }
        handler = Handler()
    }

    override fun onResume() {
        super.onResume()
        startAnimation()
    }

    override fun onPause() {
        super.onPause()
        stopAnimation()
    }

    private fun startAnimation() {
        text_view.text = textArray[textPosition]
        text_view.animation = fadeInAnimation
        fadeInAnimation.start()
        handler.postDelayed(ANIM_DURATION) {
            text_view.animation = fadeOutAnimation
            fadeOutAnimation.start()
        }
    }

    private fun stopAnimation() {
        handler.removeCallbacksAndMessages(null)
        fadeInAnimation.cancel()
        fadeOutAnimation.cancel()
    }
}

此外,如果您使用 ObjectAnimator 而不是旧的动画 API 来定义动画,则可以使用 doOnEnd 而不是更笨重的匿名 AnimationListener。