安卓如何旋转画布矩形

10

我创建了一个指定大小的矩形,现在想将其旋转45度,尝试使用canvas.rotate和matrix方法,但没有生效。请问在Android中正确的旋转canvas的方法是什么?同时,我也很好奇Path.Direction.CW是用于旋转吗?但是我在Path()函数中并没有看到任何旋转功能。

    paint.setAntiAlias(true);
    paint.setStrokeWidth(2);
    paint.setColor(Color.BLUE);
    paint.setAlpha(75);

    Path path = new Path();
    path.addRect(166, 748, 314, 890, Path.Direction.CW);
    canvas.rotate(45);
    canvas.drawPath(path, paint);

如果你对Path.Direction感到好奇,为什么不去谷歌呢?第一个链接是:http://developer.android.com/reference/android/graphics/Path.Direction.html。在绘制路径之前为什么要旋转画布?你想要达到什么效果? - Simon
它说顺时针和逆时针,我不明白它的意思。简单来说,我只想旋转我创建的矩形"path.addRect(166, 748, 314, 890, Path.Direction.CW);"。如果我去掉"canvas.rotate(45)",它会在屏幕上显示一个矩形,现在我想将其旋转45度。已经谷歌了一下,但找不到任何解决方案。 - Mat Yus
你已经旋转了画布,然后绘制路径。因此,只有在路径之前绘制的内容(看起来像是空白)被旋转了。为什么不先绘制路径再旋转呢? - Simon
你的意思是像这样吗? paint.setAntiAlias(true); paint.setStrokeWidth(2); paint.setColor(Color.BLUE); paint.setAlpha(75); Path path = new Path(); path.addRect(166, 748, 314, 890, Path.Direction.CW); canvas.drawPath(path, paint); canvas.rotate(45); 它不起作用,一样的,没有任何变化。 - Mat Yus
3个回答

18
要绘制一个旋转的矩形,你需要在绘制之前旋转画布(如果你还要绘制其他东西,则需要将它旋转回来)。Canvas.rotate() 只会改变画布的变换矩阵,该矩阵会影响在调用后绘制的所有形状。
canvas.save();
canvas.rotate(45);
canvas.drawRect(166, 748, 314, 890, paint);
canvas.restore();

Path.Direction与旋转变换没有任何关系。来自文档

  

指定封闭形状(例如矩形、椭圆)添加到路径时的方向。


请注意,canvas.rotate 本身会围绕原点旋转。如果您只想围绕矩形的中心旋转,您需要调用 canvas.translate(rectCenterX, rectCenterY) 并相应地调整您的矩形。 - undefined

7
如果你想从点 (x,y) 开始绘制某物,你需要将画布围绕点 (x,y) 旋转。要做到这一点,你可以使用:
canvas.rotate(45,x,y);

那么,

canvas.save();
canvas.rotate(45,x,y);
//all drawing from (x,y) point
canvas.restore();

2

正确的做法应该是这样的:

Path path = new Path();
path.addRect(166, 748, 314, 890, Path.Direction.CW);
canvas.save(); // first save the state of the canvas
canvas.rotate(45); // rotate it
canvas.drawPath(path, paint); // draw on it
canvas.restore(); // restore previous state (rotate it back)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接