首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android OnTouch MotionEvent操作

Android OnTouch MotionEvent操作
EN

Stack Overflow用户
提问于 2015-09-11 22:51:51
回答 2查看 14.8K关注 0票数 8

所以我想我有一个非常简单的问题,但我似乎不能解决它。

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

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

即使我只是在ImageView上点击(触摸),ACTION_MOVE事件也会被调用。

我的目标是在用户点击的时候打开一些东西(做任何事情),并在用户按住它并移动它的时候移动它。

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

发布于 2016-10-29 09:50:41

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

OnTouch MotionEvent操作

根据问题的标题,我来这里寻找onTouch MotionEvent操作的快速参考。下面是从documentation中复制的代码片段

代码语言:javascript
复制
@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( OnTouchListener() { public boolean onTouch(View v,MotionEvent event) { // ...响应触摸事件返回true;} });

  • Returning true表示仍将处理未来的事件。因此,如果您为ACTION_DOWN返回false,则所有其他事件(如move或up)都将被忽略。

进一步阅读

  • Using Touch Gestures:这是文档中的一系列官方课程。这是理解如何正确处理触摸事件和手势的基本读物。
票数 5
EN

Stack Overflow用户

发布于 2015-12-03 22:36:27

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32526332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档