在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())就可以了