2012-11-15 18 views
7

ユーザークリックに基づいてビットマップイメージを10度回転します。数多くのstackoverflowとgoogleの回答に続いて、Matrix rotationのさまざまな組み合わせを試みました。Androidでビットマップを回転させずにスムーズにイメージセンターを回転させる方法

しかし、イメージは実際には期待どおりに回転せず、キャンバスの中心については回転+振動のジッタがあります。テストするには、オブジェクトの描画メソッドが呼び出されるたびに回転角を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); 

} 

答えて

18

ここは例です。 私はそれを3つのステップに分けた。 最初のtranslateは、ビットマップの中心が0, になるようにビットマップを移動します。次に、回転、 を作成し、最後にキャンバス上でビットマップの中心を移動します。 2番目のビットマップは必要ありません。

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.reset()

+2

ありがとう! Matrixを「描画」メソッドから移動し、マトリックスがリセットされないことを保証することで、これを実現しました。[滑らかな回転効果をもたらします]また、最初の2つのポスト*メソッドの代わりに、 'matrix.setRotate(rotation、bitmap.getWidth()/ 2、bitmap.getHeight()/ 2); – Anshul

+0

この回答をありがとう。それは私の日を節約する。 – Siddharth

+0

このビューはここにありますか? –

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でビットマップの中心を描くことができない場合は、コードを中央に描画するように変更することができます。

希望すると便利です。

+0

:(復元画像

  • を描画します。上記の方法は事態を悪化させた。現在、私の車輪は右下隅にあり、右下隅を揺らしながら残りの背景とオブジェクトはそのまま「見える」ようになります。 canvas.translateは単にホイールの中心を移動します – Anshul

  • +0

    これは実際には、ビューの寸法の代わりに 'getImgWidth()/ 2'と' getImgHeight()/ 2'を翻訳すると機能します。 –

    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. は画像
    関連する問題