7

ユーザーのクリックに基づいてビットマップ画像を 10 度回転させたい。多数のスタックオーバーフローとグーグルの回答に続いて、マトリックスローテーションのさまざまな組み合わせを試しました。

ただし、画像は実際には期待どおりに回転せず、キャンバスの中心を中心とした回転と振動のぎくしゃくしたビューを提供します。テストするために、オブジェクトの 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 になるようにビットマップを移動します。次に回転し、最後にビットマップの中心をキャンバス上の必要な場所に移動します。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 を作成し、その作成を次の呼び出しに置き換えます。 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 に答える