2010-11-05 89 views
2

我想通過鼠標單擊來檢測模擬器上的手勢事件,應該如何工作?我嘗試過雙擊(我期望生成一個onDoubleTap),單擊(我希望生成一個onSingleTapConfirmed),拖動(希望生成一個onScroll),但是這些都會產生相同的三個事件: onDown,onShowPress,onLongPress。在Android上,手勢事件在模擬器上工作嗎?

是否有一種特殊的方式,鼠標點擊/拖動必須在模擬器上產生手勢事件?或者是有什麼毛病下面的代碼,我使用的檢測事件:

public class GestureEnabledImageView extends ImageView implements OnGestureListener, OnDoubleTapListener 
{ 
    private GestureDetector gestureScanner; 

    public GestureEnabledImageView(Context context) 
    { 
     super(context); 
     gestureScanner = new GestureDetector(this); 
     gestureScanner.setOnDoubleTapListener(this); 
    } 

    public GestureEnabledImageView(Context context, AttributeSet atts) 
    { 
     super(context, atts); 
     gestureScanner = new GestureDetector(this); 
     gestureScanner.setOnDoubleTapListener(this); 
    } 

    public GestureEnabledImageView(Context context, AttributeSet atts, int style) 
    { 
     super(context, atts, style); 
     gestureScanner = new GestureDetector(this); 
     gestureScanner.setOnDoubleTapListener(this); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent me) 
    { 
     return gestureScanner.onTouchEvent(me); 
    } 

    @Override 
    public boolean onDown(MotionEvent e) 
    { 
     log("onDown: " + e.getRawX() + ", " +e.getRawY()); 
     return false; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     log("onFling: " + e1.getX() + ", " + e1.getY() + " -- " + e2.getX() + ", " + e2.getY() + " -- " + velocityX + " -- " + velocityY); 
     return false; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) 
    { 
     log("onLongPress: " + e.getRawX() + ", " +e.getRawY()); 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
    { 
     log("onScroll: " + e1.getX() + ", " + e1.getY() + " -- " + e2.getX() + ", " + e2.getY() + " -- " + distanceX + " -- " + distanceY); 
     return false; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) 
    { 
     // TODO Auto-generated method stub 
     log("onShowPress: " + e.getRawX() + ", " +e.getRawY()); 
     System.out.println(); 

    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) 
    { 
     log("onSingleTapUp: " + e.getRawX() + ", " +e.getRawY()); 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean onDoubleTap(MotionEvent e) 
    { 
     log("onDoubleTap: " + e.getRawX() + ", " +e.getRawY()); 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean onDoubleTapEvent(MotionEvent e) 
    { 
     log("onDoubleTapEvent: " + e.getRawX() + ", " +e.getRawY()); 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) 
    { 
     log("onSingleTapConfirmed: " + e.getRawX() + ", " +e.getRawY()); 
     // TODO Auto-generated method stub 
     return false; 
    } 

    private void log(String text) 
    { 
     Log.i("MyInfo", text); 
    } 
} 

回答

4

好了,找到了解決辦法,只是想在這裏張貼任何人有類似的問題:

的gestureListener方法應該返回「真」,而不是「假」。這是令人驚訝的,因爲文檔聲明返回「true」表示該事件已被消耗,我認爲這會讓更多的MotionEvent不被觸發。但是,顯然沒有...

0

對不起,這麼晚了答案:) 從here

報價無論你是否使用GestureDetector.OnGestureListener,這是實現一個onDown()方法的最佳實踐,它返回真正。這是因爲所有手勢都以onDown()消息開始。如果您從onDown()返回false,則默認情況下,由於GestureDetector.SimpleOnGestureListener會執行此操作,因此係統會假定您要忽略手勢的其餘部分,並且GestureDetector.OnGestureListener的其他方法始終不會被調用。這可能會導致您的應用程序出現意外問題。你應該從onDown()返回false的唯一時間是如果你真的想忽略整個手勢。

所以,答案很簡單:你只需執行onDown()返回true

相關問題