旋转'可以在画布上绘制的东西'

时间:2012-04-27 15:55:23

标签: android matrix bitmap rotation drawable

你有关于轮换的问题。我目前正在画布上绘制一些对象。目前这个'对象'只是位图。在计算旋转并将其传递到Matrix内部之后,我不得不创建一个新的Bitmap来旋转它。一个小片段将清除这一点:

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上调用recycle,它会在大部分时间正常运行。让我们假设我有10个Bitmap'对象'我想要旋转。这意味着我必须将十个位图保留为“样本”并在每个绘制周期中创建十个新的位图以及另外一个新的矩阵(没有找到“重置”它的方法)。这对我来说听起来很奇怪。还有另一种方法,即在动态创建“可以在画布上绘制的东西”(无XML),同时保持对旋转的控制。任何想法都非常受欢迎。如果它的View,Drawable或其他CustomClass无关紧要。也许重要的是getRotation对于应该绘制的每个“东西”都是一样的。这样做的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用Canvas

轮换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());
}

答案 1 :(得分:1)

在@Jason Robinson和how To Rotate Text in 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()
}