canvas.translate是做什么的?

一个例子可以在这里findcompass.java 。 Api在这里

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

即使几年前我第一次回答这个问题时,我也不太了解Canvas如何转换(如translaterotate等)。 我曾经认为translate感动了你正在绘制的东西。 其实, translate整个坐标系。 这也有移动你正在绘制的东西的预期效果。

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

Android的Canvas.translate()方法

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

在这里输入图像说明

我先在(0,0)处画树。 然后我将坐标系的原点转换到canvas上的其他位置。 然后我再次在(0,0)处画树。 这样我的绘图代码不需要改变任何东西。 只有坐标系改变。

通常(0,0)位于视图的左上angular。 做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 ,绘图已经在canvas上。 恢复不会改变这一点。 它只是将坐标系移回原来的位置。

为什么翻译

请注意,您可以通过更改draw方法的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); 

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

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

我想说的最简单的方法是想象一下喷墨打印机或3D打印机的打印头。

translate基本上是沿X和Y轴“移动”打印头所描述的距离。

由此产生的位置成为新的“原点” (0,0)。

现在我们明白了,让我们通过以下做一个简单的面孔:

起始地点:

 x 

为左眼绘制一个矩形:

 canvas.drawRect(10, 10, 10, 10, paint); __ |__| 

注意:“原点”没有改变,它仍然在这个矩形的左上angular。

将“原点”右移20点:

 canvas.translate(20, 0) __ x |__| 

使用完全相同的矩形命令绘制右眼:

 canvas.drawRect(10, 10, 10, 10, paint); __ __ |__| |__| 

将“原点”移回到原来的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 ); __ __ |__| |__| ___________ 

由于只有很多可以用等宽字体才能完成比例缩放,因此不是完美的。 🙂

它会改变你的canvaz的位置(除了标度)或者x或者y如果我们翻译和缩放那么它是通用术语的转换