Android参照View源码实现长按效果

项目需要实现长按事件响应,又不想更改现有的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中进行移除!

搞定!
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值