我有一个用于 SVG 绘图的 java 代码。它处理包括 在内的转换rotate
,并且做得很好,据我在许多测试图片中看到的,与它们在 Chrome 中的渲染相比。接下来我需要的是获取实际的对象位置,这在许多通过变换声明的图像中。所以我决定只从用于绘图的 Matrix 中读取 X 和 Y。不幸的是,我得到了不正确的rotate
变换值,即它们与图像中的真实对象位置不对应。
精简后的代码如下所示:
Matrix matrix = new Matrix();
float cx = 1000; // suppose this is an object X coordinate
float cy = 300; // this is its Y coordinate
float angle = -90; // rotate counterclockwise, got from "rotate(-90, 1000, 300)"
// shift to -X,-Y, so object is in the center
matrix.postTranslate(-cx, -cy);
// rotate actually
matrix.postRotate(angle);
// shift back
matrix.postTranslate(cx, cy);
// debug goes here
float[] values = new float[9];
matrix.getValues(values);
Log.v("HELLO", values[Matrix.MTRANS_X] + " " + values[Matrix.MTRANS_Y]);
日志分别输出值 700 和 1300。我期望 0 和 0,因为我看到对象在我的图像中就地旋转(即没有任何移动),并且 postTranslate 调用应该相互补偿。当然,我看到这些值是如何从 1000 和 300 形成的,但不明白为什么。我再次指出,具有这些奇怪值的矩阵用于实际对象绘制,它看起来是正确的。有人可以解释这里发生了什么吗?我错过了什么吗?到目前为止,我的问题只有一个解决方案:只是不要尝试从 获取位置rotate
,仅用于显式matrix
和translate
转换。但是这种方法缺乏通用性,无论如何我认为矩阵对于任何转换类型都应该具有合理的值(包括偏移量)。