一、第一种双击方式:
在这里用到Android开发者最青睐的一种注入框架ButterKnife来写了一个点击事件,他可以节省很多的代码,后面可能会讲,此处不再赘述!我们知道,android有一个System.currentTimeMills()方法:该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。此处,我们运用了点击View两次的时间差来实现双击,双击时间间隔为800ms。
//以下为双击实现的第一种方式:
@OnClick(R.id.btn_img)
public void clickImg(){
if(System.currentTimeMillis()-mClickTime<800){
//此处做双击具体业务逻辑
}
else{
mClickTime=System.currentTimeMillis();
//表示单击,此处也可以做单击的操作
}
}
二、第二种双击方式:
第二种双击方式和第一种双击方式,思想差不多,都是运用时间间隔来实现双击(记录前后两次双击时间,得出时间差),这里运用了Android里面另一种时间方法SystemClock.uptimeMillis(),他可以获取从开机到现在的毫秒数(但手机睡眠的时间不包括在内)。我们首先判断firstClickTime>0(是否已经点了一次),如果是true,这是第二次点击。 做secondClickTime= SystemClock.uptimeMillis(),接着判断secondClickTime-firstClickTime<500。如果true,则是双击。否则我们重新让 firstClickTime=SystemClock.uptimeMillis();然后new一个线程延时0.5s,如果5s过后还是没有点击,那么做firstClickTime=0;
,
private long firstClickTime=0;
private long secondClickTime=0;
@OnClick(R.id.btn_first)
public void click1(){
if(firstClickTime>0){
secondClickTime= SystemClock.uptimeMillis();// 从开机到现在的毫秒数(手机睡眠的时间不包括在内)
if(secondClickTime-firstClickTime<500){
//双击业务逻辑
}
firstClickTime=0;
return;
}
firstClickTime=SystemClock.uptimeMillis();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(500);
firstClickTime=0;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
三、第三种双击方式
第三种方式用到了存储变量的方式:他将时间存储在了集合中,点击一次就将时间存到集合,当集合长度为2的时候(也就是点击了两次时候),我们判断集合中的最后一次点击的时间与第一次点击的时间差是否小于0.5s,若果true,则就是双击,并将集合清空;否则,移除第一次点击的时间,将第二次点击时间作为第一次。这种实现的双击,可以实现三击、四击以及多击,只需改变集合的长度即可!
List<Long> times=new ArrayList<Long>();
@OnClick(R.id.btn_second)
public void click2(){
times.add(SystemClock.uptimeMillis());
if(times.size()==2){
//已经完成一次双击,list可以清空了
if(times.get(times.size()-1)-times.get(0)<500){
times.clear();
//双击业务逻辑
}else{
//这种情况下,第一次点击的时间已经没用了,第二次就是第一次
times.remove(0);
}
}
}
四、第四种双击方式
这是google程序员常用的一种方式。在介绍这种方法之前,我首先要介绍一个Android系统中的方法:
System.arraycopy(int src[],int srcPos,int dst[],int dstPos,int length)
- arraycopy:拷贝数组
- src:要拷贝的源数组
- srcPos:源数组开始拷贝的下标位置
- dst:目标数组
- dstPos:开始存放的下标位置
- length:要复制元素的个数
他的代码实现方式如下,他和第三种方式差不多,也是 存储时间,这里方法arraycopy用来实现数组的移位,,每当移位一次,就将第二次点击的时间赋给mHites[0],这样就可以用500>(SystemClock.uptimeMillis()-mHits[0])来判断双击,这种方式也可以实现多击(改变数组长度即可);
long[] mHits =new long[2];
@OnClick(R.id.google_btn)
public void clickGoogle_btn(){
//实现数组的位移操作,点击一次,左移一位,末尾补上当前开机时间(cpu时间)
System.arraycopy(mHits,1,mHits,0,mHits.length-1);
mHits[mHits.length-1]=SystemClock.uptimeMillis();
if(500>(SystemClock.uptimeMillis()-mHits[0])){
//此处执行双击事件
}
}