多次点击事件 [MD]
我的GitHub | 我的博客 | 我的微信 | 我的邮箱 |
---|---|---|---|
baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
目录
多次点击事件
Android给我们提供了单次点击事件,虽然在设置中我们有发现多次点击事件的案例,如多次点击"版本号"后启用开发者模式、多次点击"Android版本"后显示版本动画,但Android本身并没有提供多次点击事件的实现。有如下几种实现方式。
定义存贮多个事件点的成员变量
双击事件案例
首先以双击事件为例说明。
定义一个变量,存贮第一次点击时的事件(这里只需要存储点击时间),如果第二次点击时的时间和此变量中记录的时间的间隔小于500毫秒,则认为是双击事件。
private long startClickTime;
public void onClickView() {
long nextClickTime = SystemClock.uptimeMillis();
if (startClickTime <= 0) startClickTime = SystemClock.uptimeMillis();
else {
if (nextClickTime - startClickTime < 500) {
Toast.makeText(this, "双击", Toast.LENGTH_SHORT).show();
startClickTime = 0L;
} else startClickTime = nextClickTime;
}
}
这种处理方式经常用在这种场景下:用户在主界面点击一次BACK键后,提示用户"再点击一次退出",如果用户在2s内再次点击了一次BACK键,则退出,否则不对此响应。
改进的方式,使用 LongSparseArray
上面这种方式有个缺陷,如果要实现多次点击,那么就需要定义存贮多个事件点的变量,很显然不适合多次点击的处理。
不过我们如果对此经过一些改进,还是可以很好的解决这个问题的。
首先定义一个集合,存储所有临时的数据,这里用了Android中推荐的 LongSparseArray
public static LongSparseArray<RecordBean> RECORD_LIST = new LongSparseArray<>();
其中,键为当前时间,以保证唯一性
key = System.currentTimeMillis();
RecordBean recordBean = new RecordBean(key);
RECORD_LIST.put(key, recordBean);
既然都保存到了集合中,所以读取时就很方便、灵活了
Long key = RECORD_LIST.keyAt(i);
RecordBean recordBean = RECORD_LIST.get(key);
由于我们只需要保存指定数量的临时数据,所以当集合中的数据超过指定数量时,我们要移除集合中最靠前的数据
if (RECORD_LIST != null && RECORD_LIST.size() > MAX_SIZE_OF_SAVED_FILES_IN_SDCARD) {
RecordBean removedBean = RECORD_LIST.valueAt(0);
RECORD_LIST.removeAt(0);
if (removedBean.pcmPath != null) {
//...
}
}
后面的判断就和上面的基本一致了。
使用Google提供的api中采用的算法
这个算法比较巧妙,主要是利用了System.arraycopy进行自复制的功能,可以借鉴一下。
为了实现n次点击事件,我们需要定义一个长度为n的数组,每点击一次就将数组里的内容整体向左移动一格,然后给数组的最后一个元素赋值当前的时间,如果当前时间(最后一个元素记录的时间)减去第0个元素记录的时间小于500毫秒的话,那么证明在500毫秒内点击了n次。
private long[] mHits = new long[4];
private static final int MAX_TIME = 500;
public void onClickView() {
Toast.makeText(this, "击", Toast.LENGTH_SHORT).show();
//复制数组中的元素,从第1个位置开始,目标地址是第0个位置,复制的长度为数组长度-1(也就是舍弃掉第0个元素)
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
//给数组最后一个位置赋值
mHits[mHits.length - 1] = SystemClock.uptimeMillis();
//判断数组第一个位置的时间与当前时间的差是否小于500毫秒,假如小于的话,就认为是多次点击事件
if (SystemClock.uptimeMillis() - mHits[0] < MAX_TIME){
//N击事件条件触发。
//如果此事件只需触发一次(比如5次点击之后再点击5次才触发下一次,而不是之后再点击一次就触发下一次),需要在这里重置数据
}
}
2017-03-23
本文来自博客园,作者:白乾涛,转载请注明原文链接:https://www.cnblogs.com/baiqiantao/p/6606431.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现