在Android中给我们提供了单次点击事件。但并没有给我们提供双击,或者实现在一定时间内的多次事件。所以需要我们自己在单机监听上进行修改实现。

有如下两种实现方式:

1、定义一个存贮上一个第一次点击的变量,如果两次时间间隔小于500毫秒,则认为是双击时间。

实现如下:

  1.  
    package com.andy.doubleclick;
  2.  
     
  3.  
    import android.app.Activity;
  4.  
    import android.os.Bundle;
  5.  
    import android.os.SystemClock;
  6.  
    import android.view.View;
  7.  
    import android.widget.Toast;
  8.  
     
  9.  
    /**
  10.  
    * @author Zhang,Tianyou
  11.  
    * @version 2014年12月02日 上午10:51:56
  12.  
    */
  13.  
     
  14.  
    public class MainActivity extends Activity {
  15.  
     
  16.  
    @Override
  17.  
    protected void onCreate(Bundle savedInstanceState) {
  18.  
    super.onCreate(savedInstanceState);
  19.  
    setContentView(R.layout.activity_main);
  20.  
    }
  21.  
     
  22.  
    private long startClickTime;
  23.  
     
  24.  
    public void click(View view) {
  25.  
    long nextClickTime = SystemClock.uptimeMillis();
  26.  
    if (startClickTime <= 0) {
  27.  
    startClickTime = SystemClock.uptimeMillis();
  28.  
    return ;
  29.  
    }else {
  30.  
    if (nextClickTime - startClickTime < 500) {
  31.  
    Toast.makeText(this, "被双击了", Toast.LENGTH_SHORT).show();
  32.  
    startClickTime = 0L;
  33.  
    } else {
  34.  
    startClickTime = SystemClock.uptimeMillis();
  35.  
    }
  36.  
     
  37.  
    }
  38.  
     
  39.  
    }
  40.  
     
  41.  
    }

这种方式有个缺陷,如果要实现多次点击,那么就需要定义存贮多个事件点的变量,很显然不适合多次点击的处理。

2、使用Google提供的api中采用的算法。

能够实现n次点击事件,我们需要定义一个n长度的数组,每点击一次将数组里的内容按序号整体向左移动一格,然后给n-1出即数组的最后添加当前的时间,如果0个位置的时间大于当前时间减去500毫秒的话,那么证明在500毫秒内点击了n次。

实现如下:

  1.  
    package com.andy.doubleclick;
  2.  
     
  3.  
    import android.app.Activity;
  4.  
    import android.os.Bundle;
  5.  
    import android.os.SystemClock;
  6.  
    import android.view.View;
  7.  
    import android.widget.Toast;
  8.  
     
  9.  
    /**
  10.  
    * @author Zhang,Tianyou
  11.  
    * @version 2014年12月02日 上午10:51:56
  12.  
    */
  13.  
     
  14.  
    public class MainActivity extends Activity {
  15.  
     
  16.  
    @Override
  17.  
    protected void onCreate(Bundle savedInstanceState) {
  18.  
    super.onCreate(savedInstanceState);
  19.  
    setContentView(R.layout.activity_main);
  20.  
    }
  21.  
     
  22.  
     
  23.  
    long[] mHits = new long[2];
  24.  
    public void click(View view){
  25.  
    //每点击一次 实现左移一格数据
  26.  
    System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
  27.  
    //给数组的最后赋当前时钟值
  28.  
    mHits[mHits.length - 1] = SystemClock.uptimeMillis();
  29.  
    //当0出的值大于当前时间-500时 证明在500秒内点击了2次
  30.  
    if(mHits[0] > SystemClock.uptimeMillis() - 500){
  31.  
    Toast.makeText(this, "被双击了", Toast.LENGTH_SHORT).show();
  32.  
    }
  33.  
    }
  34.  
     
  35.  
    }

这种能够实现n此事件的点击,只需将数组长度定义为n个长度。

System.currentTimeMillis() 和 SystemClock.uptimeMillis()的区别:

在Api上是这么说的:

  • System.currentTimeMillis() is the standard "wall" clock (time and date) expressing milliseconds since the epoch. The wall clock can be set by the user or the phone network (see setCurrentTimeMillis), so the time may jump backwards or forwards unpredictably. This clock should only be used when correspondence with real-world dates and times is important, such as in a calendar or alarm clock application. Interval or elapsed time measurements should use a different clock. If you are using System.currentTimeMillis(), consider listening to the ACTION_TIME_TICKACTION_TIME_CHANGED and ACTION_TIMEZONE_CHANGED Intent broadcasts to find out when the time changes.

  • SystemClock.uptimeMillis is counted in milliseconds since the system was booted. This clock stops when the system enters deep sleep (CPU off, display dark, device waiting for external input), but is not affected by clock scaling, idle, or other power saving mechanisms. This is the basis for most interval timing such as Thread.sleep(millls)Object.wait(millis), and System.nanoTime(). This clock is guaranteed to be monotonic, and is suitable for interval timing when the interval does not span device sleep. Most methods that accept a timestamp value currently expect the uptimeMillis clock.

  • SystemClock.elapsedRealtime and elapsedRealtimeNanos return the time since the system was booted, and include deep sleep. This clock is guaranteed to be monotonic, and continues to tick even when the CPU is in power saving modes, so is the recommend basis for general purpose interval timing.

SystemClock.elapsedRealtime : 从开机到现在的毫秒书(手机睡眠(sleep)的时间也包括在内)

