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