所以我想我有一个非常简单的问题,但我似乎不能解决它。
我有一个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;
}发布于 2016-10-29 09:50:41
正如其他人所说,由于设备的敏感度和大手指固有的不敏感度,ACTION_MOVE与ACTION_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( OnTouchListener() { public boolean onTouch(View v,MotionEvent event) { // ...响应触摸事件返回true;} });
true表示仍将处理未来的事件。因此,如果您为ACTION_DOWN返回false,则所有其他事件(如move或up)都将被忽略。进一步阅读
发布于 2015-12-03 22:36:27
正在发生的事情是,View.OnTouchListener将向您发送所有事件。如果你只点击并移动了1个像素,它就会被注册为ACTION_MOVE。
你需要实现一些逻辑来确定一个“保持”动作--等待100毫秒或类似的动作--之后“拖动”动作才能继续。在此之前,它应该只是一个“点击”动作。
https://stackoverflow.com/questions/32526332
复制相似问题