Android的多击事件实现

来源:互联网 发布:链表反转 递归java 编辑:程序博客网 时间:2024/05/17 08:33

首先,看普通双击事件的实现:

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();
将目标数组的最后一个设置成了当前点击时的时间戳;

一次类推,看图我们可以分析到,最后我们数组里记录的就是三次点击时的时间戳,只要最后一个元素的值减去第一个元素值,我们再判断这个值跟我们预设的时间间隔是否有出入就实现啦。。

似不似很简单呀。希望对大家有帮助。

阅读全文
1 0
原创粉丝点击