Android实现连续点击多次事件的代码详解
作者:妖久 发布时间:2022-02-09 23:28:28
有时候我们需要实现这样的场景,类似进入开发者模式,即多次点击后执行操作。
首先我们先看一个方法:
System提供的一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
src:源数组;
srcPos:源数组要复制的起始位置;
dest:目的数组;
destPos:目的数组放置的起始位置;
length:复制的长度。
注意:src and dest都必须是同类型或者可以进行转换类型的数组.
final static int COUNTS = 4;// 点击次数
final static long DURATION = 1000;// 规定有效时间
long[] mHits = new long[COUNTS];
首先我们定义次数,规定的有效时间,还有对应的数组,即我们要在一秒钟内点击4次才有效
@Override
public void onClick(View v) {
continuousClick(COUNTS, DURATION);
}
private void continuousClick(int count, long time) {
//每次点击时,数组向前移动一位
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
//为数组最后一位赋值
mHits[mHits.length - 1] = SystemClock.uptimeMillis();
if (mHits[0] >= (SystemClock.uptimeMillis() - DURATION)) {
mHits = new long[COUNTS];//重新初始化数组
Toast.makeText(this, "连续点击了4次", Toast.LENGTH_LONG).show();
}
}
思路:首先我们点击的时候都将数组向左移动一位,将时间赋值给最后一位,从上面的代码中我们可以看出当我们点击了四次,那么最后一位就已经被移到了第一位,然后我们比较时间:
mHits[0] >= (SystemClock.uptimeMillis() - DURATION)
如果是在我们规定的时间内,那么就生效,执行我们所要的操作。
SystemClock.uptimeMillis():手机开机到现在的时间。
注意:执行操作后需要从新初始化数组:mHits = new long[COUNTS];
否则点击第六次第七次的时候也会触发事件。
ps:Android控件的两次及多次点击事件
自己模拟了一个Button的双击事件,想到三击事件要怎么写呢?通过查看Google大牛的多次点击的事件,发现我的学渣真是难以望其项背。。。
多次点击事件的原理:记录每次点击事件的当前时间,判断最后一次点击与第一次点击事件的时间的差值,如果小于500ms(可以自己定义这个值),认为是多次点击事件。下面以3次点击事件为例写一个代码。
1,mHits数组长度相当于点击点击次数。也就是说现在数组长度为3,我们可以监听快速点击3次的事件。
2,System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
数组的复制,第一个参数:要被拷贝的数组;第二个参数:从哪个位置开始拷贝(这里就是从1开始);第三个参数:目标数组;第四个参数:从目标数组的哪个位置开始存放(这里是从0开始);第五个参数:拷贝的长度。通过这个方法,我们实现了对每一个点击事件的时间进行记录,可以判断任意连续3次点击是否视为3击事件。
3,if (mHits[0] >= (mHits[mHits.length - 1] - 500)){}
:这个用来判断是否是3击事件 ,判断数组中下标为2的点击事件的时间与数组中下标为0的点击事件的时间差值是否小于500;若小于500认为是3击事件,处理写在{}中;否则不为3击事件。
package cn.com.cyj.doubleclick;
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
// 数组长度代表点击次数
long[] mHits = new long[3];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 双击事件
* @param v
*/
public void click(View v) {
// 数组依次先前移动一位
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
mHits[mHits.length - 1] = SystemClock.uptimeMillis();// 开机后运行时间
if (mHits[0] >= (mHits[mHits.length - 1] - 500)) {
Toast.makeText(this, "3连击", Toast.LENGTH_LONG).show();
}
}
}
总结
以上所述是小编给大家介绍的Android实现连续点击多次事件的代码详解网站的支持!
来源:https://www.cnblogs.com/tangZH/archive/2018/10/22/9832171.html


猜你喜欢
- 在《Android Handler之消息循环的深入解析》中谈到了Handler是用于操作线程内部的消息队列,所以Handler可以用来线程间
- 简单的IM聊天程序由于项目需要做一个基于XMPP协议的Android通讯软件。故开始研究XMPP。XMPP协议采用的是客户端-服务器架构,所
- 一、简介前面介绍了平时用到的大多数的多线程的例子,但在实际开发中使用的线程往往是大量的和更为复杂的,这时,每次都创建线程、启动线程。从性能上
- 一.什么是多渠道打包在不同的应用市场可能有不同的统计需求,需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包。在安装包
- 前面写过了使用ViewFlipper和ViewPager实现屏幕中视图切换的效果(ViewPager未实现轮播)附链接:ANDROID中使用
- 本篇文章介绍selenium 操作浏览器阅读目录浏览器最大化 前进,后退, 刷新截图操作模拟鼠标操作杀掉Windows浏览器进程浏览器最大化
- 一:软键盘自动弹出。private EditText top_middle;//输入框//-------------------------
- 本文实例讲述了Java输入输出流。分享给大家供大家参考,具体如下:字节输出流,输出到文件中(写)OutputStream抽象类选好文件Fil
- 很认真的写的一个java版的贪吃蛇游戏,图形界面,支持菜单操作,键盘监听,可加速,减速,统计得分,设定运动速度,设定游戏背景颜色等!应该没有
- 本文实例讲述了Android编程ProgressBar自定义样式之动画模式实现方法。分享给大家供大家参考,具体如下:忘记在哪里看到的那位仁兄
- 使用 transient 修饰private transient String noColumn;使用 static 修饰private s
- 本文实例讲述了Java获取UTC时间的方法。分享给大家供大家参考,具体如下:取得本地时间:java.util.Calendar cal =
- 最近有时间,写一些很简单、很基础的东西,主要在操作层面。主要考虑如下: 1、经常搭建开发环境,所以有必要记录一下,自己也可以备查; 2、给新
- 声明:本文中资源全部收集整理于网络并无偿提供,仅可用于个人学习交流;请勿转载、售卖或商用;侵权联删!免责声明:本教程所有资源均来源于网络;仅
- 本次主要分享的是3个免费的二维码接口的对接代码和测试得出的注意点及区别,有更好处理方式多多交流,相互促进进步;最近在学习JavsScript
- java 中ArrayList与LinkedList性能比较今天看一框架的代码,看到有些 可以使用ArrayList的地方 使用的是 Lin
- 目录操作创建目录File类中有两个方法可以用来创建文件夹:mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败
- 前言相信大家都用过Spring Security和Shiro的框架,Spring Security必须配合Spring 全家桶使用和繁琐的配
- 1. 数据类型:在Java源代码中,每个变量都必须声明一种类型(type)。Java数据类型(type)可以分为两大类:基本类型(primi
- 导读Lombok:可以让你的POJO代码特别简洁,不止简单在BO/VO/DTO/DO等大量使用,还有设计模式,对象对比等MybatisPlu