2011-03-13 45 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 +宽度)不小于....请帮助我 –