2012年4月27日金曜日

[Android]Matrix でView を45度ずつ回転する方法

ボタンを押すたびに一定の角度でViewを回転させたかったので、その方法です。

Viewの移動、拡大縮小、回転はMatrixを使って実装するのが簡単です。

Matrixについてはここでは説明しません。

当初、
Matrix matrix = imageView.getImageMatrix();
でmatrixを取得して、
postRotate(45, centerX, centerY)で回転できると思ってた訳ですが、
ボタン押すと45度ずつ回転してくれません。
45度だったり、180度だったりしたのです。

RotateメソッドにはpreRotate() / setRotate() / postRotate()の3種類あるのですが、
意味理解していなかったです。

こちらのサイトの説明が分かりやすかったです。
あおいろ日記:android.graphics.Matrixの動作
http://blog.nagatsuki-do.net/archives/2012/01/androidgraphicsmatrix.php


それを踏まえた上で試してみました。
preRotate() ・・・現象変わらず。
setRotate() ・・・期待通りに回転。だけど、画像縮小、移動が初期化される。
postRotate()・・・現象変わらず。

そもそも現在のMatrixから角度を取得しないと +45度みたいなことができない訳で。
sin / cosとか使えば計算できるんだろうけど、数学苦手なので別案考えました。


[別案]
新しくMatrix作成します。
作成したMatrixに角度(45)を設定します。
Matrix newMatrix = new Matrix();
newMatrix.setRotate(45,  centerX, centerY);

それをViewのMatrixと合体します。
matrix.preConcat(newMatrix)  // ★preにしましょう

合体したMatrixをViewに設定します。
view.setImageMatrix(matrix)


これでボタン押して
画像の拡大縮小、移動状態を維持したまま、
回転することができました。



えっ? 写真がないと分かりづらい??

1 件のコメント:

  1. preConcatってなに?っという疑問にばしっときた検索結果が出てこなかったので助かりました。ありがとうございます。

    preConcatは直訳で(事前連結)で
    すでに、マトリックス変形をされているものを壊さないように前側に連結する方法。って認識でいいんですかね。

    返信削除