プロが教えるわが家の防犯対策術!

CANVASに画像を表示し、その画像を回転させるようにしたいのですが、どうにもうまくいかなくて困っています。

画像の中心を軸に回転させたいと思って以下のように実装してみたのですが、うまくいきません。

//////////////////////////////以下抜粋////////////////////////////////
Matrix matrix;

// Bitmap のサイズの取得
int width = bmp.getWidth();
int height = bmp.getHeight();

matrix = new Matrix();

// 画像の中心を軸に回転させるようにする(ここがうまくいっていないっぽい・・・)
matrix.postRotate(5.0f, width / 2.0f, height / 2.0f);

// 回転させた画像を生成する
bmp2 = Bitmap.createBitmap(bmp, 0, 0, width, height, matrix, true);

// CANVASに画像を描画する
canvas.drawBitmap(bmp2 , 10.0f, 10.0f, paint);

//////////////////////////////////////////////////////////////////////

上記のコードで画像自体は回転するのですが、中心軸がずれてしまっているようです。

画像のサイズは横15ピクセル、縦15ピクセルとなっております。

また、matrix.postRotateの前でmatrix.postTranslate()にて軸を設定してみたのですが、
これもうまくいきませんでした。

きれいに画像を回転させるにはどのようにすればよいか、わかる方いましたら教えて
いただけないでしょうか?

A 回答 (2件)

その方式ならちゃんと中心で回ってますが、


表示される位置が変わるってことになります。
つまり元のは100px辺の正方形だったとしても
bmp2にクリエイトビットマップされるときにはbmp2は幅100ではなくなってるんです。
45度にかたむけたとしたら100px正方の対角線の長さに画像の大きさが大きくなってしまい。
そのbmp2の描くポジションが同じ数値位置にとどめアニメなどするとぎったんばっこんすることになります。
なので、そのbmp2をクロップし100px幅のに収めるか、(図によっては角が切れます)。
もしくは、角度変えた都度都度表示位置をずらし修正してやります。
bmp2のgetWidth()と元bmpのgetWidth()の差の半分でトランスレート位置を計算し反映させれば真ん中でキレイに廻ってるように見せられるでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!!

言われみて気付きました。確かにそうですね。
画像を回転させると画像のサイズが大きくなってしまいますね!

解決しました、ありがとうございました!

お礼日時:2011/04/20 17:52

ちなみにbmp2のトランスレートてのは、そのマトリクスにするんでなく


キャンバスにドロウするときのx.y位置を都度都度ずらしたればいいという事になります
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!