23964


Androidで、タッチを検知しても背後のViewにタッチできるようにできますか？

FrameLayoutでレイアウトAとレイアウトBを重ねて画面いっぱいに表示したとして、  
FrameLayoutをタッチするとAとBどちらもタッチした事にするということです。  
両方にリスナーを付けただけでは、背後のViewがタッチされたことになりません。


CC BY-SA 3.0
2016-04-12T11:56:55.427
23959
2016-04-12T14:37:49.677
13588
question
android
Androidでレイアウトのタッチは検知するが背後のViewもタッチできるようにする


簡易的に実現するのであれば、[View.OnTouchListener](http://developer.android.com/intl/ja/reference/android/view/View.OnTouchListener.html)の場合、`onTouch()`の返り値を`false`にします。

この`boolean`型の返り値は、発生したタッチイベントをリスナが消費したかどうかを意味します。

`true`を返した場合は、タッチイベントは受け取られて処理されたものとみなされて、以降の子ビューなどへはイベントを伝播しなくなります。

`false`を返した場合には、表側のレイアウトの`onTouch()`の処理の後に、裏側にいるレイアウトの`onTouch()`を実行するといったことが可能です。

ただし`onTouch()`で`false`を返したビューへは、それ以降のタッチイベントは届かなくなります。例えば、`ACTION_DOWN`を消費しなかったビューでは、`ACTION_MOVE`や`ACTION_UP`が発生することはありません。

* * *

より厳密に実現するのであれば、「Androidのシステムは、タッチイベントをどのように処理しているのか？」というのを調べると良い気がします。`dispatchTouchEvent()`をカスタマイズすれば期待したものができると思います。

他には、レイアウトAとBの両方を覆うように、不可視のレイアウトCを用意して、レイアウトCのみにタッチイベントのリスナを付けて、受け取ったイベントをレイアウトA・Bへルーティングするという手が考えられます。


CC BY-SA 3.0
2016-04-12T14:37:49.677
23964
2016-04-12T14:37:49.677
5337
23959
answer