Property Animation は、Android 3.0(API 11)で導入されたAndroidのアニメーションシステムで、指定された時間にわたってオブジェクト(Viewだけでなく)の実際のプロパティを変更します。従来のView Animationとは異なり、Property Animationはオブジェクトの実際のフィールド(座標、サイズ、透明度、色)を変更し、視覚的な表示だけを変えるわけではありません。Google Android Developers(2026)によると、トップ100のAndroidアプリの89%で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 は、Property Animationで最も人気のあるクラスです。ValueAnimatorを拡張し、アニメーション化された値で指定されたオブジェクトプロパティのセッターを自動的に呼び出します。ObjectAnimatorが機能するには、アニメーション化するプロパティのパブリックセッターがオブジェクトに必要です(例:「translationX」プロパティのsetTranslationX(float))。
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()を使用します。
// 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 は、Property Animationのベースクラスで、指定された時間にわたって開始から終了までのアニメーション値を生成します。ObjectAnimatorとは異なり、ValueAnimatorはオブジェクトにバインドされていません。単に中間値を計算し、リスナーを介して通知します。開発者は、取得した値をどうするか(Viewプロパティの設定、Drawableパラメータの変更、onDraw()でのカスタム描画の更新など)を決定します。
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を使用する場合と比較してリソースを節約します。
// 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 は、複数のAnimatorインスタンス(ObjectAnimator、ValueAnimator)を特定の順序で実行できるオーケストレーターです:順次(playSequentially)、並列(playTogether)、遅延付き(after、before、with)。AnimatorSetはネストをサポートしており、複雑なシナリオではAnimatorSetに他のAnimatorSetを含めることができます。
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 は、0から1までのアニメーションの速度曲線を定義します。Androidは組み込みのInterpolatorを提供しています:LinearInterpolator(均一)、AccelerateDecelerateInterpolator(低速-高速-低速)、FastOutSlowInInterpolator(Material Design)、OvershootInterpolator(目標のオーバーシュート付き)、BounceInterpolator(バウンス付き)、AnticipateOvershootInterpolator(開始前の引き戻しと目標のオーバーシュート付き)。カスタムInterpolatorはTimeInterpolatorを介して実装されます。
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を使用します。プロパティ名と対応する値の配列を受け入れます。
// 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()
}
よくある質問
View Animation(Tween Animation)は、行列変換を介してViewの視覚的表現のみを変更し、オブジェクトの実際のプロパティには影響しません。View AnimationでのtranslationXアニメーション後、要素は視覚的に移動しますが、クリックは元の位置で処理されます。Property Animation(ObjectAnimator)は実際のプロパティを変更するため、アニメーション後、要素は物理的に新しい位置にあります。
animator.cancel() を呼び出すと、アニメーションは即座に停止し、最終値は適用されません。animator.end() を呼び出すと、アニメーションは最終状態に移行して停止します。AnimatorSetの場合、set.cancel()はセット内のすべてのアニメーションを停止します。Animator.pause()とresume()は、一時停止のためにAPI 19+で利用できます。
Material Designが推奨するもの:FastOutSlowInInterpolator — 要素の出現と消失のアニメーション、LinearInterpolator — ローディングインジケーター、OvershootInterpolator — アクセント効果(ボタン)、BounceInterpolator — プル・トゥ・リフレッシュとスプリング要素。画面外から表示されるアニメーションには、AccelerateDecelerateInterpolatorを使用します。
確認事項:(1) オブジェクトに指定されたプロパティのパブリックセッター(setPropertyName())がある、(2) プロパティが「set」の後に小文字でcamelCaseで記述されている、(3) セッターが渡すタイプと同じタイプを受け入れている(ofFloat → setPropertyName(float))。Viewの場合、すべての標準プロパティ(alpha、translationX、rotationなど)にセッターがあります。
ObjectAnimator — 単一の標準Viewプロパティ(alpha、translationX、rotation)をアニメーション化する場合。ValueAnimator — 1つのリスナーから複数のプロパティを更新する必要がある場合、非Viewプロパティ(進行状況、カスタム描画)をアニメーション化する場合、またはオブジェクトに必要なプロパティのセッターがない場合。ValueAnimatorはより柔軟ですが、手動更新にはより多くのコードが必要です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。