我是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代码:
postDelayed
扩展函数可以交换参数顺序,因此您可以使用尾随lambda。 (您也可以将Runnable存储在val
中,以便仅像@Mostafa的注释中那样实例化一次,但在我看来,它很小,如果将其保留在使用的位置,代码也更清晰。)textPosition
的减量(也适用于Java)。
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。