当手指向上移动时,Android onTouchListener会停止接收事件

时间:2011-09-05 09:19:17

标签: android ontouchevent ontouchlistener

我有一个自定义视图,在我的活动中为其分配了以下OnTouchListener:

private OnTouchListener MyOnTouchListener = new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        System.out.println("onTouch called.");
        System.out.println("x" + event.getX() + ", y: " + event.getY());
        return true;
    }
};

这会按预期在日志中注册和显示事件,直到用户将手指向上或向下移动超过几个像素。在此之后,在用户移除并重新应用他们的手指之前,不会将任何触摸事件传递给侦听器。但是,使用adb shell getevent表示仍在生成事件。可以在http://pastebin.com/7EBM2X4V找到带注释的LogCat输出示例。

问题不在于手指超出视图范围。

有谁知道我为什么会有这种行为?

3 个答案:

答案 0 :(得分:1)

事实证明,问题是视图包含在ScrollView中。删除ScrollView可以解决问题。

答案 1 :(得分:1)

这可能是旧的,但它仍会出现在搜索结果中。 可以通过执行以下操作来阻止ScrollView拦截触摸事件:

private OnTouchListener MyOnTouchListener = new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction()==MotionEvent.ACTION_DOWN){
//our touch handling began, request the scrollview not to interact
scrollView.requestDisallowInterceptTouchEvent(true);
           System.out.println("Down");          
           System.out.println("x" + event.getX() + ", y: " + event.getY());
        }else if(event.getAction()==MotionEvent.ACTION_MOVE){
           System.out.println("Move");          
           System.out.println("x" + event.getX() + ", y: " + event.getY());
        }else if(event.getAction()==MotionEvent.ACTION_UP){
//re-enable it after we're done (finger goes up)
scrollView.requestDisallowInterceptTouchEvent(true);
           System.out.println("up");          
           System.out.println("x" + event.getX() + ", y: " + event.getY());
        }

        return true;
    }
};

答案 2 :(得分:0)

你必须在onTouch中指定事件,例如向下,向上或向上,你必须这样做。

private OnTouchListener MyOnTouchListener = new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction()==MotionEvent.ACTION_DOWN){
           System.out.println("Down");          
           System.out.println("x" + event.getX() + ", y: " + event.getY());
        }else if(event.getAction()==MotionEvent.ACTION_MOVE){
           System.out.println("Move");          
           System.out.println("x" + event.getX() + ", y: " + event.getY());
        }else if(event.getAction()==MotionEvent.ACTION_UP){
           System.out.println("up");          
           System.out.println("x" + event.getX() + ", y: " + event.getY());
        }

        return true;
    }
};