¿Cómo puedo refactorizar mi código Kotlin y hacerla más clara

Hayk Mkrtchyan:

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.

Tenfour04:

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:

  1. No hay razón para el Ejecutable para siquiera tiene una propiedad si no lo está utilizando de nuevo. Además, hay una postDelayedfunció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 un valmodo 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.)
  2. Se puede simplificar disminuyendo textPositioncon el operador resto (también se aplicaría a Java).
  3. 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.
  4. 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 doOnEnden lugar de la AnimationListener anónima más torpe.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=342749&siteId=1
Recomendado
Clasificación