【问题标题】:Android onTouchListener stops receiving events when finger is moved up当手指向上移动时,Android onTouchListener 停止接收事件
【发布时间】:2011-09-05 09:19:16
【问题描述】:

我有一个自定义视图,在我的活动中分配了以下 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 输出示例。

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

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

【问题讨论】:

    标签: android touch-event ontouchlistener


    【解决方案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】:

    原来问题在于视图包含在 ScrollView 中。删除 ScrollView 可以解决问题。

    【讨论】:

      【解决方案3】:

      您必须在 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;
          }
      };
      

      【讨论】:

      • 不,你没有。即使我把它改成那样,它仍然不能正常工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2020-05-08
      • 1970-01-01
      相关资源
      最近更新 更多