2012-05-02 9 views
1

私は2つのキャンバスビューをスタックのようにフレームごとに並べて表示しています。Framelayout、他のビューの下にあるビューとのやりとり

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

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

タッチインタラクションを使用して上のキャンバスに描画させることができます。そのユーザが今の下にキャンバス上に描画されますが、上部のキャンバスは、まだ目に見えるよう

はどのようにして、上のキャンバスのためのタッチリスナーを無効にすることができます。上のキャンバスは、ユーザーがタッチ入力とやりとりしていないだけです。代わりに、下のキャンバスが相互作用しています。

私の代わりにキャンバスの、唯一の上ボタンがイベントをクリックして応答している、ボタンでこれをテストしています。同じようにキャンバス・ビューの場合も同様です。

は、私は方法のようなdispatchTouchEvent()のいくつかの種類が必要だと思います。現在、それも動作していない、または多分私はそれを間違って使用しています。

答えて

2

タッチイベントを基になるキャンバスに渡すだけです。例えば

canvas.setOnTouchListner(new View.OnTouchListener(){ 

onTouch(View view, MotionEvent event) 
    {  
     canvasUnder.onTouch(event); 
    } 
}); 
+0

うん、。上のビューの入力を無効にしたいだけです。すべてのタッチイベントを直接下に見ることができます。 –

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() 
} 
+0

touchHandled()とは何ですか? –

+0

それはあなたが私にしたいどのような方法でもあります。ユーザーがViewに触れたときにアクションを実行するはずです。ユーザーのタッチ操作がビューが探していたものではないと判断された場合は、親ビューにタッチを移動するためにfalseを返します。あなたはまた、真実を返す*を持っていません。ユーザーがビューに何も触れていない場合は、アクションを実行してから、falseを返してタッチを続行します。 – DeeV

関連する問題