Android:如何旋转中心点上的位图

我一直在寻找一个解决这个问题的一天,但没有什么帮助,甚至在这里的答案。 文档也没有解释任何东西。

我只是试图在另一个对象的方向旋转。 问题是位图不是围绕固定点旋转,而是绕着位图(0,0)旋转。

这是我遇到的代码:

Matrix mtx = new Matrix(); mtx.reset(); mtx.preTranslate(-centerX, -centerY); mtx.setRotate((float)direction, -centerX, -centerY); mtx.postTranslate(pivotX, pivotY); Bitmap rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0, spriteWidth, spriteHeight, mtx, true); this.bitmap = rotatedBMP; 

奇怪的是,我怎么改变pre / postTranslate()的值和postTranslate()的float参数setRotation() 。 有人可以帮忙,把我推向正确的方向吗? 🙂

我希望下面的代码序列可以帮助你:

 Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, config); Canvas canvas = new Canvas(targetBitmap); Matrix matrix = new Matrix(); matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2); canvas.drawBitmap(source, matrix, new Paint()); 

如果您从~frameworks\base\graphics\java\android\graphics\Bitmap.java检查以下方法

 public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) 

这将解释它与旋转和翻译。

编辑 :优化的代码。

 public static Bitmap RotateBitmap(Bitmap source, float angle) { Matrix matrix = new Matrix(); matrix.postRotate(angle); return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); } 

从资源获取位图:

 Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.your_img); 

我现在回到了这个问题,我们正在最后确定的游戏,我只是想发布什么对我有用。

这是旋转matrix的方法:

 this.matrix.reset(); this.matrix.setTranslate(this.floatXpos, this.floatYpos); this.matrix.postRotate((float)this.direction, this.getCenterX(), this.getCenterY()); 

this.getCenterX()基本上是位图X位置+位图宽度/ 2)

以及绘制位图的方法(通过RenderManager类调用):

canvas.drawBitmap(this.bitmap, this.matrix, null);

所以它是pretty直接,但我觉得很奇怪,我不能让它通过setRotate后跟postTranslate 。 也许有人知道为什么这不起作用? 现在所有的位图都可以正常旋转,但是位图质量并不会有小的下降:

无论如何,感谢您的帮助!

您也可以使用RotateAnimation旋转ImageView

 RotateAnimation rotateAnimation = new RotateAnimation(from, to, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotateAnimation.setInterpolator(new LinearInterpolator()); rotateAnimation.setDuration(ANIMATION_DURATION); rotateAnimation.setFillAfter(true); imageView.startAnimation(rotateAnimation); 

你可以使用如下的东西:

 Matrix matrix = new Matrix(); matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2); RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight()); matrix.mapRect(rectF); Bitmap targetBitmap = Bitmap.createBitmap(rectF.width(), rectF.height(), config); Canvas canvas = new Canvas(targetBitmap); canvas.drawBitmap(source, matrix, new Paint()); 

看看谷歌的样本叫做Lunar Lander,船上的图像是dynamic旋转的。

Lunar Lander代码示例

我使用这种configuration,仍然有像素化的问题:

 Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.map_pin); Bitmap targetBitmap = Bitmap.createBitmap((bmpOriginal.getWidth()), (bmpOriginal.getHeight()), Bitmap.Config.ARGB_8888); Paint p = new Paint(); p.setAntiAlias(true); Matrix matrix = new Matrix(); matrix.setRotate((float) lock.getDirection(),(float) (bmpOriginal.getWidth()/2), (float)(bmpOriginal.getHeight()/2)); RectF rectF = new RectF(0, 0, bmpOriginal.getWidth(), bmpOriginal.getHeight()); matrix.mapRect(rectF); targetBitmap = Bitmap.createBitmap((int)rectF.width(), (int)rectF.height(), Bitmap.Config.ARGB_8888); Canvas tempCanvas = new Canvas(targetBitmap); tempCanvas.drawBitmap(bmpOriginal, matrix, p); 
 matrix.reset(); matrix.setTranslate( anchor.x, anchor.y ); matrix.postRotate((float) rotation , 0,0); matrix.postTranslate(positionOfAnchor.x, positionOfAnchor.x); c.drawBitmap(bitmap, matrix, null);