前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >识别Android按键的短按和长按以及长按时长的判断

识别Android按键的短按和长按以及长按时长的判断

作者头像
用户7557625
发布2020-07-15 10:28:55
3.5K0
发布2020-07-15 10:28:55
举报
文章被收录于专栏:程序猿的那点事

前言:最近在做一个关于硬按键的处理,大多数都可以转成Android的keycode,其中一个功能就是要针对按键的长按和短按来做出相应的动作,包括长按的时长不同,相应的处理也不同。下面是我总结的关于识别Android按键的短按和长按以及长按时长的判断。

在KeyEvent中,有一个callback接口,里面有KeyDown(),onKeyUp(),onKeyLongPress()几个函数,我们主要通过实现这几个函数来实现我们的功能。

代码语言:javascript
复制
boolean onKeyDown(int keyCode, KeyEvent event){
        if (keyCode == KeyEvent.KEYCODE_ENTER) {
            if (event.getRepeatCount() == 0) {
                event.startTracking();
                isLongPress = false;
            }
            else {
                isLongPress = true;
            }
            return true;
        }
}
代码语言:javascript
复制
 public boolean onKeyLongPress(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_ENTER) {
            isLongPress = true;
            Toast.makeText(this, "长按", Toast.LENGTH_SHORT).show();
            return true;
        }
    }
}
代码语言:javascript
复制
public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_ENTER){
            if (isLongPress){
                isLongPress = false;
                return true;
            }
        }

但是这种方法只适合在Activity中判断。但是我的应用是一个后台应用, 下面这个是参考CarInputService.java中的函数写的一个判断硬按键长按短按已经按了几秒的一个方法。这里面定义了按键按下去和弹上来的事件,然后在按下去的时候和弹回来时分别计时,最后算出此次按键的时间,然后多久算长按有自己决定。具体代码看下面:

代码语言:javascript
复制
//定义了一个类,专门来处理按键时长
private static final class KeyPressTimer {
        private static final long LONG_PRESS_TIME_MS = 1000;
        private static final long LONG_PRESS_TIME_MS_3 = 3000;
        private static final long LONG_PRESS_TIME_MS_10 = 10000;

        private boolean mDown = false;   //判断按键状态
        private long mDuration = -1;    //长按时长

       //在KeyEvent状态变为down时调用,
        synchronized void keyDown() {
            mDown = true;
            mDuration = SystemClock.elapsedRealtime();
        }

      //在KeyEvent状态变为up时调用,然后计算
        synchronized void keyUp() {
            if (!mDown) {
                throw new IllegalStateException("key can't go up without being down");
            }
            mDuration = SystemClock.elapsedRealtime() - mDuration;
            mDown = false;
        }

//判断是否是长按
        synchronized boolean isLongPress() {
            if (mDown) {
                throw new IllegalStateException("can't query press length during key down");
            }
            return mDuration >= LONG_PRESS_TIME_MS;
        }
//判断是否长按三面
        synchronized boolean isThreePress() {
            if (mDown) {
                throw new IllegalStateException("can't query press length during key down");
            }
            return (mDuration >= LONG_PRESS_TIME_MS_3) && (mDuration <= LONG_PRESS_TIME_MS_10);
        }
//判断是否长按十秒
        synchronized boolean isTenPress() {
            if (mDown) {
                throw new IllegalStateException("can't query press length during key down");
            }
            return mDuration >= LONG_PRESS_TIME_MS_10;
        }
}

针对每个需要区分长按短按的按键都需要写一个处理方法,在这个方法里调用之前写的EnterPressTimer里的方法,来判断他是长按还是短按,然后进行相应的处理。

代码语言:javascript
复制
private void handleEnterKey(KeyEvent event) {
        int action = event.getAction();
        if (action == KeyEvent.ACTION_DOWN) {
            mEnterPressTimer.keyDown();
        } else if (action == KeyEvent.ACTION_UP) {
            mEnterPressTimer.keyUp();
            if (mEnterPressTimer.isTenPress()) {
            } else if (mEnterPressTimer.isThreePress()) {
            } else {
            }
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档