Android OnTouch MotionEvent动作

时间:2015-09-11 14:51:51

标签: java android android-studio onclicklistener ontouchlistener

所以我认为我有一个非常简单的问题,但我似乎无法弄明白。

我有一个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;
}

2 个答案:

答案 0 :(得分:1)

正如其他人所说,ACTION_MOVEACTION_DOWN一起被调用,因为设备的敏感性和大手指固有的不敏感性。这称为touch slop。您可以通过调整移动的时间和距离的阈值来获得所需的结果。或者,您可以使用gesture detector

OnTouch MotionEvent操作

根据问题的标题,我来到这里寻找onTouch MotionEvent行动的快速参考。所以这是从documentation复制的代码段:

@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);
    }
}

注意:

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

    View myView = findViewById(R.id.my_view);
    myView.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            // ... Respond to touch events
            return true;
        }
    });
    
  • Difference between getAction() and getActionMasked()

  • 返回true表示仍会处理未来事件。因此,如果您为false返回ACTION_DOWN,则会忽略所有其他事件(如移动或向上)。

进一步阅读

  • Using Touch Gestures:这是文档中的一系列官方课程。这是了解如何正确处理触摸事件和手势的重要读物。

答案 1 :(得分:0)

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

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