双击事件,三击...多击事件的实现
按钮双击事件的实现:
private long firstClickTime;//记录第一次按下的时间 //按钮双击事件的实现 public void click(View view){ if(firstClickTime>0){ long sencondClickTime = SystemClock.uptimeMillis();//手机开机到现在的时间 long dtime = sencondClickTime - firstClickTime; if(dtime<500){ Toast.makeText(this, "双击了", 0).show(); }else{ firstClickTime = 0; } return; } firstClickTime = SystemClock.uptimeMillis(); //解决按一次就不按了的bug new Thread(){ public void run() { try { Thread.sleep(500);//保证按下500ms后,能清零第一次按下的时间 } catch (InterruptedException e) { e.printStackTrace(); } firstClickTime = 0; }; }.start(); }
线程的作用:比如,在当前界面只按下一次,停留一段时间再去双击,此时的第一击的时间肯定超过第一次按下的500ms的时间,所以此时的第一击使第一次按下的时间为0,第二击就不能触发双击事件了
更牛逼的实现方式:
/** * 双击事件,三击的事件.... */ private long[] mHits = new long[2];//记录击打的时间,2代表2击,需要实现三击,只需要改变该数组的长度为3,以此类推 public void btnOnClick(View v){ /* * 参数1:拷贝的源数组, 参数2:从源数组的哪个位置开始拷贝,参数3:目标数组(拷贝到这个数组) * 参数4:从目标数组的哪个位子开始写数据, 参数5:拷贝的元素的个数 */ System.arraycopy(mHits, 1, mHits, 0, mHits.length-1);//数组移位的实现 mHits[mHits.length-1] = SystemClock.uptimeMillis();//手机开机至今的时间放到数尾 //数组尾减头的时间差大于500ms if(mHits[0] >= (SystemClock.uptimeMillis()-500)){ Toast.makeText(getApplicationContext(), "多击了按钮", 0).show(); } }
过程图如下,