当前位置: 首页 > 知识库问答 >
问题:

如何在Android中围绕图像中心平滑地旋转位图而不产生振荡运动

文国发
2023-03-14

我想根据用户点击将位图图像旋转10度。跟着无数的stackoverflow和google answers,我尝试了矩阵旋转的各种组合。

然而,图像并没有真正像预期的那样旋转,并给出了一个关于画布中心旋转振荡的抖动视图。为了测试,每次调用object的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);

 }

共有3个答案

张博涛
2023-03-14
// 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. 恢复图像
姚新霁
2023-03-14

您需要将位图转换为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处绘制位图中心,那么您可以更改我的代码以在中心绘制它,它将按您的要求工作。

希望这有帮助!

梅庆
2023-03-14

这里有一个例子。我把它分成三步。第一次平移移动位图,使其中心位于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);

作为优化,在此方法之外创建一次矩阵,并用对< code>matrix.reset()的调用来替换创建的矩阵

 类似资料:
  • 到目前为止,我一直在使用 以旋转 OMR 应用程序的图像。结果是一个旋转但模糊的图像。我也怀疑这会围绕其中心旋转图像。如何将特定的像素位置指定为旋转中心?

  • 问题内容: 有没有一种简单的方法可以围绕图片中心旋转图片?我首先使用了AffineTransformOp。看起来很简单,而且需要,并且在一个整洁的Google会话中为矩阵找到正确的参数。所以我认为… 我的结果是这样的: 如果您忽略旋转90度的倍数的情况,这非常简单(sin()和cos()无法正确处理)。该解决方案的问题在于,它围绕图片左上角的(0,0)坐标点进行变换,而不是围绕图片中心进行正常的变

  • 问题内容: 我正在努力围绕其中心绘制旋转的位图,并在不调整位图大小的情况下进行旋转。我正在通过游戏线程将所有子画面绘制到屏幕上,因此我正在寻找一种包含原始位图而不是画布的解决方案。 提前致谢。 到目前为止,这是我的代码,它围绕其中心旋转一个位图,但对其进行了调整。 更新: 我注意到这并不像听起来那么容易。我的旋转代码不是问题。位图旋转,但是dst rect也必须根据旋转角度增加/减少,否则bima

  • 问题内容: 我正在用Java制作2D游戏,玩家可以通过障碍物引导多边形。多边形上下移动,游戏世界向左和向右滚动。我需要多边形绕其中心旋转,但是由于它不断地被平移,所以它绕着点旋转。尝试将其平移回原始中心,旋转并重新平移不起作用。如何获得形状的中心? 这是我在2ms计时器上的运动计算: 这是我的paintComponent方法: 其中(xPos,yPos)是屏幕的中心。 问题答案: 转换(通常)是复

  • OpenGL总是围绕(0,0,0)旋转。但是我需要绕着相机旋转。我知道在GL中,没有相机,但是如果我翻译回(0,0,-6.0),它会绕着(0,0,0)旋转,而不是绕着(0,0,-6.0)旋转 所以我的问题是:如何在opengl和c中设置旋转中心 我已经找到了这篇文章:OpenGL围绕一个点旋转相机 显示此解决方案的地方: 旋转函数通常围绕原点旋转。要围绕另一个点P旋转,必须:平移(-P)旋转平移(

  • 如题所述,我想知道如何围绕中心旋转绘制的矩形。 我目前正在使用以下代码: 现在,旋转发生在2D空间中,但我似乎无法集中矩形的旋转。相反,矩形一直围绕全局点0,0旋转。 我想我的旋转和平移设置不正确或顺序不正确。 我不想是什么阻止此代码产生所需的输出。任何建议和答案将不胜感激。 谢谢