canvas.translate 有什么作用?

问题描述 投票:0回答:4

可以在此处找到示例 compass.javaAPI在这里

android android-canvas
4个回答
96
投票

即使几年前我第一次回答这个问题时,我也不太明白

Canvas
变换(如
translate
rotate
等)是如何工作的。我曾经以为
translate
移动了你正在画的东西。实际上,
translate
移动了整个坐标系。这也达到了移动您正在绘制的东西的预期效果。

在屏幕上看起来您正在移动绘图:

Android Canvas.translate() method

实际发生的是将坐标系移动到画布上的新位置:

我首先在

(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
可能会非常昂贵。


52
投票

想象它是一个打印头。

解释这一点的最简单方法就是想象它是喷墨打印机或 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

无法完美缩放,因为使用等宽字体只能做这么多。 :)


48
投票

翻译 - 基本上按照它说的去做。只需使用 x,y 平移画布即可。如果你想绘制两个对象,并且一个只是另一个对象的平移,例如每个点 x2 = x1 + 50 。您不必为第二个对象再次进行所有计算,但您只需平移画布并再次绘制相同的对象即可。我希望这个例子能帮助你。


0
投票

它将改变画布的位置(比例除外)x 或 y 如果我们进行翻译和缩放,那么这就是通用术语中的转换

© www.soinside.com 2019 - 2024. All rights reserved.