短版:我想一个方式开始上的onTouchEvent基于时间的计数器,并且测试一下时间一定量的响应之前已过,作为手动LongTouch检测。
说明:我有一个在/上两指甩了屏幕滑动的自定义ImageView的。 我想拖动事件添加到它,但这些都需要比一个长按快。 我可以用一个计数器,每更新的onTouchEvent一次且仅触发,比如说,10个计数拖延迟拖动事件,但计数器只对触摸事件的更新和手指必须移动。
如何创建一个基于时间的计数器,这是增加的活性水平场60次的速率或诸如此类?
短版:我想一个方式开始上的onTouchEvent基于时间的计数器,并且测试一下时间一定量的响应之前已过,作为手动LongTouch检测。
说明:我有一个在/上两指甩了屏幕滑动的自定义ImageView的。 我想拖动事件添加到它,但这些都需要比一个长按快。 我可以用一个计数器,每更新的onTouchEvent一次且仅触发,比如说,10个计数拖延迟拖动事件,但计数器只对触摸事件的更新和手指必须移动。
如何创建一个基于时间的计数器,这是增加的活性水平场60次的速率或诸如此类?
我不知道从你的问题,但似乎你想在你的onTouchListener实行捕捞长按事件,除非你需要的ACTION_UP事件发生之前进行某种逻辑? 如果是这样,那是我有同样的确切的问题。 我使用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;
}
}
}
只要看看android系统的源代码。
长按GestureDetector开始对“键按下”延迟的消息。 当这个消息被“键向上”来之前它是一个长按。
到源只是一个链接http://www.devdaily.com/java/jwarehouse/android/core/java/android/view/GestureDetector.java.shtml
我会接近这个问题的方法是,当发生ACTION_DOWN一些布尔值设置为true。 如果action_up出现则布尔值设置为false。 也开始postDelayed集时ACTION_DOWN时要什么延迟。 在postdelayed,如果您之前设置为true的布尔仍然是正确的,然后做你想做的。 对不起,这样罗嗦的答案,但是这是我会怎么做。
答:使用系统时钟(elapsedRealtime()),测量毫秒,因为媒体已启动。 容易,一旦你开始得到了它的窍门。