2012-05-30 71 views
3

我有一個帶有GestureDetector和擴展SimpleOnGestureListener的GLSurfaceView。我需要能夠通過快速點擊來在表面視圖中選擇多個項目。因爲onSingleTapConfirmed太慢了,所以我忽略了onSingleTapUp以快速檢測觸摸。現在的問題是,如果表面視圖上的兩個項目彼此靠近並且用戶快速點擊另一個,然後對第一個項目調用onSingleTapUp方法,但對第二個項目不調用onSingleTapUp方法。第二個調用onDoubleTap方法,不管它是否被覆蓋。禁用雙擊或檢測第二個水龍頭位置

爲了解決這個問題,我試圖簡單地不重寫onDoubleTap方法,我也試圖在重寫的onDoubleTap中不做任何事情,並返回false。既不能解決問題。 onSingleTapUp方法仍不會被第二次點擊調用。

我決定嘗試檢測onDoubleTap方法中的第二次敲擊並從那裏選擇項目。與此相關的問題是從onDoubleTap返回的動作事件包含「雙擊的第一個水龍頭的向下運動事件」。 - http://developer.android.com/reference/android/view/GestureDetector.OnDoubleTapListener.html

有什麼辦法可以禁用雙擊,改變雙擊時間,所以它永遠不會開火,將雙擊半徑改變爲非常小的東西,或者獲得onDoubleTap方法中的第一個水龍頭位置?

這裏是我的SimpleOnGestureListener:

public class ViewGestureListener extends 
    GestureDetector.SimpleOnGestureListener { 

    private ViewRenderer renderer; 
    private GLSurfaceView surfaceView; 

    public ViewGestureListener(GLSurfaceView surfaceView, 
     ViewRenderer renderer) { 
     this.renderer = renderer; 
     this.surfaceView = surfaceView; 
    } 

    // Pan 
    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
     float distanceY) { 
     renderer.pan(distanceX, distanceY); 
     surfaceView.requestRender(); 
     return true; 
    } 

    // Double touch and release 
    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     // Note: e.getX() doesn't return the second tap's location! 
     renderer.singleTouch(e.getX(), e.getY()); 
     surfaceView.requestRender(); 
     return true; 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     renderer.singleTouch(e.getX(), e.getY()); 
     surfaceView.requestRender(); 
     return true; 
    } 
} 

謝謝, 馬特

回答

2

我可能來得太遲,以幫助這個帖子的作者,但我只是遇到了同樣的問題,所以這裏的答案其他人在想這件事。

答:

您需要重寫下面的方法,它會爲您提供向下,移動和向上的第二次敲擊的事件:

onDoubleTapEvent(MotionEvent五)

如果您想要第二次點擊的UP運動,則:

onDoubleTapEvent(MotionEvent e) { 
     if(e.getAction() != MotionEvent.ACTION_UP) { 
       return false; // Don't do anything for other actions 
     } 


     // YOUR CODE HERE 

     return true; 
} 

祝你好運! /卡洛斯

1

它沒有很好的記錄,但爲了忽略雙擊,並將其檢測爲兩個單獨的水龍頭,它足以將null設置爲雙擊偵聽器。

GestureDetector gd = new GestureDetector(context, gestureListener); 
gd.setOnDoubleTapListener(null); 

同時適用於GestureDetectorGestureDetectorCompat