Android新增加物理按键流程,onKeyDown,onKeyUp,onKeyLongPress长按键功能实现的方法

本文介绍了Android系统中的物理按键处理,包括如何识别系统按键和唤醒按键,重复按键的产生机制(如keyRepeatTimeout和keyRepeatDelay),以及onKeyDown、onKeyUp和onKeyLongPress回调的使用。重点讨论了长按事件的判断方法,无需onKeyLongPress时,通过重复次数判断长按时长进行不同事务处理。
摘要由CSDN通过智能技术生成

1,增加物理按键:
请参考:https://blog.csdn.net/lxp_p666/article/details/121342435

2,KeyEvent.java里面配置是否为系统按键和可以唤醒按键:
  isSystem()
  isWakeKey()
  
3,重复按键的产生:在用户持续按下一个按键到抬起之间,应用程序能够收到多个onKeyDown时间,默认间隔500ms,并且getReaptCount的返回值会不断累加,并且当且仅当第二次调用KeyEvent.isLongPress返回true
inputDispatcher.cpp
struct InputDispatcherConfiguration {
    // The key repeat initial timeout.
    nsecs_t keyRepeatTimeout;

    // The key repeat inter-key delay.
    nsecs_t keyRepeatDelay;

    InputDispatcherConfiguration() :
            keyRepeatTimeout(500 * 1000000LL), //500ms repeat一次
            keyRepeatDelay(50 * 1000000LL) { }
};

4,keyevent.java中调用这些回调:onKeyDown,onKeyUp,onKeyLongPress

5,在onKeyDown()方法中,使用event.startTracking()
使用onKeyLongPress必须使用event.startTracking()

private boolean isLongPress = false;

onKeyDown:
if (keyCode == KeyEvent.KEYCODE_ENTER) {
            if (event.getRepeatCount() == 0) {
                event.startTracking();
                isLongPress = false;
                Toast.makeText(this, "key单击", Toast.LENGTH_SHORT).show();
            }
            else {
                isLongPress = true;
            }
            return true;
        }
        
onKeyLongPress:        
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_ENTER) {
            isLongPress = true;
            Toast.makeText(this, "长按", Toast.LENGTH_SHORT).show();
            return true;
        }
        return super.onKeyLongPress(keyCode, event);
    }

onKeyUp:
if (keyCode == KeyEvent.KEYCODE_ENTER){
            if (isLongPress){
                isLongPress = false;
                return true;
            }
            Toast.makeText(this, "key抬起", Toast.LENGTH_SHORT).show();
        }

6,那如果不用onKeyLongPress,在onKeyDown就不调用event.startTracking(),用repeate的次数来判断长按多长时间做不同的事务处理:
onKeyDown:
if (keyCode == KeyEvent.KEYCODE_ENTER) {
            if (event.getRepeatCount() == 0) {
                
                Toast.makeText(this, "key单击", Toast.LENGTH_SHORT).show();
            }
            else if(event.getRepeatCount() == 1)//长按了1s
            {
             //长按1s,请处理
            }
            else if(event.getRepeatCount() == 3)//长按了2s
            {
             //长按2s,请处理
            }
            return true;
        }

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值