项目需要实现长按事件响应,又不想更改现有的onTouch事件逻辑去使用Gesture识别类,故此参照了View的源码实现LongClick的逻辑,自己实现了符合项目需求的长按功能。
具体看View的源码:
可以看到在ACTION_UP事件中移除了长按回调(这里我之前想自己通过增加逻辑判断来实现同意的效果,结果很不理想,于是再次回到源码找答案!)。
其中的 attachInfo.mHandler.removeCallbacks(action); getRunQueue().removeCallbacks(action); 便是核心代码了。
其中的mHandler.removeCallbacks(action) 其实是大家很数据的MessageQueue操作!
而这个Queue其实就是大家非常熟悉的数组封装对象!
因此,View的事件移除逻辑便是:如果View Attach到父窗口了就需要先移除Android消息队列里的事件,否则只需要移除掉事件数组里的事件即可!
到这里其实基础好的同学应该能联想到长按事件的添加其实也类似了!
能够看到在ACTION_DOWN事件里做了LongClick检查这么一件事,而这里有一个参数ViewConfiguration.getLongPressTimeout(),他的默认值其实就是400ms。
那么checkForLongClick函数里面到底做了什么呢?直接上源码!
看到了吗?其实就是通过postDelayed将长按逻辑事件丢到了队列中!而这个delay就是默认的长按时间间隔!
那么这个mPendingCheckForLongPress到底是什么呢?
可以看到其实就是Runnable对象,里面最核心的就是performLongClick(mX, mY) 函数了,这个函数会执行长按操作,同时也会执行大家平时设置的长按回调事件!
这个逻辑还是很清晰的,而且源码也不长,建议可以看看源码!
源码看完了,也该练练手了吧!直接实现项目需要的功能!
ACTION_DOWN里面postDelay出去一个Runnable,在ACTION_UP和ACTION_MOVE中进行移除!
搞定!