2011-03-13 73 views
0

我正在製作Android遊戲,需要旋轉圖片。當我旋轉它顯然它的尺寸變化。例如,當它旋轉45度時(它是方形的,但我希望這可以用於任何矩形,所以它是更通用的解決方案),它的寬度和高度就成爲對角線的長度,比對角線長。在一些代數之後,你可以計算出比例因子是sqrt(2)。但我知道旋轉位圖的唯一方法是使用矩陣。例:圖像在旋轉時更改大小。我該如何阻止?

matrix.postRotate(degrees); 
rotated = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true); 

使用該方法的位圖的大小保持恆定,從而在圖像必須收縮的含量適合經旋轉的圖像。這導致我的問題。

我現在應該工作,但運行時不能。可能是因爲它過於複雜,從來沒有少,那就是:

 float totalRotated = 0; 

public void rotate(float degrees){ 
    if(mBitmap != null){ 
     float increment = (float)((mBitmap.getWidth()/45.0)*(Math.sqrt(2)-1)); 
     totalRotated += degrees; 
     totalRotated -= (float)((int)totalRotated/360)*360; 
     matrix.reset(); 
     matrix.setRotate(totalRotated); 
     rotated = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true); 
     rotated = Bitmap.createScaledBitmap(rotated, (int)(mBitmap.getWidth()+(((Math.abs(Math.abs(((int)totalRotated%90)-45)-45)))*increment)), (int)(mBitmap.getHeight()+(((Math.abs(Math.abs(((int)totalRotated%90)-45)-45)))*increment)), true); 
    } 
} 

使用Log.d功能,我能夠確定的是,在最後的聲明中設定的尺寸是什麼,我希望他們都能但圖像沒有按」 t改變大小。由於這甚至不起作用,我需要更好的方法來做到這一點或解決方法。另外我的方法只適用於正方形。那麼,我該怎麼做?

編輯: 我的方法確實有效,我只是沒有打電話setBounds()雖然這不是唯一的方法,但效率非常低。

+0

請澄清你的問題是什麼。我不知道。 – Gabe

回答

1

目前還不清楚你在找什麼,所以這裏有一個基於你的函數,它試圖計算新位圖的合適寬度和高度,並通過創建一個位圖來完成旋轉。

float totalRotated = 0; 

public void rotate(float degrees){ 
    if(mBitmap != null){ 
     // compute the absolute rotation 
     totalRotated = (totalRotated + degrees) % 360; 
     // precompute some trig functions 
     double radians = Math.toRadians(totalRotated); 
     double sin = Math.abs(Math.sin(radians)); 
     double cos = Math.abs(Math.cos(radians)); 
     // figure out total width and height of new bitmap 
     int newWidth = mBitmap.getWidth() * cos + mBitmap.getHeight() * sin; 
     int newHeight = mBitmap.getWidth() * sin + mBitmap.getHeight() * cos; 
     // set up matrix 
     matrix.reset(); 
     matrix.setRotate(totalRotated); 
     // create new bitmap by rotating mBitmap 
     rotated = Bitmap.createBitmap(mBitmap, 0, 0, 
             newWidth, newHeight, matrix, true); 
    } 
} 
+1

雖然你的計算複雜得多,可能更正確。因爲如果第一個整數加上第三個整數(x + width)不小於或等於您作爲參數傳遞的位圖的寬度,createBitmap方法將拋出非法參數異常。如果你這樣做,異常將被拋出。我現在知道我必須糾正的是邊界矩形。所以我只是爲它添加了一行,並使用了你的計算。現在我所要做的就是正確的縮放創建的偏移量。哪個不應該太難。 – Fsmv

+0

@Fsmv:您可能只需要一個'matrix.postTranslate((newWidth - mBitmap.getWidth())/ 2,(newHeight - mBitmap.getHeight())/ 2);' – Gabe

+0

我嘗試了ur代碼, :非法參數異常(x +寬度)不小於....請幫助我 –