2012-09-16 19 views
4

我有一個覆蓋整個屏幕(比如說ParentView)的視圖,以及僅覆蓋它的一部分的子內部視圖ChildView。 我想讓ChildView迴應onSingleTapUp(),而ParentView迴應onFling()。我試圖通過在ChildView上附加一個SimpleOnGestureListenerParentView上的一個SimpleOnGestureListener來實現。如何在內部視圖上接受onSingleTapUp(),同時在外部視圖上接受onFling()?

要從ChildView接受onSingleTapUp(),其收聽者的onDown()必須返回true。 但是一旦我這麼做,綁定到ParentView的聽衆不會再聽到任何動作事件,因爲它是由ChildView的聽衆取得的。即使ChildViewonFling()返回false,這些事件也不會流向ParentView的偵聽器。

我怎樣才能讓父視圖的偵聽器趕上扔手勢,而子視圖的偵聽器抓住輕按手勢?

我不認爲任何需要的源代碼,以說明情況,但這裏是設置了我ChildView監聽片段。

ChildView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     return singleTapGestureDetector.onTouchEvent(motionEvent); 
    } 
}); 

一個解決辦法可能是同時擁有ParentViewChildView的偵聽器來處理onFling()而只有ChildView的監聽器處理onSingleTapUp(),但在這種情況下,一扔就無法跨越ChildView發生(如我相信,在孩子的外面開始,然後在孩子的內部結束)。

回答

2

我不喜歡我的解決方案,但我找到了一種方法來做到這一點。希望其他人能在未來發布更好的答案,或者至少我的解決方法對其他人有用。

正如我在問題中所描述的,問題在於手勢監聽器的工作方式。對於要查看onSingleTapUp()事件的子視圖,您將在onDown()上返回true。但是一旦你這樣做了,即使你的子視圖的onTouch()聲明它不再對事件感興趣,後續系列事件也不會進入父視圖。如果在手勢檢測器的手勢檢測器返回false時,強制呼叫子女onTouch()內的父母onTouch(),則會調用父母的onFling(),但第一個MouseEvent參數將爲NULL,因爲子視圖的onTouch()已使用該參數。

我必須缺少一些東西,因爲這看起來非常基本的手勢檢測方案。無論如何,我找不到合理的方式來做到這一點。

所以,我的解決方法是使TouchListenerService作爲一個單例。

兩個子視圖和父視圖這一行

view.setOnTouchListener(TouchListenerService.Instance()); 

和TouchListenerService開始是這樣的:

public class TouchListenerService 
    extends GestureDetector.SimpleOnGestureListener 
    implements View.OnTouchListener { 

    // some code to implement singleton 

    public SingleTapUpHandler SingleTapUpHandler; 
    public FlingHandler FlingHandler; 

    private View _touchingView; 

    GestureDetector gestureDetector; 

    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if (gestureDetector == null) 
      gestureDetector = new GestureDetector(_touchListenerService); 

     _touchingView = view; 
     boolean result = gestureDetector.onTouchEvent(motionEvent); 
     _touchingView = null; 
     return result; 
    } 
    // and some more code 

既然是同一個事件處理程序,父視圖成功捕獲onFling()事件而子視圖可以設置SingleTapUpHandler來處理點擊事件。

+0

這對我來說工作得很好,我嘗試了其他方法,但沒有工作,就像使用FrameLayout - 同樣的問題。接受這個答案 - 希望這將有助於其他人在未來,或其他人會注意到更好的方式來做到這一點。 – kennethc

+0

需要幫助來實現這個http://stackoverflow.com/a/21036823/2380114 –

相關問題