所以我认为我有一个非常简单的问题,但我似乎无法弄明白。
我有一个ImageView
我使用的是setOnTouchListener
方法(OnTouch
)。
如何区分ACTION_DOWN
事件和ACTION_MOVE
事件?
即使我只是点击(触摸)ImageView
,ACTION_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;
}
答案 0 :(得分:1)
正如其他人所说,ACTION_MOVE
与ACTION_DOWN
一起被调用,因为设备的敏感性和大手指固有的不敏感性。这称为touch slop。您可以通过调整移动的时间和距离的阈值来获得所需的结果。或者,您可以使用gesture detector。
根据问题的标题,我来到这里寻找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;
}
});
true
表示仍会处理未来事件。因此,如果您为false
返回ACTION_DOWN
,则会忽略所有其他事件(如移动或向上)。 答案 1 :(得分:0)
发生的事情是View.OnTouchListener会向您发送所有事件。如果您仅点按并移动1个像素,它将被注册为ACTION_MOVE。
您需要实现一些逻辑来确定“保持”操作 - 等待100毫秒或类似的事情 - 之后可以继续执行“拖动”操作。在此之前,它应该只是一个“点击”动作。