3

最初にSurfaceViewを含み、次に、さまざまなButtonsとTextViewsを含むRelativeLayoutを含むFrameLayoutがあります。

SurfaceViewのキャンバス上に多数のビットマップを描画しており、タッチイベントとモーションイベントを介して、ユーザーがそれらをドラッグできるようにしています。

これらのビットマップは、ドラッグすると、RelativeLayout内にあるボタンなどの下を通過します。

さて、SurfaceViewの「Zレベル」、またはそれを通過するものはすべて、レイアウトの他の部分の実際のZレベルとはまったく関係がないことを理解しているのは、私の(おそらく誤っている)ことです。これは本当ですか?もしそうなら、ドラッグされたビットマップが他のビューの上に描画されるように、どうすればそれを回避できますか?または、他にどのような方法でフルスクリーンキャンバスを実装しても、ボタンなどをオーバーレイのコントロールのように機能させることはできません。

私が実際に必要としているのはアンダーレイだと思います。アンダーレイでは、タッチイベントを下のボタンなどで拾うことができます。しかし、これを実現する方法がわかりません。キャンバスを再描画するときに、背景も再描画する必要があるためです。

FrameLayout内のRelativeLayoutとSurfaceViewの順序を入れ替えて、Canvasの背景を透明にすることはできますか?もしそうなら、どのように?タッチイベントは引き続き下のボタンに「フォールスルー」しますか?

私と一緒にいてくれてありがとう、私は少しワッフルだと知っています。

4

2 に答える 2

2

SurfaceView はそのようには機能しません。

SurfaceView には、「ビュー」部分と「サーフェス」部分の 2 つの部分があります。「ビュー」部分は、他のビュー要素と一緒にレイアウトされ、ビュー レイヤーに合成される透明な穴です。「表面」部分は完全に別のレイヤーであり、「ビュー」部分に合わせて配置およびスケーリングされ、アプリではなくシステム コンポジターによって合成されます。

SurfaceView が最初に作成されたときに「表面」レイヤーの Z オーダーを制御できますが、すべてのビュー要素の上または下になります。ビューは完全に独立したレイヤーであるため、一部のビューの上や下に移動することはできません。「表面」レイヤーは入力イベントをキャッチしないため、( 経由で) 一番上に配置SurfaceView#setZOrderOnTop()しても入力フォーカスには影響しません。

API 14 以降では、よりビューに適した方法で動作する TextureView を使用できます。

編集:詳細については、より長い説明を参照してください。

于 2014-04-17T23:16:23.697 に答える
0

もう少し明確にできますか?あなたのSurfaceViewには背景が割り当てられていますか? そうでない場合は、単にピースをドラッグするだけの場合は、AbsoluteView を使用することもできます。背景がない場合は、ビュー全体を RelativeView の上に配置し、さまざまなボタンなどをビューの上に描画するだけで、ドラッグ可能で他のすべての上に残ることができます。

于 2011-01-12T14:06:30.133 に答える