package com.limemobile.app.launcher.anim;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.Animation;
import android.view.animation.Transformation;
public class Rotate3d extends Animation {
/** 起始角度 **/
private float mFromDegree;
/** 结束角度 **/
private float mToDegree;
/** 中轴X坐标 **/
private float mCenterX;
/** 中轴Y坐标 **/
private float mCenterY;
// private float mLeft;
// private float mTop;
private float mSaveFromDegree;
private float mSaveToDegree;
private int type;
public final static int ROTATE_X = 0;
public final static int ROTATE_Y = 1;
public final static int ROTATE_Z = 2;
public final static int ROTATE_XY = 3;
public final static int ROTATE_XZ = 4;
public final static int ROTATE_YZ = 5;
public final static int ROTATE_XYZ = 6;
private Camera mCamera;
// private static final String TAG = "Rotate3d";
// public Rotate3d(float fromDegree, float toDegree, float left, float top, float centerX, float centerY) {
// this.mFromDegree = fromDegree;
// this.mToDegree = toDegree;
// // this.mLeft = left;
// // this.mTop = top;
// this.mCenterX = centerX;
// this.mCenterY = centerY;
//
// }
/**
* 3D旋转
*
* @param fromDegree
* 起始角度
* @param toDegree
* 结束角度
* @param centerX
* 旋转中心轴X
* @param centerY
* 旋转中心轴Y
*/
public Rotate3d(float fromDegree, float toDegree, float centerX, float centerY) {
this.mFromDegree = fromDegree;
this.mToDegree = toDegree;
this.mCenterX = centerX;
this.mCenterY = centerY;
mSaveFromDegree = fromDegree;
mSaveToDegree = toDegree;
type = ROTATE_Y;
}
/**
* 反转角度
* @param isReverse 是否反转
*/
public void reverseTransformation(boolean isReverse){
if(isReverse){
this.mFromDegree = -mSaveFromDegree;
this.mToDegree = -mSaveToDegree;
}else{
this.mFromDegree = mSaveFromDegree;
this.mToDegree = mSaveToDegree;
}
}
public void rotate(float degrees){
switch (type) {
case ROTATE_X:
mCamera.rotateX(degrees);
break;
case ROTATE_Y:
mCamera.rotateY(degrees);
break;
case ROTATE_Z:
mCamera.rotateZ(degrees);
break;
case ROTATE_XY:
mCamera.rotateX(degrees);
mCamera.rotateY(degrees);
break;
case ROTATE_XZ:
mCamera.rotateX(degrees);
mCamera.rotateZ(degrees);
break;
case ROTATE_YZ:
mCamera.rotateY(degrees);
mCamera.rotateZ(degrees);
break;
case ROTATE_XYZ:
mCamera.rotateX(degrees);
mCamera.rotateY(degrees);
mCamera.rotateZ(degrees);
break;
}
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
mCamera = new Camera();
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
final float FromDegree = mFromDegree;
float degrees = FromDegree + (mToDegree - mFromDegree) * interpolatedTime;
final float centerX = mCenterX;
final float centerY = mCenterY;
final Matrix matrix = t.getMatrix();
// Log.e("Rotate3d", "degrees=" + degrees);
if (degrees <= -76.0f) {
degrees = -90.0f;
mCamera.save();
rotate(degrees);
mCamera.getMatrix(matrix);
mCamera.restore();
} else if (degrees >= 76.0f) {
degrees = 90.0f;
mCamera.save();
rotate(degrees);
mCamera.getMatrix(matrix);
mCamera.restore();
} else {
mCamera.save();
mCamera.translate(0, 0, centerX);
rotate(degrees);
mCamera.translate(0, 0, -centerX);
mCamera.getMatrix(matrix);
mCamera.restore();
}
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}