前言
在项目中,不管是Android平台的或者其他平台的,都遇到过用户在一定的时间段内多次触发同一个事件,导致流程或者状态存在错误等问题。
既然存在,那就需要解决不让用户在一定的时间段内重复的点击。
解决这个问题大概有两种思路。
- 同一段时间内不让用户点击(过滤点击时间)
- 同一段时间设置内控件不响应点击
下面以Android中为例讲解。
防爆力点击
不让用户点击(过滤点击事件)
这种是过滤用户的点击事件
// 记录上一次点击响应时的时间点,默认为0 long mLastClickTime= 0; // 定义间隔时间 final long CLICK_INTERVAL_TIME = 300; // 下面是放入点击时间响应前过滤 if (SystemClock.uptimeMillis() - mLastClickTime < CLICK_INTERVAL_TIME) { // 如果小于设定的范围就忽略 return; } else { mLastClickTime = SystemClock.uptimeMillis(); }
或许有些人会问为啥用SystemClock.uptimeMillis()这个计时而不是其他的。这个问题我看过过《「安卓开发」Android防暴力点击事件处理解决方法及其存在的问题》有解释,觉得不错,因此摘抄部分于此。
- System.currentTimeMillis() 系统时间,会根据手机系统中设置的时间改变;
- Calendar.getInstance().getTimeInMillis() 这种方式是最low的。因为每次点击都会创建一个Calendar实例,在后端开发中,都是拒绝使用这个类的,因为效率会比较低。
- SystemClock.uptimeMillis() 自开机后,经过的时间,不包括深度睡眠的时间。Looper中所使用的也是这个方法,对时间间隔的计算比较有保证。
- SystemClock.elapsedRealtime() 自开机后,经过的时间,包括深度睡眠的时间。
控件不响应点击时间
这种方式就是让控件不能点击。
Android的RadioButton、Button等都存在设置setEnabled()来是否允许用户可以点击的状态。
/** * 设置RadioButton是否可以点击 * * @param enable */ private void setRadioButtonEnable(boolean enable) { //设置RadioButton是否可点 rb_one.setEnabled(enable); rb_two.setEnabled(enable); //如果设置了不可点击(false),延迟一定时间后恢复可以点击。 if (!enable) { mHandler.sendEmptyMessageDelayed(MSG_DELAY_SET_CHECKBOX_ENABLE, DELAY_RADIOBUTTON_CLICK_TIME); } return; }
小结
实际中需要自己去判断用哪一种。
个人偶尔偏向于第一次中,用得也比较多。
第二种使用需要注意setEnabled()设置后会改变一些控件的颜色状态,比如Button的可点击和不能点击的颜色可能不同(不能点击一般都是灰色的),为了不让用户感觉状态变了,可以同一配置一样的背景颜色。当然也有些就是需要通过改变颜色,从视觉上告诉用户我不能点击,这个要看项目需求。
参考文章
历史上的今天
暂无评论...
随机推荐
system.exit()的作用
前言记录一下,system.exit(1) 和 system.exit(0)的用法与作用。方便自己查阅和回顾。好记性不如烂笔头正文System.exit(status)不管status为何值都会退出程序,也就是后面的代码不会再执行。public static void exit(in...
监听和获取Android 设备的USER_UNLOCKED状态
前言Android有些功能需要user unlocked之后才能使用,因此在启动前需要判断一下当前Android设备是否unlocked。这简单记录一下,方便自己查阅。正文判断isUserUnlocked启动某些功能时通过下面方式判断一下是否已经可以启动了。public boolean...
XmlSerializer简单使用
前言XmlSerializer是Android提供的一个类,用于创建和编辑XML文档。本文简单记录一下XmlSerializer的使用。正文常用方法下面是XmlSerializer创建xml文档的常用的方法。1. endDocument() 结束XML文档2. startDocum...
修改Android系统时间设置到2099
前言修改Android支持的时间大于2037。系统时间限制默认是Int(有符号32位,最大0X7FFFFFFF)最大值即为: Integer.MAX_VALUE = 0X7FFFFFFF=2147483647 = 2038-01-19 11:14:07。个人流水账而已。正文将RTC时间限...
大卫.索罗:孤独
在这美妙的黄昏,我的身心融为一体,大自然的一切尤显得与我相宜。夜幕降临了,风儿依然在林中呼啸,水仍在拍打着堤岸,一些生灵唱起了动听的催眠曲。伴随黑夜而来的并非寂静,猛兽在追寻猎物。这些大自然的更夫使得生机勃勃的白昼不曾间断。我的近邻远在一英里开外,举目四望,不见一片房舍,只有距我半英里地的黑暗的山...
[转]毕业5年决定人的一生
转给自己,也转个需要的朋友!正如"打工皇帝"唐骏说:"我觉得有两种人不要跟别人争利益和价值回报。第一种人就是刚刚进入企业的人,头5年千万不要说你能不能多给我一点儿工资,最重要的是能在企业里学到什么,对发展是不是有利……"人总是从平坦中获得的教益少,从磨难中获得的教益多;从平坦中获得的教益浅,从磨...