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 | longfirstClickTime = 0;longsecondClickTime = 0;publicvoidclick1(View view) {    if(firstClickTime > 0) {        secondClickTime = SystemClock.uptimeMillis();        if(secondClickTime - firstClickTime < 500) {            Toast.makeText(this, "第一种双击方式", 0).show();        }        firstClickTime = 0;        return;    }    firstClickTime = SystemClock.uptimeMillis();        newThread(newRunnable() {                @Override        publicvoidrun() {            //            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 = newArrayList<long>();    publicvoidclick2(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 = newArrayList<long>();    publicvoidclick2(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 = newlong[2];    publicvoiddoubleClick() {        // 双击事件响应        /**         * 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 ... 
随机推荐
- MySQL -1- 简介及安装
			第一章 MySQL 大纲介绍 1.官方定义的MySQL DBA工作内容 (1)运维DBA 初级:各版本.各平台安装搭建.升级 中级:体系结构原理.基础管理(启动关闭.初始化配置文件管理.多实例管理.用 ... 
- 更新到.netcore3.0后找不到dotnet-ef的解决办法
			在项目根目录下建立global.json文件 { "sdk": { "version": "2.2.402" } } 或使用命令 dotne ... 
- Spring Security框架进阶、自定义登录
			1.Spring Security框架进阶 1.1 Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安 ... 
- C#模态对话框和非模态对话框
			模态对话框弹出窗口阻止调用窗口的所有消息响应.只有在弹出窗口结束后调用窗口才能继续.在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值. 非模态对话框可以在弹出窗口和调用 ... 
- Java作业  题目:16版.情人节送玫瑰花
			题目:16版.情人节送玫瑰花 题干: 1.实验要求 本实验要求:以情人节送花为业务背景,体验自定义异常以及异常处理机制. 1-1. 业务说明: 1-1.1. 本实验以情人节送花为业务背景,女方提出送花 ... 
- 软考题型—PERT图(项目计划评审技术)
			经历过软件危机和大量软件项目的失败,人们对软件工程产业现状进行分析后,得出普遍性结论便是:软件项目成功率低的原因很可能就是项目管理能力太弱.由于软件本身的特殊性和复杂性,将项目管理思想引入软件工程领域 ... 
- Python和mysql的连接
			python与mysql的连接: 说明:前提是已近安装了mysql以及可视化工具(本人装的是Navicat) 1.在cmd下下载Python的第三方数据库包:pip install pymysql: ... 
- 图数据库:AgensGraph
			文章目录 AgensGraph简介 官网及下载 安装AgensGraph 上传并解压 添加agens用户 配置.bashrc 初始化并启动 初始化数据库 启动数据库 执行交互式终端 图数据库基础概念 ... 
- java实现spark常用算子之cartesian
			import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ... 
- 吴恩达机器学习101:SVM优化目标
			1.为了描述SVM,需要从logistic回归开始进行学习,通过改变一些小的动作来进行支持向量机操作.在logistic回归中我们熟悉了这个假设函数以及右边的sigmoid函数,下式中z表示θ的转置乘 ... 
