在我的應用程序中,我需要讓用戶檢查一些照片的眼睛。 在OnTouchListener.onTouch(...)我得到了ImageView的座標。如何將圖像視圖的座標轉換爲位圖的座標?
如何將此座標轉換爲被觸摸的位圖上的點?
在我的應用程序中,我需要讓用戶檢查一些照片的眼睛。 在OnTouchListener.onTouch(...)我得到了ImageView的座標。如何將圖像視圖的座標轉換爲位圖的座標?
如何將此座標轉換爲被觸摸的位圖上的點?
好了,所以我還沒有試過,但給它一點心思,這裏就是我有一個建議:
ImageView imageView = (ImageView)findViewById(R.id.imageview);
Drawable drawable = imageView.getDrawable();
Rect imageBounds = drawable.getBounds();
//original height and width of the bitmap
int intrinsicHeight = drawable.getIntrinsicHeight();
int intrinsicWidth = drawable.getIntrinsicWidth();
//height and width of the visible (scaled) image
int scaledHeight = imageBounds.height();
int scaledWidth = imageBounds.width();
//Find the ratio of the original image to the scaled image
//Should normally be equal unless a disproportionate scaling
//(e.g. fitXY) is used.
float heightRatio = intrinsicHeight/scaledHeight;
float widthRatio = intrinsicWidth/scaledWidth;
//do whatever magic to get your touch point
//MotionEvent event;
//get the distance from the left and top of the image bounds
int scaledImageOffsetX = event.getX() - imageBounds.left;
int scaledImageOffsetY = event.getY() - imageBounds.top;
//scale these distances according to the ratio of your scaling
//For example, if the original image is 1.5x the size of the scaled
//image, and your offset is (10, 20), your original image offset
//values should be (15, 30).
int originalImageOffsetX = scaledImageOffsetX * widthRatio;
int originalImageOffsetY = scaledImageOffsetY * heightRatio;
給這個想法一試,看看它是否適合您。
除了考慮由於填充引起的偏移(邊距是佈局的一部分,它是視圖外部的空間並且不需要考慮),如果縮放圖像,則可以縮放圖像矩陣(ImageView.getImageMatrix()
)座標。
編輯: 你可以得到的x/y縮放因子和平移量得到的值數組,並使用相應的指數常數:
float[] values;
matrix.getValues(values);
float xScale = values[Matrix.MSCALE_X];
注意,翻譯不包括填充,你仍然有分開考慮。當存在一些「空白」空間時,翻譯用於FIT_CENTER縮放。
爲了增加kcoppock的答案,我只想補充一點:
//original height and width of the bitmap
int intrinsicHeight = drawable.getIntrinsicHeight();
int intrinsicWidth = drawable.getIntrinsicWidth();
可能返回你不期待一個答案。這些值取決於您從中加載圖像的可繪製文件夾的dpi。例如,如果從/ drawable vs/drawable-hdpi vs/drawable-ldpi加載圖像,則可能會得到不同的值。
這對我的作品至少有API 10+:
final float[] getPointerCoords(ImageView view, MotionEvent e)
{
final int index = e.getActionIndex();
final float[] coords = new float[] { e.getX(index), e.getY(index) };
Matrix matrix = new Matrix();
view.getImageMatrix().invert(matrix);
matrix.postTranslate(view.getScrollX(), view.getScrollY());
matrix.mapPoints(coords);
return coords;
}
獲取地板寬度和高度
float floorWidth = floorImage.getWidth();
float floorHeight = floorImage.getHeight();
計算protionate值
float proportionateWidth = bitmapWidth/floorWidth;
float proportionateHeight = bitmapHeight/floorHeight;
你X &Ÿ
float x = 315;
float y = 119;
多用PropotionateValue
x = x * proportionateWidth;
y = y * proportionateHeight;
http://stackoverflow.com/a/3152172/755804 – 18446744073709551615 2016-02-06 03:25:43