
アニメーションを作成するタスクがありました-与えられた曲線に沿って画像を移動します。 stackoverflow.comで同様のタスクを持ついくつかの質問が1年以上未回答のままであることに気付き、Googleは驚きました。 私は袖をまくり、文書を掘り下げ、適切な解決策を見つけなければなりませんでした。
曲線があります。 たとえば、一連のポイントから構築され、美しさのために平滑化されます。
タスクは、曲線上の点の座標を取得して、そこに画像を描画することです。 これを行うには、
PathMeasureクラスを使用します。 このクラスを使用して、曲線の長さを「測定」します。 目的のポイントを見つけるために、このクラスのオブジェクトに、ポイントが先頭から削除される長さを渡すことができます。
そのため、たとえば、曲線の中央にあるポイントの座標を取得できます。
PathMeasure pm = new PathMeasure(ptCurve, false); float afP[] = {0f, 0f};
最後のパラメーター(ここで
null
を渡しました)は、座標と同様に、このポイントで接線パラメーターを取得できます。
さらに、既製の変換マトリックス(オフセットと目的の回転)を提供する
getMatrix
メソッドがあります。 これを使用してスプライトを表示します。
Matrix mxTransform = new Matrix(); pm.getMatrix( pm.getLength() * 0.5f, mxTransform, PathMeasure.POSITION_MATRIX_FLAG + PathMeasure.TANGENT_MATRIX_FLAG ); mxTransform.preTranslate(-bmSprite.getWidth(), -bmSprite.getHeight()); canvas.drawBitmap(bmSprite, mxTransform, null);
まさに必要なものが判明しました。
完全なコードを以下に示すか、リポジトリからプロジェクトをダウンロードできます
-SpriteAlongPathまたは
Mercurialを使用します-
hg clone bitbucket.org/TedBeer/spritealongpath
hg clone bitbucket.org/TedBeer/spritealongpath
。
package net.tedbeer; import android.app.Activity; import android.os.Bundle; import android.content.Context; import android.graphics.*; import android.util.Log; import android.view.Display; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.Toast; import java.util.*; public class moveSprite extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new SceneView(this)); } } public class SceneView extends View { private static Bitmap bmSprite; private static Bitmap bmBackground; private static Rect rSrc, rDest;
更新:ビデオを別のビデオに置き換えました。スプライトも回転していることがはっきりとわかります。
tween-engブランチがリポジトリに追加され、コメントで指定された
java-universal-tween-engineがアニメーションに使用されます