7

我想根据用户点击将位图图像旋转 10 度。在众多 stackoverflow 和 google 回答之后,我尝试了矩阵旋转的各种组合。

然而,图像并没有像预期的那样真正旋转,并且给出了旋转 + 围绕画布中心振荡的抖动视图。为了测试,每次调用对象的 draw 方法时,我都会将旋转角度增加 10 度(而不是点击)。图像是一个对称的圆形 [64x64 封闭矩形],我希望它像轮子一样在屏幕中心围绕它自己的中心旋转,但它会旋转并沿对角线向右下方移动,然后以振荡方式回到屏幕中心.

 public void draw(Canvas canvas) {
    Matrix matrix = new Matrix();

    rotation += 10;
    float px = this.viewWidth/2;
    float py = this.viewHeight/2;
    matrix.setRotate(rotation, bitmap.getWidth()/2, bitmap.getHeight()/2);
    Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, getImgWidth(), getImgHeight(), matrix, true);
    canvas.drawBitmap(newbmp, px - (getImgWidth()/2), py - (getImgHeight()/2), null);

 }
4

3 回答 3

19

这是一个例子。我把它分成了3个步骤。第一个平移移动位图,使其中心位于 0,0 然后旋转,最后将位图中心移动到画布上您想要的位置。您不需要第二个位图。

Matrix matrix = new Matrix();
rotation += 10;
float px = this.viewWidth/2;
float py = this.viewHeight/2;
matrix.postTranslate(-bitmap.getWidth()/2, -bitmap.getHeight()/2);
matrix.postRotate(rotation);
matrix.postTranslate(px, py);
canvas.drawBitmap(bitmap, matrix, null);

作为优化,在此方法之外创建一次 Matrix 并将创建替换为调用 matrix.reset()

于 2012-11-15T16:38:39.463 回答
0

您需要将位图转换为 0,0 点(或在 0,0 处绘制)并将其旋转到那里,然后将其转换回来,如下所示:

canvas.save();
    canvas.translate(this.viewWidth, this.viewHeight);
    canvas.rotate(rotation);
    canvas.drawBitmap(newbmp, -(getImgWidth()/2), -(getImgHeight()/2), null);
canvas.restore();

在这里,我以 0,0(我认为)的中心绘制它,因为当您旋转时,它大约是 0,0,而不是人们想象的屏幕中心。如果您在 0,0 处绘制中心,那么它将围绕位图的中心旋转。

如果我的代码没有完成在 0,0 处绘制位图中心,那么您可以更改我的代码以在中心处绘制它,它将按您的意愿工作。

希望这可以帮助!

于 2012-11-15T14:16:18.207 回答
0
// x : x coordinate of image position
// y : y coordinate of image position
// w : width of canvas
// h : height of canvas
canvas.save();
canvas.rotate(angle, x + (w/2), y + (h/2));
canvas.drawBitmap(image, x, y, null);
canvas.restore();

步骤是

  1. 保存现有画布
  2. 围绕位图的中心旋转画布,您将使用旋转角度在画布上绘制
  3. 绘制图像
  4. 恢复图像
于 2017-12-27T14:39:08.737 回答