2010-11-05 86 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

相关问题