Property Animation: 概要、ObjectAnimatorとValueAnimator

著者: IT Sectr 公開日: 2026-02-28 読了時間: 10 分

Property Animation は、Android 3.0(API 11)で導入されたAndroidのアニメーションシステムで、指定された時間にわたってオブジェクト(Viewだけでなく)の実際のプロパティを変更します。従来のView Animationとは異なり、Property Animationはオブジェクトの実際のフィールド(座標、サイズ、透明度、色)を変更し、視覚的な表示だけを変えるわけではありません。Google Android Developers(2026)によると、トップ100のAndroidアプリの89%でProperty Animationが使用されています。他の種類のアニメーションの詳細については、アニメーションの一般的なガイドをご覧ください。

重要なポイント

  • Property Animation — Animatorを介してオブジェクトのプロパティを変更するAndroidアニメーションシステム。
  • ObjectAnimator — 指定された値でオブジェクトの特定のプロパティをアニメーション化するためのメインクラス。
  • ValueAnimator — 特定のオブジェクトにバインドせずにアニメーション値を生成するベースクラス。
  • AnimatorSet — 複数のアニメーターを順次または並列で組み合わせることができます。
  • Property AnimationはInterpolator、TypeEvaluator、およびAnimatorListenerを介したリスニングをサポートしています。

Property Animationとは?

Property Animation は、Android SDK(android.animationパッケージ)のフレームワークで、指定された時間内に任意のオブジェクト(View、Drawable、カスタムクラス)の任意のプロパティをアニメーション化します。View AnimationがViewでのみ機能し、視覚的な表現(行列変換)のみを変更するのとは異なり、Property Animationはオブジェクトの実際のフィールドを変更します。つまり、translationXアニメーションの後、オブジェクトは実際に新しい位置にあり、クリックは新しい場所で処理されます。

Property Animationのアーキテクチャは、3つの主要なクラスに基づいています。ValueAnimator — 基本の値ジェネレーター、ObjectAnimator — オブジェクトのプロパティにバインドするためのサブクラス、AnimatorSet — グループアニメーションのためのオーケストレーター。3つすべてがInterpolator(速度曲線)とTypeEvaluator(値間の補間ルール)をサポートしています。

Android Performance Patterns(Google、2025)によると、Property Animationは、Interpolatorが適切に設定され、onAnimationUpdate()で重い計算がない場合、最大60 FPSで動作します。複雑なアニメーション(3D、物理)には、Android 12+ではRenderThread(RenderNode Animations)が推奨されています。Property Animationは、translationX、rotationY、scaleX、alphaなどのViewプロパティをアニメーション化するための主要な選択肢であり続けています。

ObjectAnimator: オブジェクトのプロパティをアニメーション化

ObjectAnimator は、Property Animationで最も人気のあるクラスです。ValueAnimatorを拡張し、アニメーション化された値で指定されたオブジェクトプロパティのセッターを自動的に呼び出します。ObjectAnimatorが機能するには、アニメーション化するプロパティのパブリックセッターがオブジェクトに必要です(例:「translationX」プロパティのsetTranslationX(float))。

kotlin
import android.animation.ObjectAnimator
import android.view.View

// ObjectAnimator for translationX
val animator = ObjectAnimator.ofFloat(
    myView,
    "translationX",
    0f,
    300f
).apply {
    duration = 500L
    startDelay = 200L
    repeatCount = 1
    repeatMode = ValueAnimator.REVERSE
    interpolator = FastOutSlowInInterpolator()
    start()
}

サポートされているViewプロパティ: translationX、translationY、translationZ、rotation、rotationX、rotationY、scaleX、scaleY、alpha、x、y、elevation。ObjectAnimator.ofFloat()はfloatプロパティに、ofInt()はintに、ofObject()はカスタムタイプ(色、点)に使用されます。色のアニメーションには、ArgbEvaluatorまたはHsvEvaluatorとともにofObject()を使用します。

