Android中实现双击(多击)事件
要实现双击,你需要保存第一次点击时的时间,需要使用到变量,之后便是与第二次点击时的时间比较,看时间间隔是否在你设定的时间内(比如500ms)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
long firstClickTime = 0 ; long secondClickTime = 0 ; public void click1(View view) { if (firstClickTime > 0 ) { secondClickTime = SystemClock.uptimeMillis(); if (secondClickTime - firstClickTime < 500 ) { Toast.makeText( this , "第一种双击方式" , 0 ).show(); } firstClickTime = 0 ; return ; } firstClickTime = SystemClock.uptimeMillis(); new Thread( new Runnable() { @Override public void run() { // try { Thread.sleep( 500 ); firstClickTime = 0 ; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } |
双击事件(多击事件)中有两个重要的问题需要考虑:第一次点击的时间,最后(如何知道是“最后”)点击的时间;点击一次后,等待一段时间(比如2s),再次双击(多击)如何保证得到正确的响应。 上面的代码解决了这两个问题,但不够效率,也很复杂。它是通过一个变量存储第一次点击的时间,通过判断这个变量的大小来判断是不是第二次点击,解决第一个问题;再加上子线程的sleep方法,500ms内如果没有第二次点击,变量就重置了,解决了第二个问题。 但是这种方式解决双击事件还算凑合,那么三击、四击……如何解决了?
第二种,换种方式存储变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
<pre name= "code" class = "java" > List< long > times = new ArrayList< long >(); public void click2(View view) { times.add(SystemClock.uptimeMillis()); if (times.size() == 2 ) { //已经完成了一次双击,list可以清空了 if (times.get(times.size()- 1 )-times.get( 0 ) < 500 ) { times.clear(); Toast.makeText( this , "第二种双击方式" , 0 ).show(); } else { //这种情况下,第一次点击的时间已经没有用处了,第二次就是“第一次” times.remove( 0 ); } } }</ long ></ long ></pre><br> <br> <pre class = "brush:java;" ></pre> 在第二种方式中,使用List存放点击时的时间。现在来分析一下这个实现的原理: <h4> 1 、如何判断是第二次点击?</h4> 通过链表的长度,每次点击list的长度加 1 ,当为 2 时,表示点击了两次。 <h4> 2 、如何消除间隔一段时间的点击事件的影响?</h4> 如果是正常的双击,点击两次就完成一次“轮回”,之前保存的时间数据已经使用完毕了,需要清除掉,具体操作就是将List清空。而如果是点击一次后,第二次点击相隔时间较长,那个第一次点击的时间已经没有用处了,就直接将第二次点击视为“第一次”点击,具体而言就是去掉第 1 次的点击事件。 <br> 这个方法,比起第一种方法效率要好得多,而且非常容易扩展到三击、四击……事件。比如: <pre class = "brush:java;" ><pre name= "code" class = "java" > List< long > times = new ArrayList< long >(); public void click2(View view) { times.add(SystemClock.uptimeMillis()); if (times.size() == 3 ) { if (times.get(times.size()- 1 )-times.get( 0 ) < 500 ) { times.clear(); Toast.makeText( this , "三击方式" , 0 ).show(); } else { times.remove( 0 ); } } }</ long ></ long ></pre><br> <br> <pre class = "brush:java;" ></pre> 改变的只是判断条件。 <h1>第三种,谷歌程序员的写法。</h1> 下面是谷歌所写的三击方法,我改写成了双击的方法<pre class = "brush:java;" > /** * 双击事件、多击事件 */ //存储时间的数组 long [] mHits = new long [ 2 ]; public void doubleClick() { // 双击事件响应 /** * arraycopy,拷贝数组 * src 要拷贝的源数组 * srcPos 源数组开始拷贝的下标位置 * dst 目标数组 * dstPos 开始存放的下标位置 * length 要拷贝的长度(元素的个数) * */ //实现数组的移位操作,点击一次,左移一位,末尾补上当前开机时间(cpu的时间) System.arraycopy(mHits, 1 , mHits, 0 , mHits.length - 1 ); mHits[mHits.length - 1 ] = SystemClock.uptimeMillis(); //双击事件的时间间隔500ms if (mHits[ 0 ] >= (SystemClock.uptimeMillis() - 500 )) { //双击后具体的操作 //do } }</pre> 非常简洁,思想差不多,不过谷歌工程师是利用数组移位操作来消除第二个问题的影响的。而要实现多击事件,只需修改数组长度即可。 <br> <br> </pre> 结伴旅游,一个免费的交友网站:www.jieberu.com 推推族,免费得门票,游景区:www.tuituizu.com |
Android中实现双击(多击)事件的更多相关文章
- Android Listview中Button按钮点击事件冲突解决办法
今天做项目时,ListView中含有了Button组件,心里一早就知道肯定会有冲突,因为以前就遇到过,并解决过,可惜当时没有记录下来. 今天在做的时候,继续被这个问题郁闷了一把,后来解决后,赶紧来记录 ...
- 查找和定位Android应用的按钮点击事件的代码位置基于Xposed Hook实现
本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80956455 在进行Android程序的逆向分析的时候,经常需要通过Androi ...
- Android中ListView无法点击
Android中ListView无法点击 转自:http://xqjay19910131-yahoo-cn.iteye.com/blog/1319502 问题描述: ListView中Item加入 ...
- Android Button四种点击事件和长按事件
项目XML代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr ...
- robot framework程序运行过程中,遇到点击事件之后,未出现点击之后的效果(求解)
1.click Element操作,在实际过程中偶然会出现,日志显示已点击成功,但是实际自动化页面,没有点击成功之后的操作 现象: 现象描述:程序执行到点击侧边栏的[人员信息]之后,日志显示已经点击成 ...
- Android 响应webview中图片的点击事件
最近碰到个新需求需要点击webview中的图片进行放大显示. 整理了下思路,想到了下面的一个可行的方案. 方案思路, 1.在点击图片的时候调用本地的java方法并给出响应的图片地址 2.本地获得图片地 ...
- Android学习---ListView的点击事件,simpleAdapter和arrayadapter,SimpleCursoAdapter的原理和使用
如题,本文将介绍 listview的点击事件,simpleAdapter和arrayadapter的原理和使用. 1.ListView的注册点击事件 //注册点击事件 personListView.s ...
- android 入门 003 (点击事件)
点击事件 有四种实现方式. 1.内部类实现方式 1.0 package cn.rfvip.clickevent; import android.app.Activity; import android ...
- android中ListView控件&&onItemClick事件中获取listView传递的数据
http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...
随机推荐
- Statistics项目学习笔记
1. http://218.244.157.0:55443/index.html 初始访问时,弹出的窗口为index.html文件,文件有html命令组成.html展现的UI界面用的是WIN10-UI ...
- java 不可变对象 final Collections guava 简单样例
本地环境 jdk1.8 连接 Google Guava官方教程(中文版) journaldev 说明 java的final关键字大家都了解,但是final修饰的如果是引用类型,那么不可修改的其实只是重 ...
- 企业面试题|最常问的MySQL面试题集合(二)
MySQL的关联查询语句 六种关联查询 交叉连接(CROSS JOIN) 内连接(INNER JOIN) 外连接(LEFT JOIN/RIGHT JOIN) 联合查询(UNION与UNION ALL) ...
- javaSql面试题(10题)
有如下四张表: 学生表Student(stuId,stuName,stuAge,stuSex): 课程表Course(courseId,courseName,teacherId): 成绩表Scores ...
- git 查看对比的方法log diff
git shortlog 默认情况下,git shortlog 把输出按作者名字排序,但你可以传入 -n 选项来按每个作者提交数量排序. 1.有冲突时可以用 git status查看 2.通过git ...
- FMDB-FMDatabaseQueue
FMDB封装了SQLite3的方法,操作数据库变得很简单. 增删改查变简单之后,那么问题来了,如何使用多线程优化对数据库的操作? 这是我们的第一反应估计是dispatch_async(). 那么问题又 ...
- Core Graphics 定制UIVIew 处理图片
许多UIView的子类,如UIButton或UILabel,它们的形状都是系统固定的.但是,对于一些特殊的情况,我们需要绘制产品狗想要的图形.那么等待我们的只有两个选择:第一,可以使用UIImageV ...
- ubuntu apache 一个ip绑定多个域名,发布目录
1.将www.aaa.com 与 www.bbb.com 的DNS解析到你的服务器上 2.添加两个发布目录 /var/www/html/aaa /var/www/html/bbb 3.修改配置文件. ...
- 023-zabbix性能优化中的几个中肯建议
随着zabbix的广泛应用,少数人的zabbix服务器在性能上出现瓶颈,或者在未来会出现性能方面的瓶颈,接下来讨论几个有效并且简单的优化方案. 服务器硬件 想通过几个简单的配置让服务器提高成倍的性能, ...
- Oracle 之 触发器
触发器是特定的事件出现的时候,自动隐式执行代码块,这个过程用户无法控制,用户只能控制触发的事件,触发后的操作,触发过程是自动执行的. 定义触发器: 1.名称 2.触发时间:是在执行事件之前(befor ...