2014-09-13 37 views
0

这是我的问题:Android将触摸点转换为图像上的实际位图点

我有一个显示图像的Android应用程序。无论大小如何,图像本身都调整为480 x 640。

用户可以点击图像的多个点。根据用户点击图像的位置,位图本身会应用一些变形。

所以我们假设原始图像是1000 x 2000(使用整数使其更简单)。 将图像加载到ImageView后,它会缩放以在图像视图中正确显示。

这对于不同分辨率的手机来说显然是不同的。

现在,当用户点击不同点时,我最终希望将这些点与位图数据一起传递给我的WCF服务以执行一些图像操作。

所以我的问题是如何获取用户在手机上触摸的点,并将这些点转换为相对于正常未缩放位图的点。

摘要:

位图缩放以适​​合。用户点击100,100。 100,100是相对于缩放图像的点...不是实际的位图本身。我正在寻找关于如何将100,100转换为实际位图上的点的指导。

在此先感谢您提供的任何帮助。

+0

是缩放的图像,以便比例被保留,或只是为了准确地适应480x640盒? – Dave 2014-09-13 04:48:51

+0

嗨Dave ...图像没有缩放。它只是加载到一个典型的ImageView中。 在我将其发送到REST服务之前就已经缩放了。所以最终用户点击了手机上的点数。这些点是相对于ImageView。 在将图像发送到REST服务进行图像处理之前,我使用RATIO PRESERVED将其缩放到480 x 640。 我需要那些点击相对于480 x 640图像进行转换的图像。如果没有意义,道歉。如果你知道我的意思,我试图解释它而不会过度表达。 谢谢 – tronious 2014-09-13 05:14:24

回答

0

确定,所以在Android ImageView的具有FIT_CENTER的默认ScaleType,这样就意味着:

public static final Matrix.ScaleToFit CENTER 

计算一个比例,将保持原来的SRC的纵横比,但 还将确保SRC配合完全在dst内。至少有一个轴 (X或Y)将完全适合。结果集中在dst中。

所以如果你整个图像视图具有480×640,显示的图像,例如你的形象是1000x2000,则:

2000/640 = scaleFactor = 3.125/1 

所以宽度将缩减至320留在任80个像素边空,所以它可以保持纵横比。

//this one will be 80. 
int xBuffer= (imageViewWidth - (realImageWidth*scaleFactor))/2; 
//this one will be zero in your example  
int yBuffer = (imageViewHeight - (realImageHeight*scaleFactor))/2; 


int imageViewX = 0;//x coord where on the image view it was clicked 
int imageViewY = 0;//y coord where on the image view it was clicked 

if (imageViewX < xBuffer || imageViewX > imageViewWidth-xBuffer) 
{ 
    //ignore the click, outside of your image. 
} 
else if (imageViewY < yBuffer || imageViewY > imageViewHeight-yBuffer) 
{ 
    //ignore the click, outside of your image. 
} 
else 
{ 
    realImageY = imageViewY * scaleFactor; 
    realImageX = (imageViewY - 80) * scaleFactor; 
    //save click somehow.. 
    saveClick(realImageX,realImageY); 
} 
+0

戴夫真的很感激答复。我会在wuth上玩耍,看看它是否适合我。如果是这样,我会很快接受你的答案。如果没有,我可能会有几个关于你的答案的其他问题。再次感谢 – tronious 2014-09-13 12:32:57

+0

戴夫非常感谢您的答案。这帮了我很多。 标记 – tronious 2014-09-16 02:35:06