2012-05-04 128 views
5

我試圖展示一張圖片,該圖片可以放大和平移,並且可以隨着指南針讀數旋轉。通過下面的代碼,所有這三種行爲都是有用的,但它們相互影響。在Android畫布中同時旋轉,平移和縮放位圖

這裏是我想達到的目標:
1.繞屏幕中心
2.規模而使畫面的相同部分在中心
3.泛在畫面所需位置

這裏是實際上是與下面的代碼發生的事情:
1.旋轉如預期運作,屏幕周圍
2.縮放作品的中心,但它擴展圍繞中心的圖片
3.翻譯只打算如果angle是零,否則它朝着一個錯誤的方向

// the center of the view port 
float centerX = screen.right/2; 
float centerY = screen.bottom/2; 

Matrix m = new Matrix(); 
m.preRotate(angle, centerX, centerY); 
m.preScale(mScaleFactor, mScaleFactor, centerX, centerY); 

// scaling the amount of translation, 
// rotating the translation here gave crazy results 
float x = mPosX/mScaleFactor; 
float y = mPosY/mScaleFactor; 
m.preTranslate(x, y); 

canvas.drawBitmap(pic, m, null); 

如果我翻譯第一,後來旋轉的作品,翻譯作品如預期,但旋轉不在身邊中心視圖端口了。

如何應用所有三種轉換,而不會相互影響?

回答

1

我不確定圍繞圖像中心的縮放比例,但是如果翻譯的方向錯誤,是不是因爲您旋轉圖像而不是翻譯的結果?也許嘗試是這樣的:

float x = (mPosX*(cos(angle) + sin(angle))/mScaleFactor; 
float y = (mPosY*(cos(angle) - sin(angle))/mScaleFactor; 
m.preTranslate(x, y); 

也做矩陣對象有一個方法可以直接套用affine transformation?因爲那樣你就不需要考慮操作的順序。

仿射變換可能是這個樣子:

M = |mScaleFactor*cos(angle)  sin(angle)   x| 
    |  -sin(angle)   mScaleFactor*cos(angle) y| 
    |   0       0    1| 

而是讓你需要首先使用預翻譯()函數像這樣,這將周圍圖像的角旋轉:

Mt.preTranslate(-centerX,-centerY); 

並應用Mt之前應用M,然後在您需要申請之後,圖片-Mt

+0

旋轉翻譯似乎只是抵消旋轉,但我也有這種感覺,這就是我需要d。 Android矩陣是3x3,所以我猜他們已經是仿射變換? – modemuser

+0

那麼也許嘗試直接設置矩陣,而不是使用preRotate,preScale方法?所以你的矩陣應該像 – Dan

+0

以上的帖子中的編輯一樣。使用此矩陣,平移可以工作,但縮放也會旋轉圖片,旋轉也會縮放圖片,旋轉發生在圖片的一角。這就像whac-a-mole,但是感謝你的輸入。 – modemuser

相關問題