Android开发之实现多次点击事件

在Android中给我们提供了单次点击事件。但并没有给我们提供双击,或者实现在一定时间内的多次事件。所以需要我们自己在单机监听上进行修改实现。

有如下两种实现方式:

1、定义一个存贮上一个第一次点击的变量,如果两次时间间隔小于500毫秒,则认为是双击时间。

实现如下:

package com.andy.doubleclick;

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Toast;

/**
 * @author Zhang,Tianyou
 * @version 2014年12月02日 上午10:51:56
 */

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	private long startClickTime;

	public void click(View view) {
		long nextClickTime = SystemClock.uptimeMillis();
		if (startClickTime <= 0) {
			startClickTime = SystemClock.uptimeMillis();
			return ;
		}else {
			if (nextClickTime - startClickTime < 500) {
				Toast.makeText(this, "被双击了", Toast.LENGTH_SHORT).show();
				startClickTime = 0L;
			} else {
				startClickTime = SystemClock.uptimeMillis();
			}

		}

	}

}

这种方式有个缺陷,如果要实现多次点击,那么就需要定义存贮多个事件点的变量,很显然不适合多次点击的处理。

2、使用Google提供的api中采用的算法。

能够实现n次点击事件,我们需要定义一个n长度的数组,每点击一次将数组里的内容按序号整体向左移动一格,然后给n-1出即数组的最后添加当前的时间,如果0个位置的时间大于当前时间减去500毫秒的话,那么证明在500毫秒内点击了n次。

实现如下:

package com.andy.doubleclick;

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Toast;

/**
 * @author Zhang,Tianyou
 * @version 2014年12月02日 上午10:51:56
 */

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	long[] mHits = new long[2];
	public void click(View view){
		//每点击一次 实现左移一格数据
		System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
		//给数组的最后赋当前时钟值
		mHits[mHits.length - 1] = SystemClock.uptimeMillis();
		//当0出的值大于当前时间-500时  证明在500秒内点击了2次
		if(mHits[0] > SystemClock.uptimeMillis() - 500){
			Toast.makeText(this, "被双击了", Toast.LENGTH_SHORT).show();
		}
	}

}

这种能够实现n此事件的点击,只需将数组长度定义为n个长度。

System.currentTimeMillis() 和 SystemClock.uptimeMillis()的区别:

在Api上是这么说的:

  • System.currentTimeMillis() is the standard "wall" clock (time and date) expressing milliseconds since the epoch. The wall clock can be set by the user or the phone network (see
    setCurrentTimeMillis), so the time may jump backwards or forwards unpredictably. This clock should only be used when correspondence with real-world dates and times is important, such as in a calendar or alarm clock
    application. Interval or elapsed time measurements should use a different clock. If you are using System.currentTimeMillis(), consider listening to the
    ACTION_TIME_TICK, ACTION_TIME_CHANGED and
    ACTION_TIMEZONE_CHANGED Intent broadcasts to find out when the time changes.
  • SystemClock.uptimeMillis is counted in milliseconds since the system was booted. This clock stops when the system enters deep sleep (CPU off, display dark, device waiting for external input), but is not affected
    by clock scaling, idle, or other power saving mechanisms. This is the basis for most interval timing such as
    Thread.sleep(millls), Object.wait(millis), and
    System.nanoTime(). This clock is guaranteed to be monotonic, and is suitable for interval timing when the interval does not span device sleep. Most methods that accept a timestamp value currently expect the
    uptimeMillis clock.
  • SystemClock.elapsedRealtime and
    elapsedRealtimeNanos
    return the time since the system was booted, and include deep sleep. This clock is guaranteed to be monotonic, and continues to tick even when the CPU is in power saving modes, so is the recommend basis
    for general purpose interval timing.

SystemClock.elapsedRealtime : 从开机到现在的毫秒书(手机睡眠(sleep)的时间也包括在内)

System.currentTimeMillis() :从1970年1月1日 UTC到现在的毫秒数,是可以通过System.setCurrentTimeMillis修改的,那么,在某些情况下,一但被修改,时间间隔就不准了。

