GettingSignals

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

2012年4月27日
Posted by hina

ボタンを押すたびに一定の角度で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)

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

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

Share

Comments are currently closed.

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

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

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

Follow

カレンダー

2024年12月
 1
2345678
9101112131415
16171819202122
23242526272829
3031