질문이 확실하지 않지만 ACTION_UP 이벤트가 발생하기 전에 일종의 논리를 수행해야한다는 점을 제외하면 onTouchListener에서 catch long click 이벤트를 구현하려는 것 같습니다. 그렇다면 똑같은 문제가 있습니다. 또한 System.nanoTime() 사용하여 시도했지만 덜 까다로운 메서드를 발견했습니다. 타이머를 사용할 수 있습니다. 첫 번째 ACTION_DOWN 이벤트에서 일정을 예약하고 악영향이 발생하면 취소해야합니다 (예 : ACTION_UP은 길게 누르지 않고 클릭 만했거나 ACTION_MOVE는 특정 임계 값). 다음과 같은 뭔가 :
layout.seyOnTouchListener(new OnTouchListener(){
private Timer longpressTimer; //won't depend on a motion event to fire
private final int longpressTimeDownBegin = 500; //0.5 s
private Point previousPoint;
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:{
longPressTimer = new Timer();
longpressTimer.schedule(new TimerTask(){
//whatever happens on a longpress
}, longpressTimeDownBegin);
return true; //the parent was also handling long clicks
}
case MotionEvent.ACTION_MOVE:{
Point currentPoint = new Point((int)event.getX(), (int)event.getY());
if(previousPoint == null){
previousPoint = currentPoint;
}
int dx = Math.abs(currentPoint.x - previousPoint.x);
int dy = Math.abs(currentPoint.y - previousPoint.y);
int s = (int) Math.sqrt(dx*dx + dy*dy);
boolean isActuallyMoving = s >= minDisToMove; //we're moving
if(isActuallyMoving){ //only restart timer over if we're actually moving (threshold needed because everyone's finger shakes a little)
cancelLongPress();
return false; //didn't trigger long press (will be treated as scroll)
}
else{ //finger shaking a little, so continue to wait for possible long press
return true; //still waiting for potential long press
}
}
default:{
cancelLongPress();
return false;
}
}
}
고맙지 만 제스처를 사용하지 않았습니다. 터치 이벤트를 수동으로 평가하는 것은 내가하고 싶은 일에 대해보다 융통성 있고 편리합니다. 터치 이벤트 시스템은 시간을 제외한 우수한 정보를 제공합니다. 따라서 터치 이벤트 내에서 프레스를 측정 할 수있는 간단한 시계가 필요합니다. ;) –
물론, GestureDetector의 출처에 대해 살펴보면이 문제를 해결하는 방법을 보여줍니다. 지연된 메시지는 "시계"입니다. –
소스를 보내 주셔서 감사합니다. 지금 찾고있어. –