我一直在寻找解决这个问题的一天,但没有任何帮助,甚至这里的答案。文档也没有解释任何内容。
我只是试图在另一个物体的方向上进行旋转。问题是位图不是围绕固定点旋转,而是围绕位图(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()
中的值和setRotation()
中的浮点参数无关紧要。有人可以帮助并推动我朝着正确的方向前进吗? :)
答案 0 :(得分:100)
我希望以下代码序列可以帮助您:
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)
这可以解释它对旋转和翻译的作用。
答案 1 :(得分:77)
已修改:优化代码。
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);
答案 2 :(得分:25)
我现在回到这个问题,我们正在最后确定游戏,我只想发布对我有用的东西。
这是旋转矩阵的方法:
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);
所以它是直截了当的,但我觉得很奇怪,我无法通过setRotate
后跟postTranslate
让它工作。也许有人知道为什么这不起作用?现在所有的位图都可以正常旋转,但位图质量不会有一些小的下降:/
无论如何,谢谢你的帮助!
答案 3 :(得分:7)
您还可以使用ImageView
RotateAnimation
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);
答案 4 :(得分:5)
您可以使用以下内容:
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());
答案 5 :(得分:1)
查看Google称为Lunar Lander的样本,船舶图像会动态旋转。
答案 6 :(得分:1)
我使用了这种配置,仍然存在像素化的问题:
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);
答案 7 :(得分:0)
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);