【问题标题】:How to get the Touch position in android?如何在android中获得触摸位置?
【发布时间】:2011-03-29 10:53:01
【问题描述】:

我需要在android中获取屏幕的触摸开始位置(X,Y),触摸移动位置和触摸结束位置。

【问题讨论】:

    标签: android


    【解决方案1】:
    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        int x = (int)event.getX();
        int y = (int)event.getY();
    
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
        }
    
        return false;
    }
    

    这三种情况是为了让您可以对不同类型的事件做出反应,在此示例中再次点击或拖动或抬起手指。

    【讨论】:

    • 为什么返回false?
    • true 的返回值意味着触摸事件已被处理,这将阻止事件传播,反之亦然。
    【解决方案2】:

    补充答案

    给定一个OnTouchListener

    private View.OnTouchListener handleTouch = new View.OnTouchListener() {
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
    
            int x = (int) event.getX();
            int y = (int) event.getY();
    
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    Log.i("TAG", "touched down");
                    break;
                case MotionEvent.ACTION_MOVE:
                    Log.i("TAG", "moving: (" + x + ", " + y + ")");
                    break;
                case MotionEvent.ACTION_UP:
                    Log.i("TAG", "touched up");
                    break;
            }
    
            return true;
        }
    };
    

    在某些视图上设置:

    myView.setOnTouchListener(handleTouch);
    

    这为您提供了相对于分配有触摸侦听器的视图的触摸事件坐标。视图的左上角是(0, 0)。如果您将手指移到视图上方,则y 将为负数。如果您将手指移到视图的左侧,则x 将为负数。

    int x = (int)event.getX();
    int y = (int)event.getY();
    

    如果您想要相对于设备屏幕左上角的坐标,请使用原始值。

    int x = (int)event.getRawX();
    int y = (int)event.getRawY();
    

    相关

    【讨论】:

    • 这可行,但是在我的测试中,添加侦听器的视图不应被其他视图覆盖。为了获得屏幕上触摸位置的绝对坐标,我添加了一个框架布局作为基本视图,并在其之上添加了带有监听器的视图。不要忘记return false,否则会消耗触摸。
    • @lenooh、getRawX()getRawY() 应该返回添加侦听器的任何视图上的触摸位置的绝对坐标。但是你是对的,如果它上面有另一个视图返回true,那么就不会通知较低的视图触摸事件。
    • Suragch:完全正确。因为我使用 FrameLayout,所以我将视图设置为“matchParent”,所以 getX()getY() 工作得很好(不需要 getRawX/Y())。
    • @Suragch 无论如何都可以记录触摸,即使它被其他视图覆盖或有孩子喜欢的按钮?
    • @vigneshkumar,从底部向上通知视图触摸事件(请参阅我的答案底部的链接),因此您可以在onInterceptTouchEvent 中记录事件,然后返回false 所以事件被正常处理。
    【解决方案3】:
    @Override
        public boolean onTouch(View v, MotionEvent event) {
           float x = event.getX();
           float y = event.getY();
           return true;
        }
    

    【讨论】:

      【解决方案4】:

      这是 Koltin 风格,我在我的项目中使用它并且效果很好:

      this.yourview.setOnTouchListener(View.OnTouchListener { _, event ->
              val x = event.x
              val y = event.y
      
              when(event.action) {
                  MotionEvent.ACTION_DOWN -> {
                      Log.d(TAG, "ACTION_DOWN \nx: $x\ny: $y")
                  }
                  MotionEvent.ACTION_MOVE -> {
                      Log.d(TAG, "ACTION_MOVE \nx: $x\ny: $y")
                  }
                  MotionEvent.ACTION_UP -> {
                      Log.d(TAG, "ACTION_UP \nx: $x\ny: $y")
                  }
              }
              return@OnTouchListener  true
          })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多