通常,检测长按的正确方法是实现
View.OnLongClickListener。这比自己检测更容易,更不容易出错,并且可以确保您的应用程序与系统的其余部分完美匹配。
对于 custom 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
}
});
更新:好的,我已经进行了一些挖掘,虽然这对于我曾经使用过的每个视图都是正确的方法,但实际上它不适用于提问者正在使用的 SeekBars。这个事实没有记录在SeekBar文档中,但实验表明它是正确的,并且深入研究源代码显示了原因:SeekBar.onTouchEvent()不调用super.onTouchEvent(). 如果合适的话,它就是View.onTouchEvent()被调用的。performLongClick()
如果我必须要实现它,我会使用Handler.postDelayed(). 在 ACTION_DOWN 上,我会发布(例如 3000 毫秒延迟)Runnable处理长按的 a Handler,然后我会在 ACTION_UP 上取消它。因此,任何小于延迟的按下都不会最终调用Runnable,但如果在延迟之后没有发生 ACTION_UP ,那就是。
也就是说,我会提醒你重新考虑这样做。长按 a 是什么意思SeekBar?如果用户拖动“拇指”的时间超过了延迟时间,那么突然间你就有了一个可能不是本意的长按。您可以在每次移动拇指时取消和重置延迟,需要长按几秒钟才能恰好在一个位置。但是很少有完全静止的;事实上,握住拇指几秒钟不移动它是很困难的。因此,您可以对重置延迟的拇指位置进行最小更改。如果必须,我会这样做,但我必须说这是一种非常奇怪的用户体验。