SystemClock.uptimeMillis :  它表示的是手机从启动到现在的运行时间,且不包括系统sleep(CPU关闭)的时间,很多系统的内部时间都是基于此,比如Thread.sleep(millls)Object.wait(millis),
and System.nanoTime()它表示的是手机从启动到现在的运行时间,且不包括系统sleep(CPU关闭)的时间,很多系统的内部时间都是基于此,比如Thread.sleep(millls)Object.wait(millis),
and System.nanoTime()

时间: 2024-10-11 13:16:17

Android开发之实现多次点击事件的相关文章

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

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

Android开发之PullToRefresh的Click点击事件的监听实现长按删除Item

本文为原创博客,出自http://blog.csdn.net/minimicall 到今天为止,搜芽的卖家版本应该来说已经基本完成,攻坚克难的一路过来.速度也控制的比较好. 项目过程进度 从任务分配量上来看,基本还是我个人英雄主义.接下来这样不行.但暂时也没办法,师弟还需要一个学习的过程.智质不错,而且态度端正.相信搜芽买家,他就可以承担更多的开发任务了. 接下来进入正题,说我们的PullToRefresh的点击事件.其实,我是想做长按进入删除的. 见效果图.当然这个是我做出来之后的了,但做出来

Android ImageView图片透明区域不响应点击事件,不规则图片透明区域响应点击事件

转载:http://blog.csdn.net/aminfo/article/details/7872681 经常会在项目中用到透明图片,不规则图片,特别是做游戏的时候,需要对图片的透明区域的点击事件做特别处理. 一.先上图片文件transparent.png,图片中间区域与外围区域是非透明的,其它区域是透明的: 二.上布局文件test.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout

Android自定义适配器和ListView的点击事件相结合的使用

下边演示一个使用ListView和自定义适配器的案例,点击ListView中的条目会出现一个对话框,进行成绩的修改,修改之后会立即通知适配器进行数据的重新加载,如下: (1).用于显示listView的布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" andro

Android代码模拟物理、屏幕点击事件

一.应用中模拟物理和屏幕点击事件 例如,模拟对某个view的点击事件 private void simulateClick(View view, float x, float y) { long downTime = SystemClock.uptimeMillis(); final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime,MotionEvent.ACTION_DOWN, x, y, 0); downTime +

Android实现RecyclerView自定义列表、点击事件以及下拉刷新

Android使用RecyclerView 1. 什么是RecyclerView RecyclerView 是 Android-support-v7-21 版本中新增的一个 Widgets,官方对于它的介绍则是:RecyclerView 是 ListView 的升级版本,更加先进和灵活. 简单来说就是:RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式.它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持. 2.

AndroidのListView之滑动列表项(点击事件和滑动事件共存) - bvin

返回脚本百事通 这里正好在项目有这么一个bt的需求,如下图ListView的item可以响应点击事件也可以响应item的左右滑动事件,两个事件可以相互独立互不影响. 听说iphone的list选项就有这样bt的功能,安卓版的手机QQ和微信和QQ通讯录也有类似的效果,在网上各种寻早方案都试过,要不只能滑动不能点击要么就只能点击不能滑动,而且操作很不灵敏,网上的代码都是在itemView的onTouch方法里处理,判断down和up的像素差.其实这样操作相当不便,down-up这样的其实只能算拖动事

Android 四种方法写按钮点击事件

1.匿名内部类的方式 2. 创建一个类实现onclickListener,实现onclick方法,设置控件点击事件时传一个类的对象. 3. 让当前类实现onclickListener,设置控件点击事件时传一个this.这种方式适合按钮比较多的情况,一般在公司采用该方式. 4. 在布局文件中为控件添加一个onclick属性,在布局对应的Activity中写一个一onclick属性值为名的方法,要public,传一个View类型的参数.比较适合做简单的测试.

android studio 菜鸟实战项目 之 点击事件以及动态添加

原始界面:               登陆失败:             登陆成功:              动态添加控件: 布局如下:(特别声明最后又一个空linearlayout,这是为了后面的动态添加事件) <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu