首先,看普通双击事件的实现:
public class MainActivity extends AppCompatActivity { private ImageView mImage; private Button mButton; private long startTime = 0; //首次点击时间 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { mButton = (Button) findViewById(R.id.button); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //我们假设两次点击的时间间隔小于500ms为双击事件 if (startTime != 0){ long endTime = System.currentTimeMillis();//获取当前点击事件的时间戳 if ((endTime - startTime) <= 500){ Toast.makeText(MainActivity.this,"这是一次双击事件。。。",Toast.LENGTH_SHORT).show(); } } startTime = System.currentTimeMillis(); } }); } }
这里实现很简单,(假定我两次点击的时间间隔小于等于500ms即视为双击。)就是我点击第一次的时候记录第一次点击的时间戳,然后在第二次点击时判断是否是第一次点击,若不是,记录第二次点击的时间戳,然后用第二次的点击时间减去第一次的时间,比较即可。
下面是多击事件的实现思路以及演示实例:
这里用的是System.arrayCopy()方法,系统自带用于拷贝数组的一个方法,
该方法有五个参数,我们先来看一下它们都代表什么意思,
参数一:src 是我们要拷贝的源数组;
参数二:srcPos 这是拷贝原数组的指定索引,就是从原数组的第几个元素开始拷贝;
参数三:dest 指的是我们要拷贝到的目标数组;
参数四: destPos 就是我们指定目标数组接受的起始索引位置;
参数五:length 拷贝的长度,就是可以指定目标数组的拷贝长度,不一定要全部拷贝。
下图是arrayCopy的api文档:
当然,我们看到原数组与目标数组可以是同一个数组,但是实现原理是先将,原数组的需要拷贝的子数组拷贝到一个长度为length的临时数组,然后将该临时数组拷贝到目标数组,也就是原数组啦。
我们这里实现就是用的这种方式,先指定一个数组来记录我们要做的是“几击事件”。
先贴出代码吧。
public class MainActivity extends AppCompatActivity { private ImageView mImage; private Button mButton; private long[] mHits = new long[3];//先声明一个long类型的数组,数组的长度为3表示我要处理的是一个三击事件 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initUi(); } private void initUi() { mButton = (Button) findViewById(R.id.button); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.arraycopy(mHits,1,mHits,0,mHits.length-1); mHits[mHits.length-1] = System.currentTimeMillis(); if ((mHits[mHits.length-1] - mHits[0]) < 500){ Toast.makeText(MainActivity.this,"这是一次三击事件。。。",Toast.LENGTH_SHORT).show(); } } }); } }例如我这里声明一个mHits[]数组,如mHits[3],表示我要做的是三击处理,当我点击的时候:如下图
当点击第一次的时候,从原数组的第一个索引开始拷贝到目标数组的第一个索引位置,拷贝长度为length-1,由于我们的目标数组跟原数组是一个数组,我们发现目标数组的最后一个元素没有被拷贝,所以,在下面,我们有
mHits[mHits.length-1] = System.currentTimeMillis();将目标数组的最后一个设置成了当前点击时的时间戳;
一次类推,看图我们可以分析到,最后我们数组里记录的就是三次点击时的时间戳,只要最后一个元素的值减去第一个元素值,我们再判断这个值跟我们预设的时间间隔是否有出入就实现啦。。
似不似很简单呀。希望对大家有帮助。