可在此处找到一个示例compass.java。 Api here
答案 0 :(得分:65)
即使几年前我第一次回答这个问题,我也不太明白Canvas
变换的方式(如translate
,rotate
等)是如何运作的。我曾经认为translate
移动了你正在绘制的东西。实际上,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
当您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
可能非常昂贵。
答案 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的位置 如果我们翻译&然后它是一般术语的转换