Skija でのアニメーション
Skija における「アニメーション」は、達成したい目的によって以下の3つの異なる意味を持ちます:
- プログラムによるアニメーション: コードを使用して図形を動かしたり色を変えたりすること(例:ゲームループ)。
- Lottie (Skottie): After Effects からエクスポートされた高品質なベクターアニメーションを再生すること。
- アニメーション画像: GIF や WebP 画像を再生すること。
1. プログラムによるアニメーション(「ゲームループ」)
Skija は「即時モード」レンダラーです。これは、昨日どこに円を描いたかを覚えていないことを意味します。円を動かすには、単に今日は別の位置に描画すればよいのです。
アニメーションを作成するには、ウィンドウライブラリ(JWM や LWJGL など)が draw 関数を繰り返し呼び出すことに依存します。
パターン
- 時間を取得:
System.nanoTime()を使用して現在時刻を取得します。 - 状態を計算: 時間に基づいてオブジェクトがどこにあるべきかを決定します。
- 描画: フレームをレンダリングします。
- 次のフレームを要求: ウィンドウに直ちに再描画するよう指示します。
例: 円を動かす
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 リファレンス を参照してください。
パフォーマンスのヒント
- ループ内でオブジェクトを作成しない:
Paint、Rect、Pathオブジェクトは再利用してください。毎秒60回新しい Java オブジェクトを作成すると、ガベージコレクタが起動し、カクつきの原因になります。 saveLayerは注意して使用: これは高コストな操作です。- V-Sync: 画面のティアリングを防ぐために、ウィンドウライブラリで V-Sync が有効になっていることを確認してください。