2

スタックのように、フレームレイアウトに 2 つのキャンバス ビューが重ねられています。

<Framelayout>
      <Canvas />    // Canvas underneath
      <Canvas />    // Canvas available to user for interaction.
</Framelayout>

両方のキャンバスが全領域を占め、下のキャンバスはキャンバスのアッパーで完全に覆われています。どちらのキャンバスも透明なので、ユーザーは両方のキャンバスを見ることができます (コンテンツがある場合)。

タッチ操作を使用して、ユーザーが上部のキャンバスに描画できるようにします。

ユーザーが下のキャンバスに描画できるように、上部キャンバスのタッチリスナーを無効にするにはどうすればよいですか?ただし、上部キャンバスは引き続き表示されます。アッパー キャンバスは、ユーザーによるタッチ入力と対話していません。代わりに、下のキャンバスが相互作用しています。

キャンバスではなくボタンでこれをテストしています。クリックイベントに応答するのは上のボタンだけです。ひいては、キャンバス ビューの場合も同じです。

メソッドのようなタイプの dispatchTouchEvent() が必要だと思います。現在、それも機能していないか、間違って使用している可能性があります。

4

2 に答える 2

2

touch イベントを基になるキャンバスに渡すだけです。

例えば:

canvas.setOnTouchListner(new View.OnTouchListener(){

onTouch(View view, MotionEvent event) 
    {       
        canvasUnder.onTouch(event);
    }
});
于 2012-05-02T13:44:08.257 に答える
2

タッチ イベントは、タッチ リスナーが戻るまで、ビュー ツリーをカスケードしますtrue

1 つのキャンバスは常に別のキャンバスの下にあるため、トップ レベルのキャンバスをボトム レベルの子にすることは理にかなっています。これは、最下層が何らかのカスタム ViewGroup でなければならないことを意味します。

いずれにせよ、トップ レベルのキャンバスでタッチ イベントを処理したくない場合は、トップ キャンバスに対して次のようにします。

@Override
public void onTouch(View view, MotionEvent event) {
   if(touchHandled())
      return true;
   else
      return false;
}

次に、下部のキャンバスで何かを行います。

@Override
public void onTouch(View view, MotionEvent event) {
   handleBottomLevelTouchEvent()
}
于 2012-05-02T13:51:29.567 に答える