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

问题描述 投票:0回答:1

我是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()
}

}

[请留下与我的代码相关的反馈,如何使其更加清晰,或者我做错了什么,或者不是实践?谢谢。

android animation kotlin handler
1个回答
2
投票

我会用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。

© www.soinside.com 2019 - 2024. All rights reserved.