当用户点击时,会触发案例MotionEvent.ACTION_DOWN。释放单击后,将触发案例MotionEvent.ACTION_UP。
我有兴趣确定在ACTION_DOWN的3秒内是否未触发ACTION_UP。意思是,如果自用户点击并且尚未发布3秒后,我想知道,主要是尝试确定长按。
有没有办法做这样的事情?
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
break;
}
答案 0 :(得分:3)
通常,检测长按的正确方法是实现 View.OnLongClickListener。这样可以更轻松,更不容易出错,自行检测,并确保您的应用与系统的其他部分完美匹配。
对于自定义View
,您可以将implements View.OnLongClickListener
添加到类声明中,将setOnLongClickListener(this);
添加到构造函数中,然后将onLongClick()
方法添加到您的类中:
public boolean onLongClick (View v) {
// Handle long-click
}
如果View
不是自定义的,您可以像这样添加监听器:
theView.setLongClickable(true);
theView.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View v) {
// Handle long-click
}
});
更新:好的,我已经做了一些挖掘,虽然这是我曾经使用的每个View的正确方法,但实际上它对SeekBars不起作用,这是提问者正在使用的内容。 SeekBar
文档中没有记录这一事实,但实验表明它是正确的,挖掘源代码可以说明原因:SeekBar.onTouchEvent()
不会调用super.onTouchEvent()
。如果合适,View.onTouchEvent()
会调用performLongClick()
。
如果我必须使用Handler.postDelayed()
,我将实施它的方式。在ACTION_DOWN上,我会发布(例如延迟3000毫秒)一个Runnable
来处理长按到Handler
,我会在ACTION_UP上取消它。因此,任何低于延迟的按压都不会最终调用Runnable
,但如果在延迟之后没有发生ACTION_UP,则为。{/ p>
那就是说,我要提醒你重新考虑这样做。长按SeekBar
是什么意思?如果用户拖动“拇指”的时间超过了延迟时间,那么突然间你有一个长按,可能不是一个。您可以在每次移动拇指时取消和重置延迟,需要在一个位置长按几秒钟。但是完全静止是很少见的;实际上很难握住拇指而不能移动它几秒钟。因此,您可以在拇指位置进行最小的更改,以重置延迟。如果必须的话,那就是我会做的,但我必须说这是一种非常奇怪的用户体验。
答案 1 :(得分:0)
简单直接。您需要获取时间戳来评估事件之间的时间差异您可以通过以下示例执行此操作:
private static int TIME_MARGIN = 3; //seconds
private Date d1 = null;
public void OnWhatEverOnClickEvent(Event event){
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
d1 = new Date();
break;
case MotionEvent.ACTION_UP:
Date d2 = new Date();
if((d2.getTime() - d1.getTime()) >= (TIME_MARGIN * 1000L)){
//its a long click due to 3 seconds hold, do something here
}
break;
}
}
然而,正如@Darshan Computing所说,你应该更好地利用View.OnLongClickListener
,这是一种无忧无虑的方法。
答案 2 :(得分:0)
当用户单击时,启动一个新线程,轮询按钮的当前状态(或引入一个新标记,该标记在DOWN
中设置并在UP
中重置。线程可以轮询此每隔100毫秒进行一次状态或标记,并使用内部时间戳来确定是否已经过了3秒。如果是这样,它可以触发一个新事件以开始长按一次动作
答案 3 :(得分:0)
不确定,我说得对。 但如果我,那么这可能对你有帮助。 Here。看看已接受的答案