FrameLayoutでImageViewの重ね合わせた際のタッチイベントについて

5,489 views
Skip to first unread message

taku

unread,
Dec 10, 2012, 11:06:31 AM12/10/12
to android-...@googlegroups.com
takuです。

現在、FrameLayoutで2つの独自拡張したImageViewを重ねています。
拡張したビューにはonTouchListnerをセットしており、マルチタッチで画像の移動や縮小が可能となっております。
そこで、上のビューと下のビューに同じ動きをさせたいのです。
(上のビューの画像を右にずらすと、下のビューの画像も右にずれるように)
2つのビュー間でタッチイベントを共有できないのでしょうか?
(今の所、ScalableView内のonTouchEvent()でreturn false;としているのですが、下のビューにイベントが伝わらないのです。)

どうすればよいのか、アドバイスなど、ご教授お願い致します。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<jp.dip.sys1.multitouch.ScalableView android:id="@+id/ImageView01"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:src="@drawable/grandmenu" 
android:focusableInTouchMode="true"
android:focusable="true" android:clickable="true" android:scaleType="matrix"/>
<!-- <jp.dip.sys1.multitouch.ScalableView android:id="@+id/Overray"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:src="@drawable/icon"
    android:focusableInTouchMode="true"
    android:focusable="true" android:clickable="true" android:scaleType="matrix"
    android:alpha="0.5"/> -->
<EditText android:id="@+id/edit"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="80sp"
    android:focusable="true"
    android:focusableInTouchMode="true"/>
</FrameLayout>




taku

unread,
Dec 10, 2012, 11:08:51 AM12/10/12
to android-...@googlegroups.com
takuです。
追記です。
質問としては、この方と似たようなものだと思います。

みなさま、よろしくお願いいたします。

2012年12月11日火曜日 1時06分31秒 UTC+9 taku:

Nishimura Shin

unread,
Dec 10, 2012, 8:19:56 PM12/10/12
to android-...@googlegroups.com
Nishimuraです。

ベストな方法/正しい方法では無いかもしれませんが、
以下の様に一番上に重なっているViewのonTouchEvent中で、
下のViewのonTouchEventを呼ぶと上手くいくかもです。

(※MyTopViewとMyBottomViewが重なっており、それぞれにonTouchListnerをセットしている想定)

public boolean onTouchEvent(MotionEvent event) {    // MyTopViewのonTouchEvent
    MyBottomView.onTouchEvent(event);
    :
}



2012年12月11日火曜日 1時06分31秒 UTC+9 taku:

Keiji Ariyama

unread,
Dec 11, 2012, 1:09:05 AM12/11/12
to android-...@googlegroups.com
有山です。

 onTouchEventで返す値を、

 return false;

 から、

 return super.onTouchEvent(event);

 に変更してみてはいかがでしょうか。
--
Keiji,
ml_an...@c-lis.co.jp

taku

unread,
Dec 11, 2012, 10:16:22 AM12/11/12
to android-...@googlegroups.com
Nishimura 様

ご返信ありがとうございます。
上のビューから下のビューのonTouchEventを呼ぶのですね。
現在、FrameLayoutの上にScalabkeViewとTopScalableViewを設定しております。
【main.xml】
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/frameLayout"

android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<jp.dip.sys1.multitouch.ScalableView android:id="@+id/ImageView01"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:src="@drawable/grandmenu" 
android:focusableInTouchMode="true"
android:focusable="true" android:clickable="true" android:scaleType="matrix"/>
<jp.dip.sys1.multitouch.TopScalableView
    android:id="@+id/TopScalableView"

    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:src="@drawable/icon"
    android:focusableInTouchMode="true"
    android:focusable="true"
    android:clickable="true"
    android:scaleType="matrix"
    android:alpha="0.4"/>
</FrameLayout>

そこで、TopScalableViewのonTouch()メソッド内でScalableViewのonTouch()を呼ぼうとしてるのですが、うまく行きません。
実装すると、「Cannot make a static reference to the non-static method onTouch(View, MotionEvent) from the type ScalableView」というエラーが出ます。
下のビュー(ScalableView)のonTouch()をstaticにしても、ScalableViewでエラーがでてしまいます。
 【TopScalableView.java】
@Override
public boolean onTouch(View v, MotionEvent event) {
   ScalableView.onTouch(v,event);

そこで、上のビューから下のビューのインスタンスを取得したいのですが、何か方法はあるでしょうか?
ちなみに、
ScalableVIew sv = (ScalableView)findViewById(R.id.ImageView01); 
としたら エラーが出ました。



2012年12月11日火曜日 10時19分56秒 UTC+9 Nishimura Shin:

taku

unread,
Dec 11, 2012, 10:19:35 AM12/11/12
to android-...@googlegroups.com
有山 様

ご返信ありがとうございます。
super.onTouchEvent(event)はもう既に試していましたが、うまく行きませんでした。
質問時に追記しておけばよかったです、すいません。
他に何か方法はあるでしょうか?

2012年12月11日火曜日 15時09分05秒 UTC+9 C-LIS Keiji Ariyama:

Nishimura Shin

unread,
Dec 11, 2012, 9:28:24 PM12/11/12
to android-...@googlegroups.com
taku様

クラスのメンバ変数にすれば上のビューから下のビューの
インスタンスにアクセスできるかと思います。

しかし申し訳ないのですが、私が提示した方法は、
>上のビューと下のビューに同じ動きをさせたいのです。
が実現できないことに気づきました。
(下のビューには流れるが上のビューの処理は一度で止まる)

考えられる別の方法ですが、
ActivityにView.OnTouchListenerをimplementsして、
onTouch()中で二つのビューに対して同じ処理する、といった方法でいけるかもしれません。


2012年12月12日水曜日 0時16分22秒 UTC+9 taku:

Makoto Yamazaki

unread,
Dec 11, 2012, 10:02:25 PM12/11/12
to android-...@googlegroups.com
zaki です。

以前、一つの Activity の中に配置された 2つの View に対して、
片方をswipe すると両方の View が連動して中身の表示を更新
するようなコードを書いたことがあります。その際は、Activity の
onCreate() で以下の様な感じで swipe を拾いたい View に対して
OnTouchListener をセットして、自身ともう一つの onTouchEvent(...)
を呼ぶようにして動かしました。

view1 = (MyView1) findViewById(R.id.view1);
view2 = (MyView2) findViewById(R.id.view2);
view1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
view2.onTouchEvent(event);
view1.onTouchEvent(event);
return true;
}
});

このようにするとこで、MyView1 クラス、 MyView2 クラスの onTouchEvent(...) が
それぞれの処理を実行することができます。
これがベストな方法かはわかりませんが、うまく動いていたと思います。


2012/12/12 taku <t.fuji...@gmail.com>:
> --
> このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-sdk-japan/-/bqdNaK4mDvwJ
> にアクセスしてください。
>
> このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja
> からこのグループにアクセスしてください。



--
YAMAZAKI Makoto

taku

unread,
Dec 13, 2012, 5:13:54 AM12/13/12
to android-...@googlegroups.com
Nishimura 様、zaki 様

takuです。
返信が遅くなりすみません。

お教えの通り、Activityでイベントを広い、2つのビューに対して処理を行うことでできました。
zaki様コード通り、2つのビューにはリスナーをimplementsして、Activityから呼び出すことで操作可能となりました。

みなさまのおかげで解決できました。
ありがとうございます!!
Reply all
Reply to author
Forward
0 new messages