4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Android] [kotlin] ObjectAnimatorの生成をいい感じにしたい

Posted at

はじめに

少し前に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 にしなくても良かったんですが、使いたかったんですよね。覚えたてだったので。楽しいので。
Propertychanges を生やしたのも目のつけどころが違いますね、自分。

changes に続く (1f to 0f) もなかなかイカしてるんじゃないでしょうか。(そうでもない?)
1f から 0f まで変化するというのがわかりやすく示されていると思います。
この to を使いたいがために Pair<Float, Float> を生成してるんで、無駄が大きいんですけどもね。

createObjectAnimator() という関数はちょっと長いので、うまい名前がつけられれば短くしたいんですが、自分の英語力では出て来ず…。
悔しいですね。

まとめ

今回紹介したコードがどう評価されるかはわからないですが、こうやっていろいろできる Kotlin はステキですね。
どんどん使いましょう!Kotlin 楽しい!

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?