Android 使用Camera创建3D动画

在Android中,可以使用android.graphics.Camera这个类进行3D变换

之前更改CameraUI的时候,需要做一个切换前后摄像头的翻转动画,刚开始在网上着了一些翻转动画的代码,合到自己的代码之后,发现并没有达到自己想要的效果,为此纠结了很久,后来凑巧把几份Demo代码揉杂在一起,突然发现达到了理想效果。。晕,逐行阅读代码,原因还是细节处理问题--呵呵

下面贴出关键代码


public class FlipAnimation extends Animation {

private Camera mCamera;

private float centerX;

private float centerY;

private float scale = 0.5f;

public FlipAnimator() {

}

@Override

public void initialize(int width, int height, int parentWidth, int parentHeight) {

super.initialize(width, height, parentWidth, parentHeight);

// 初始化Camera,并得View  X和Y轴的中心点坐标

mCamera = new Camera();

centerX = width / 2;

centerY = height / 2;

}

@Override

protected void applyTransformation(float interpolatedTime, Transformation t) {

final double radians = Math.PI * interpolatedTime;

float degrees = (float) (180.0 * radians / Math.PI);

if (interpolatedTime >= 0.5f) {

degrees -= 180.f;

}

//利用Matrix 对view进行平移,缩放等变换

final Matrix matrix = t.getMatrix();

camera.save();

// 根据动画播放进度,在Z轴方向进行平移,达到先远离屏幕,在靠近屏幕的效果

camera.translate(0.0f, 0.0f, (float) (300.0 * Math.sin(radians)));

// 围绕X轴进行旋转

camera.rotateX(degrees);

// 围绕Y轴进行旋转,此处是实现上下翻转,因此不要Y轴变换

//camera.rotateY(degrees);

//围绕Z轴进行旋转,此处是实现上下翻转,因此不要Z轴变换

//camera.rotateZ(degrees);

camera.getMatrix(matrix);

camera.restore();

// 下面两行代码是设置旋转中心点为图像正中

matrix.preTranslate(-centerX, -centerY);

matrix.postTranslate(centerX, centerY);

// 对图像进行缩放

matrix.preScale(scale, scale, centerX, centerY);

}

}

由于我需要翻转的是整个屏幕界面,仅仅是上下翻转,会导致翻转的时候上半部分或下半部分超出屏幕(根据动画的方向决定:从上至下/从下至上),动画看起来会很奇怪,因此最重要的是要加上缩小和Z轴平移效果


camera.translate(0.0f, 0.0f, (float) (300.0 * Math.sin(radians)));

matrix.preScale(scale, scale, centerX, centerY);

将View缩在屏幕范围内进行3D变换,看起来perfect(貌似你们看不到,哈哈)

使用动画的方法就简单了

view.startAnimation(new FlipAnimation())就可以了

你可能感兴趣的:(Android 使用Camera创建3D动画)