自定义动画文件
public class Rotate3dAnimation extends Animation
{
private final float mFromDegrees;
private final float mToDegrees;
private final float mCenterX;
private final float mCenterY;
private float mDepthZ;
private final int MAXDETHZ = 1000;
private final boolean mReverse;
private Camera mCamera;
private final int ROTATE_X = 0;
private final int ROTATE_Y = ROTATE_X + 1;
private final int ROTATE_Z = ROTATE_Y + 1;
private int currentRotate = ROTATE_X;
public Rotate3dAnimation(float fromDegrees, float toDegrees,
float centerX, float centerY, float depthZ, boolean reverse)
{
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
mCenterX = centerX;
mCenterY = centerY;
mDepthZ = depthZ;
mReverse = reverse;
Random rand = new Random();
currentRotate = rand.nextInt(3);
}
@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 fromDegrees = mFromDegrees;
float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);
final float centerX = mCenterX;
final float centerY = mCenterY;
final Camera camera = mCamera;
final Matrix matrix = t.getMatrix();
camera.save();
if(degrees <= 180)
{
mDepthZ = ((degrees/180) * MAXDETHZ);
}else
{
mDepthZ = ((360 - degrees) / 180) * MAXDETHZ;
}
camera.translate(0.0f, 0.0f, mDepthZ);
switch(currentRotate)
{
case ROTATE_X:
{
camera.rotateX(degrees);
break;
}
case ROTATE_Y:
{
camera.rotateY(degrees);
break;
}
case ROTATE_Z:
{
camera.rotateZ(degrees);
break;
}
}
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
}
使用方式 Activity
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
if(hasFocus)
{
applyRotation();
}
}
private void applyRotation()
{
// 计算中心点
final float centerX = iv_Logo.getWidth() / 2.0f;
final float centerY = iv_Logo.getHeight() / 2.0f;
// Create a new 3D rotation with the supplied parameter
// The animation listener is used to trigger the next animation
int start = 0;
int end = 360;
final Rotate3dAnimation rotation =new Rotate3dAnimation(start, end, centerX, centerY, 0.0f, true);
rotation.setDuration(2000);
rotation.setFillAfter(true);
rotation.setInterpolator(new AccelerateInterpolator());
//│ᅱᅢᄐ¢ᅩ�
rotation.setAnimationListener(new DisplayNextView());
iv_Logo.startAnimation(rotation);
}
private final class DisplayNextView implements AnimationListener
{
private DisplayNextView()
{
}
@Override
public void onAnimationEnd(Animation animation)
{
applyRotation();
}
@Override
public void onAnimationRepeat(Animation animation)
{
}
@Override
public void onAnimationStart(Animation animation)
{
}
}