Как я могу изменить свой код kotlin и сделать его более понятным - PullRequest
0 голосов
/ 20 марта 2020

Я новичок в kotlin, но я знаю java. Итак, я создал программу, в которой у меня есть одна textview. Он будет менять свой тест каждые 1se c с анимацией затухания. Так что моя программа работает нормально, но, как я новичок в 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()
}

}

Пожалуйста, оставьте отзыв, связанный с моим кодом, как я могу сделать его более понятным, или, может быть, что-то я не правильно сделал или может что-то не практикуется? Спасибо.

1 Ответ

2 голосов
/ 20 марта 2020

Я бы создал одну единственную анимацию в XML, которая выполняет постепенное увеличение, задержку и постепенное исчезновение. Тогда вам не нужно будет использовать обработчик для публикации затухания или манипулирования двумя анимациями. Но поскольку мы просто смотрим на код Kotlin:

  1. У Runnable нет никаких оснований даже иметь свойство, если вы никогда не используете его снова. Также есть функция расширения postDelayed, которая меняет порядок аргументов, так что вы можете использовать конечную лямбду. (В качестве альтернативы вы можете хранить 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 вместо более старого API анимации, вы можете использовать doOnEnd вместо более громоздкого анонимного AnimationListener.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...