你有关于轮换的问题。我目前正在画布上绘制一些对象。目前这个'对象'只是位图。在计算旋转并将其传递到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
对于应该绘制的每个“东西”都是一样的。这样做的最佳做法是什么?
答案 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()
}