Sur*_*gch 73

甚至当我第一次在几年前回答了这个问题,我真的不知道如何Canvas变换(如translate,rotate等)的工作.我曾经认为那translate让你感动的东西感动了.实际上,translate移动整个坐标系.这具有移动您正在绘制的东西的期望效果.

在您的屏幕上,您似乎正在移动绘图:

Android Canvas.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 
Run Code Online (Sandbox Code Playgroud)

当你restore,画布已经在画布上.恢复不会改变这一点.它只是将坐标系移回到保存时的任何位置.

为何翻译

请注意,您可以通过更改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);
Run Code Online (Sandbox Code Playgroud)

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


Moj*_*sin 45

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

  • 你将绘制前三个然后你将你的画布向右移动50英寸(这是canvas.translate所做的)并将绘制第二个树.为了恢复画布的原始位置,你将再次移动50英寸,但这次是向左移动.现在,当你绘制它时,它将位于第一棵树的上方,如果你没有恢复画布的原始状态,翻译后绘制的所有对象都将被翻译成 - 在我们的例子中,鸟将被绘制在第二棵树之上树 (17认同)
  • 好的图像你有一个画布,你想在它上画两棵树,一只鸟在第一棵树上面.树具有相同的y坐标但不同的x(例如50英寸).你接下来打算怎么办 ?......继续 (7认同)
  • 你不必.你第一次处理这些东西有点令人困惑,但一旦你习惯它,事情变得越来越简单. (4认同)

Jos*_*ter 41

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

最简单的解释方法是想象它是喷墨打印机或2D打印机的打印头.

translate基本上"沿" X轴和Y轴"移动"打印头,告诉它的像素数.

结果位置成为新的"原点"(0,0).

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

起源:

x
Run Code Online (Sandbox Code Playgroud)

x意志(粗略地)表示,其中原点(或打印头)的.

为左眼画一个矩形:

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

x__
|__|
Run Code Online (Sandbox Code Playgroud)

注意:"原点"没有改变,它仍然在这个矩形的左上角.

将"原点"向右移动20点:

canvas.translate(20, 0)

 __    x    
|__|
Run Code Online (Sandbox Code Playgroud)

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

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

 __    x__
|__|   |__|
Run Code Online (Sandbox Code Playgroud)

将"原点"移回原始X位置并在Y轴上向下移动:

canvas.translate(-20, 20) // Positive numbers for the second param is "down" on the y-axis.

 __     __
|__|   |__|

x
Run Code Online (Sandbox Code Playgroud)

画一个嘴来完成它:

canvas.drawLine( 0, 0, 30, 0, paint ); 
 __     __
|__|   |__|

x___________
Run Code Online (Sandbox Code Playgroud)

现在只需将"原点"向下移动20分即可展示我们的杰作:

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

___________

x
Run Code Online (Sandbox Code Playgroud)

不完美的扩展,因为只有你可以用等宽字体做的那么多.:)

  • 很好的解释 (3认同)
  • 我以为你的名字是约书亚 **打印机** (2认同)