要实现双击,你需要保存第一次点击时的时间,需要使用到变量,之后便是与第二次点击时的时间比较,看时间间隔是否在你设定的时间内(比如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中实现双击(多击)事件的更多相关文章

  1. Android Listview中Button按钮点击事件冲突解决办法

    今天做项目时,ListView中含有了Button组件,心里一早就知道肯定会有冲突,因为以前就遇到过,并解决过,可惜当时没有记录下来. 今天在做的时候,继续被这个问题郁闷了一把,后来解决后,赶紧来记录 ...

  2. 查找和定位Android应用的按钮点击事件的代码位置基于Xposed Hook实现

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80956455 在进行Android程序的逆向分析的时候,经常需要通过Androi ...

  3. Android中ListView无法点击

    Android中ListView无法点击 转自:http://xqjay19910131-yahoo-cn.iteye.com/blog/1319502   问题描述: ListView中Item加入 ...

  4. Android Button四种点击事件和长按事件

    项目XML代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr ...

  5. robot framework程序运行过程中,遇到点击事件之后,未出现点击之后的效果(求解)

    1.click Element操作,在实际过程中偶然会出现,日志显示已点击成功,但是实际自动化页面,没有点击成功之后的操作 现象: 现象描述:程序执行到点击侧边栏的[人员信息]之后,日志显示已经点击成 ...

  6. Android 响应webview中图片的点击事件

    最近碰到个新需求需要点击webview中的图片进行放大显示. 整理了下思路,想到了下面的一个可行的方案. 方案思路, 1.在点击图片的时候调用本地的java方法并给出响应的图片地址 2.本地获得图片地 ...

  7. Android学习---ListView的点击事件,simpleAdapter和arrayadapter,SimpleCursoAdapter的原理和使用

    如题,本文将介绍 listview的点击事件,simpleAdapter和arrayadapter的原理和使用. 1.ListView的注册点击事件 //注册点击事件 personListView.s ...

  8. android 入门 003 (点击事件)

    点击事件 有四种实现方式. 1.内部类实现方式 1.0 package cn.rfvip.clickevent; import android.app.Activity; import android ...

  9. android中ListView控件&&onItemClick事件中获取listView传递的数据

    http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...

随机推荐

  1. poj2773(欧基里德算法 或 二分+容斥)

    题目链接:https://vjudge.net/problem/POJ-2773 题意:给定m,k,求与m互质的第k个数. 思路一:利用gcd(a,b)=gcd(b*t+a,b)知道,与m互质的数是以 ...

  2. 786B - Legacy(线段树 + 最短路)线段树优化建图

    题意: 就是给定一张n nn个点的图,求源点s ss到每个点的单源最短路.这张图共有q组边,连边方式有3种: a→b ,边权为w的单向边:a→[l,r] ,即a到连续区间[l,r]中的每一个点都有一条 ...

  3. P1397 [NOI2013]矩阵游戏

    传送门 首先显然可以矩乘快速幂然后 $T$ 飞 看一眼题解发现因为这一题矩阵的特殊性所以可以对矩阵的次数欧拉降幂 然而我并不懂证明,所以我选择暴力乱搞的做法 十进制快速幂,然后注意一下常数,还有矩阵乘 ...

  4. 用C#控制台编写 推箱子之类的 坐标移动----之二维坐标

     //首先用枚举 列出方向  上,下,左,右(枚举的最后一位数后不用符号  否则会报错)        public enum dro    {       up = 1,        down = ...

  5. jse中将数据反转

    public class test { public static void main(String args[]){ String arr[]={"1","2" ...

  6. javaScript运动框架之缓冲运动

    缓冲运动 逐渐变慢,最后停止 距离越远速度越大   速度由距离决定 速度=(目标值-当前值)/缩放系数 存在Bug 速度取整 跟随页面滚动的缓冲侧边栏 潜在问题:目标值不是整数时 缓冲运动的停止条件 ...

  7. java 并发编程lock使用详解

    浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其 ...

  8. leetcode34. 在排序数组中查找元素的第一个和最后一个位置

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...

  9. wordpress的固定链接问题

    在安装完wordpress后,按照其方法在/etc/apache2/sites-available/000-default.conf文件中添加了下述代码中的加重部分: [...] ServerAdmi ...

  10. zabbix 图形注释乱码

    1.寻找字体文件 1.1 首先需要找到zabbix后台的字体文件路径,字体文件的后缀为.ttf [root@zabbix ~]# cd /usr/share/zabbix/ [root@zabbix ...