Android:计算触摸位置增量的最简单方法?
Android: Simplest way to calculate delta of touch position?
我想计算屏幕上触摸位置的增量。为此,我正在使用此代码:
public boolean onTouchEvent(MotionEvent event) {
touchX = (int) event.getX();
touchY = (int) event.getY();
deltaX = touchX - oldX;
deltaY = touchY - oldY;
oldX = touchX;
oldY = touchY;
return super.onTouchEvent(event);
}
现在,当我在屏幕上移动手指一段时间时,我得到了正确的增量。但是当我停止手指但没有抬起它时,问题就出现了。那时,我只是得到最后一帧的非零增量。这是因为 onTouchEvent
不是在手指在屏幕上而是静止时调用的。当手指静止时,我应该得到零增量。
这个问题的解决方案是什么?
停留在屏幕上的手指不是一个MotionEvent
,所以不会调用这个方法
试试这个。
private Handler mHandler = new Handler();
private static final int FINGER_STOP_THRESHOLD = 500;
public boolean onTouchEvent(MotionEvent event) {
touchX = (int) event.getX();
touchY = (int) event.getY();
deltaX = touchX - oldX;
deltaY = touchY - oldY;
oldX = touchX;
oldY = touchY;
mHandler.removeCallbacksAndMessages(null);
if(event.getActionMasked() != MotionEvent.ACTION_UP){
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
deltaX = 0;
deltaY = 0;
}
}, FINGER_STOP_THRESHOLD);
}
return super.onTouchEvent(event);
}
您可以将 FINGER_STOP_THRESHOLD
更改为您想要的值。
使用这段代码,一切都在代码中注释:
Double x;//Using double, so I can assign null to this, when touch is removed
Double y;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_DOWN) {
x=Double.valueOf(motionEvent.getX());//On touch, set initial position
y=Double.valueOf(motionEvent.getY());
}
if (action == MotionEvent.ACTION_UP) {
x= null;//On touch removed, set it to null
y=null;
}
if (action == MotionEvent.ACTION_MOVE) {
Log.d("d--diff", (x-motionEvent.getX()) + " - " + (y-motionEvent.getY()));
//Calculate difference
}
return true;
}
如果您有任何疑问,请随时提问。
我想计算屏幕上触摸位置的增量。为此,我正在使用此代码:
public boolean onTouchEvent(MotionEvent event) {
touchX = (int) event.getX();
touchY = (int) event.getY();
deltaX = touchX - oldX;
deltaY = touchY - oldY;
oldX = touchX;
oldY = touchY;
return super.onTouchEvent(event);
}
现在,当我在屏幕上移动手指一段时间时,我得到了正确的增量。但是当我停止手指但没有抬起它时,问题就出现了。那时,我只是得到最后一帧的非零增量。这是因为 onTouchEvent
不是在手指在屏幕上而是静止时调用的。当手指静止时,我应该得到零增量。
这个问题的解决方案是什么?
停留在屏幕上的手指不是一个MotionEvent
,所以不会调用这个方法
试试这个。
private Handler mHandler = new Handler();
private static final int FINGER_STOP_THRESHOLD = 500;
public boolean onTouchEvent(MotionEvent event) {
touchX = (int) event.getX();
touchY = (int) event.getY();
deltaX = touchX - oldX;
deltaY = touchY - oldY;
oldX = touchX;
oldY = touchY;
mHandler.removeCallbacksAndMessages(null);
if(event.getActionMasked() != MotionEvent.ACTION_UP){
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
deltaX = 0;
deltaY = 0;
}
}, FINGER_STOP_THRESHOLD);
}
return super.onTouchEvent(event);
}
您可以将 FINGER_STOP_THRESHOLD
更改为您想要的值。
使用这段代码,一切都在代码中注释:
Double x;//Using double, so I can assign null to this, when touch is removed
Double y;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_DOWN) {
x=Double.valueOf(motionEvent.getX());//On touch, set initial position
y=Double.valueOf(motionEvent.getY());
}
if (action == MotionEvent.ACTION_UP) {
x= null;//On touch removed, set it to null
y=null;
}
if (action == MotionEvent.ACTION_MOVE) {
Log.d("d--diff", (x-motionEvent.getX()) + " - " + (y-motionEvent.getY()));
//Calculate difference
}
return true;
}
如果您有任何疑问,请随时提问。