はじめに
少し前にAndroidアプリ開発に復帰しました。もう数年ぶりです。
いろいろとブランクがあって、覚えることだらけで大変なんですが、それもまた楽しいですね。
特に Kotlin がステキです。楽しいです。いろいろ出来ていいですね。
そんな中、こんなコードを書いたよ、という紹介です。
(紹介するのは書いたコードの一部分です)
ObjectAnimator を使うのがめんどくさい
ObjectAnimator
をコードで生成するとき、ちょっとめんどくさくないですか?
例えば、だんだん小さくなりながら、消えていくアニメーションを作るとこんな感じです。
ObjectAnimator.ofPropertyValuesHolder(
targetView,
PropertyValuesHolder.ofFloat(View.ALPHA, 1f, 0f),
PropertyValuesHolder.ofFloat(View.SCALE_X, 1f, 0f),
PropertyValuesHolder.ofFloat(View.SCALE_Y, 1f, 0f))
.apply {
duration = 300
}.start()
名前が長い
PropertyValuesHolder
って何ですか。長くないですか。
エディタのサポートがあれば、数文字のタイプで済むとはいえ、何度も入力したくありません。
意味がわかりにくい
自分だけでしょうか。ofFloat()
ってどういうことですか。
ofPropertyValuesHolder()
って何ですか。
もうちょっと易しい英語にしておいて欲しいです。
拡張関数でわかりやすくしてみた
そこで、このような関数を用意してみました。
// ObjectAnimator 生成
fun View.createObjectAnimator(vararg propertyValuesHolders: PropertyValuesHolder): ObjectAnimator
= ObjectAnimator.ofPropertyValuesHolder(this, *propertyValuesHolders)
// PropertyValuesHolder 生成
fun <T> Property<T, Float>.createPropertyValuesHolder(from: Float, to: Float): PropertyValuesHolder
= PropertyValuesHolder.ofFloat(this, from, to)
// ↑だと長いので、簡易的に書けるようにする
infix fun <T> Property<T, Float>.changes(values: Pair<Float, Float>): PropertyValuesHolder
= this.createPropertyValuesHolder(values.first, values.second)
これだけ見てもどういうコードになるのかわかりにくいと思うので、次の例を見てください。
ObjectAnimator を生成する
上記の拡張関数を使って、最初の例を書き直すと次のようになります。
targetView.createObjectAnimator(
View.ALPHA changes (1f to 0f),
View.SCALE_X changes (1f to 0f),
View.SCALE_Y changes (1f to 0f))
.apply {
duration = 300
}.start()
少し説明
いかがでしょうか。読みやすくなったのではないでしょうか。(大差ない?)
ポイントは changes
ですね。infix
を使って英文っぽくしてみました。
infix
にしなくても良かったんですが、使いたかったんですよね。覚えたてだったので。楽しいので。
Property
に changes
を生やしたのも目のつけどころが違いますね、自分。
changes
に続く (1f to 0f)
もなかなかイカしてるんじゃないでしょうか。(そうでもない?)
1f から 0f まで変化するというのがわかりやすく示されていると思います。
この to
を使いたいがために Pair<Float, Float>
を生成してるんで、無駄が大きいんですけどもね。
createObjectAnimator()
という関数はちょっと長いので、うまい名前がつけられれば短くしたいんですが、自分の英語力では出て来ず…。
悔しいですね。
まとめ
今回紹介したコードがどう評価されるかはわからないですが、こうやっていろいろできる Kotlin はステキですね。
どんどん使いましょう!Kotlin 楽しい!