Android - 如何旋转Rect对象?

时间:2013-11-07 13:42:47

标签: java android android-canvas

我有一个矩形: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对象的外部类。

是否有另一种方法可以旋转矩形r表单类型Rect,除了这个方法并且没有旋转整个画布(画布包含一些其他元素)?

提前谢谢!

致以最诚挚的问候,Dimitar Georgiev

2 个答案:

答案 0 :(得分:9)

以这种方式旋转矩形不会为您提供任何可用于绘图的内容。 Rect和RectF不存储有关旋转的任何信息。当您使用Matrix.mapRect()时,输出RectF只是一个新的非旋转矩形,其边缘触及您想要的旋转矩形的角点。

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

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

答案 1 :(得分:0)

如果对矩阵应用旋转,则可以使用另一种方法进行操作,则不应使用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);