2014-09-13 56 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