Hencoder学习笔记1-4

HenCoder Android 开发进阶:自定义 View 1-4 Canvas 对绘制的辅助

范围裁切

clipRect()

canvas.save();
canvas.clipRect(left, top, right, bottom);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();

clipPath()

canvas.save();
canvas.clipPath(path1);
canvas.drawBitmap(bitmap, point1.x, point1.y, paint);
canvas.restore();

几何变换

使用 Canvas 来做常见的二维变换;
使用 Matrix 来做常见和不常见的二维变换;
使用 Camera 来做三维变换。

使用 Canvas 来做常见的二维变换
Canvas.translate(float dx, float dy) 平移

canvas.save();
canvas.translate(200, 0);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();

Canvas.rotate(float degrees, float px, float py) 旋转

canvas.save();
canvas.rotate(45, centerX, centerY);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();

Canvas.scale(float sx, float sy, float px, float py) 放缩

canvas.save();
canvas.scale(1.3f, 1.3f, x + bitmapWidth / 2, y + bitmapHeight / 2);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();

skew(float sx, float sy) 错切

canvas.save();
canvas.skew(0, 0.5f);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();

使用 Matrix 来做变换

使用 Matrix 来做常见变换

matrix.reset();
matrix.postTranslate();
matrix.postRotate();

canvas.save();
canvas.concat(matrix);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();

使用 Matrix 来做自定义变换

Matrix 的自定义变换使用的是 setPolyToPoly() 方法。
Matrix.setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) 用点对点映射的方式设置变换

使用 Camera 来做三维变换

Camera 的三维变换有三类:旋转、平移、移动相机。

Camera.rotate*() 三维旋转

rotateX(deg) rotateY(deg) rotateZ(deg) rotate(x, y, z)。

camera.save(); // 保存 Camera 的状态
camera.rotateX(30); // 旋转 Camera 的三维空间
canvas.translate(centerX, centerY); // 旋转之后把投影移动回来
camera.applyToCanvas(canvas); // 把旋转投影到 Canvas
canvas.translate(-centerX, -centerY); // 旋转之前把绘制内容移动到轴心(原点)
camera.restore(); // 恢复 Camera 的状态

canvas.drawBitmap(bitmap, point1.x, point1.y, paint);
canvas.restore();

Camera.translate(float x, float y, float z) 移动
Camera.setLocation(x, y, z) 设置虚拟相机的位置

在 Camera 中,相机的默认位置是 (0, 0, -8)(英寸)。8 x 72 = 576,所以它的默认位置是 (0, 0, -576)(像素)。
如果绘制的内容过大,当它翻转起来的时候,就有可能出现图像投影过大的「糊脸」效果。
camera.setLocation(0, 0, newZ);

你可能感兴趣的:(Hencoder学习笔记1-4)