我已经找到了这个答案:Distinguish between long press and short press on a hardware button但是我对OnTouchListener感兴趣。原因是我希望短按并释放(单击)将触发某种行为,而长按(不释放)将触发运动事件,以使用户能够用手指拖动小部件。
所以我正在使用ACTION_MOVE:
val listener = View.OnTouchListener(function = { view, motionEvent ->
// check if the user gesture upon the view is of moving action
when (motionEvent.action) {
MotionEvent.ACTION_DOWN-> {
// pressed
}
MotionEvent.ACTION_MOVE -> {
view.y = motionEvent.rawY - ((view.height / 2) + 60)
view.x = motionEvent.rawX - view.width / 2
}
MotionEvent.ACTION_UP -> {
// Released
问题是ACTION_MOVE将立即触发。是否可以选择仅在长按时调用它?我以为可能以某种方式使用时间戳来启用和禁用它,但是有没有更简单的解决方案?
Android处理此问题的方法是使用手势检测器。指南主题Detect common gestures讨论了如何执行此操作并提供了示例代码。
您想要在相对较低的触摸侦听器级别上进行操作的唯一原因是,如果要实现的逻辑尚未被库手势检测器之一打包。对您来说幸运的是,长按和拖动是已经支持的手势。
如果仍然要编写自己的逻辑,则适当的手势检测器的源代码可以为您提供一个良好的起点。但是,我强烈不鼓励这样做,因为逻辑可能非常棘手,有很多极端情况需要纠正。