Android - 如何旋转矩形对象?

8

我有一个矩形:Rect r = new Rect();。我想将r对象旋转45度。我查找了解决方案,并发现可以使用矩阵来实现:

Matrix m = new Matrix();
// point is the point about which to rotate.
m.setRotate(degrees, point.x, point.y);
m.mapRect(r);

问题在于当我将r传递给m.mapRect(r);时,它会抱怨r应该是RectF类型。我设法这样做:
RectF r2 = new RectF(r);
Matrix m = new Matrix();
// point is the point about which to rotate.
m.setRotate(degrees, point.x, point.y);
m.mapRect(r2);

但问题在于我需要类型为Rect而不是RectF的对象。因为我要将r对象传递给外部类,该类接受Rect对象。

除了这种方法并且不旋转整个画布(画布包含其他元素),是否还有其他方法可以旋转类型为Rect的矩形r

谢谢您的帮助!

最好的问候,Dimitar Georgiev


1
你需要保存画布,旋转后重新绘制。 - Broak
你为什么不用旋转后的RectF的值创建一个新的Rect,并将其强制转换(或四舍五入)为整数呢? - Torben
@xBroak,你能否给我更多的细节,比如何时以及如何保存和重新绘制? - chikito1990
@Torben 我刚试了一下,不知道为什么它没起作用。 - chikito1990
@chikito1990 我完全不相信。请展示代码。 - Torben
我有一个问题,当这样做时,Rect 的点会改变吗? - Snake
2个回答

11

按照这种方式旋转矩形将不会得到可用于绘图的任何东西。一个 Rect 和一个 RectF 不存储任何关于旋转的信息。当您使用 Matrix.mapRect() 时,输出的 RectF 只是一个新的未旋转的矩形,其边缘与您想要旋转的矩形的角点相接触。

您需要旋转整个画布以绘制矩形。然后立即取消画布旋转以继续绘图,因此在旋转具有其他对象的画布时没有问题。

canvas.save();
canvas.rotate(45);
canvas.drawRect(r,paint);
canvas.restore();

1
输出的RectF对我很有用,但如果我想旋转RectF,我该怎么做?请参见我的问题:http://stackoverflow.com/questions/33236473/how-to-rotate-view-by-coordinate-also-in-android - Mayur R. Amipara

2

如果您正在对矩阵应用旋转,那么另一种方法是不要使用mapRect,而应该找出代表每个矩形边缘的4个初始点,然后使用mapPoints。

float[] rectangleCorners = {
                            r2.left, r2.top, //left, top
                            r2.right, r2.top, //right, top
                            r2.right, r2.bottom, //right, bottom
                            r2.left, r2.bottom//left, bottom
                    };
Matrix m = new Matrix();
// point is the point about which to rotate.
m.setRotate(degrees, point.x, point.y);
m.mapPoints(r2);

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