键盘按下和抬起事件(keydown,keyup)——原创

本文深入探讨了Android中按键按下和抬起事件的处理机制,包括事件的捕获、按键重复次数的获取以及如何通过KeyCode参数识别特定按键。通过示例代码展示了如何在Activity中响应这些事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

           Android学习自修笔记(一)

键盘按下和抬起事件(keydownkeyup
                                             ————将军的Android自修之途
通常按键的动作分为单击、按下和抬起,但实际上单击并不能算单独的按键事件,因为系统底层(Linux内核)在按键按下时会发出一个中断,在按键抬起时也会发送一个中断,并没有在按键单击时发中断。其实按键单击就是按键按下和抬起的组合动作,所以窗口事件中并不能捕获按键单击事件,而只能捕获按键按下和抬起事件,分别用onKeyDownonKeyUp方法捕获。
源码实例如下:
public class ActivityEventMain extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_event_main);
    }
    //捕获按键按下事件
    public boolean onKeyDown(int keycode,KeyEvent event){
       //输出按键代码
       Log.d("onKeyDown:keycode",String.valueOf(keycode));
       //输出按键重复次数
       Log.d("onKeyDown:RepeatCount", String.valueOf(event.getRepeatCount()));
       //如果重复次数到了200(8秒左右),显示提示
       if(event.getRepeatCount()==200)
       {
           Toast.makeText(this, "已经按一会了,累了吧,该松开了!", Toast.LENGTH_LONG).show();
           
       }
       //如果按下的是菜单按钮,输出日志信息
       if(keycode==KeyEvent.KEYCODE_MENU)
       {
           Log.d("onKeyDown","MenuKeyDown");
       }
       return super.onKeyDown(keycode, event);
      
      
    }
    //捕获按键抬起事件
    public boolean onKeyUp(int keycode,KeyEvent event)
    {
       if(keycode==KeyEvent.KEYCODE_MENU)
       {
           Log.d("onKeyUp","MenuKeyDown");
        }
       return super.onKeyUp(keycode, event);
      
    }
}
其中onKeyDownonKeyUp方法的参数和类型完全一样,其中Keycode表示按下或抬起的按键代码,通过event参数则可以获得更多的按键信息。其中有一个KeyEvent.getKeyCode方法与keycode参数的含义完全一样。如果这两个方法返回true,表示按键事件已经处理完毕。
注意:处理键盘事件的方法不止一个,这些方法是以一个链表形式组织在一起的,当前方法执行完,会执行下一个方法。如果其中某一个方法返回true,系统就不会在调用后面的方法处理按键事件了。
使用onkeyDownonkeyup方法捕捉事件应了解如下几点:
1onkeyDownonkeyup方法不能捕捉“Home”按键
2)按键重复次数是指按下按键还没有抬起的期间系统会以一定时间间隔不断发送键盘按下中断,也就是说会不断调用onkeyDown方法,使用KeyEvent.getRepeatCount方法可以获取调用onkeyDown方法的次数,也就是按键重复次数,RepeatCount0开始。如果按键抬起,并再次按下,RepeatCount会清零。
3)所有的物理按键的按下和抬起动作都由onkeyDownonkeyup方法捕获,如果想判断具体按下了哪个按键,可以使用keycode参数,也可以使用keyEvent.getKeycode方法。可以直接通过按键编码进行判断,但是最好使用在KeyEvent类中定义的表示按键编码的常量,所有表示按键编码的常量都以“KEYCODE”开头。
<think>我们正在处理一个关于HTML5键盘事件对象属性的问题。用户想知道当键盘按下(keydown抬起keyup事件发生时,事件对象中有哪些可用的成员(属性)。 根据HTML5标准,键盘事件(KeyboardEvent)是DOM事件的一部分。键盘事件主要有三种:keydown、keypress(已废弃,不推荐使用)keyup。我们重点关注keydownkeyup事件。 在KeyboardEvent对象中,有一些常用的属性,例如: - key: 表示按下的键的字符串值(例如:"a", "Enter", "ArrowUp"等)。 - code: 表示物理按键的代码(例如:"KeyA", "Enter", "ArrowUp"),键盘布局无关。 - keyCode: 已废弃,但一些旧代码可能仍在使用。它返回一个表示按键的Unicode值(对于可打印字符)或虚拟键码(对于功能键)。建议使用key或code替代。 - charCode: 已废弃,仅用于keypress事件,表示按键字符的Unicode值。 - which: 已废弃,类似于keyCode,也是返回按键的Unicode值或虚拟键码。 - location: 表示按键键盘上的位置(例如:标准位置、左侧、右侧、小键盘等),是一个整数(0:标准键,1:左侧,2:右侧,3:小键盘)。 - repeat: 布尔值,表示该按键是否被按住而重复触发。 - ctrlKey, shiftKey, altKey, metaKey: 布尔值,表示在事件发生时,这些修饰键是否被按下。 注意:由于keyCode、charCodewhich已被废弃,现代代码应该使用keycode属性。 因此,对于keydownkeyup事件,我们可以使用以下属性: - event.key - event.code - event.location - event.repeat - 以及修饰键状态:event.ctrlKey, event.shiftKey, event.altKey, event.metaKey 另外,KeyboardEvent继承自UIEvent,而UIEvent继承自Event,所以还有事件通用属性,如target、currentTarget、type等。 下面是一个简单的示例代码,展示如何获取这些属性: ```html <!DOCTYPE html> <html> <head> <title>Keyboard Event Properties</title> </head> <body> <p>Press and release any key to see the event properties.</p> <script> document.addEventListener('keydown', function(event) { console.log('Keydown Event:'); logEventProperties(event); }); document.addEventListener('keyup', function(event) { console.log('Keyup Event:'); logEventProperties(event); }); function logEventProperties(event) { console.log('key:', event.key); console.log('code:', event.code); console.log('location:', event.location); console.log('repeat:', event.repeat); console.log('ctrlKey:', event.ctrlKey); console.log('shiftKey:', event.shiftKey); console.log('altKey:', event.altKey); console.log('metaKey:', event.metaKey); console.log('---'); } </script> </body> </html> ``` 在这个示例中,当按下释放按键时,会在控制台输出事件对象的属性。 注意:由于安全原因,一些特殊键(如F1-F12,Ctrl,Alt等)在浏览器中可能会触发默认行为(例如F1会打开帮助页面),在演示时可能需要阻止默认行为(event.preventDefault())来避免页面行为干扰,但要注意不要阻止必要的默认行为(如输入字符)。 因此,回答用户的问题:HTML5键盘按下(keydown抬起keyup事件的对象中,常用的成员(属性)包括:key, code, location, repeat, ctrlKey, shiftKey, altKey, metaKey,以及从Event继承的通用属性(如type, target等)。 另外,需要注意的是,keypress事件已被废弃,因此不建议使用。 参考文献: [^1]: MDN Web Docs: KeyboardEvent - https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent [^2]: W3C UI Events Specification - https://www.w3.org/TR/uievents/#events-keyboardevents 由于用户要求使用中文回答,我们使用中文总结。 总结: HTML5键盘事件keydownkeyup)的事件对象(KeyboardEvent)包含以下重要属性: - `key`: 按键的字符串表示(例如:"A"、"Enter")。 - `code`: 物理按键的代码(例如:"KeyA"、"Enter")。 - `location`: 按键键盘上的位置(0:标准,1:左侧,2:右侧,3:小键盘)。 - `repeat`: 布尔值,表示该事件是否由于按住按键而重复触发。 - 修饰键状态:`ctrlKey`, `shiftKey`, `altKey`, `metaKey`,布尔值,表示事件发生时这些修饰键是否被按下。 此外,还有继承自Event对象的属性,如`target`(事件目标)、`type`(事件类型)等。 注意:废弃属性(如keyCode, charCode, which)应避免使用。 相关问题: 1. 如何阻止键盘事件的默认行为? 2. 如何检测组合键(例如Ctrl+C)? 3. 键盘事件在移动设备上的表现有何不同? 4. 如何实现键盘快捷键功能? 5. 键盘事件输入事件(input event)有什么区别?</think>### HTML5 键盘按下抬起事件的对象属性 在 HTML5 中,键盘按下 (`keydown`) 抬起 (`keyup`) 事件通过 `KeyboardEvent` 对象提供详细的按键信息。以下是关键属性用法说明: #### 📌 核心属性(常用) 1. **`key`** - 返回按下的**字符值**(如 `"a"`, `"Enter"`, `"ArrowUp"`) - 对功能键也有效(如 `"F1"`, `"Escape"`) - 示例:`event.key === "Shift"` 检测是否按了 Shift 键 2. **`code`** - 返回按键的**物理位置编码**(如 `"KeyA"`, `"EnterLeft"`) - 不受键盘布局影响(美式/德式键盘返回相同值) - 示例:`event.code === "Space"` 检测空格键 3. **`repeat`** - 布尔值,表示按键是否被**长按重复触发** - 示例:`if (event.repeat) return;` 忽略长按重复事件 4. **修饰键状态**(布尔值) - `ctrlKey`:Ctrl 键是否按下 - `shiftKey`:Shift 键是否按下 - `altKey`:Alt/Option 键是否按下 - `metaKey`:Cmd/Win 键是否按下 #### 📌 其他属性(部分已废弃) | 属性 | 说明 | 状态 | |-------------|-------------------------------|------------| | `keyCode` | 按键的 Unicode 值(如 65=A) | ⚠️ 已废弃 | | `charCode` | 字符的 Unicode 值 | ⚠️ 已废弃 | | `which` | 类似 `keyCode` | ⚠️ 已废弃 | | `location` | 按键位置(0=标准,1=左侧,2=右侧,3=小键盘) | 可用 | > ⚠️ 注意:现代开发应优先使用 `key` `code` 替代废弃属性 [^1]。 #### 代码示例 ```html <script> document.addEventListener('keydown', (event) => { console.log("按下事件:", { key: event.key, // 字符值 code: event.code, // 物理键编码 shift: event.shiftKey, // 修饰键状态 repeat: event.repeat // 是否长按 }); }); document.addEventListener('keyup', (event) => { console.log("抬起事件:", event.key); }); </script> ``` #### 🌐 浏览器兼容性 - 所有现代浏览器(Chrome/Firefox/Safari/Edge)均支持 `key` `code` - 废弃属性(`keyCode`)仍可用但不推荐,未来可能移除 [^2] --- ### 相关问题 1. 如何检测组合键(如 Ctrl+S)? 2. `keydown` `keypress` 事件有何区别? 3. 如何阻止键盘事件的默认行为(如阻止保存网页)? 4. 移动端键盘事件桌面端有何不同? 5. 游戏开发中如何优化连续按键检测? [^1]: MDN KeyboardEvent: [https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent) [^2]: W3C UI Events Specification: [https://www.w3.org/TR/uievents/#keyboard](https://www.w3.org/TR/uievents/#keyboard)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值