System.currentTimeMillis() :从1970年1月1日 UTC到现在的毫秒数,是可以通过System.setCurrentTimeMillis修改的,那么,在某些情况下,一但被修改,时间间隔就不准了。

SystemClock.uptimeMillis :  它表示的是手机从启动到现在的运行时间,且不包括系统sleep(CPU关闭)的时间,很多系统的内部时间都是基于此,比如Thread.sleep(millls)Object.wait(millis), and System.nanoTime()它表示的是手机从启动到现在的运行时间,且不包括系统sleep(CPU关闭)的时间,很多系统的内部时间都是基于此,比如Thread.sleep(millls)Object.wait(millis), and System.nanoTime()

转自:https://blog.csdn.net/fengshizty/article/details/41675923

Android开发之实现多次点击事件的更多相关文章

  1. Android开发-之监听button点击事件

    一.实现button点击事件的方法 实现button点击事件的监听方法有很多种,这里总结了常用的四种方法: 1.匿名内部类 2.外部类(独立类) 3.实现OnClickListener接口 4.添加X ...

  2. Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题。

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之去掉listview的点击效果,一行代码间接粗暴,解决你的问题. 当你在用list ...

  3. Android实现监听控件点击事件

    Android实现监听控件点击事件 引言 这篇文章主要想写一下Android实现监听点击事件的几种方法,Activity和Fragment实现起来有些方法上会有些不同,这里也略做介绍. 最近一直在忙一 ...

  4. Android开发——Accessibility机制实现模拟点击(微信自动抢红包实现)

    1. 何为Accessibility机制 许多Android使用者因为各种情况导致他们要以不同的方式与手机交互.对于那些由于视力.听力或其它身体原因导致不能方便使用Android智能手机的用户,And ...

  5. Android开发 ---基本UI组件4:拖动事件、评分进度条、圆圈式进度条、进度条控制

    Android开发 ---基本UI组件4 1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding=" ...

  6. Android开发之PullToRefresh的Click点击事件的监听实现长按删除Item

    本文为原创博客.出自http://blog.csdn.net/minimicall 到今天为止,搜芽的卖家版本号应该来说已经基本完毕.攻坚克难的一路过来.速度也控制的比較好. 项目过程进度 从任务分配 ...

  7. Android ImageView图片透明区域不响应点击事件,不规则图片透明区域响应点击事件

    转载:http://blog.csdn.net/aminfo/article/details/7872681 经常会在项目中用到透明图片,不规则图片,特别是做游戏的时候,需要对图片的透明区域的点击事件 ...

  8. Android TextView 高亮字体并添加点击事件

    运行效果 package com.zutil.lib; import android.graphics.Typeface; import android.os.Bundle; import andro ...

  9. android 组合控件接收不到点击事件的问题

    android点击事件的传播是有子控件传给父控件,如果子控件处理过了,父控件不再处理,所以要想让组合控件接收点击事件,必须屏蔽子控件的点击事件. 设置组合控件的clickable和focusable属 ...

随机推荐

  1. C语言入门教程-(6)运算符

    1.运算符概述 运算符是一种编译器执行特定的数学或逻辑操作的符号.C语言提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 其他运算符 2.算术运算符 算术 ...

  2. [C++]指针/指针数组/数组指针/多维指针/单值指针/多值指针

    int main(){ //单值指针(指向单个值得指针,类同普通变量) int *px = new int; *px = 100; printf("%d",*px); delete ...

  3. 第16月第5天 performSelector afterDelay cancel dispatch_semaphore_wait

    1. //不延时,可能会导致界面黑屏并卡住一会 [self performSelector:@selector(startScan) withObject:nil afterDelay:0.3]; - ...

  4. python - 添加文件环境变量

    #添加  当前文件目录 import sys,os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE ...

  5. Maven继承

    继承为了消除重复,可以把pom 中很多相同的配置提取出来:如:grouptId, version 等. 在使用的时候子工程直接继承父工程的依赖版本号,子工程中不再需要指定具体版本号,方便统一管控项目的 ...

  6. ubuntu 禁用 nouveau 方法

    (1)直接移除这个驱动(备份出来) $ mv /lib/modules/4.4.0-31-generic/kernel/drivers/gpu/drm/nouveau/nouveau.ko /lib/ ...

  7. GitHub:Awesome-Hacking(黑客技能列表-恶意代码)

    0 初衷 GitHub这一份黑客技能列表很不错,包含了多个方向的安全.但目前我关注只有逆向工程与恶意代码,所以其他的被暂时略过. 虽然很感谢作者的辛勤付出,但并不打算复制粘贴全套转载.逐条整理是为了从 ...

  8. phantomjs 下拉滚动条获取网页的全部源码

    //codes.js var system = require('system'); var fs = require("fs"); //console.log('Loading ...

  9. uoj#188. 【UR #13】Sanrd(Min_25筛)

    题面 传送门 题解 这是一道语文题 不难看出,题目所求即为\(l\)到\(r\)中每个数的次大质因子 我们考虑\(Min\_25\)筛的过程,设 \[S(n,j)=\sum_{i=1}^nsec_p( ...

  10. @Html.Action()

    背景 在这里主要想谈下mvc,最初几年都是用的webform,作为一个资深傻瓜程序员多年,后来到处听说mvc,终于在某天下定决心实验下mvc,其实关键还是在于easyui,因为它的请求数据方式和mvc ...