2011-02-08 117 views

回答

30

好了,所以我還沒有試過,但給它一點心思,這裏就是我有一個建議:

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; 

給這個想法一試,看看它是否適合您。

0

我想說,你可能需要用佈局中的任何填充或邊距來抵消ImageView的座標,以獲得BitMap的正確座標。

+0

的主要問題是,位圖可縮放 – alekz 2011-02-08 13:45:32

+0

@alekz你知道縮放值?如果是這樣,你也可以考慮這一點。 – dbryson 2011-02-08 13:51:31

1

除了考慮由於填充引起的偏移(邊距是佈局的一部分,它是視圖外部的空間並且不需要考慮),如果縮放圖像,則可以縮放圖像矩陣(ImageView.getImageMatrix())座標。

編輯: 你可以得到的x/y縮放因子和平移量得到的值數組,並使用相應的指數常數:

float[] values; 
matrix.getValues(values); 

float xScale = values[Matrix.MSCALE_X]; 

注意,翻譯不包括填充,你仍然有分開考慮。當存在一些「空白」空間時,翻譯用於FIT_CENTER縮放。

+0

感謝您的回答。 但是我如何在我的場景中使用矩陣? `matrix.mapPoints()`將位圖點轉換爲ImageView的點。 目前我已經將ImageViews縮放類型設置爲「FitXY」並使用類似下面的內容:`xCoord =(xCoord/imagView.getWidth())* bitmap.getWidth();` – alekz 2011-02-08 14:46:01

+0

@alekz編輯答案。我不擅長矩陣代數,所以實際上我不知道翻譯價值是否在縮放單位或不... – bigstones 2011-02-08 15:32:54

0

爲了增加kcoppock的答案,我只想補充一點:

//original height and width of the bitmap 
int intrinsicHeight = drawable.getIntrinsicHeight(); 
int intrinsicWidth = drawable.getIntrinsicWidth(); 

可能返回你不期待一個答案。這些值取決於您從中加載圖像的可繪製文件夾的dpi。例如,如果從/ drawable vs/drawable-hdpi vs/drawable-ldpi加載圖像,則可能會得到不同的值。

33

這對我的作品至少有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; 
} 

0

獲取地板寬度和高度

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; 
相關問題