xyz轴旋转动画


自定义动画文件
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) 
{
}
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值