Sur*_*gch 73
甚至当我第一次在几年前回答了这个问题,我真的不知道如何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
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)
从数学背景来看,这可能更直观.但是,在翻译,旋转和缩放图像时,通常很容易保持绘图逻辑相同并只是转换画布.重新计算x
和y
每次抽奖都可能非常昂贵.
Moj*_*sin 45
翻译 - 基本上做它说的.只需使用x,y翻译画布.如果你想绘制两个对象,而另一个只是另一个对象的翻译,例如每个点的x2 = x1 + 50.您不必再为第二个对象进行所有计算,但您可以只翻译画布并再次绘制相同的对象.我希望这个例子可以帮到你.
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)
不完美的扩展,因为只有你可以用等宽字体做的那么多.:)
归档时间: |
|
查看次数: |
31519 次 |
最近记录: |