焦点控制

2024-01-22 16:19 更新

自定义组件的走焦效果,可设置组件是否走焦和具体的走焦顺序,tab键或者方向键切换焦点。

说明

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

属性

名称

参数类型

描述

focusable

boolean

设置当前组件是否可以获焦。

说明:

存在默认交互逻辑的组件例如Button、TextInput等,默认即为可获焦,Text、Image等组件则默认状态为不可获焦。不可获焦状态下,无法触发焦点事件

tabIndex9+

number

自定义组件tab键走焦能力。若有配置了tabIndex大于0的组件,则tab键走焦只会在tabIndex大于0的组件内按照tabIndex的值从小到大并循环依次走焦。若没有配置tabIndex大于0的组件,则tabIndex等于0的组件按照组件预设的走焦规则走焦。

- tabIndex >= 0:表示元素是可聚焦的,并且可以通过tab键走焦来访问到该元素。

- tabIndex < 0(通常是tabIndex = -1):表示元素是可聚焦的,但是不能通过tab键走焦来访问到该元素。

默认值:0

defaultFocus9+

boolean

设置当前组件是否为当前页面上的默认焦点,仅在初次创建的页面第一次进入时生效。

默认值:false

groupDefaultFocus9+

boolean

设置当前组件是否为当前组件所在容器获焦时的默认焦点,仅在初次创建容器节点第一次获焦时生效。

默认值:false

说明: 必须与tabIndex联合使用,当某个容器设置了tabIndex,且容器内某子组件设置了groupDefaultFocus,当该容器首次获焦时,会自动将焦点转移至该组件上。

focusOnTouch9+

boolean

设置当前组件是否支持点击获焦能力。

默认值:false

说明: 仅在组件可点击时才能正常获取焦点。

focusControl9+

requestFocus9+

requestFocus(value: string): boolean

方法语句中可使用的全局接口,调用此接口可以主动让焦点转移至参数指定的组件上。

参数:

名称

类型

必填

描述

value

string

目标组件使用接口key(value: string)绑定的字符串。

返回值:

类型

说明

boolean

返回是否成功给目标组件申请到焦点。若参数指向的目标组件存在,且目标组件可获焦,则返回true,否则返回false。

说明

支持焦点控制的组件:TextInput、TextArea、Search、Button、Text、Image、List、Grid。焦点事件当前仅支持在真机上显示运行效果。

示例

示例1

defaultFocus/groupDefaultFocus/focusOnTouch示例代码:

defaultFocus可以使绑定的组件成为页面创建后首次获焦的焦点。groupDefaultFocus可以使绑定的组件成为tabIndex容器创建后首次获焦的焦点。focusOnTouch可以使绑定的组件点击后立即获焦。

  1. // focusTest.ets
  2. @Entry
  3. @Component
  4. struct FocusableExample {
  5. @State inputValue: string = ''
  6. build() {
  7. Scroll() {
  8. Row({ space: 20 }) {
  9. Column({ space: 20 }) {
  10. Column({ space: 5 }) {
  11. Button('Group1')
  12. .width(165)
  13. .height(40)
  14. .fontColor(Color.White)
  15. .focusOnTouch(true) // 该Button组件点击后可获焦
  16. Row({ space: 5 }) {
  17. Button()
  18. .width(80)
  19. .height(40)
  20. .fontColor(Color.White)
  21. Button()
  22. .width(80)
  23. .height(40)
  24. .fontColor(Color.White)
  25. .focusOnTouch(true) // 该Button组件点击后可获焦
  26. }
  27. Row({ space: 5 }) {
  28. Button()
  29. .width(80)
  30. .height(40)
  31. .fontColor(Color.White)
  32. Button()
  33. .width(80)
  34. .height(40)
  35. .fontColor(Color.White)
  36. }
  37. }.borderWidth(2).borderColor(Color.Red).borderStyle(BorderStyle.Dashed)
  38. .tabIndex(1) // 该Column组件为按TAB键走焦的第一个获焦的组件
  39. Column({ space: 5 }) {
  40. Button('Group2')
  41. .width(165)
  42. .height(40)
  43. .fontColor(Color.White)
  44. Row({ space: 5 }) {
  45. Button()
  46. .width(80)
  47. .height(40)
  48. .fontColor(Color.White)
  49. Button()
  50. .width(80)
  51. .height(40)
  52. .fontColor(Color.White)
  53. .groupDefaultFocus(true) // 该Button组件上级Column组件获焦时获焦
  54. }
  55. Row({ space: 5 }) {
  56. Button()
  57. .width(80)
  58. .height(40)
  59. .fontColor(Color.White)
  60. Button()
  61. .width(80)
  62. .height(40)
  63. .fontColor(Color.White)
  64. }
  65. }.borderWidth(2).borderColor(Color.Green).borderStyle(BorderStyle.Dashed)
  66. .tabIndex(2) // 该Column组件为按TAB键走焦的第二个获焦的组件
  67. }
  68. Column({ space: 5 }) {
  69. TextInput({placeholder: 'input', text: this.inputValue})
  70. .onChange((value: string) => {
  71. this.inputValue = value
  72. })
  73. .defaultFocus(true) // 该TextInput组件为页面的初始默认焦点
  74. Button('Group3')
  75. .width(165)
  76. .height(40)
  77. .fontColor(Color.White)
  78. Row({ space: 5 }) {
  79. Button()
  80. .width(80)
  81. .height(40)
  82. .fontColor(Color.White)
  83. Button()
  84. .width(80)
  85. .height(40)
  86. .fontColor(Color.White)
  87. }
  88. Button()
  89. .width(165)
  90. .height(40)
  91. .fontColor(Color.White)
  92. Row({ space: 5 }) {
  93. Button()
  94. .width(80)
  95. .height(40)
  96. .fontColor(Color.White)
  97. Button()
  98. .width(80)
  99. .height(40)
  100. .fontColor(Color.White)
  101. }
  102. Button()
  103. .width(165)
  104. .height(40)
  105. .fontColor(Color.White)
  106. Row({ space: 5 }) {
  107. Button()
  108. .width(80)
  109. .height(40)
  110. .fontColor(Color.White)
  111. Button()
  112. .width(80)
  113. .height(40)
  114. .fontColor(Color.White)
  115. }
  116. }.borderWidth(2).borderColor(Color.Orange).borderStyle(BorderStyle.Dashed)
  117. .tabIndex(3) // 该Column组件为按TAB键走焦的第三个获焦的组件
  118. }.alignItems(VerticalAlign.Top)
  119. }
  120. }
  121. }

