どのように私は私のkotlinコードをリファクタリングし、それがより明確にすることができます

ハイク・ナハペトMkrtchyan:

私は初心者だkotlinが、私は知っていますjava私は、私は1つを持っているプログラムを、作成しましたので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()
}

}

私はそれがより明確にすることができ、または多分何かが私がいない右やった、または多分何かが練習ではありませんどのように、私のコードに関連するフィードバックを残してください!ありがとうございました。

Tenfour04:

私は、遅延、フェードインを行うXML内の1つのアニメーションを作成し、フェードアウトでしょう。その後、フェードアウトやジャグリング2つのアニメーションを投稿するハンドラを使用する必要はありません。しかし、以来、私たちは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の代わりに。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=342738&siteId=1