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
相关产品推荐
相关产品推荐

