正常に動作するアプリ用のカスタム 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 です。これは、メモリを節約するために画像のサイズが変更された要因を表します)