`
貌似掉线
  • 浏览: 260483 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

按键的双击事件及再按一次退出的封装

阅读更多
本文原创,转载请注明原文出处:http://maosidiaoxian.iteye.com/blog/1472873
或者我的另外一个博客: http://msdxblog.sinaapp.com/?p=371

现在许多应用都有一个“再按一次退出”的效果,其实实现这个不难,具体可以看我的另外一篇文章:http://maosidiaoxian.iteye.com/blog/1403040

不过最近又对以前写的东西再次封装,原因是以前是写死了,一定是“再次一次退出”的效果,而没有“再按一次XXX”的。而出现这个需求是因为最近在写的一个小的游戏应用,有“新游戏”的按钮,我觉得在响应这个事件时先弹出一个对话框来确认是否开始新游戏没什么必要,因为频率比较高,久了用户会很烦。朋友说可以做成“再按一次开始新游戏”。

于是封装了“再次一次XXX”的代码。具体如下:
/*
 * @(#)DoubleClick.java		       Project:com.sinaapp.msdxblog.androidkit
 * Date:2012-3-20
 *
 * Copyright (c) 2011 CFuture09, Institute of Software, 
 * Guangdong Ocean University, Zhanjiang, GuangDong, China.
 * All rights reserved.
 */
package com.sinaapp.msdxblog.androidkit.ui.util;

import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.widget.Toast;

/**
 * @author Geek_Soledad (66704238@51uc.com)
 */
public abstract class DoubleClick {
	protected Context mContext;
	private boolean willDo;
	private Runnable task = new Runnable() {
		@Override
		public void run() {
			willDo = false;
		}
	};

	public DoubleClick(Context context) {
		mContext = context;
	}

	/**
	 * 当某个动作要双击才执行时,调用此方法。
	 * 
	 * @param delayTime
	 *            判断双击的时间。
	 * @param msg
	 *            当第一次点击时,弹出的提示信息。如果为null,则不作提示。
	 */
	public void doDoubleClick(int delayTime, String msg) {
		if (willDo) {
			doOnDoubleClick();
		} else {
			keepInDelayTime(delayTime);
			showMsgInToast(delayTime, msg);
		}
	}

	/**
	 * 在双击之后执行的事情。
	 */
	abstract protected void doOnDoubleClick();

	/**
	 * 判断是否双击。
	 * 
	 * @param delayTime
	 *            是否双击的判断时间。
	 */
	final private void keepInDelayTime(int delayTime) {
		willDo = true;
		HandlerThread thread = new HandlerThread("doTask");
		thread.start();
		new Handler(thread.getLooper()).postDelayed(task, delayTime);

	}

	/**
	 * 显示提示信息。
	 * 
	 * @param msg
	 *            要显示的信息。
	 */
	private void showMsgInToast(int delayTime, String msg) {
		if (msg != null) {
			Toast.makeText(mContext, msg, delayTime).show();
		}
	}
}


然后关于再按一次退出,仅需要继承以上类并实现其抽象方法即可。
	/**
	 * 在双击之后执行的事情。
	 */
	abstract protected void doOnDoubleClick();

以下是“再次一次退出”的再次封装。不过这里我用的是单例模式,一个是我觉得对于一个应用,退出也就完了,所以它对应的这个“再次一次退出”的辅助类也是只有一个的,另一个是单例模式的话,我不需要为它写个成员变量,再在一开始的时候对它初始化,对我原来的代码影响很小。代码如下:
/*
 * @(#)ExitDoubleClick.java		       Project:com.sinaapp.msdxblog.androidkit
 * Date:2012-3-20
 *
 * Copyright (c) 2011 CFuture09, Institute of Software, 
 * Guangdong Ocean University, Zhanjiang, GuangDong, China.
 * All rights reserved.
 */
package com.sinaapp.msdxblog.androidkit.ui.util;


import android.app.Activity;
import android.content.Context;


/**
 * 双击退出Activity的类。
 * 
 * @author Geek_Soledad (66704238@51uc.com)
 */
public class ExitDoubleClick extends DoubleClick {

	private static ExitDoubleClick exitDoubleClick;

	private ExitDoubleClick(Context context) {
		super(context);
	}

	/**
	 * 返回一个双击退出的实例。
	 * 
	 * @param context
	 * @return ExitDoubleClick
	 */
	public static synchronized ExitDoubleClick getInstance(Context context) {
		if (exitDoubleClick == null) {
			exitDoubleClick = new ExitDoubleClick(context);
		}
		return exitDoubleClick;
	}

	/**
	 * 双击之后退出。
	 */
	@Override
	protected void doOnDoubleClick() {
		((Activity) mContext).finish();
		exitDoubleClick = null;
	}
	
	/* (non-Javadoc)
	 * @see com.sinaapp.msdxblog.androidkit.util.DoubleClick#doDoubleClick(int, java.lang.String)
	 */
	@Override
	public void doDoubleClick(int delayTime, String msg) {
		if (msg == null || msg.equals("")) {
			msg = "再按一次退出";
		}
		super.doDoubleClick(delayTime, msg);
	}

}

注意,在退出之后需要对exitDoubleClick赋值为null(或者可以调用System.exit(0)方法?),否则在下次启动时可能无法正常退出,因为这时调用的mContext已经不是当前的Activity实例了,所以无法对当前的Activity实例用finish()退出。
0
0
分享到:
评论

相关推荐

    qt获取按键双击、多击事件

    如果在短时间内连续两次按下Shift键,计数器达到2,我们就认为发生了双击事件,并在控制台打印一条消息。当Shift键被释放或非Shift键被按下时,计数器会被重置。此外,当定时器超时,也会重置计数器,防止误判。 在...

    探寻C# Button双击事件

    这种方法的基本思路是:记录下第一次鼠标按下时的时间,当再次按下鼠标时,比较两次按下的时间间隔。如果时间间隔小于一定的阈值(通常为系统定义的双击时间),则认为发生了双击事件。 ##### 2.2 继承`Button`类并...

    android按返回两次退出

    android中实现按两次返回键退出Activity,不再是返回一次就退出应用,第一次点击提示“再按一次退出应用”

    RecyclerView基类的封装(单击双击事件)及附demo完整使用操作

    本篇文章将详细探讨如何对RecyclerView进行基类封装,实现单击和双击事件,并提供一个完整的Demo示例来帮助理解操作流程。 首先,我们要创建一个RecyclerView的基础适配器(BaseAdapter),这个适配器将负责绑定...

    C# winform 单击与双击事件同时存在例子

    在C# WinForm开发中,用户界面交互是一个关键部分,其中单击(Click)和双击(DoubleClick)事件是常见的用户输入响应。然而,标题提到的一个常见问题是:在同一个控件上,C# WinForm不支持同时处理单击和双击事件。...

    Android按两次返回退出应用的代码

    Toast.makeText(this, "再按一次退出应用", Toast.LENGTH_SHORT).show(); firstBackPressTime = System.currentTimeMillis(); // 记录第一次点击时间 } ``` 这段代码的工作原理是:当用户第一次按下返回键时,...

    单片机按键长按 短按 组合按 双击程序

    有关单片机的 按键 长按 短按 双击 组合按程序分享啊

    1-2-15-按键双击和长按程序.zip

    例如,如果用户在短时间内连续两次按下并释放同一按键,那么我们就认为是双击。这需要我们记录每次按键按下和释放的时间,并比较两次操作之间的间隔。如果间隔在预设的阈值内,就认为是双击。 长按检测相对简单,只...

    STM32按键(单击、双击、长按)

    为了防止抖动,通常会在检测到下降沿后加入一个小的延时(例如20ms),再检测一次上升沿,确保按键状态稳定。 ### 3. 双击检测 双击是在短时间内连续两次按下并释放按键。实现双击检测的方法是记录按键单击的时间...

    nrf52832 nrf52810 按键驱动,兼任单次按键处理,双击处理,长按处理

    当第一次按键被按下并释放后,启动一个定时器,如果在预设时间内再次检测到按键按下,就认为是双击事件。这需要在`KeyScanCallBack`中进行逻辑判断,并在适当的时候调用双击事件的处理函数。 至于"长按处理",同样...

    按键实现单击、双击、长按 方便移植版本

    当检测到按键由高变低(按下),然后短时间内又由低变高(释放)时,视为一次单击。这个“短时间内”需要设置一个合理的阈值,避免因抖动导致误判。 2. **双击检测**: 双击检测则更为复杂,需要在单击的基础上...

    FullCalendar扩展双击事件

    为了避免直接修改源码带来的问题,你可以创建一个扩展来实现双击事件。FullCalendar支持插件系统,允许你添加自定义功能。首先,创建一个新的JavaScript文件,然后定义一个新的插件方法: ```javascript (function...

    嵌入式STM32按键状态机-单击双击长按操作

    双击事件:俩次短按时间间隔小于500ms,俩次短按操 本程序只供学习使用,未经作者许可,不得用于其它任何用途 感谢大家的阅读与下载,码字开源分享不易,麻烦给个免费的赞。 如果有帮助的,请不要吝啬三连。点赞...

    按键的单击双击三击和长按

    单击是最基本的操作,当用户快速按下并释放按键一次,单片机检测到输入引脚从高到低再到高的电平变化,即可识别为一次单击事件。在代码实现中,通常会加入去抖动处理,因为机械按键在按下和释放瞬间可能会产生多次...

    STC8单片机的按键单击、双击、长按的代码实现

    在C语言中,我们需要定义一个结构体或类来存储按键的状态信息,如当前状态、上一次状态、按键按下时间等。接下来,编写一个定时器中断服务程序,定期检查按键状态。这里有两个关键点:滤波和去抖动。滤波是为了消除...

    js单击事件和双击事件并存绑定

    "js单击事件和双击事件并存绑定"这个主题涉及到如何让一个元素同时响应单击(click)和双击(dblclick)事件,而不互相冲突。这在实现某些交互功能时非常有用,比如,单击可能打开一个菜单,而双击则可能编辑内容。...

    MFC button双击事件响应

    - 在对应的`.h`头文件中,找到类声明,通常是`CMyDialog`,在消息映射`BEGIN_MESSAGE_MAP`和`END_MESSAGE_MAP`之间添加一条消息映射项,指定双击事件的处理函数。例如: ```cpp BEGIN_MESSAGE_MAP(CMyDialog, ...

    实现按键的长按、短按、双击.zip

    在嵌入式系统开发中,特别是使用STM32F103这类微控制器时,处理按键的长按、短按和双击事件是一项常见的任务。这些功能可以为用户交互提供更多的控制选项,使得设备操作更加灵活。下面我们将详细介绍如何实现这些...

    ListBox 项的双击事件

    在探讨“ListBox项的双击事件”这一主题时,我们首先需要理解ListBox控件的基本功能以及如何处理用户交互,特别是双击事件。ListBox是Windows Forms和WPF等图形用户界面框架中常用的一种控件,用于展示一系列选项供...

    基于STM32+MultiButton实现的按键检测单击双击长按保持按键松开按键弹起等源码+说明文档.zip

    1. **按键单击**:当用户短暂按下并释放一个按键时,STM32会检测到GPIO引脚电平从高到低再到高的转换。通过在中断服务程序中加入延时判断,可以防止短暂的噪声干扰导致误识别为按键单击。 2. **按键双击**:双击...

Global site tag (gtag.js) - Google Analytics