/**
* カスタム アニメーション。カメラを使用して 3D 効果を実現します。 image = (ImageView)
* findViewById(R.id.image) * BitmapFactory.decodeResource(getResources(), R.drawable) .main_back_pic) ;
* image.setImageBitmap(bitmap); image.startAnimation(new
* MyAnimation(bitmap.getWidth()/2, bitmap.getHeight()/2, 3500));
**/
public class MyAnimation extendsAnimation {
private int width;
private int height;
private int period;// 期間
private Camera カメラ = new Camera();
public MyAnimation(int width, int height, int period) {
this.height = height;
this.width = width;
this.duration = period;
}
@Override
public voidInitialize(int width, int height, intparentWidth,
intparentHeight) {
setDuration(duration);//アニメーションの実行時間を設定します
setFillAfter(true) / / アニメーションが終了すると、アニメーションはアニメーションの最後のフレームに留まります。 setFillBefore(true): アニメーションが終了すると、最初のフレームに留まります
// アニメーションは均一モーションに設定され、モーション状態が設定されますXML ファイルで設定しても効果はなく、Java コードで設定する必要があります
setInterpolator(new LinearInterpolator());
super.initialize(width, height,parentWidth,parentHeight);
}
@Override
protected void applyTransformation(float interpolatedTime,
Transformation trans) {
/**
* このメソッドの 2 つのパラメーター (最初の interpolatedTime) は、時間がどれだけ長くても、パラメーター値は 0 から 1 までです
* 0 はアニメーションの開始を表し、1 はアニメーションの開始を表します。アニメーションの終了を表します。Transformation は、アニメーションを変更するために Camera によって提供されるメソッドです。 getMatrix (Matrix
* matrix) は、Camera によって行われた変更を行列に適用します。rotateX (float deg) は、ターゲット コンポーネントを X 軸に沿って回転します
*rotateY (float deg) Y 軸に沿ってターゲット コンポーネントを回転します totateZ (float deg) Z 軸に沿ってコンポーネントを回転します
* Translation (float x, float y, float z) ターゲット コンポーネントを 3 次元空間で変位させます
* applyToCanvas (キャンバス キャンバス) は、カメラによる変更を Canvas に適用します
**/
super.applyTransformation(interpolatedTime, trans);
Camera.save();
// 3 次元ビューのターゲット コンポーネントを切り替えます
// 初めて呼び出されたとき、interpolatedTime の値は 0 で、これはビューを 10 ピクセル移動するのと同じですが、その後はその値がどんどん小さくなっていきます。一定期間が経過すると、再び方向が変わります
Camera.translate(0.0f, 0.0f , (10 - 10 * interpolatedTime));
// Camera.rotateX(360 * interpolatedTime);
Camera.rotateY(360 * interpolatedTime);
// Camera.rotateZ(360 * interpolatedTime);
Matrix 行列 = trans.getMatrix();
Camera.getMatrix(matrix);
// preTranslate は setScale 前の翻訳を指し、postTranslate は指しますto translation after setScale
// パラメーターは移動距離であり、移動先の座標ではないことに注意してください!
// ズームの中心は (0,0) なので、インターフェイスの中心を揃えるためにwith (0,0), preTranslate(-centerX,
// - centerY),
// setScale が完了したら、postTranslate(centerX,
// centerY) を呼び出し、画像を元に戻します。表示されるアニメーション効果は、アクティビティ インターフェイスの画像が中心から常にスケーリングしていることです
// centerX と centerY はインターフェイスの中心の座標です
matrix.preTranslate(-width, -height);
matrix.postTranslate(幅、高さ);
Camera.restore();
}
}