ImageViewに表示している画像の中心座標・倍率の求め方

1,889 views
Skip to first unread message

Ryousuke Kouda

unread,
Jul 4, 2013, 9:28:32 AM7/4/13
to android-g...@googlegroups.com
皆様のお知恵をお貸しください。

現在、画像を編集してプリントするアプリを作成しています。
このアプリでは画像の回転、拡大/縮小、移動などができます。

その際、画像のMatrixを取得して操作しています。
Matrixについてですが、座標や倍率が取得できるのですが、
この倍率は画像を回転させることでなぜか変わってしまいます。
そのため、常に拡大/縮小する度に倍率を蓄積して保持しています。
それでも精密に確認すると正確な倍率が保持できていません。

また、Matrixで取得できる座標は画像の左上の頂点の座標が取れます。
この座標と倍率から画像の中心点の座標を算出し、回転や拡大/縮小の中心点としています。
この座標は画像を回転させた場合、常にその時の左上の頂点ではなく、同じ一点が画像と共に回転していきます。
これも最初に中心点を算出し、画像の移動による移動量を常に保持して使用しています。
しかし、これも編集を繰り返していくと微妙にズレが出てきます。

お知恵をお借りしたいのはこの倍率と中心座標の取得方法です。
ImageViewから表示している画像の現在の表示倍率と画像の中心座標の取得方法はないでしょうか?

いずれも保持する精度を高めればいいのですが、
イベント処理の中で正確な値が取れた方がリスクを減らせると思い質問させていただきました。


お手数おかけしますが、よろしくお願いいたします。

Yohsuke Nakano

unread,
Jul 5, 2013, 1:21:48 AM7/5/13
to android-g...@googlegroups.com
どうも、中野と申します。

Matrixから座標などを取得する方法は、あまりお勧めできないように思います。

一般的には座標(Translation)、回転(Rotation)、拡大縮小(Scale)を、必要で
あれば回転用中心座標、拡大縮小用中心座標を保持しておいて、随時Matrix
を生成して、適用するのがロジックとしては適切かと思います。

それらの値をどのような順番で掛けたかでMatrixの値が変わってくるので、それ
を把握しておいてInverseしない限りは正確な元の値は出ないと思います。
逆に掛けているロジックが分かれば、それほど難しくもないと思いますが。

また、Androidの多くはMatrixを固定小数点で扱ったりもしているので、いったん
浮動小数点か倍精度小数点などを使って取得してみるだけでも、精緻な値が
取得できるやもしれません。

よろしくお願いします。

2013年7月4日木曜日 22時28分32秒 UTC+9 Ryousuke Kouda:

kacodama

unread,
Jul 5, 2013, 4:35:53 AM7/5/13
to android-g...@googlegroups.com
3Dプログラミングをやっていたときの考え方ですが、まず、Matrixから値を取り出すというのは、
座標要素以外ではオススメできません。というかしないのが普通です。
Matrixから回転量を完全に復元することはほぼ不可能だからです。
2次元でのZ軸のみでの回転だけなら何とかならなくも無いですが、スケーリング(拡縮)が入ると
やはり複雑になってしまいます。

なので、
・アンカー座標(基本的には中心座標)
・X,Y,Z各軸の回転角度
・倍率
をそれぞれ別に自分が保持し、それらを掛け合わせたMatrixを毎フレーム作成して、
描画するオブジェクトに適用する、という流れにするのが通常です。
つまり、計算した値に描画を合わせるのです。

>このアプリでは画像の回転、拡大/縮小、移動などができます。

この段階で、「回転、拡大/縮小、移動」の個別情報を算出しているところがあるはずなので、
それを保持していけば良いように思えますが。


2013年7月4日木曜日 22時28分32秒 UTC+9 Ryousuke Kouda:
皆様のお知恵をお貸しください。

Ryousuke Kouda

unread,
Jul 5, 2013, 10:14:05 AM7/5/13
to android-g...@googlegroups.com
中野様
kacodama様
日本アンドロイドの会の皆様

ご回答ありがとうございました。
やはり座標等の取得にMatrixは使わないものなのですね。

現状で独自に値を保持するロジックが構築できており、
これまでのテストでは正確に保存されているので、
このままこの造りで進めていきます。

勉強になりました。
ありがとうございました。


2013年7月5日 17:35 kacodama <le.s....@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

Reply all
Reply to author
Forward
0 new messages