2012-04-27 74 views
0

嗨旋轉有問題。我目前在畫布上繪製幾個對象。目前這個「對象」只是位圖。在計算旋轉並將其傳遞給Matrix後,我不得不創建一個新的位圖來旋轉它。一個小片段將clearify這樣的:旋轉'可以在畫布上繪製的東西'

public void onDraw(Canvas canvas){ 
    mMatrix = new Matrix(); 
    mMatrix.postRotate(getRotation()); 
    Bitmap rotateBmp = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), mMatrix, true); 
    canvas.drawBitmap(rotateBmp, mCoords.x -(mBitmap.getWidth()/2), mCoords.y - (mBitmap.getHeight()/2), null); 
    rotateBmp.recycle(); 
} 

我所能做的,以節省內存在rotateBmp調用循環,它會正常運行的大部分時間。讓我們假設我有10個位圖'對象'我想旋轉。這意味着我必須保留十個Bitmaps作爲「示例」,並在每個繪製週期中創建十個新的位圖以及一個額外的新矩陣(沒有找到「重置」它的方法)。這聽起來很奇怪。有沒有另外一種方法,可以在飛行中創建'可以在畫布上繪製的東西'(無XML),同時保持旋轉的控制。任何想法都非常受歡迎。如果它的View,Drawable或其他CustomClass無關緊要。也許重要的是getRotation對於每一個應該繪製的「東西」都是一樣的。最佳做法是什麼?

回答

1

隨着@Jason羅賓遜的大力幫助和how To Rotate Text in Canvas我想出一個辦法,我怎麼能做到這一點旋轉Canvas。這裏是一個小片段,將工作:

Bitmap mBitmap = getResources()... 
int xPositionOfBitmap 
int yPositionOfBitmap 
public void onDraw(Canvas canvas) { 
    int bitmapCenterX = xPositionOfBitmap + (mBitmap.getWidth()/2) 
    int bitmapCenterY = yPositionOfBitmap + (mBitmap.getHeight()/2) 
    canvas.save() 
    canvas.rotate(getRotation(),bitmapCenterX, bitmapCenterY) 
    canvas.drawBitmap(mBitmap, xPositionOfBitmap, yPositionOfBitmap) 
    canvas.restore() 
} 
1

可以使用canvas.rotate(float degrees)

public void onDraw(Canvas canvas) { 
    canvas.drawBitmap(mBitmap, mCoords.x -(mBitmap.getWidth()/2), mCoords.y - (mBitmap.getHeight()/2), null); 
    canvas.rotate(getRotation()); 
} 
+0

這不會讓我的位圖的位置。他們跑「出來的畫面」,如果我改變了getRotation'的'結果...讓我們假設:我在(0,0)處繪製位圖,然後將畫布旋轉-90度:我的位圖將被推出屏幕 – 2012-04-30 08:35:42

+1

這是因爲旋轉的錨點是左上角的點(0,0 )。如果您想要在圖像的中心錨定一個旋轉,您必須發佈翻譯畫布以模擬作爲錨點的中心。不幸的是,我在幾何學上很糟糕,所以我不確定你需要應用的算法,但這是你需要做的。 – 2012-04-30 08:38:58