可以在此处找到示例 compass.java。 API在这里
即使几年前我第一次回答这个问题时,我也不太明白
Canvas
变换(如 translate
、rotate
等)是如何工作的。我曾经以为translate
移动了你正在画的东西。实际上,translate
移动了整个坐标系。这也达到了移动您正在绘制的东西的预期效果。
在屏幕上看起来您正在移动绘图:
实际发生的是将坐标系移动到画布上的新位置:
我首先在
(0,0)
处画树。然后我将坐标系的原点平移到画布上的其他位置。然后我在(0,0)
处再次绘制树。这样我的绘图代码根本不需要改变任何东西。仅坐标系发生变化。
通常
(0,0)
位于视图的左上角。执行 Canvas.translate
将其移动到您视图的其他部分。
您可以执行
save()
和 restore()
返回原始坐标系。
// draw the tree the first time
canvas.drawBitmap(tree, 0, 0, mPaint);
// draw the tree the second time
canvas.save();
canvas.translate(dx, dy); // dx = change in x, dy = change in y
canvas.drawBitmap(tree, 0, 0, mPaint); // draw still thinks it is at (0,0)
canvas.restore(); // undo the translate
当您
restore
时,绘图已在画布上。恢复并不会改变这一点。它只是将坐标系移回您保存时的位置。
请注意,您可以通过更改绘制方法的 x,y 坐标来实现相同的效果:
// draw the tree the first time
canvas.drawBitmap(tree, x, y, mPaint);
// update the x,y coordinates
x += dx;
y += dy;
// draw the tree the second time
canvas.drawBitmap(tree, x, y, mPaint);
如果有数学背景,这可能会更直观。然而,当您平移、旋转和缩放图像时,通常很容易保持绘图逻辑相同,只需变换画布即可。每次抽奖重新计算
x
和 y
可能会非常昂贵。
解释这一点的最简单方法就是想象它是喷墨打印机或 2D 打印机的打印头。
translate
基本上 “移动” 打印头沿 X 轴和 Y 轴移动您指定的像素数。
结果位置成为新的“原点”(0,0)。
现在我们明白了这一点,让我们通过执行以下操作来制作一个简单的面孔:
出发地:
x
x
将(大致)代表原点(或打印头)所在位置。
为左眼画一个矩形:
canvas.drawRect(10, 10, 10, 10, paint);
x__
|__|
注意:“原点”没有改变,仍然在这个矩形的左上角。
将“原点”右移20点:
canvas.translate(20, 0)
__ x
|__|
使用完全相同矩形命令绘制右眼:
canvas.drawRect(10, 10, 10, 10, paint);
__ x__
|__| |__|
将“原点”移回到原来的X位置,并在Y轴上向下移动:
canvas.translate(-20, 20) // Positive numbers for the second param is "down" on the y-axis.
__ __
|__| |__|
x
然后画上嘴巴就完成了:
canvas.drawLine( 0, 0, 30, 0, paint );
__ __
|__| |__|
x___________
现在只需将“原点”向下移动 20 点即可展示我们的杰作:
canvas.translate(0, 20)
__ __
|__| |__|
___________
x
无法完美缩放,因为使用等宽字体只能做这么多。 :)
翻译 - 基本上按照它说的去做。只需使用 x,y 平移画布即可。如果你想绘制两个对象,并且一个只是另一个对象的平移,例如每个点 x2 = x1 + 50 。您不必为第二个对象再次进行所有计算,但您只需平移画布并再次绘制相同的对象即可。我希望这个例子能帮助你。
它将改变画布的位置(比例除外)x 或 y 如果我们进行翻译和缩放,那么这就是通用术语中的转换