如何在Android的ImageView中通过触摸获取图片实际坐标?
解决ImageView触摸坐标转图片实际像素坐标的问题
你现在遇到的问题核心在于ImageView会对图片进行缩放适配自身尺寸,直接通过getX()/getY()拿到的是控件内的相对坐标,需要转换成图片原始分辨率下的真实坐标。结合你使用的fitXY缩放类型,我给你整理了具体的实现方案:
核心思路
- 获取图片的原始宽高(即图片本身的真实分辨率,不是ImageView控件的尺寸)
- 计算图片在ImageView中的缩放比例(分别计算x、y方向的缩放因子)
- 用触摸得到的控件坐标乘以对应缩放比例,得到图片的真实像素坐标
修改后的代码实现
private void addTouchListener(){ ImageView image = findViewById(R.id.result); image.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { ImageView iv = (ImageView) view; Drawable drawable = iv.getDrawable(); if (drawable == null) { // 图片还未加载完成,直接返回 return false; } // 获取图片的原始宽高(真实分辨率) int originalImgWidth = drawable.getIntrinsicWidth(); int originalImgHeight = drawable.getIntrinsicHeight(); // 获取ImageView控件的实际显示宽高(用getMeasured系列方法避免布局未完成的问题) int viewWidth = iv.getMeasuredWidth(); int viewHeight = iv.getMeasuredHeight(); // 计算缩放比例:fitXY模式下图片会被拉伸填满控件,所以x/y方向分别计算 float xScale = (float) originalImgWidth / viewWidth; float yScale = (float) originalImgHeight / viewHeight; // 转换触摸坐标为图片真实坐标 float realX = motionEvent.getX() * xScale; float realY = motionEvent.getY() * yScale; String message = String.format("控件坐标: (%.1f, %.1f) | 图片真实坐标: (%.1f, %.1f)", motionEvent.getX(), motionEvent.getY(), realX, realY); Log.d(MainActivity.DEBUGTAG, message); return false; } }); }
关键细节说明
getIntrinsicWidth()/getIntrinsicHeight():这两个方法能准确获取图片的原始像素尺寸,不受ImageView缩放逻辑影响,拿到的就是图片本身的分辨率。getMeasuredWidth()/getMeasuredHeight():用来获取ImageView实际显示的宽高,比直接用getWidth()更稳妥,能避免布局还未完全渲染时拿到0的异常情况。- 缩放比例计算:因为你设置了
android:scaleType="fitXY",图片会被拉伸至完全填满ImageView,所以x方向的缩放因子是图片原始宽 / 控件宽,y方向同理,触摸坐标乘以这个因子就能还原到图片的真实位置。
如果后续你换成其他缩放类型(比如centerCrop、fitCenter),还需要额外计算图片在控件内的偏移量,但当前fitXY场景下上面的代码完全适用。
内容的提问来源于stack exchange,提问作者gongetout
相关产品推荐
相关产品推荐