kotlin
// ObjectAnimatorとカスタムTypeEvaluator(色)
import android.animation.ObjectAnimator
import android.animation.ArgbEvaluator
import android.graphics.Color

val colorAnim = ObjectAnimator.ofObject(
    myView,
    "backgroundColor",
    ArgbEvaluator(),
    Color.BLUE,
    Color.RED
).apply {
    duration = 1000L
    repeatCount = ValueAnimator.INFINITE
    repeatMode = ValueAnimator.REVERSE
    start()
}

// 複数のプロパティを同時にアニメーション化
val scaleXAnim = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.5f)
val scaleYAnim = ObjectAnimator.ofFloat(myView, "scaleY", 1f, 1.5f)
val alphaAnim = ObjectAnimator.ofFloat(myView, "alpha", 1f, 0.5f)

AnimatorListener — アニメーションイベント(onAnimationStart、onAnimationEnd、onAnimationCancel、onAnimationRepeat)を追跡するためのインターフェース。必要なメソッドのみをオーバーライドするにはAnimatorListenerAdapterを使用します。Android 12以降、suspendAnimationFrameを介したコルーチンサポート付きのAnimator.AnimationCallbackが追加されました。

ValueAnimator: アニメーション値の生成

ValueAnimator は、Property Animationのベースクラスで、指定された時間にわたって開始から終了までのアニメーション値を生成します。ObjectAnimatorとは異なり、ValueAnimatorはオブジェクトにバインドされていません。単に中間値を計算し、リスナーを介して通知します。開発者は、取得した値をどうするか(Viewプロパティの設定、Drawableパラメータの変更、onDraw()でのカスタム描画の更新など)を決定します。

kotlin
import android.animation.ValueAnimator
import android.view.animation.LinearInterpolator

"> ValueAnimator: ロード進捗アニメーション
val valueAnimator = ValueAnimator.ofFloat(0f, 100f).apply {
    duration = 2000L
    interpolator = LinearInterpolator()
    repeatCount = ValueAnimator.INFINITE

    addUpdateListener { animator ->
        val progress = animator.animatedValue as Float
        progressBar.progress = progress.toInt()
        progressText.text = "${progress.toInt()}%"
    }

    addListener(object : AnimatorListenerAdapter() {
        override fun onAnimationRepeat(animation: Animator) {
            Log.d("Anim", "Progress animation restarted")
        }
    })
    start()
}

ValueAnimator.ofInt() — 整数プロパティ(幅、高さ、ステップ数)に使用されます。ValueAnimator.ofObject() — TypeEvaluatorを使用したカスタムタイプ用。ValueAnimator.ofPropertyValuesHolder() — 単一のタイマーで複数のプロパティを並列アニメーション化し、各プロパティに個別のAnimatorを使用する場合と比較してリソースを節約します。

kotlin
// ValueAnimator.ofObjectとPointEvaluator
import android.animation.ValueAnimator
import android.graphics.PointF
import android.animation.PointFEvaluator

val pointAnim = ValueAnimator.ofObject(
    PointFEvaluator(),
    PointF(0f, 0f),
    PointF(300f, 500f)
).apply {
    duration = 1000L
    addUpdateListener { animator ->
        val point = animator.animatedValue as PointF
        movingView.x = point.x
        movingView.y = point.y
    }
    start()
}

ValueAnimatorのパフォーマンス: 60 FPSでは、onAnimationUpdateは約16.7ミリ秒ごとに呼び出されます。リスナー内では避けてください:オブジェクトの割り当て(PointF/RectFは一度作成)、findViewById()の呼び出し、重い計算(ファイルI/O、ネットワーク)。20以上の要素を同時にアニメーション化するには、20の個別のAnimatorではなく、1つのAnimatorでPropertyValuesHolderを使用します。サイズ変更を伴うアニメーションの場合は、アニメーションの最後にのみView.setLayoutParams()を使用します(AnimatorListenerAdapter.onAnimationEnd経由)。

