Skip to content

Skija でのアニメーション

Skija における「アニメーション」は、達成したい目的によって以下の3つの異なる意味を持ちます:

  1. プログラムによるアニメーション: コードを使用して図形を動かしたり色を変えたりすること(例:ゲームループ)。
  2. Lottie (Skottie): After Effects からエクスポートされた高品質なベクターアニメーションを再生すること。
  3. アニメーション画像: GIF や WebP 画像を再生すること。

1. プログラムによるアニメーション(「ゲームループ」)

Skija は「即時モード」レンダラーです。これは、昨日どこに円を描いたかを覚えていないことを意味します。円を動かすには、単に今日は別の位置に描画すればよいのです。

アニメーションを作成するには、ウィンドウライブラリ(JWM や LWJGL など)が draw 関数を繰り返し呼び出すことに依存します。

パターン

  1. 時間を取得: System.nanoTime() を使用して現在時刻を取得します。
  2. 状態を計算: 時間に基づいてオブジェクトがどこにあるべきかを決定します。
  3. 描画: フレームをレンダリングします。
  4. 次のフレームを要求: ウィンドウに直ちに再描画するよう指示します。

例: 円を動かす

java
// 状態を格納する変数
long startTime = System.nanoTime();

public void onPaint(Canvas canvas) {
    // 1. 時間に基づいて進行状況(0.0 から 1.0)を計算
    long now = System.nanoTime();
    float time = (now - startTime) / 1e9f; // 秒単位の時間
    
    // 毎秒100ピクセル移動
    float x = 50 + (time * 100) % 500; 
    float y = 100 + (float) Math.sin(time * 5) * 50; // 上下に揺れる

    // 2. 描画
    Paint paint = new Paint().setColor(0xFFFF0000); // 赤
    canvas.drawCircle(x, y, 20, paint);

    // 3. 次のフレームを要求(方法はウィンドウライブラリに依存)
    window.requestFrame(); 
}

2. Lottie アニメーション (Skottie)

複雑なベクターアニメーション(UI ローダーやアイコンなど)には、Skija は Skottie モジュールを使用します。これはすべてを手動で描画するよりもはるかに効率的です。

Lottie ファイルの読み込みと制御方法の詳細については、Animation API リファレンス を参照してください。

3. アニメーション画像 (GIF / WebP)

GIF や WebP のような標準的なアニメーション画像フォーマットを再生するには、Codec クラスを使用してフレームを抽出します。

マルチフレーム画像のデコードと再生の詳細については、Codec API リファレンス を参照してください。


パフォーマンスのヒント

  • ループ内でオブジェクトを作成しない: PaintRectPath オブジェクトは再利用してください。毎秒60回新しい Java オブジェクトを作成すると、ガベージコレクタが起動し、カクつきの原因になります。
  • saveLayer は注意して使用: これは高コストな操作です。
  • V-Sync: 画面のティアリングを防ぐために、ウィンドウライブラリで V-Sync が有効になっていることを確認してください。