You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ImageView矩阵模式下缩放平移时绘图坐标校正问题求助

解决Matrix模式下触摸坐标转图片原始坐标的问题

当ImageView使用Matrix进行缩放和平移后,触摸事件的坐标是相对于ImageView的屏幕显示区域的,要映射到图片的原始像素坐标,必须使用当前Matrix的逆矩阵进行转换——因为Matrix本身是将图片原始坐标映射到屏幕显示坐标,逆矩阵则可以反向将屏幕坐标转换为图片原始坐标。

具体实现步骤:

  • 首先获取当前ImageView正在使用的变换Matrix,创建它的逆矩阵。
  • 将触摸事件的坐标(相对于ImageView)传入逆矩阵的mapPoints方法,得到转换后的图片原始坐标。
  • 使用转换后的坐标进行标记绘制,就能保证位置准确。

针对你的代码修改:

首先在ACTION_DOWN中替换坐标获取逻辑,直接转换为图片原始坐标:

if (event.getAction() == MotionEvent.ACTION_DOWN) {
    then = System.currentTimeMillis();
    // 转换触摸坐标到图片原始坐标
    float[] touchPoint = new float[]{event.getX(), event.getY()};
    Matrix inverseMatrix = new Matrix();
    if (matrix.invert(inverseMatrix)) {
        inverseMatrix.mapPoints(touchPoint);
        cx = touchPoint[0];
        cy = touchPoint[1];
    }
}

然后在ACTION_UP的绘制逻辑中,直接使用转换后的坐标(注意要操作原始图片Bitmap,而非getDrawingCache返回的显示截图):

// 假设你保存了原始图片Bitmap对象为originalBitmap
Canvas canvas = new Canvas(originalBitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

if (queensselected) {
    queencount++;
    countQueen.setText(String.valueOf(queencount));
    paint.setColor(Color.YELLOW);
    // 直接用转换后的cx、cy,对应原始图片的像素位置
    canvas.drawCircle(cx, cy, 10, paint);
    imgGallery.setImageBitmap(originalBitmap);
}
// Worker、Brut分支同理修改

关键细节:

  • 调用matrix.invert(inverseMatrix)时要判断返回值,确保矩阵可求逆(避免缩放为0等异常场景)。
  • 不要用getDrawingCache获取Bitmap,它是经过Matrix变换后的显示区域截图,尺寸和原始图片不匹配,直接操作原始Bitmap才能保证标记位置永久准确。

内容的提问来源于stack exchange,提问作者Jan Stutz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:55:41