AnimatorSet: アニメーションの構成

AnimatorSet は、複数のAnimatorインスタンス(ObjectAnimator、ValueAnimator)を特定の順序で実行できるオーケストレーターです:順次(playSequentially)、並列(playTogether)、遅延付き(after、before、with)。AnimatorSetはネストをサポートしており、複雑なシナリオではAnimatorSetに他のAnimatorSetを含めることができます。

kotlin
import android.animation.AnimatorSet
import android.animation.ObjectAnimator

// AnimatorSet: 順次および並列アニメーション
val fadeIn = ObjectAnimator.ofFloat(myView, "alpha", 0f, 1f)
val slideUp = ObjectAnimator.ofFloat(myView, "translationY", 100f, 0f)
val bounce = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.1f, 1f)

val animatorSet = AnimatorSet().apply {
    // 並列: fadeIn + slideUp
    play(fadeIn).with(slideUp)
    "> 後: 200msの遅延付きbounce
    play(bounce).after(200L)

    duration = 400L
    interpolator = FastOutSlowInInterpolator()
    addListener(object : AnimatorListenerAdapter() {
        override fun onAnimationEnd(animation: Animator) {
            Log.d("Anim", "Set completed")
        }
    })
    start()
}

AnimatorSet.Builder は、チェーンを構築するためのfluent APIを提供します:with() — 並列、before() — 前、after() — 後。AnimatorSetはcancel()をサポートしており、セット内のすべてのアニメーションを停止します。複雑なシナリオ(25以上のアニメーター)では、PropertyValuesHolderを使用します。各Animatorに個別のタイマーを使用する代わりに、単一の共有タイマーを使用するため、パフォーマンスが向上します。

Builderメソッド説明
with(Animator)現在のアニメーションと並列実行play(fadeIn).with(slideUp)
before(Animator)現在のアニメーションを指定の前にplay(fadeIn).before(bounce)
after(Animator)現在のアニメーションを指定の後にplay(bounce).after(slideUp)
after(Long)現在のアニメーションの前に遅延play(bounce).after(200L)

InterpolatorとTypeEvaluator: 速度とタイプの制御

Interpolator は、0から1までのアニメーションの速度曲線を定義します。Androidは組み込みのInterpolatorを提供しています:LinearInterpolator(均一)、AccelerateDecelerateInterpolator(低速-高速-低速)、FastOutSlowInInterpolator(Material Design)、OvershootInterpolator(目標のオーバーシュート付き)、BounceInterpolator(バウンス付き)、AnticipateOvershootInterpolator(開始前の引き戻しと目標のオーバーシュート付き)。カスタムInterpolatorはTimeInterpolatorを介して実装されます。

kotlin
import android.animation.ObjectAnimator
import android.view.animation.BounceInterpolator
import android.view.animation.OvershootInterpolator
import android.view.animation.AnticipateOvershootInterpolator

// BounceInterpolator — 最後にバウンス効果
val bounceAnim = ObjectAnimator.ofFloat(myView, "translationY", 0f, -50f).apply {
    duration = 600L
    interpolator = BounceInterpolator()
    start()
}

// AnticipateOvershoot — 引き戻し、その後オーバーシュート
val anticipateAnim = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.3f).apply {
    duration = 500L
    interpolator = AnticipateOvershootInterpolator(2.0f)
    start()
}

TypeEvaluator — evaluate(fraction, startValue, endValue)メソッドを持つインターフェースで、開始値と終了値の間の中間値を計算します。組み込み:ArgbEvaluator(int色)、FloatEvaluator、IntEvaluator、PointFEvaluator、RectEvaluator。カスタムデータタイプ(例:3つのフィールドを持つカスタムクラスのアニメーション化)の場合は、独自のTypeEvaluatorを実装します。同じ設定で複数のViewをアニメーション化するには、PropertyValuesHolderを使用します。プロパティ名と対応する値の配列を受け入れます。

