鸿蒙5.0开发进阶:API ArkUI框架-ArkTS组件(组件快捷键事件)

往期鸿蒙全套实战文章必看:(文中附带全栈鸿蒙学习资料)


组件快捷键事件

开发者可以设置组件的自定义组合键,每个组件可以设置多个组合键。

即使组件未获焦或是在所在页面未展示,只要已经挂载到获焦窗口的组件树上就会响应自定义组合键。

开发者在设置组合键的同时可以设置自定义事件,组合键按下时,触发该自定义事件,若没有设置自定义事件,则组合键行为与click行为一致。

说明

从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

keyboardShortcut

keyboardShortcut(value: string | FunctionKey, keys: Array<ModifierKey>, action?: () => void): T

设置组件的自定义组合键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名参数类型必填参数描述
valuestring | FunctionKey

热键的单个字符(可以通过键盘输入的字符)或FunctionKey

空字符串意为取消快捷键绑定。

keysArray<ModifierKey>

热键组合。

仅当value为FunctionKey的情况下可以为空。

action() => void

组合快捷键触发成功后的自定义事件回调。

返回值:

类型说明
T返回当前组件。

ModifierKey

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称描述
CTRL表示键盘上Ctrl键。
SHIFT表示键盘上Shift键。
ALT表示键盘上Alt键。

FunctionKey

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称描述
ESC

表示键盘上ESC功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

F1

表示键盘上F1功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

F2

表示键盘上F2功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

F3

表示键盘上F3功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

F4

表示键盘上F4功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

F5

表示键盘上F5功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

F6

表示键盘上F6功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

F7

表示键盘上F7功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

F8

表示键盘上F8功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

F9

表示键盘上F9功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

F10

表示键盘上F10功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

F11

表示键盘上F11功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

F12

表示键盘上F12功能键。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

TAB12+

表示键盘上TAB功能键。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

DPAD_UP12+

表示键盘上UP方向键。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

DPAD_DOWN12+

表示键盘上DOWN方向键。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

DPAD_LEFT12+

表示键盘上LEFT方向键。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

DPAD_RIGHT12+

表示键盘上RIGHT方向键。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

快捷键使用注意事项

快捷键是对系统按键的响应,优先于普通的按键事件OnKeyEvent。

场景快捷键处理逻辑例子
所有支持onClick事件的组件支持自定义组合键
自定义组合键要求控制键Ctrl、Shift、Alt及它们的组合加上其它可输入字符按键Button('button1').keyboardShortcut('a',[ModifierKey.CTRL])
多个不同组件设置相同组合键只响应结点树上的第一个组件,其它组件不响应快捷键。

Button('button1').keyboardShortcut('a',[ModifierKey.CTRL])

Button('button2').keyboardShortcut('a',[ModifierKey.CTRL])

无论组件是否获得焦点只要窗口获焦快捷键就会响应
使用单个FunctionKey触发快捷键单个FunctionKey,没有ModifierKey,可以绑定为快捷键Button('button1').keyboardShortcut(FunctionKey.F2,[])
keyboardShortcut的入参value为空

取消绑定的快捷键。

绑定多个快捷键的时候无法取消快捷键。

Button('button1').keyboardShortcut('',[ModifierKey.CTRL])

Button('button2').keyboardShortcut('',[])

独立pipeline子窗口、主窗口共存的情况下获焦的窗口响应快捷键
keyboardShortcut接口中的keys命令中ctrl、shift、alt不区分左右键都响应Button('button1').keyboardShortcut('a',[ModifierKey.CTRL, ModifierKey.ALT])
keyboardShortcut接口中的value单个字符不区分大小写都响应

Button('button1').keyboardShortcut('a',[ModifierKey.CTRL])

Button('button2').keyboardShortcut('A',[ModifierKey.CTRL])

快捷键的响应keys键处于按下状态且value键触发down事件(长按会连续响应)

隐藏组件

响应快捷键
disable状态组件不响应快捷键

1. 组件的组合键(包括系统预定义快捷键)相同时。

2. 接口参数value有多个字符时。

3. 接口参数keys有重复的控制键时。

这几种情况不绑定组合键, 先前绑定的组合键仍然有效

Button('button1').keyboardShortcut(FunctionKey.F4,[ModifierKey.ALT])

Button('button2').keyboardShortcut('ab',[ModifierKey.CTRL])

Button('button3').keyboardShortcut('ab',[ModifierKey.CTRL,ModifierKey.CTRL])

禁止绑定的系统快捷键

以下组合键绑定为快捷键不生效。

  • Ctrl + C
  • Ctrl + A
  • Ctrl + V
  • Ctrl + X
  • Ctrl + Shift + Z
  • Ctrl + Z
  • Ctrl + Y

系统已存在的按键事件

已存在如下系统响应的按键事件,具体规格如下表。

表中的按键事件与自定义按键事件的触发有优先级关系,高优先级的事件会拦截低优先级事件。

快捷键获焦组件用途事件处理类别
方向键、Shift + 方向键输入框组件移动光标输入法
方向键、Shift + 方向键通用组件系统处于走焦状态时,用于方向走焦系统按键
TAB、Shift + TAB通用组件触发进入走焦状态/走焦系统按键

