我创建了一个可以拖动的视图。这是我的来源:
imageView.setOnTouchListener(new View.OnTouchListener() {
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);
windowManager.updateViewLayout(imageView, params);
return true;
}
return false;
}
});
正如您所看到的,通过触摸图像视图并平移,视图本身会移动。现在我的问题是,我想在移动视图和实际点击视图之间进行区分。我已经尝试了stackoverflow上显示的多个方法,但找不到任何能解决我问题的方法。
如果点击了imageview,它应该调用一个方法。否则,如果仅触摸移动视图,则不应调用该方法。
有人有建议吗?
提前致谢
答案 0 :(得分:2)
当您发生ACTION_UP
事件时,您希望返回false
,否则OnClickListener
不会被调用,因为您告诉系统您已处理该触摸事件。
您可能还希望在第一个System.currentTimeMillis()
事件中获取并保存ACTION_DOWN
,然后,如果ACTION_UP
事件在表示点击的阈值时间之前出现,则仅返回false。
答案 1 :(得分:1)
我通过添加@ChrisMcJava的想法和一些进一步的调整来解决我的问题:
imageView.setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
private long time;
private boolean hasMoved = false;
@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();
time = System.nanoTime();
hasMoved = false;
return true;
case MotionEvent.ACTION_UP:
if(System.nanoTime() - time < 1000000000 && !hasMoved) {
Toast.makeText(getApplicationContext(), "Click", Toast.LENGTH_SHORT).show();
}
return false;
case MotionEvent.ACTION_MOVE:
if(Math.pow(initialTouchX - (int)event.getRawX(), 2) > Math.pow(5, 2) || Math.pow(initialTouchY - (int)event.getRawY(), 2) > Math.pow(5, 2)) {
hasMoved = true;
}
params.x = initialX + (int)(event.getRawX()-initialTouchX);
params.y = initialY + (int)(event.getRawY()-initialTouchY);
windowManager.updateViewLayout(imageView, params);
return true;
}
return false;
}
});
正如您所看到的,点击不仅取决于点击的时间长短,还取决于视图是否被移动。我已经建立了移动5px和1秒的容差,意思是: 如果按钮保持小于或等于1秒并且按钮没有被拖动超过5px,则只需点击一下。
感谢您的建议
答案 2 :(得分:0)
更新ACTION_UP案例如下:
case MotionEvent.ACTION_UP:
if( (Math.abs(initialTouchX - event.getRawX())<5) && (Math.abs(initialTouchY - event.getRawY())<5) )
{
Log.e(TAG,"It's a click ! ");
}else{
Log.e(TAG,"you moved the head");
}
return true;