2012-04-27 70 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