Android OnTouch MotionEvent 动作

ᴛʜᴇ*_*ᴛᴇʟ 8 java android ontouchlistener onclicklistener android-studio

所以我想我有一个非常简单的问题,但我似乎无法弄清楚。

我有一个ImageView,我正在使用它的setOnTouchListener方法 ( OnTouch)。

如何区分ACTION_DOWN事件和ACTION_MOVE事件?

甚至当我只需要点击(触摸)ImageViewACTION_MOVE事件被调用。

我的目标是当用户点击它时打开它(做任何事情),并在用户握住它并移动它时移动它。

private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            initialX = params.x;
            initialY = params.y;
            initialTouchX = event.getRawX();
            initialTouchY = event.getRawY();
            return true;
       case MotionEvent.ACTION_UP:
           return true;
       case MotionEvent.ACTION_MOVE:
           params.x = initialX + (int) (event.getRawX() - initialTouchX);
           params.y = initialY + (int) (event.getRawY() - initialTouchY);
           mWindowManager.updateViewLayout(mImgFloatingView, params);

           // Log.d("Params", "X: " + params.x + ".  Y: " + params.y + ".");

          if(params.x == initialX && params.y == initialY) {
              Toast.makeText(getBaseContext(), "Test", Toast.LENGTH_SHORT).show();
          }

          return true;
      }
      return false;
}
Run Code Online (Sandbox Code Playgroud)

Sur*_*gch 9

正如其他人所说,由于设备的敏感性和大手指固有的不敏感性,因此ACTION_MOVE被称为“with” 。ACTION_DOWN这称为接触斜率。可以通过调整移动时间和距离的阈值来获得您想要的结果。或者,您可以使用手势检测器

OnTouch 运动事件操作

根据问题的标题,我来这里是为了寻找操作的快速参考onTouch MotionEvent这是从文档中复制的片段:

@Override
public boolean onTouchEvent(MotionEvent event){

    int action = event.getActionMasked();

    switch(action) {
        case (MotionEvent.ACTION_DOWN) :
            Log.d(DEBUG_TAG,"Action was DOWN");
            return true;
        case (MotionEvent.ACTION_MOVE) :
            Log.d(DEBUG_TAG,"Action was MOVE");
            return true;
        case (MotionEvent.ACTION_UP) :
            Log.d(DEBUG_TAG,"Action was UP");
            return true;
        case (MotionEvent.ACTION_CANCEL) :
            Log.d(DEBUG_TAG,"Action was CANCEL");
            return true;
        case (MotionEvent.ACTION_OUTSIDE) :
            Log.d(DEBUG_TAG,"Movement occurred outside bounds " +
                    "of current screen element");
            return true;
        default :
            return super.onTouchEvent(event);
    }
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 上面的代码可以在活动或子类视图中使用。如果不需要对视图进行子类化,则可以通过向OnTouchListener视图添加 来跟踪相同的运动事件。(示例也取自文档

      View myView = findViewById(R.id.my_view);
      myView.setOnTouchListener(new OnTouchListener() {
          public boolean onTouch(View v, MotionEvent event) {
              // ... Respond to touch events
              return true;
          }
      });
    
    Run Code Online (Sandbox Code Playgroud)
  • getAction()和之间的区别getActionMasked()

  • 返回true意味着未来的事件仍将被处理。因此,如果您返回falseACTION_DOWN那么所有其他事件(例如移动或向上)都将被忽略。

进一步阅读

  • 使用触摸手势:这是文档中的一系列官方课程。对于理解如何正确处理触摸事件和手势来说,这是一本必不可少的读物。


小智 1

正在发生的事情是 View.OnTouchListener 将向您发送所有事件。如果您点击并仅移动 1 个像素,它将被注册为 ACTION_MOVE。

您需要实现一些逻辑来确定“保持”操作 - 等待 100 毫秒或类似的时间 - 之后可以继续进行“拖动”操作。在那之前,它应该只是一个“点击”操作。