Android 实现双击退出 支持多击/自定义延迟时间
来源:互联网 发布:php图片木马下载 编辑:程序博客网 时间:2024/06/07 17:52
Android 实现双击退出 支持多击/自定义延迟时间
最近又使用到了双击和多击的操作,之前一直是通过两个变量来判断,使用起来不方便,今天抽出时间封装了一个监听类,以后使用只要依然 setOnClickListener 这样使用就好;
PS. 为什么不用 OnDoubleTapListener?
因为我只是单纯的觉得setOnClickListener方便
关于 OnDoubleTapListener 的使用方法,可以参考这篇帖子 -> Android 触摸手势基础 官方文档概览
关于实现方法,我只是新建了一个类实现View.OnClickListener,通过对点击次数进行判断,来进行相应接口的回调,实现原理见代码:
MultiClickListener.java
import android.view.View;/** * Created by Doracoin on 2016/11/6. * * @author Doracoin * @version 1.0 * 主要判断逻辑全部都在onClick方法中 * 想做双击,直接实现 {@code onDoubleClick()} 方法即可 * 其他次数,实现 {@code onMultiClick()} 根据回调的次数进行操作 */public abstract class MultiClickListener implements View.OnClickListener { /** * 记录点击次数 */ private int click_counts = 0; /** * 记录上次点击事件的时间戳,用于延时判断 */ private long last_click_time = 0; /** * 延迟时间 */ private long delayed_time = 300; /** * 延迟时间默认300ms */ public MultiClickListener() { } /** * 通过此构造函数设定点击的延迟时间 * * @param delayed_time 延迟时间,默认300ms */ public MultiClickListener(long delayed_time) { this.delayed_time = delayed_time; } /** * 双击回调,如果想对双击进行操作可直接实现此方法 * * @param v The view that was clicked. */ public abstract void onDoubleClick(View v); /** * 点击次数的回调方法,如果想根据不同的点击次数进行操作,可实现此方法获取当前点击次数 * * @param v The view that was clicked. * @param clickCounts 实时点击次数 */ public abstract void onMultiClick(View v, int clickCounts); /** * 不建议实现此回调方法, 如果需要实现此方法,请去掉编译器自动填充的 * {@code super.onClick(v)} 这一行, * 否则在 {@code onMultiClick()} 方法被实现的情况下,会导致此方法被重复回调 */ @Deprecated @Override public void onClick(View v) { //根据当前点击时间和上次点击时间相差时间, 来判断是否在设定的延迟时间范围内 if (System.currentTimeMillis() - last_click_time < delayed_time) { //点击次数+1 click_counts++; } else { //点击次数为1 click_counts = 1; } //记录新的点击时间 last_click_time = System.currentTimeMillis(); if (click_counts == 2) { onDoubleClick(v); } onMultiClick(v, click_counts); }}
使用方法:
MainActivity.java
import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends AppCompatActivity { private Button btnDouble; private TextView txtAClickCounts; private Button btnMulti; private TextView txtBClickCounts; private int totalTimes = 10; private boolean isDebug = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initview(); } private void initview() { txtAClickCounts = (TextView) findViewById(R.id.txt_btn_a_click_counts); btnDouble = (Button) findViewById(R.id.btn_double_click); btnDouble.setOnClickListener(new MultiClickListener() { @Override public void onDoubleClick(View v) { toast("按钮 A 被双击!"); } @Override public void onMultiClick(View v, int clickCounts) { txtAClickCounts.setText("按钮 A 点击次数: " + clickCounts); } }); txtBClickCounts = (TextView) findViewById(R.id.txt_btn_b_click_counts); btnMulti = (Button) findViewById(R.id.btn_multi_click); btnMulti.setOnClickListener(new MultiClickListener() { @Override public void onDoubleClick(View v) { } @Override public void onMultiClick(View v, int clickCounts) { txtBClickCounts.setText("按钮 B 点击次数: " + clickCounts); if (!isDebug) { if (clickCounts >= 3) { toastAppend("再点击 " + (totalTimes - clickCounts) + " 次进入开发者模式"); if (clickCounts == totalTimes) { isDebug = true; } } } else { toastAppend("您已进入开发者模式 [/滑稽] "); } } }); } private void toast(String text) { Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show(); } private Toast mToast = null; private void toastAppend(String text) { if (mToast == null) { mToast = Toast.makeText(this, text, Toast.LENGTH_SHORT); } mToast.setText(text); mToast.show(); } int back_click_count = 0; long back_click_time = 0; /** * 双击返回键退出 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: if (System.currentTimeMillis() - back_click_time < 300) { back_click_count++; } else { back_click_count = 1; toast("双击返回键退出"); } back_click_time = System.currentTimeMillis(); if (back_click_count == 2) { finish(); } return true; } return super.onKeyDown(keyCode, event); }}
Demo工程已上传到Github->Doracoin/MultiClickDemo
0 0
- Android 实现双击退出 支持多击/自定义延迟时间
- Android实现双击退出
- Android实现双击退出应用
- Android 实现双击退出应用程序
- Android 双击返回键退出程序 实现
- Android 双击返回键退出程序 实现
- Android 双击返回键退出程序 实现
- Android 双击返回键退出程序 实现
- Android 双击返回键退出程序 实现
- Android 双击返回键退出程序 实现
- Android 双击返回键退出程序 实现
- Android 双击返回键退出程序 实现
- Android双击back按钮退出实现
- Android 双击返回键退出程序 实现
- Android应用程序双击退出功能实现
- Android实现双击退出程序的效果
- Android简洁代码实现双击退出程序
- Android中如何实现双击退出APP
- 直播连麦能做的轻量级一些吗?
- 菜鸟的入门(一)
- CodeForces 405C Unusual Product【思维】
- 【长文干货】浅析分布式系统
- 计算机视觉/图像处理领域相关研究机构梳理
- Android 实现双击退出 支持多击/自定义延迟时间
- 有符号数据类型的最小值问题丨C
- Fast-RCNN
- defer和async的区别
- 《OpenCV3编程入门》学习笔记番外篇之图像形态学处理
- Delphi 中递归生成TreeView节点的方法
- 混淆教程锦集
- 7个js基础知识总结
- CSS 属性之中经常出现的百分比