canvas.translate做什么?

时间:2011-04-26 11:46:22

标签: android

可在此处找到一个示例compass.javaApi here

4 个答案:

答案 0 :(得分:65)

即使几年前我第一次回答这个问题,我也不太明白Canvas变换的方式(如translaterotate等)是如何运作的。我曾经认为translate移动了你正在绘制的东西。实际上,translate会移动整个坐标系。这样也可以移动您正在绘制的东西。

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

Android Canvas.translate() method

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

enter image description here

我首先在(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);

这可能更直观来自数学背景。但是,在翻译,旋转和缩放图像时,通常很容易保持绘图逻辑相同并只是转换画布。每次抽奖重新计算xy可能非常昂贵。

答案 1 :(得分:43)

翻译 - 基本上做它所说的。只需使用x,y翻译画布。如果你想绘制两个对象,而另一个只是另一个对象的翻译,例如x2 = x1 + 50。您不必再为第二个对象进行所有计算,但您可以只翻译画布并再次绘制相同的对象。我希望example会帮助你。

答案 2 :(得分:40)

想象一下,它是一个打印头。

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

不完全可扩展,因为只有那么多你可以使用等宽字体。 :)

答案 3 :(得分:0)

它会改变你的canvaz(除了比例)x或y的位置 如果我们翻译&然后它是一般术语的转换