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