首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android ImageView 觸摸坐標轉換為 Bitmap 原圖坐標

     編輯:程式設計綜合問答

核心邏輯

計算顯示區域與原圖的縮放比例,將觸摸點相對 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 等常見縮放類型。
  • 若 ImageView 有 padding,需額外扣除 getPaddingLeft/Top()。
  • Matrix 變換(旋轉、翻轉)情況下需用 imageView.getImageMatrix().invert() 反轉矩陣處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved