2012-05-02 55 views
1

我在framelayout中有2個canvas視圖,就像堆棧一樣。Framelayout,與其他視圖下的視圖進行交互

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

兩幅畫布佔據整個區域,下面的畫布完全被畫布上方覆蓋。 兩個畫布都是透明的,所以用戶可以看到畫布(如果他們有任何內容)。

我讓用戶使用觸摸交互在上部畫布上繪圖。

如何禁用上層畫布的觸摸偵聽器,以便用戶現在將在畫布下方繪製,但上方的畫布仍然可見。 Upper Canvas只是不與用戶的觸摸輸入交互。相反,較低的畫布正在互動。

我正在測試這與按鈕,而不是畫布,只有上部按鈕響應點擊事件。通過擴展,對於畫布視圖也是如此。

我想我需要某種類型的dispatchTouchEvent()方法。目前它也沒有工作,或者我錯誤地使用它。

回答

2

只需將觸摸事件傳遞到底層畫布。

例如:

canvas.setOnTouchListner(new View.OnTouchListener(){ 

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

是的,發生在我身上,但沒有任何其他方式。我只想禁用上方視圖的任何輸入。和所有觸摸事件直接通過查看下面。 –

2

觸摸事件向下級聯視圖樹,直到觸摸監聽器返回true

由於一個畫布總是「在另一個畫布下」,所以將頂層畫布設置爲底層的子畫面是有意義的。這意味着底層必須是某種自定義的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將觸摸移動到父視圖。你也不*有*返回true。如果用戶不管觸摸哪個視圖,都可以執行操作,然後返回false以保持觸摸的連續性。 – DeeV

相關問題