Android中实现双击(多击)事件

第一种,容易想到的方法。

要实现双击,你需要保存第一次点击时的时间,需要使用到变量,之后便是与第二次点击时的时间比较,看时间间隔是否在你设定的时间内(比如500ms)。

	long firstClickTime = 0;
	long secondClickTime = 0;
	public void click1(View view) {
		if (firstClickTime > 0) {
			secondClickTime = SystemClock.uptimeMillis();
			if (secondClickTime - firstClickTime < 500) {
				Toast.makeText(this, "第一种双击方式", 0).show();
			}
			firstClickTime = 0;
			return ;
		}
		firstClickTime = SystemClock.uptimeMillis();

		new Thread(new Runnable() {

			@Override
			public void run() {
				//
				try {
					Thread.sleep(500);
					firstClickTime = 0;
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		}).start();
	}

双击事件(多击事件)中有两个重要的问题需要考虑:第一次点击的时间,最后(如何知道是“最后”)点击的时间;点击一次后,等待一段时间(比如2s),再次双击(多击)如何保证得到正确的响应。

上面的代码解决了这两个问题,但不够效率,也很复杂。它是通过一个变量存储第一次点击的时间,通过判断这个变量的大小来判断是不是第二次点击,解决第一个问题;再加上子线程的sleep方法,500ms内如果没有第二次点击,变量就重置了,解决了第二个问题。

但是这种方式解决双击事件还算凑合,那么三击、四击……如何解决了?

第二种,换种方式存储变量

	List<Long> times = new ArrayList<Long>();
	public void click2(View view) {
		times.add(SystemClock.uptimeMillis());
		if (times.size() == 2) {
			if (times.get(1)-times.get(0) < 500) {
				times.clear();
				Toast.makeText(this, "第一种双击方式", 0).show();
			} else {
				times.clear();
				times.add(SystemClock.uptimeMillis());
			}
		}
	}

在第二种方式中,使用List存放点击时的时间。现在来分析一下这个实现的原理:

1、如何判断是第二次点击?

通过链表的长度,每次点击list的长度加1,当为2时,表示点击了两次。

2、如何消除间隔一段时间的点击事件的影响?

如果是正常的双击,点击两次就完成一次“轮回”,之前保存的时间数据已经使用完毕了,需要清除掉,具体操作就是将List清空。而如果是点击一次后,第二次点击相隔时间较长,那个第一次点击的时间已经没有用处了,就直接将第二次点击视为“第一次”点击,具体而言就是清空List,add第二次的点击事件。

这个方法,比起第一种方法效率要好得多,而且非常容易扩展到三击、四击……事件。比如:

	List<Long> times = new ArrayList<Long>();
	public void click2(View view) {
		times.add(SystemClock.uptimeMillis());
		if (times.size() == 3) {
			if (times.get(2)-times.get(0) < 500) {
				times.clear();
				Toast.makeText(this, "第一种双击方式", 0).show();
			} else {
				times.clear();
				times.add(SystemClock.uptimeMillis());
			}
		}
	}

真正需要改变的只是两个判断条件!!

第三种,谷歌程序员的写法。

下面是谷歌所写的三击方法,我改写成了双击的方法

	/**
	 * 双击事件、多击事件
	 */
	//存储时间的数组
	long[] mHits = new long[2];
	public void doubleClick() {
		// 双击事件响应
		/**
		 * arraycopy,拷贝数组
		 * src 要拷贝的源数组
		 * srcPos 源数组开始拷贝的下标位置
		 * dst 目标数组
		 * dstPos 开始存放的下标位置
		 * length 要拷贝的长度(元素的个数)
		 *
		 */
		//实现数组的移位操作,点击一次,左移一位,末尾补上当前开机时间(cpu的时间)
		System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
		mHits[mHits.length - 1] = SystemClock.uptimeMillis();
		//双击事件的时间间隔500ms
		if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
            //双击后具体的操作
			//do
		}
	}

非常简洁,思想差不多,不过谷歌工程师是利用数组移位操作来消除第二个问题的影响的。而要实现多击事件,只需修改数组长度即可。

时间: 2024-10-01 01:06:44

Android中实现双击(多击)事件的相关文章

Android中按钮的点击事件的四种写法

如题,在Android中按钮的点击事件有四种写法,如下图. 界面为四个Button+一个TextView+一个ImageView activity_main布局文件如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="

android中多次点击事件的实现

1.在android系统中,设置里面->关于手机->安卓版本(即android version),三击后会出现android该个版本的版本号,以及一些动图,算是一个彩蛋吧! 2.导入setting源代码,ctrl+h搜索文件(关键字Android Version),搜索到了之后打开xml文件 3.是一个strings.xml文件,再次找到关键字firmware_version,再搜索.找到src下的源代码文件 4.又找到一个关键字KEY_FIRMWARE_VERSION,翻一翻找到关于多次点击

[android篇]textview中片段响应点击事件(SpannableString)

项目需求 点击textView中的一小段文字,弹一个dialog框 失败解决方案 刚开始是用了两个textView水平布局,可想而知,当第一个textView快占满一行,还未换行时,第二个textView很可能出现换行排版问题 用spannableString的问题 小段文字有下划线 点击textView中的小段文字时,系统会当做url处理,给点击部分的text加一个蓝色的背景 解决方案 public class TouchableSpan extends ClickableSpan { pri

Android学习---ListView的点击事件,simpleAdapter和arrayadapter,SimpleCursoAdapter的原理和使用

如题,本文将介绍 listview的点击事件,simpleAdapter和arrayadapter的原理和使用. 1.ListView的注册点击事件 //注册点击事件 personListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { /** * * @param parent 当前ListView * @param view 代表当前被点击的条目 * @param position 当前条目的位置 * @p

Android学习---ListView的点击事件,simpleAdapter和arrayadapter的原理和使用 - Hi_Amos

如题,本文将介绍 listview的点击事件,simpleAdapter和arrayadapter的原理和使用. 1.ListView的注册点击事件 //注册点击事件 personListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { /** * * @param parent 当前ListView * @param view 代表当前被点击的条目 * @param position 当前条目的位置 * @p

在android中如何通过点击edittext之外的部分使软键盘隐藏

我们知道在android中点击edittext框就会自动弹出软键盘,那怎么通过点击edittext之外的部分使软键盘隐藏呢?(微信聊天时的输入框就是这个效果,这个给用户的体验还是很不错的) 首先我们要先定义一个隐藏软键盘的工具类方法: 1 public static void hideSoftKeyboard(Activity activity) { 2 InputMethodManager inputMethodManager = (InputMethodManager) activity.g

Android中 Alertdialog对话框点击消失?

在开发的时候遇到一个问题,就是一触摸对话框边缘外部,对话框会自动消失.这个问题很纠结啊,查找了一下发现从Android 4.0开始,AlertDialog有了变化,就是在触摸对话框边缘外部,对话框会自动消失,查了源码,找到解决办法: 研究其父类时候发现,可以设置这么一条属性,在AlertDialog.Builder.create()之后才能调用这两个方法 方法一: setCanceledOnTouchOutside(false);调用这个方法时,按对话框以外的地方不起作用.按返回键还起作用 方法

Android中实现Gallery 点击放大

图片放大的思路: 第一.可以通过Matrix对象来变换图像,在选择的时候放大,在失去焦点的时候,缩小到原来的大小. double scale = 1.2;int width = bm.getWidth();int height = bm.getHeight();Log.i("size:", width+"");float scaleWidth = (float)(scale*width);float scaleHeight = (float)(scale*heigh

Android 按钮的响应点击事件的4种写法

Android按钮的响应点击事件 学习了按钮的响应点击事件,写一下总结,写的不好的希望大家能给出意见或建议. 这是layout xml文件   点击事件只需要获得Button的id或者onClick <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" an

Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法

bug说明: Mint-ui中loadmore(上拉加载下拉刷新)组件 在 使用fastclick的情况下 ,在ios设备中滑动会触发点击事件: 解决方法: 我是按需引入,去项目中找到loadmore下的index.js,全部引入的要找mint下面mint-ui.common.js 路径如下:你的项目名/node_modules\mint-ui\lib\loadmore\index.js 搜索 handleTouchEnd ,记得写event进去 handleTouchEnd: function