示例

示例1(设置组件快捷键)

该示例通过设置组件的快捷键,同时按控制键+对应的字符可以触发组件响应快捷键,并触发onClick事件或自定义事件。

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
    Row() {
      Column({ space: 5 }) {
        Text(this.message)
        Button("Test short cut 1").onClick((event: ClickEvent) => {
          this.message = "I clicked Button 1";
          console.log("I clicked 1");
        }).keyboardShortcut('.', [ModifierKey.SHIFT, ModifierKey.CTRL, ModifierKey.ALT])
          .onKeyEvent((event: KeyEvent)=>{
            console.log("event.keyCode: " + JSON.stringify(event));
          })
        Button("Test short cut 2").onClick((event: ClickEvent) => {
          this.message = "I clicked Button 2";
          console.log("I clicked 2");
        }).keyboardShortcut('1', [ModifierKey.CTRL])
        Button("Test short cut 3").onClick((event: ClickEvent) => {
          this.message = "I clicked Button 3";
          console.log("I clicked 3");
        }).keyboardShortcut('A', [ModifierKey.SHIFT])
        Button("Test short cut 4").onClick((event: ClickEvent) => {
          this.message = "I clicked Button 4";
          console.log("I clicked 4");
        }).keyboardShortcut(FunctionKey.F5, [], () => {
          this.message = "I clicked Button 4";
          console.log("I clicked user callback.");
        }).keyboardShortcut(FunctionKey.F3, [])
      }
      .width('100%')
    }
    .height('100%')
  }
}

示例2(注册和解注册快捷键绑定)

该示例演示了如何实现按键注册和解注册快捷键绑定。

@Entry
@Component
struct Index {
  @State message: string = 'disable'
  @State shortCutEnable: boolean = false
  @State keyValue: string = ''

  build() {
    Row() {
      Column({ space: 5 }) {
        Text('Ctrl+A is ' + this.message)
        Button("Test short cut").onClick((event: ClickEvent) => {
          this.message = "I clicked Button";
          console.log("I clicked");
        }).keyboardShortcut(this.keyValue, [ModifierKey.CTRL])
        Button(this.message + 'shortCut').onClick((event: ClickEvent) => {
          this.shortCutEnable = !this.shortCutEnable;
          this.message = this.shortCutEnable ? 'enable' : 'disable';
          this.keyValue = this.shortCutEnable ? 'a' : '';
        })
        Button('multi-shortcut').onClick((event: ClickEvent) => {
          console.log('Trigger keyboard shortcut success.')
        }).keyboardShortcut('q', [ModifierKey.CTRL])
          .keyboardShortcut('w', [ModifierKey.CTRL])
          .keyboardShortcut('', []) // 不生效,绑定了多个快捷键的组件不能取消快捷键
      }
      .width('100%')
    }
    .height('100%')
  }
}

HarmonyOS 5.0ArkTS 组件中,设置触摸热区(Touch Area)属性可以通过组件的 `touchable` 和 `hitTestBehavior` 等属性来实现。这些属性允许开发者定义组件响应触摸事件的区域和行为。 ### 配置触摸热区属性 #### 1. `touchable` 属性 `touchable` 属性用于控制组件是否可以响应触摸事件。设置为 `true` 时,组件将可以响应触摸事件;设置为 `false` 时,组件将忽略所有触摸事件。 ```ts @Component struct MyComponent { build() { Column() { Text('Click Me') .fontSize(30) .touchable(true) } .width('100%') .height(100) } } ``` #### 2. `hitTestBehavior` 属性 `hitTestBehavior` 属性用于定义组件在命中测试(Hit Test)中的行为。它有以下几种取值: - `HitTestBehavior.self`: 组件仅在其自身的区域内响应触摸事件- `HitTestBehavior.none`: 组件不响应任何触摸事件- `HitTestBehavior.default`: 组件按照默认行为响应触摸事件。 ```ts @Component struct MyComponent { build() { Column() { Text('Click Me') .fontSize(30) .hitTestBehavior(HitTestBehavior.self) } .width('100%') .height(100) } } ``` #### 3. 自定义触摸热区 如果需要更复杂的触摸热区配置,可以通过自定义组件的 `onTouch` 事件来实现。通过监听触摸事件开发者可以自定义组件的响应逻辑。 ```ts @Component struct MyComponent { @State message: string = 'Touch Me' build() { Column() { Text(this.message) .fontSize(30) .onTouch((event: TouchEvent) => { if (event.type === TouchType.Down) { this.message = 'Touched Down' } else if (event.type === TouchType.Up) { this.message = 'Touched Up' } }) } .width('100%') .height(100) } } ``` ### 注意事项 - **性能优化**:在设置触摸热区时,应避免不必要的复杂逻辑,以确保应用的响应速度和性能。 - **交互设计**:触摸热区的设计应符合用户习惯,避免过于敏感或响应区域过小的问题。 通过以上方法,开发者可以灵活地配置 ArkTS 组件的触摸热区属性,以满足不同的交互需求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值