Soy un principiante en kotlin
, pero sé java
. Así que he creado un programa, en el que tengo uno textview
. Se va a cambiar es de prueba cada 1 segundo con la animación de fundido. Así que mi programa funciona bien, pero como estoy principiante en kotlin
, ¿me pueden ayudar o dar una retroalimentación relacionada con mi código. También si escribía algo mal, se puede editar sin ningún problema :)
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()
}
}
Por favor, deje un comentario en relación con mi código, ¿cómo puedo hacer más claro, o tal vez algo que he hecho no está bien, o tal vez algo que no es una práctica? Gracias.
Me gustaría crear una única animación en XML que hace el fundido de entrada, retardo, y fade out. Entonces no habría necesidad de utilizar el controlador para publicar los fundido de salida o malabares dos animaciones. Pero ya que sólo estamos mirando el código Kotlin:
- No hay razón para el Ejecutable para siquiera tiene una propiedad si no lo está utilizando de nuevo. Además, hay una
postDelayed
función de extensión que intercambia el orden de los argumentos para que pueda utilizar un lambda de arrastre. (Se podría, alternativamente, almacenar el Ejecutable en unval
modo que es sólo una instancia vez al igual que en el comentario de @Mostafa, pero en mi opinión es trivialmente pequeña y el código es más claro si lo mantiene en el lugar que se utiliza.) - Se puede simplificar disminuyendo
textPosition
con el operador resto (también se aplicaría a Java). - Si su objeto acompañante no tiene más que constantes privadas, es mejor para moverlo fuera de la clase ya que los objetos de compañía se compilan como una nueva clase y tienen una instancia.
- Sólo es necesario configurar el oyente animación vez.
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()
}
}
También, si define sus animaciones utilizando ObjectAnimator en lugar de la más antigua API de animaciones, se puede utilizar doOnEnd
en lugar de la AnimationListener anónima más torpe.