canvas.translate是做什么的?
一个例子可以在这里findcompass.java 。 Api在这里
翻译 – 基本上做它说的。 只需要使用x,y翻译canvas。 如果你想绘制两个对象,而另一个只是另一个的平移,例如每个点的x2 = x1 + 50。 您不必为第二个对象重新进行所有计算,只需翻译canvas并再次绘制相同的对象即可。 我希望这个例子能帮助你。
即使几年前我第一次回答这个问题时,我也不太了解Canvas
如何转换(如translate
, rotate
等)。 我曾经认为translate
感动了你正在绘制的东西。 其实, 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通常很容易。 重新计算每次抽奖的x
和y
可能非常昂贵。
想象一下,这是一个打印头。
我想说的最简单的方法是想象一下喷墨打印机或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如果我们翻译和缩放那么它是通用术语的转换