計算顯示區域與原圖的縮放比例,將觸摸點相對 ImageView 的偏移量按比例映射回原圖。
public static PointF mapTouchToBitmap(ImageView imageView, MotionEvent event) {
Drawable drawable = imageView.getDrawable();
if (drawable == null) return null;
Rect bounds = drawable.getBounds(); // 可見繪製區域
int intrinsicW = drawable.getIntrinsicWidth();
int intrinsicH = drawable.getIntrinsicHeight();
if (intrinsicW <= 0 || intrinsicH <= 0) return null;
float scaleX = (float) bounds.width() / intrinsicW;
float scaleY = (float) bounds.height() / intrinsicH;
// 觸摸點相對 ImageView 左上角
float touchX = event.getX();
float touchY = event.getY();
// 轉換為相對可見繪製區域左上角
float relX = touchX - bounds.left;
float relY = touchY - bounds.top;
// 映射回原圖坐標
float bitmapX = relX / scaleX;
float bitmapY = relY / scaleY;
return new PointF(bitmapX, bitmapY);
}
imageView.setOnTouchListener((v, event) -> {
if (event.getAction() == MotionEvent.ACTION_UP) {
PointF pt = mapTouchToBitmap((ImageView) v, event);
if (pt != null) {
Log.d("EyePos", "原圖坐標: (" + pt.x + ", " + pt.y + ")");
}
}
return true;
});
ScaleType.FIT_CENTER、FIT_XY、CENTER_INSIDE 等常見縮放類型。getPaddingLeft/Top()。imageView.getImageMatrix().invert() 反轉矩陣處理。