示意图:

首次按下TAB键,焦点切换到defaultFocus绑定的组件上:

第二次按TAB键,焦点切换到tabIndex(1)的容器上,且自动走到其内部的groupDefaultFocus绑定的组件上:

第三次按TAB键,焦点切换到tabIndex(2)的容器上,且自动走到其内部的groupDefaultFocus绑定的组件上:

第四次按TAB键,焦点切换到tabIndex(3)的容器上,且自动走到其内部的groupDefaultFocus绑定的组件上:

点击绑定了focusOnTouch的组件,组件自身获焦:

示例2

focusControl.requestFocus示例代码:

使用focusContrl.requestFocus接口使指定组件获取焦点。

  1. // requestFocus.ets
  2. import prompt from '@ohos.prompt'
  3. @Entry
  4. @Component
  5. struct RequestFocusExample {
  6. @State idList: string[] = ['A', 'B', 'C', 'D', 'E', 'F', 'LastPageId']
  7. @State selectId: string = 'LastPageId'
  8. build() {
  9. Column({ space:20 }){
  10. Row({space: 5}) {
  11. Button("id: " + this.idList[0] + " focusable(false)")
  12. .width(200).height(70).fontColor(Color.White)
  13. .key(this.idList[0])
  14. .focusable(false)
  15. Button("id: " + this.idList[1])
  16. .width(200).height(70).fontColor(Color.White)
  17. .key(this.idList[1])
  18. }
  19. Row({space: 5}) {
  20. Button("id: " + this.idList[2])
  21. .width(200).height(70).fontColor(Color.White)
  22. .key(this.idList[2])
  23. Button("id: " + this.idList[3])
  24. .width(200).height(70).fontColor(Color.White)
  25. .key(this.idList[3])
  26. }
  27. Row({space: 5}) {
  28. Button("id: " + this.idList[4])
  29. .width(200).height(70).fontColor(Color.White)
  30. .key(this.idList[4])
  31. Button("id: " + this.idList[5])
  32. .width(200).height(70).fontColor(Color.White)
  33. .key(this.idList[5])
  34. }
  35. Row({space: 5}) {
  36. Select([{value: this.idList[0]},
  37. {value: this.idList[1]},
  38. {value: this.idList[2]},
  39. {value: this.idList[3]},
  40. {value: this.idList[4]},
  41. {value: this.idList[5]},
  42. {value: this.idList[6]}])
  43. .value(this.selectId)
  44. .onSelect((index: number) => {
  45. this.selectId = this.idList[index]
  46. })
  47. Button("RequestFocus")
  48. .width(200).height(70).fontColor(Color.White)
  49. .onClick(() => {
  50. var res = focusControl.requestFocus(this.selectId) // 使选中的this.selectId的组件获焦
  51. if (res) {
  52. prompt.showToast({message: 'Request success'})
  53. } else {
  54. prompt.showToast({message: 'Request failed'})
  55. }
  56. })
  57. }
  58. }.width('100%').margin({ top:20 })
  59. }
  60. }

示意图:

按下TAB键,激活焦点态显示。

申请不存在的组件获焦:

申请不可获焦的组件获焦:

申请存在且可获焦的组件获焦:

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号