繁体   English   中英

如何重构我的 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 中创建一个单独的动画来执行淡入、延迟和淡出。 然后您就不需要使用处理程序来发布淡出或处理两个动画。 但由于我们只是查看 Kotlin 代码:

  1. 如果您不再使用 Runnable ,则没有理由甚至拥有它的属性。 此外,还有一个postDelayed扩展函数可以交换参数顺序,因此您可以使用尾随 lambda。 (你也可以将 Runnable 存储在一个val这样它就像@Mostafa 的评论中一样只实例化一次,但在我看来,它很小,如果你把它放在它使用的位置,代码会更清晰。)
  2. 您可以使用余数运算符简化递减textPosition (也适用于 Java)。
  3. 如果你的伴生对象只有私有常量,最好把它移到类之外,因为伴生对象被编译为一个新类并有一个实例。
  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而不是旧的 Animations API 定义您的动画,您可以使用doOnEnd而不是更笨拙的匿名 AnimationListener。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM