在Android Canvas上旋转位图

14

我有一些对象,我将它们作为SurfaceView的一部分绘制到Canvas上。我想通过程序实现对它们进行旋转,例如myParticle.setRotation(90); 这是我目前绘制粒子的简化代码:

public class Particle {

  public void draw(Canvas canvas){
    image.setBounds((int)(xPos), (int)(yPos), (int)(xPos+radius), (int)(yPos+radius));
    image.draw(canvas);
  }

}
2个回答

60

对我来说,这样做似乎更清晰:

Matrix rotator = new Matrix();

// rotate around (0,0)
rotator.postRotate(90);

// or, rotate around x,y
// NOTE: coords in bitmap-space!
int xRotate = ...
int yRotate = ...
rotator.postRotate(90, xRotate, yRotate);

// to set the position in canvas where the bitmap should be drawn to;
// NOTE: coords in canvas-space!
int xTranslate = ...
int yTranslate = ...
rotator.postTranslate(xTranslate, yTranslate);

canvas.drawBitmap(bitmap, rotator, paint);

用这种方法,画布保持原来的方向,您可以使用矩阵进行更多的操作,例如平移、缩放等,矩阵的内容封装了您的操作的真正含义。

编辑: Eddie 想知道旋转发生在哪个点周围。

编辑: AndrewOrobator 想知道如何设置画布的目标坐标。


4
你如何使用这种方法指定位置的X和Y值? - Eddie
@Eddie:你所说的“how do you specify”是什么意思? - Bondax
1
@AndrewOrobator "... x 和 y 应该是多少 ... ": 好的,旋转时的 x 和 y 坐标位于位图空间中,并定义了位图内的旋转点。如果您想在绘制时设置位置,则必须添加 postTranslate(x1,y1),其中 x1、y1 位于画布空间中。我将编辑我的帖子。 - Bondax
3
实际上,这是这个问题的答案。被接受的答案解释了如何旋转画布,而不是如何在Android画布上旋转位图。 - Tiago Espinha
2
我可以在绘制多个位图时重复使用这个矩阵对象吗,只要每次调用postRotate+postTranslate即可? - Dor
显示剩余3条评论

5

您只需调用

canvas.rotate(90) :) // 90 是度数。


2
然后执行canvas.rotate(0)! - fredley
4
canvas.save()和canvas.restore()更加高效。 - methodin
17
但是它会旋转画布上的所有对象,我只想旋转其中一个对象。实际上它们是动画图像,在线程中被调用。 - AZ_
这是旧的问题,但让我来回答一下。如果您采用此方法,则旋转的是画布而不是图片。因此,在绘制位图之前进行canvas.save,绘制完成后进行canvas.restore,将恢复画布到旧位置。您可以将其应用于单个位图,通过存储位图列表并仅在找到要绘制的位图索引时使用循环应用旋转。 - Mubashir Murtaza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接