我为我的应用程序编写了一个自定义 ImageView (Android),效果很好。出于多种目的,我需要将视图坐标(例如单击的坐标)映射到图像坐标(单击发生在图像中的位置),因为图像可以缩放和滚动。到目前为止,以下方法似乎工作正常:
private PointF viewPointToImgPointF(PointF viewPoint) {
final float[] coords = new float[] { viewPoint.x, viewPoint.y };
Matrix matrix = new Matrix();
getImageMatrix().invert(matrix);
matrix.mapPoints(coords); // --> PointF in image as scaled originally
if (coords != null && coords.length > 1) {
return new PointF(coords[0] * inSampleSize,coords[1] * inSampleSize);
} else {
return null;
}
}
private PointF imgPointToViewPointF(PointF imgPoint) {
final float[] coords = new float[] { imgPoint.x / inSampleSize, imgPoint.y / inSampleSize };
getImageMatrix().mapPoints(coords);
if (coords != null && coords.length > 1) {
return new PointF(coords[0], coords[1]);
} else {
return null;
}
}
在大多数情况下,我可以毫无问题地使用这些方法,但现在我注意到它们并非 100% 准确,因为我尝试了以下方法:
PointF a = new PointF(100,100);
PointF b = imgPointToViewPointF(a);
PointF a2 = viewPointToImgPointF(b);
PointF b2 = imgPointToViewPointF(a2);
PointF a3 = viewPointToImgPointF(b2);
并得到这些值:
a: Point(100, 100)
b: Point(56, 569)
a2: Point(99, 99)
b2: Point(55, 568)
a3: Point(97, 97)
如果一切正常,所有 a- 值和所有 b- 值应该保持不变。
我还发现,这种微小的差异正在向图像中心减小。如果 (100, 100) 是图像的中心,那么这些方法将提供正确的结果!
有没有人经历过类似的事情,甚至可能有解决方案?还是我做错了什么?
(对于我测试的图像,inSampleSize == 1。它表示图像已调整大小以节省内存的因素)