kotlin
// ProgressStateクラスのカスタムTypeEvaluator
data class ProgressState(val progress: Float, val color: Int)

class ProgressEvaluator : TypeEvaluator<ProgressState> {
    override fun evaluate(
        fraction: Float,
        startValue: ProgressState,
        endValue: ProgressState
    ): ProgressState {
        val progress = startValue.progress + fraction * (endValue.progress - startValue.progress)
        val color = ArgbEvaluator().evaluate(
            fraction, startValue.color, endValue.color
        ) as Int
        return ProgressState(progress, color)
    }
}

"> PropertyValuesHolder — 最大限のパフォーマンス
val pvh1 = PropertyValuesHolder.ofFloat("scaleX", 1f, 1.5f)
val pvh2 = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.5f)
val pvhAnim = ObjectAnimator.ofPropertyValuesHolder(myView, pvh1, pvh2).apply {
    duration = 300L
    start()
}

よくある質問

Property AnimationとView Animationの違いは何ですか?

View Animation(Tween Animation)は、行列変換を介してViewの視覚的表現のみを変更し、オブジェクトの実際のプロパティには影響しません。View AnimationでのtranslationXアニメーション後、要素は視覚的に移動しますが、クリックは元の位置で処理されます。Property Animation(ObjectAnimator)は実際のプロパティを変更するため、アニメーション後、要素は物理的に新しい位置にあります。

Property Animationを停止するには?

animator.cancel() を呼び出すと、アニメーションは即座に停止し、最終値は適用されません。animator.end() を呼び出すと、アニメーションは最終状態に移行して停止します。AnimatorSetの場合、set.cancel()はセット内のすべてのアニメーションを停止します。Animator.pause()とresume()は、一時停止のためにAPI 19+で利用できます。

さまざまなタイプのアニメーションにはどのInterpolatorを使用すべきですか?

Material Designが推奨するもの:FastOutSlowInInterpolator — 要素の出現と消失のアニメーション、LinearInterpolator — ローディングインジケーター、OvershootInterpolator — アクセント効果(ボタン)、BounceInterpolator — プル・トゥ・リフレッシュとスプリング要素。画面外から表示されるアニメーションには、AccelerateDecelerateInterpolatorを使用します。

ObjectAnimatorがプロパティをアニメーション化しないのはなぜですか?

確認事項:(1) オブジェクトに指定されたプロパティのパブリックセッター(setPropertyName())がある、(2) プロパティが「set」の後に小文字でcamelCaseで記述されている、(3) セッターが渡すタイプと同じタイプを受け入れている(ofFloat → setPropertyName(float))。Viewの場合、すべての標準プロパティ(alpha、translationX、rotationなど)にセッターがあります。

ValueAnimatorではなくObjectAnimatorを使用するのはいつですか?

ObjectAnimator — 単一の標準Viewプロパティ(alpha、translationX、rotation)をアニメーション化する場合。ValueAnimator — 1つのリスナーから複数のプロパティを更新する必要がある場合、非Viewプロパティ(進行状況、カスタム描画)をアニメーション化する場合、またはオブジェクトに必要なプロパティのセッターがない場合。ValueAnimatorはより柔軟ですが、手動更新にはより多くのコードが必要です。

まとめ

  • Property Animation — Animatorを介して実際のオブジェクトのプロパティをアニメーション化するAndroidフレームワーク。
  • ObjectAnimator — 指定された開始/終了値で特定のオブジェクトのプロパティをアニメーション化。
  • ValueAnimator — onAnimationUpdateで手動更新によるアニメーション値の生成。
  • AnimatorSet — 複数のアニメーターを順次または並列でオーケストレーション。
  • Interpolator — 速度曲線: FastOutSlowIn、Linear、Bounce、Overshoot、カスタム。
  • TypeEvaluator — カスタムデータタイプの値間の補間ルール。
  • Property Values Holder(PropertyValuesHolder) — 複数のプロパティの並列アニメーションの最適化。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください