在我们处理canvas平移,缩放等矩阵matrix变换中,除了自己手动操作矩阵matrix外,安卓系统还提供了一个工具类--Camera,用于3D变换计算,生成一个Matrix矩阵实例用于画布上面绘制。它的坐标系和我们canvas的绘图坐标有些区别,支持x,y,z轴,三维坐标系变换,如下图
zuobiao.png
其中初始坐标和canvas相同,为左上角,但是y轴不再是向下为正,而是和我们平时数学中的坐标系相同,这点要注意
Camera内部实际上OpenGL。很多时候我们用OpenGL做3D特效,其实Camera可以满足绝大部分的需要
下面是一张在app中没有做任何变换的图
默认.jpg
接下来,我们使用camera来对该图进行矩阵变换
代码语言:javascript复制 private Camera camera = new Camera();
private Matrix matrix = new Matrix();
@Override
protected void onDraw(Canvas canvas) {
matrix.reset();
//涉及到矩阵变换,和canvas同样的,我们使用save和restore对矩阵保存和恢复
camera.save();
//往x,y,z方向分别平移100像素
camera.translate(100, 100, 100);
//每次我们都要获取下矩阵
camera.getMatrix(matrix);
camera.restore();
canvas.drawBitmap(bitmap, matrix, mPaint);
}
x,y,z轴平移100像素.jpg
很明显,在x,y,z轴平移100像素后,比原来看起来更小(远),并且,y轴平移100不再是往下平移,而是往上平移
camera还支持旋转操作
代码语言:javascript复制 @Override
protected void onDraw(Canvas canvas) {
matrix.reset();
//涉及到矩阵变换,和canvas同样的,我们使用save和restore对矩阵保存和恢复
camera.save();
//往x,y,z方向分别平移100像素
//camera.translate(100, 100, 100);
//绕x轴旋转45度
camera.rotateX(45);
//每次我们都要获取下矩阵
camera.getMatrix(matrix);
camera.restore();
canvas.drawBitmap(bitmap, matrix, mPaint);
}
绕x轴45度.jpg
是不是有立体的感觉了,当然一般我们都是以图片的中心旋转,这个时候我们就需要操作下矩阵,让它先平移到原点,再旋转,之后再平移会原来位置
代码语言:javascript复制 @Override
protected void onDraw(Canvas canvas) {
matrix.reset();
//涉及到矩阵变换,和canvas同样的,我们使用save和restore对矩阵保存和恢复
camera.save();
//往x,y,z方向分别平移100像素
//camera.translate(100, 100, 100);
//绕x轴旋转45度
camera.rotateX(45);
//每次我们都要获取下矩阵
camera.getMatrix(matrix);
camera.restore();
//矩阵前乘
matrix.preTranslate(-bitmap.getWidth() / 2f,-bitmap.getHeight() / 2f);
//矩阵后乘
matrix.postTranslate(bitmap.getWidth() / 2f,bitmap.getHeight() / 2f);
canvas.drawBitmap(bitmap, matrix, mPaint);
}
图片中心旋转45度.jpg