ImageViewの表示領域の取得方法について

1,439 views
Skip to first unread message

henry

unread,
Jan 18, 2012, 2:30:22 AM1/18/12
to 日本Androidの会
お世話になっております。henryと申します。

掲題の件についてご教授いただきたく、投稿させていただきました。
お手数をおかけしますが、ご確認をお願いいたします。
---

レイアウトファイルにImageView(android.widget.ImageView)の領域を
定義し、画像をアプリ上に表示しています。

アプリにて、このImageViewの領域がタッチされた際に固有の実装を
したいのですが、領域の座標を取得する方法がわからず、判定が
できません。

申し訳ありませんが、何か方法が分かる方がいらっしゃいましたら
ご教授いただけませんでしょうか。よろしくお願いいたします。

Makoto Yamazaki

unread,
Jan 18, 2012, 10:57:29 PM1/18/12
to android-g...@googlegroups.com
zaki です。

ImageView を継承した独自クラスを作って onTouchEvent をオーバーライドするか、
ImageView#setOnTouchListener を呼んでリスナを登録すると、タッチの際に
MotionEvent を受け取ることができます。この MotionEvent からタッチした座標を
取得することができます。

APIDemo に、タッチでお絵かきできるプログラムがあります。PaintView をみてください。
View を継承していますが、ImageView でも同じです。
http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.html

↓は私が公開しているコードですが、こちらの方が多少シンプルなので一応リンクをのせておきます。
https://github.com/zaki50/MemoPad/blob/master/src/org/zakky/memopad/PaintView.java#L174

2012/1/18 henry <henry...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>

--
YAMAZAKI Makoto

henry

unread,
Jan 19, 2012, 4:28:21 AM1/19/12
to 日本Androidの会
zaki様

henryです。
早速のご回答ありがとうございました。

なるほど、ImageView を setOnTouchListener で
リスナ登録することができるんですね。。。
(勉強不足で申し訳ないです)

載せていただいたサンプルとともに参考にさせて
いただきます。とてもご丁寧にご説明いただき、
助かりました。

ありがとうございます。

On 1月19日, 午後12:57, Makoto Yamazaki <makoto1...@gmail.com> wrote:
> zaki です。
>
> ImageView を継承した独自クラスを作って onTouchEvent をオーバーライドするか、
> ImageView#setOnTouchListener を呼んでリスナを登録すると、タッチの際に
> MotionEvent を受け取ることができます。この MotionEvent からタッチした座標を
> 取得することができます。
>
> APIDemo に、タッチでお絵かきできるプログラムがあります。PaintView をみてください。
> View を継承していますが、ImageView でも同じです。http://developer.android.com/resources/samples/ApiDemos/src/com/examp...
>
> ↓は私が公開しているコードですが、こちらの方が多少シンプルなので一応リンクをのせておきます。https://github.com/zaki50/MemoPad/blob/master/src/org/zakky/memopad/P...
>
> 2012/1/18 henry <henry42...@gmail.com>:

henry

unread,
Jan 29, 2012, 9:19:38 PM1/29/12
to 日本Androidの会
度々すみません。先日質問出せていただいた者です。

ImageView がタッチされたかどうかを判定するために、
setOnTouchListener で登録する方法をご教授いただいた
のですが、想定と少し違う動きをしています。

原因は ImageView をレイアウト(RelativeLayout) の上に
配置していることだと思われるのですが、
setOnTouchListener による通知が ImageView の領域
だけではなく、レイアウトの領域に反応して通知されます。
(説明不足で申し訳ございません)

そのため、厳密に ImageView の場合のタッチを検出できて
いないのですが、上記動作は仕様なのでしょうか。

こちらで調べたところ、他の方法として以下のAPIが使えそう
に見えたのですが、同様にレイアウトの領域が取れてしまい
ました。
- View.getGlobalVisibleRect(Rect outRect)


申し訳ございませんが、ご教授いただけませんでしょうか。
よろしくお願いいたします。

Makoto Yamazaki

unread,
Jan 30, 2012, 4:36:14 AM1/30/12
to android-g...@googlegroups.com
zaki です。

単純に ImageView が親のViewGroup(今回だと RelativeLayout) と同じ大きさになっていて
表示上 Matrix で画像が小さくなっているだけということではないかと思います。
画像が表示されている領域内だけで操作できるようにしたいのであれば、自分で画像の表示されている
領域を計算してその範囲内で発生しているMotionEventのみに反応するようにするといいのではないでしょうか。

もしくはMatrixによる表示上の変換ではなく、実際にImageView の位置と大きさを
LayoutParam で変更するという方法もあると思います。

2012/1/30 henry <henry...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。

henry

unread,
Jan 31, 2012, 2:42:18 AM1/31/12
to 日本Androidの会
zaki様

質問者です。今回もご回答いただきありがとうございます。

いただいたコメントを見て、レイアウト領域内のImageViewの
サイズを確認したところ、"fill_parent"を指定しており、
ようやく気付きました。。
「Matrixによる表示上の変換」が頭になかったことが原因です。
勉強になりました。

ここで、いただいた対策についてですが、
今回こちらで作成しているアプリが、任意の画像をレイアウト
領域内で最大化して表示する動作を期待していますので、
後者のLayoutParamを設定する方法は難しいようです。

そこで前者ですが、
Matrixによる表示上の変換があることを考慮し、アプリ側で
レイアウトのサイズと読み込んだイメージのサイズから
実際に表示されるサイズを計算する形になるのでしょうか。
(変換後のサイズを取得する方法がないようなので)

とりあえず変換の仕組みから勉強してみようと思います。

立て続けの質問となりましたが、ありがとうございました。
Reply all
Reply to author
Forward
0 new messages