我使用动作事件,action_down,action_move等来检测手指没有移动但手指仍然在屏幕上。例如,用户从屏幕顶部到底部沿垂直线移动,然后在不抬起手指的情况下停止移动。拖动/滑动后,如何检测到没有移动但手指仍在屏幕上?
编辑:每次我改变垂直方向的移动方向时,我想要做的就是计算。为了做到这一点,我试图检测何时我停止运动以改变运动。例如,我向下移动屏幕然后向上移动,这算作两个计数。这是我的代码,请不要向我提供代码作为直接答案,但提示或线索,以便我可以尝试自己解决(我的代码可能看起来有点令人困惑,我只是尝试不同的事情):
@覆盖 public boolean onTouchEvent(MotionEvent event){
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
oldX = event.getX();
oldY = event.getY();
oldSpeedY = System.currentTimeMillis();
break;
case MotionEvent.ACTION_MOVE:
posY = event.getY();
posSpeedY = System.currentTimeMillis();
float timeElapsed = (posSpeedY - oldSpeedY) / 1000;
float diffSpeed = posSpeedY - oldSpeedY;
if (changeOfMovement(posY, oldY)) {
//if (diffSpeed == 0)
count += 1;
}
break;
case MotionEvent.ACTION_UP:
// count seconds here
break;
}
Toast.makeText(getApplicationContext(), "Swipe: " + count,
Toast.LENGTH_SHORT).show();
return false;
}
public boolean changeOfMovement(float posY, float oldY) {
int newY = Math.round(posY);
double distance = Math.abs(newY - oldY);
oldY = newY;
//float speed = (float) (distance / time);
//if (distance < 25)
//return false;
//if (speed == 0)
//return true;
if (distance < 25)
return true;
return false;
}
答案 0 :(得分:0)
手指触摸屏幕,直到您收到任一MotionEvent操作mouseY - (elem.offset().top+(elem.height()/2)
或ACTION_UP
答案 1 :(得分:0)
在手指从屏幕上抬起之前,ACTION_DOWN事件仍然有效,或者您可以等到检测到ACTION_UP事件
答案 2 :(得分:0)
我不确定我的情况是否与您的情况相符,但是我想要检测用户是否在一秒钟内停止在圈内移动并通过比较最后两个currentTimeMillis
来重新开始移动。
所以,我所做的是我初始化固定的ArrayList以在移动事件中保存最后两次:
public class FixedArrayList extends ArrayList {
int fixedSize = 10;
public FixedArrayList(){}
public FixedArrayList(int fixedSize){
this.fixedSize = fixedSize;
}
@SuppressWarnings("All")
public void addItem(Object object){
if(size() < fixedSize){
add(object);
} else{
remove(0);
add(object);
}
}
}
现在,我已经使用固定的2个项目初始化了我的新课程:
FixedArrayList savedLastMove = new FixedArrayList(2);
int secondsToWait = 1;
public boolean onTouchEvent(MotionEvent event) {
int action = MotionEventCompat.getActionMasked(event);
switch (action) {
case (MotionEvent.ACTION_MOVE):
currentSystemTime = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
savedLastMove.addItem(currentSystemTime);
if(savedLastMove.size() >= 2 && ((long)savedLastMove.get(1) - (long)savedLastMove.get(0)) >= secondsToWait){
//Do what you want after secondsToWait
}
return true;
}
我希望这会有所帮助!因为它解决了我的问题。