Canvas绘图基础
在之前的文章中,我们已经了解到Canvas类可以用于绘制各种图形和形状。现在,我们将进一步探讨Canvas类提供的变换功能,如平移、旋转、缩放和倾斜等。
首先需要理解的是,Canvas绘图并不是直接在一张固定的画布上进行,而是每次调用DrawXXX()方法时都会生成一个新的图层并在其上绘制,类似于Photoshop中的图层概念。
一、平移(translate)
平移操作可以让整个画布沿水平或垂直方向移动,从而影响后续的所有绘制操作。
public void translate(float dx, float dy); // 平移画布
dx: 水平方向平移距离,正值向右,负值向左;
dy: 垂直方向平移距离,正值向下,负值向上。
以下是一个简单的代码示例:
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.RED);
canvas.drawRect(100, 100, 400, 300, paint); // 绘制一个矩形
canvas.translate(120, 120);
paint.setColor(Color.BLACK);
canvas.drawRect(100, 100, 400, 300, paint); // 再次绘制矩形
从结果可以看出,黑色矩形相对于屏幕左上角的位置为 (100 + 120, 100 + 120)。
为了确保某些变换仅应用于特定部分,我们可以使用save()和restore()方法保存和恢复画布状态。
canvas.save();
canvas.translate(120, 120);
canvas.drawRect(100, 100, 400, 300, paint);
canvas.restore();
canvas.drawRect(200, 200, 500, 400, paint);
二、旋转(rotate)
旋转操作可以绕指定中心点旋转画布。
public void rotate(float degrees); // 绕原点旋转
public void rotate(float degrees, float px, float py); // 绕指定点(px, py)旋转
例如:
canvas.drawRect(200, 200, 400, 300, paint);
canvas.rotate(15);
canvas.drawRect(200, 200, 400, 300, paint);
三、缩放(scale)
缩放操作可以改变画布的比例。
public void scale(float sx, float sy);
sx: 水平缩放比例;sy: 垂直缩放比例。(>1表示放大,<1表示缩小,=1表示不变)
例如:
canvas.drawRect(0, 0, 400, 300, paint);
canvas.scale(0.5f, 0.5f);
canvas.drawRect(0, 0, 400, 300, paint);
四、倾斜(skew)
倾斜操作可以使画布沿x轴或y轴倾斜。
public void skew(float sx, float sy);
sx: x轴倾斜角度的tan值;sy: y轴倾斜角度的tan值。
例如:
canvas.drawRect(0, 0, 400, 300, paint);
canvas.skew(1.732f, 0);
canvas.drawRect(0, 0, 400, 300, paint);
注意:倾斜角度的tan值可以通过数学计算得出,例如60度的tan值约为1.732。