2010-06-25 48 views
0

我發現了一些很好的資源,可以在android中旋轉位圖,而在網絡中也可以。我接近讓我的代碼工作,但顯然我不完全理解Matrix Translations的工作原理。以下是我的精靈類的三個主要功能。在添加東西以促進矩陣旋轉之前,THey工作得很好(即在onDraw中,我只用x,y和矩陣來調用draw)。我寫了一些測試代碼來添加一個精靈,並且將它從0重新旋轉到360並且再次回到0。它導致它像旋轉一些奇怪的點一樣旋轉。在現實中,我希望它只是坐在那裏,旋:在Android中旋轉一個位圖,但沒有視圖的動畫

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.雖然它似乎有我所有的精靈我呼籲在軌道上旋轉圍繞一個點。

回答

1

試試這個:

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

基本上,你需要你的位圖轉換成你想要的第一位置,在此設置,然後將其旋轉圍繞其中心N度。

+0

這似乎並不奏效。如果你在一個矩陣上調用.setTranslate,然後加上.postRotate,你只需要旋轉,即使它不圍繞指定的中心旋轉。對圖像的大小或形狀有任何要求嗎? – 2010-11-29 01:58:39

+0

您可能想要轉換爲objectX-objectRadius,objectY-objectRadius然後執行旋轉。 – 2010-12-01 00:29:35

1

我還沒有在android上工作過,自從我上次使用矩陣後,它已經有一段時間了,但它聽起來像是你正在旋轉工作正常,而你忘記了翻譯,所以點的旋轉是在0,0。如果這實際上是問題所在,那麼你將要做的是轉換精靈,以便它的世界位置是0,0;旋轉精靈;然後將其翻譯回原來的位置。這應該在繪製該幀之前發生,因此翻譯本身將永遠不會被看到。

希望這會有所幫助。

+0

在哪裏可以做到這一點翻譯,這些翻譯座標像素? – Codejoy 2010-06-25 17:18:09

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

+0

哇...夥計........非常感謝......我認爲這是最適合我旋轉的代碼。 – Kalpesh 2012-05-11 11:01:43