Android中实现双击(多击)事件
第一种,容易想到的方法。
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),再次双击(多击)如何保证得到正确的响应。
第二种,换种方式存储变量
List<Long> times = new ArrayList<Long>(); public void click2(View view) { times.add(SystemClock.uptimeMillis()); if (times.size() == 2) { if (times.get(1)-times.get(0) < 500) { times.clear(); Toast.makeText(this, "第一种双击方式", 0).show(); } else { times.clear(); times.add(SystemClock.uptimeMillis()); } } }在第二种方式中,使用List存放点击时的时间。现在来分析一下这个实现的原理:
1、如何判断是第二次点击?
2、如何消除间隔一段时间的点击事件的影响?
List<Long> times = new ArrayList<Long>(); public void click2(View view) { times.add(SystemClock.uptimeMillis()); if (times.size() == 3) { if (times.get(2)-times.get(0) < 500) { times.clear(); Toast.makeText(this, "第一种双击方式", 0).show(); } else { times.clear(); times.add(SystemClock.uptimeMillis()); } } }真正需要改变的只是两个判断条件!!
第三种,谷歌程序员的写法。
/** * 双击事件、多击事件 */ //存储时间的数组 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 } }非常简洁,思想差不多,不过谷歌工程师是利用数组移位操作来消除第二个问题的影响的。而要实现多击事件,只需修改数组长度即可。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。