在android中关于没有动画视图的点旋转位图

时间:2010-06-25 15:45:20

标签: android bitmap rotation

我在这里找到了一些用于在android中旋转位图的好资源,而且还有网络。我接近让我的代码工作但显然我不完全理解Matrix Translations如何工作。以下是我的精灵类中的三个主要功能。在我添加东西以促进矩阵旋转之前,它工作得很好(即在onDraw中我只用x,y和无矩阵调用绘图)。我写了一些测试代码来添加一个精灵,然后将它从0旋转到360并再次反复返回0。它导致它像绕轨道旋转一样奇怪。实际上我希望它只是坐在那里旋转:

public void Rotate_Sprite(int transform, int deg)
    {
        int spriteCenterX = x+(width/2);
                int spriteCenterY = y+(height/2);
        mMatrix.setRotate(deg, spriteCenterX, spriteCenterY);
        }

public void Draw_Sprite(Canvas c) { 
//c.drawBitmap(images[curr_frame], x, y, null); //this worked great esp in move sprite
    c.drawBitmap(images[curr_frame], mMatrix, null);
}

public void Create_Sprite(blah blah) {

    ...
    ...
    mMatrix = new Matrix();
    mMatrix.reset();
}

public int Move_Sprite() {
    //with the matrix stuff, I assume I need a translate.  But it does't work right 
    //for me at all.
    int lastx=this.x;
    int lasty=this.y;
    this.x+=this.vx;
    this.y+=this.vy;
    mMatrix.postTranslate(lastX-x,lastY-y); //doesn't work at all
}

我确实发现了这个 J2me like reference here.虽然它似乎有我所有的精灵,我称之为围绕一点旋转。

3 个答案:

答案 0 :(得分:1)

我还没有在android上工作过,自从我上次使用矩阵以来已经有一段时间了,但听起来你旋转工作正常并且你只是忘了翻译所以旋转的点是0 ,0。你想要做的事情,如果这实际上是问题是翻译精灵,使它的世界位置是0,0;旋转精灵;然后将它翻译回以前的任何地方。这应该在绘制该帧之前发生,因此翻译本身永远不会被看到。

希望这有帮助。

答案 1 :(得分:1)

试试这个:

mMatrix.setTranslate(objectX,objectY);
mMatrix.postRotate(Degrees, objectXcenter, objectYcenter);

基本上,您需要先将位图转换为您想要的位置,然后将其设置在那里,然后围绕其中心旋转N Degrees。

答案 2 :(得分:1)

对于任何发现这一点且正在尝试做同样事情的人:

我正在旋转我的图像:

//create all your canvases and bitmaps and get sizes first
Bitmap minBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.minute);
minCanvas..setBitmap(minBitmap);
int height = min.getHeight();
int width = min.getWidth();
//Bitmap minBitmap = Bitmap(width, height, Bitmap.Config.ARGB_8888); //not using in example


//The basically applies the commands to the source bitmap and creates a new bitmpa.  Check the order of width and height, mine was a square.
minMatrix.setRotate(minDegrees, width/2, height/2);
Bitmap newMin = Bitmap.createBitmap(minBitmap, 0, 0, (int) width, (int) height, minMatrix, true);

//apply this to a canvas.  the reason for this is that rotating an image using Matrix changes the size of the image and this will trim it and center it based on new demensions.
minCanvas2.drawBitmap(newMin, width/2 - newMin.getWidth()/2, height/2 - newMin.getHeight()/2, null);

//Then you can use it the way you want, but I create a bitmap from the canvas
minCanvas2.setBitmap(minBitmap);

我没有运行此代码,这是在查看我实际运行的代码时输入的。

HTH