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

转载于:https://www.cnblogs.com/rabbit-bunny/p/4252331.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值