• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Class (UIObserver)
2
3<!--Kit: ArkUI-->
4<!--Subsystem: ArkUI-->
5<!--Owner: @piggyguy; @xiang-shouxing; @yangfan229-->
6<!--Designer: @piggyguy; @xiang-shouxing; @yangfan229-->
7<!--Tester: @fredyuan912-->
8<!--Adviser: @HelloCrease-->
9
10提供UI组件行为变化的无感监听能力。
11
12> **说明:**
13>
14> - 本模块首批接口从API version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
15>
16> - 本Class首批接口从API version 11开始支持。
17>
18> - 以下API需先使用UIContext中的[getUIObserver()](arkts-apis-uicontext-uicontext.md#getuiobserver11)方法获取到UIObserver对象,再通过该对象调用对应方法。
19>
20> - UIObserver仅能监听到本进程内的相关信息,不支持获取<!--Del-->[UIExtensionComponent](../../reference/apis-arkui/arkui-ts/ts-container-ui-extension-component-sys.md)等<!--DelEnd-->跨进程场景的信息。
21
22## on('navDestinationUpdate')<sup>11+</sup>
23
24on(type: 'navDestinationUpdate', callback: Callback\<observer.NavDestinationInfo\>): void
25
26监听[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的状态变化。
27
28**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
29
30**系统能力:** SystemCapability.ArkUI.ArkUI.Full
31
32**参数:**
33
34| 参数名   | 类型                                                  | 必填 | 说明                                                         |
35| -------- | ----------------------------------------------------- | ---- | ------------------------------------------------------------ |
36| type     | string                                                | 是   | 监听事件,固定为'navDestinationUpdate',即[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的状态变化。 |
37| callback | Callback\<observer.[NavDestinationInfo](js-apis-arkui-observer.md#navdestinationinfo)\> | 是   | 回调函数。返回当前的[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件状态。                 |
38
39**示例:**
40
41<!--code_no_check-->
42```ts
43// Index.ets
44// 演示uiObserver.on('navDestinationUpdate', callback)
45// uiObserver.off('navDestinationUpdate', callback)
46
47@Component
48struct PageOne {
49  build() {
50    NavDestination() {
51      Text("pageOne")
52    }.title("pageOne")
53  }
54}
55
56@Entry
57@Component
58struct Index {
59  private stack: NavPathStack = new NavPathStack();
60
61  @Builder
62  PageBuilder(name: string) {
63    PageOne()
64  }
65
66  aboutToAppear() {
67    // 添加监听
68    this.getUIContext().getUIObserver().on('navDestinationUpdate', (info) => {
69      console.info('NavDestination state update', JSON.stringify(info));
70    });
71  }
72
73  aboutToDisappear() {
74    // 取消监听,不选择回调时,取消所有监听的回调
75    this.getUIContext().getUIObserver().off('navDestinationUpdate');
76  }
77
78  build() {
79    Column() {
80      Navigation(this.stack) {
81        Button("push").onClick(() => {
82          // 将PageOne的NavDestination入栈
83          this.stack.pushPath({ name: "pageOne" });
84        })
85      }
86      .title("Navigation")
87      .navDestination(this.PageBuilder)
88    }
89    .width('100%')
90    .height('100%')
91  }
92}
93```
94
95## off('navDestinationUpdate')<sup>11+</sup>
96
97off(type: 'navDestinationUpdate', callback?: Callback\<observer.NavDestinationInfo\>): void
98
99取消监听[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的状态变化。
100
101**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
102
103**系统能力:** SystemCapability.ArkUI.ArkUI.Full
104
105**参数:**
106
107| 参数名   | 类型                                                  | 必填 | 说明                                                         |
108| -------- | ----------------------------------------------------- | ---- | ------------------------------------------------------------ |
109| type     | string                                                | 是   | 监听事件,固定为'navDestinationUpdate',即[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的状态变化。 |
110| callback | Callback\<observer.[NavDestinationInfo](js-apis-arkui-observer.md#navdestinationinfo)\> | 否   | 需要取消的监听回调,不传参数时,取消所有的[Navigation](arkui-ts/ts-basic-components-navigation.md)监听回调。                 |
111
112**示例:**
113
114参考[on('navDestinationUpdate')](#onnavdestinationupdate11)接口示例。
115
116## on('navDestinationUpdate')<sup>11+</sup>
117
118on(type: 'navDestinationUpdate', options: { navigationId: ResourceStr }, callback: Callback\<observer.NavDestinationInfo\>): void
119
120通过[Navigation](arkui-ts/ts-basic-components-navigation.md)的id监听[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的状态变化。
121
122**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
123
124**系统能力:** SystemCapability.ArkUI.ArkUI.Full
125
126**参数:**
127
128| 参数名   | 类型                                                         | 必填 | 说明                                                         |
129| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
130| type     | string                                                       | 是   | 监听事件,固定为'navDestinationUpdate',即[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的状态变化。 |
131| options  | { navigationId: [ResourceStr](arkui-ts/ts-types.md#resourcestr) } | 是   | 指定监听的[Navigation](arkui-ts/ts-basic-components-navigation.md)的id。                                   |
132| callback | Callback\<observer.[NavDestinationInfo](js-apis-arkui-observer.md#navdestinationinfo)\>        | 是   | 回调函数。返回当前的[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件状态。                 |
133
134**示例:**
135
136<!--code_no_check-->
137```ts
138// Index.ets
139// 演示uiObserver.on('navDestinationUpdate', options, callback)
140// uiObserver.off('navDestinationUpdate', options, callback)
141
142@Component
143struct PageOne {
144  build() {
145    NavDestination() {
146      Text("pageOne")
147    }.title("pageOne")
148  }
149}
150
151@Entry
152@Component
153struct Index {
154  private stack: NavPathStack = new NavPathStack();
155
156  @Builder
157  PageBuilder(name: string) {
158    PageOne()
159  }
160
161  aboutToAppear() {
162    // 添加监听,指定Navigation的id
163    this.getUIContext().getUIObserver().on('navDestinationUpdate', { navigationId: "testId" }, (info) => {
164      console.info('NavDestination state update', JSON.stringify(info));
165    });
166  }
167
168  aboutToDisappear() {
169    // 取消监听,不选择回调时,取消所有监听的回调
170    this.getUIContext().getUIObserver().off('navDestinationUpdate', { navigationId: "testId" });
171  }
172
173  build() {
174    Column() {
175      Navigation(this.stack) {
176        Button("push").onClick(() => {
177          // 将PageOne的NavDestination入栈
178          this.stack.pushPath({ name: "pageOne" });
179        })
180      }
181      .id("testId")
182      .title("Navigation")
183      .navDestination(this.PageBuilder)
184    }
185    .width('100%')
186    .height('100%')
187  }
188}
189```
190
191## off('navDestinationUpdate')<sup>11+</sup>
192
193off(type: 'navDestinationUpdate', options: { navigationId: ResourceStr }, callback?: Callback\<observer.NavDestinationInfo\>): void
194
195取消通过[Navigation](arkui-ts/ts-basic-components-navigation.md)的id监听[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的状态变化。
196
197**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
198
199**系统能力:** SystemCapability.ArkUI.ArkUI.Full
200
201**参数:**
202
203| 参数名   | 类型                                                         | 必填 | 说明                                                         |
204| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
205| type     | string                                                       | 是   | 监听事件,固定为'navDestinationUpdate',即[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的状态变化。 |
206| options  | { navigationId: [ResourceStr](arkui-ts/ts-types.md#resourcestr) } | 是   | 指定监听的[Navigation](arkui-ts/ts-basic-components-navigation.md)的id。                                   |
207| callback | Callback\<observer.[NavDestinationInfo](js-apis-arkui-observer.md#navdestinationinfo)\>        | 否   |需要取消的监听回调,不传参数时,取消该[Navigation](arkui-ts/ts-basic-components-navigation.md)上所有的监听回调。                 |
208
209**示例:**
210
211参考[on('navDestinationUpdate')](#onnavdestinationupdate11-1)接口示例。
212
213## on('navDestinationUpdateByUniqueId')<sup>20+</sup>
214
215on(type: 'navDestinationUpdateByUniqueId', navigationUniqueId: number, callback: Callback\<observer.NavDestinationInfo\>): void
216
217通过[Navigation](arkui-ts/ts-basic-components-navigation.md)的uniqueId监听[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的状态变化,uniqueId可通过[queryNavigationInfo](arkui-ts/ts-custom-component-api.md#querynavigationinfo12)获取。
218
219**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
220
221**系统能力:** SystemCapability.ArkUI.ArkUI.Full
222
223**参数:**
224
225| 参数名   | 类型                                                                 | 必填 | 说明                                                                     |
226| -------- | -------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------ |
227| type     | string                                                               | 是   | 监听事件,固定为'navDestinationUpdateByUniqueId',即[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的状态变化。 |
228| navigationUniqueId  | number | 是   | 指定监听的[Navigation](arkui-ts/ts-basic-components-navigation.md)的uniqueId,可以通过[queryNavigationInfo](arkui-ts/ts-custom-component-api.md#querynavigationinfo12)获取。                                               |
229| callback | Callback\<observer.[NavDestinationInfo](js-apis-arkui-observer.md#navdestinationinfo)\>                | 是   | 回调函数。返回当前的[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件状态。                             |
230
231**示例:**
232
233通过[Navigation](arkui-ts/ts-basic-components-navigation.md)的uniqueId,可以触发[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的状态变化。
234
235```ts
236// Index.ets
237// 演示on('navDestinationUpdateByUniqueId', navigationUniqueId, callback)
238// off('navDestinationUpdateByUniqueId', navigationUniqueId, callback)
239
240@Component
241struct PageOne {
242  private text = '';
243  private uniqueid = -1;
244  aboutToAppear() {
245    // 获取Navigation的uniqueId
246    let navigationUniqueId = this.queryNavigationInfo()?.uniqueId;
247    if (navigationUniqueId) {
248      this.uniqueid = navigationUniqueId.valueOf();
249    }
250    this.text = JSON.stringify(this.uniqueid);
251    // 添加监听,指定Navigation的uniqueId
252    this.getUIContext().getUIObserver().on('navDestinationUpdateByUniqueId', this.uniqueid, (info) => {
253      console.info('NavDestination state update navigationId', JSON.stringify(info));
254    });
255  }
256  aboutToDisappear() {
257    // 取消监听,不选择回调时,取消所有监听的回调
258    this.getUIContext().getUIObserver().off('navDestinationUpdateByUniqueId', this.uniqueid);
259  }
260  build() {
261    NavDestination() {
262      Text("pageOne")
263      Text('navigationUniqueId是:' + this.text)
264        .width('80%')
265        .height(50)
266        .margin(50)
267        .fontSize(20)
268    }.title("pageOne")
269  }
270}
271
272@Entry
273@Component
274struct Index {
275  private stack: NavPathStack = new NavPathStack();
276
277  @Builder
278  PageBuilder(name: string) {
279    PageOne()
280  }
281
282  build() {
283    Column() {
284      Navigation(this.stack) {
285        Button("push").onClick(() => {
286          // 将PageOne的NavDestination入栈
287          this.stack.pushPath({ name: "pageOne" });
288        })
289      }
290      .id("testId")
291      .title("Navigation")
292      .navDestination(this.PageBuilder)
293    }
294    .width('100%')
295    .height('100%')
296  }
297}
298```
299
300## off('navDestinationUpdateByUniqueId')<sup>20+</sup>
301
302off(type: 'navDestinationUpdateByUniqueId', navigationUniqueId: number, callback?: Callback\<observer.NavDestinationInfo\>): void
303
304取消通过[Navigation](arkui-ts/ts-basic-components-navigation.md)的uniqueId监听[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的变化。
305
306**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
307
308**系统能力:** SystemCapability.ArkUI.ArkUI.Full
309
310**参数:**
311
312| 参数名   | 类型                                                                 | 必填 | 说明                                                                     |
313| -------- | -------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------ |
314| type     | string                                                               | 是   | 监听事件,固定为'navDestinationUpdateByUniqueId',即[NavDestination](arkui-ts/ts-basic-components-navdestination.md)组件的状态变化。 |
315| navigationUniqueId  | number | 是   | 指定监听的[Navigation](arkui-ts/ts-basic-components-navigation.md)的uniqueId,可以通过[queryNavigationInfo](arkui-ts/ts-custom-component-api.md#querynavigationinfo12)获取。                                               |
316| callback | Callback\<observer.[NavDestinationInfo](js-apis-arkui-observer.md#navdestinationinfo)\>                | 否   | 需要取消的监听回调,不传参数时,取消该[Navigation](arkui-ts/ts-basic-components-navigation.md)上所有的监听回调。                             |
317
318**示例:**
319
320参考[on('navDestinationUpdateByUniqueId')](#onnavdestinationupdatebyuniqueid20)接口示例。
321
322## on('scrollEvent')<sup>12+</sup>
323
324on(type: 'scrollEvent', callback: Callback\<observer.ScrollEventInfo\>): void
325
326监听所有滚动组件滚动事件的开始和结束。滚动组件包括[List](./arkui-ts/ts-container-list.md)、[Grid](./arkui-ts/ts-container-grid.md)、[Scroll](./arkui-ts/ts-container-scroll.md)、[WaterFlow](./arkui-ts/ts-container-waterflow.md)、[ArcList](./arkui-ts/ts-container-arclist.md)。
327
328**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
329
330**系统能力:** SystemCapability.ArkUI.ArkUI.Full
331
332**参数:**
333
334| 参数名   | 类型                                                  | 必填 | 说明                                                         |
335| -------- | ----------------------------------------------------- | ---- | ------------------------------------------------------------ |
336| type     | string                                                | 是   | 监听事件,固定为'scrollEvent',即滚动事件的开始和结束。      |
337| callback | Callback\<observer.[ScrollEventInfo](js-apis-arkui-observer.md#scrolleventinfo12)\> | 是   | 回调函数。返回滚动事件的信息。   |
338
339**示例:**
340
341```ts
342// Index.ets
343// 演示uiObserver.on('scrollEvent', callback)
344// uiObserver.off('scrollEvent', callback)
345// uiObserver.on('scrollEvent', options, callback)
346// uiObserver.off('scrollEvent', options, callback)
347
348import { UIObserver } from '@kit.ArkUI';
349
350@Entry
351@Component
352struct Index {
353  scroller: Scroller = new Scroller();
354  observer: UIObserver = this.getUIContext().getUIObserver();
355  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7];
356
357  build() {
358    Column() {
359      Column() {
360        Scroll(this.scroller) {
361          Column() {
362            ForEach(this.arr, (item: number) => {
363              Text(item.toString())
364                .width('90%')
365                .height(150)
366                .backgroundColor(0xFFFFFF)
367                .borderRadius(15)
368                .fontSize(16)
369                .textAlign(TextAlign.Center)
370                .margin({ top: 10 })
371            }, (item: string) => item)
372          }.width('100%')
373        }
374        .id('testId')
375        .height('80%')
376      }
377      .width('100%')
378
379      Row() {
380        Button('UIObserver on')
381          .onClick(() => {
382            // 添加监听
383            this.observer.on('scrollEvent', (info) => {
384              console.info('scrollEventInfo', JSON.stringify(info));
385            });
386          })
387        Button('UIObserver off')
388          .onClick(() => {
389            // 取消监听,不选择回调时,取消所有监听的回调
390            this.observer.off('scrollEvent');
391          })
392      }
393
394      Row() {
395        Button('UIObserverWithId on')
396          .onClick(() => {
397            // 添加监听,指定滚动组件的id
398            this.observer.on('scrollEvent', { id: 'testId' }, (info) => {
399              console.info('scrollEventInfo', JSON.stringify(info));
400            });
401          })
402        Button('UIObserverWithId off')
403          .onClick(() => {
404            // 取消监听,不选择回调时,取消所有监听的回调
405            this.observer.off('scrollEvent', { id: 'testId' });
406          })
407      }
408    }
409    .height('100%')
410  }
411}
412```
413
414## off('scrollEvent')<sup>12+</sup>
415
416off(type: 'scrollEvent', callback?: Callback\<observer.ScrollEventInfo\>): void
417
418取消监听所有滚动组件滚动事件的开始和结束。滚动组件包括[List](./arkui-ts/ts-container-list.md)、[Grid](./arkui-ts/ts-container-grid.md)、[Scroll](./arkui-ts/ts-container-scroll.md)、[WaterFlow](./arkui-ts/ts-container-waterflow.md)、[ArcList](./arkui-ts/ts-container-arclist.md)。
419
420**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
421
422**系统能力:** SystemCapability.ArkUI.ArkUI.Full
423
424**参数:**
425
426| 参数名   | 类型                                                  | 必填 | 说明                                                         |
427| -------- | ----------------------------------------------------- | ---- | ------------------------------------------------------------ |
428| type     | string                                                | 是   | 监听事件,固定为'scrollEvent',即滚动事件的开始和结束。      |
429| callback | Callback\<observer.[ScrollEventInfo](js-apis-arkui-observer.md#scrolleventinfo12)\> | 否   | 回调函数。返回滚动事件的信息。不传参数时,取消所有滚动事件的监听回调。   |
430
431**示例:**
432
433参考[on('scrollEvent')](#onscrollevent12)接口示例。
434
435## on('scrollEvent')<sup>12+</sup>
436
437on(type: 'scrollEvent', options: observer.ObserverOptions, callback: Callback\<observer.ScrollEventInfo\>): void
438
439监听指定id的滚动组件滚动事件的开始和结束。滚动组件包括[List](./arkui-ts/ts-container-list.md)、[Grid](./arkui-ts/ts-container-grid.md)、[Scroll](./arkui-ts/ts-container-scroll.md)、[WaterFlow](./arkui-ts/ts-container-waterflow.md)、[ArcList](./arkui-ts/ts-container-arclist.md)。
440
441**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
442
443**系统能力:** SystemCapability.ArkUI.ArkUI.Full
444
445**参数:**
446
447| 参数名   | 类型                                                         | 必填 | 说明                                                         |
448| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
449| type     | string                                                       | 是   | 监听事件,固定为'scrollEvent',即滚动事件的开始和结束。 |
450| options  | [observer.ObserverOptions](js-apis-arkui-observer.md#observeroptions12) | 是   | Observer选项,包含指定监听的滚动组件的id。                    |
451| callback | Callback\<observer.[ScrollEventInfo](js-apis-arkui-observer.md#scrolleventinfo12)\>        | 是   | 回调函数。返回滚动事件的信息。                 |
452
453**示例:**
454
455参考[on('scrollEvent')](#onscrollevent12)接口示例。
456
457## off('scrollEvent')<sup>12+</sup>
458
459off(type: 'scrollEvent', options: observer.ObserverOptions, callback?: Callback\<observer.ScrollEventInfo\>): void
460
461取消监听指定id的滚动组件滚动事件的开始和结束。滚动组件包括[List](./arkui-ts/ts-container-list.md)、[Grid](./arkui-ts/ts-container-grid.md)、[Scroll](./arkui-ts/ts-container-scroll.md)、[WaterFlow](./arkui-ts/ts-container-waterflow.md)、[ArcList](./arkui-ts/ts-container-arclist.md)。
462
463**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
464
465**系统能力:** SystemCapability.ArkUI.ArkUI.Full
466
467**参数:**
468
469| 参数名   | 类型                                                         | 必填 | 说明                                                         |
470| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
471| type     | string                                                       | 是   | 监听事件,固定为'scrollEvent',即滚动事件的开始和结束。 |
472| options  | [observer.ObserverOptions](js-apis-arkui-observer.md#observeroptions12) | 是   | Observer选项,包含指定监听的滚动组件的id。                    |
473| callback | Callback\<observer.[ScrollEventInfo](js-apis-arkui-observer.md#scrolleventinfo12)\>        | 否   | 回调函数。返回滚动事件的信息。不传参数时,取消所有滚动事件的监听回调。                 |
474
475**示例:**
476
477参考[on('scrollEvent')](#onscrollevent12)接口示例。
478
479## on('routerPageUpdate')<sup>11+</sup>
480
481on(type: 'routerPageUpdate', callback: Callback\<observer.RouterPageInfo\>): void
482
483监听[Router](arkts-apis-uicontext-router.md)中page页面的状态变化。
484
485**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
486
487**系统能力:** SystemCapability.ArkUI.ArkUI.Full
488
489**参数:**
490
491| 参数名   | 类型                                                         | 必填 | 说明                                                         |
492| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
493| type     | string                                                       | 是   | 监听事件,固定为'routerPageUpdate',即[Router](arkts-apis-uicontext-router.md)中page页面的状态变化。 |
494| callback | Callback\<observer.[RouterPageInfo](js-apis-arkui-observer.md#routerpageinfo)\>        | 是   | 回调函数。携带[RouterPageInfo](js-apis-arkui-observer.md#routerpageinfo)对象,返回当前的page页面状态。                 |
495
496**示例:**
497
498<!--code_no_check-->
499```ts
500// PageOne.ets
501
502@Entry
503@Component
504struct PageOne {
505  build() {
506    Column() {
507      Text("pageOne")
508    }
509  }
510}
511```
512
513<!--code_no_check-->
514```ts
515// Index.ets
516// 演示uiObserver.on('routerPageUpdate', callback)
517// uiObserver.off('routerPageUpdate', callback)
518
519@Entry
520@Component
521struct Index {
522  aboutToAppear() {
523    // 添加监听
524    this.getUIContext().getUIObserver().on('routerPageUpdate', (info) => {
525      console.info('router page update', JSON.stringify(info));
526    });
527  }
528
529  aboutToDisappear() {
530    // 取消监听,不选择回调时,取消所有监听的回调
531    this.getUIContext().getUIObserver().off('routerPageUpdate');
532  }
533
534  build() {
535    Column() {
536      Button("pushUrl").onClick(() => {
537        // router跳转到PageOne.ets页面
538        this.getUIContext().getRouter().pushUrl({ url: 'pages/PageOne' })
539      })
540    }
541    .width('100%')
542    .height('100%')
543  }
544}
545```
546
547## off('routerPageUpdate')<sup>11+</sup>
548
549off(type: 'routerPageUpdate', callback?: Callback\<observer.RouterPageInfo\>): void
550
551取消监听[Router](arkts-apis-uicontext-router.md)中page页面的状态变化。
552
553**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
554
555**系统能力:** SystemCapability.ArkUI.ArkUI.Full
556
557**参数:**
558
559| 参数名   | 类型                                                         | 必填 | 说明                                                         |
560| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
561| type     | string                                                       | 是   | 监听事件,固定为'routerPageUpdate',即[Router](arkts-apis-uicontext-router.md)中page页面的状态变化。 |
562| callback | Callback\<observer.[RouterPageInfo](js-apis-arkui-observer.md#routerpageinfo)\>        | 否   | 需要被注销的回调函数。不传参数时,取消所有[Router](arkts-apis-uicontext-router.md)中page页面状态变化的监听回调。                 |
563
564**示例:**
565
566参考[on('routerPageUpdate')](#onrouterpageupdate11)接口示例。
567
568## on('densityUpdate')<sup>12+</sup>
569
570on(type: 'densityUpdate', callback: Callback\<observer.DensityInfo\>): void
571
572监听屏幕像素密度变化。
573
574**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
575
576**系统能力:** SystemCapability.ArkUI.ArkUI.Full
577
578**参数:**
579
580| 参数名   | 类型                                                         | 必填 | 说明                                                         |
581| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
582| type     | string                                                       | 是   | 监听事件,固定为'densityUpdate',即屏幕像素密度变化。 |
583| callback | Callback\<observer.[DensityInfo](./js-apis-arkui-observer.md#densityinfo12)\>        | 是   | 回调函数。携带[DensityInfo](./js-apis-arkui-observer.md#densityinfo12),返回变化后的屏幕像素密度。                 |
584
585**示例:**
586
587```ts
588// Index.ets
589// 演示uiObserver.on('densityUpdate', callback)
590// uiObserver.off('densityUpdate', callback)
591
592import { uiObserver } from '@kit.ArkUI';
593
594@Entry
595@Component
596struct Index {
597  @State density: number = 0;
598  @State message: string = '未注册监听';
599
600  // 定义监听回调函数
601  densityUpdateCallback = (info: uiObserver.DensityInfo) => {
602    this.density = info.density;
603    this.message = '变化后的DPI:' + this.density.toString();
604  }
605
606  build() {
607    Column() {
608      Text(this.message)
609        .fontSize(24)
610        .fontWeight(FontWeight.Bold)
611      Button('注册屏幕像素密度变化监听')
612        .margin({ bottom: 10 })
613        .onClick(() => {
614          this.message = '已注册监听';
615          // 添加监听
616          this.getUIContext().getUIObserver().on('densityUpdate', this.densityUpdateCallback);
617        })
618      Button('解除注册屏幕像素密度变化监听')
619        .onClick(() => {
620          this.message = '未注册监听';
621          // 取消监听
622          this.getUIContext().getUIObserver().off('densityUpdate', this.densityUpdateCallback);
623        })
624    }
625  }
626}
627```
628
629## off('densityUpdate')<sup>12+</sup>
630
631off(type: 'densityUpdate', callback?: Callback\<observer.DensityInfo\>): void
632
633取消监听屏幕像素密度的变化。
634
635**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
636
637**系统能力:** SystemCapability.ArkUI.ArkUI.Full
638
639**参数:**
640
641| 参数名   | 类型                                                                 | 必填 | 说明                                                                                         |
642| -------- | -------------------------------------------------------------------- | ---- | -------------------------------------------------------------------------------------------- |
643| type     | string                                                               | 是   | 监听事件,固定为'densityUpdate',即屏幕像素密度变化。                                        |
644| callback | Callback\<observer.[DensityInfo](./js-apis-arkui-observer.md#densityinfo12)\> | 否   | 需要被注销的回调函数。若不指定具体的回调函数,则注销该[UIContext](arkts-apis-uicontext-uicontext.md)下所有屏幕像素密度变化事件监听。 |
645
646**示例:**
647
648参考[on('densityUpdate')](#ondensityupdate12)接口示例。
649
650## on('willDraw')<sup>12+</sup>
651
652on(type: 'willDraw', callback: Callback\<void\>): void
653
654监听每一帧绘制指令下发情况。
655
656**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
657
658**系统能力:** SystemCapability.ArkUI.ArkUI.Full
659
660**参数:**
661
662| 参数名   | 类型                                                         | 必填 | 说明                                                         |
663| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
664| type     | string                                                       | 是   | 监听事件,固定为'willDraw',即是否将要绘制。 |
665| callback | Callback\<void\>        | 是   | 回调函数。                 |
666
667**示例:**
668
669```ts
670// Index.ets
671// 演示uiObserver.on('willDraw', callback)
672// uiObserver.off('willDraw', callback)
673
674@Entry
675@Component
676struct Index {
677  // 定义监听回调函数
678  willDrawCallback = () => {
679    console.info("willDraw指令下发");
680  }
681
682  build() {
683    Column() {
684      Button('注册绘制指令下发监听')
685        .margin({ bottom: 10 })
686        .onClick(() => {
687          // 添加监听
688          this.getUIContext().getUIObserver().on('willDraw', this.willDrawCallback);
689        })
690      Button('解除注册绘制指令下发监听')
691        .onClick(() => {
692          // 取消监听
693          this.getUIContext().getUIObserver().off('willDraw', this.willDrawCallback);
694        })
695    }
696  }
697}
698```
699
700## off('willDraw')<sup>12+</sup>
701
702off(type: 'willDraw', callback?: Callback\<void\>): void
703
704取消监听每一帧绘制指令下发情况。
705
706**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
707
708**系统能力:** SystemCapability.ArkUI.ArkUI.Full
709
710**参数:**
711
712| 参数名   | 类型                                                         | 必填 | 说明                                                         |
713| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
714| type     | string                                                       | 是   | 监听事件,固定为'willDraw',即是否将要绘制。 |
715| callback | Callback\<void\>        | 否   | 需要被注销的回调函数。不传参数时,取消所有绘制指令下发事件的监听回调。                  |
716
717**示例:**
718
719参考[on('willDraw')](#onwilldraw12)接口示例。
720
721## on('didLayout')<sup>12+</sup>
722
723on(type: 'didLayout', callback: Callback\<void\>): void
724
725监听每一帧布局完成情况。
726
727**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
728
729**系统能力:** SystemCapability.ArkUI.ArkUI.Full
730
731**参数:**
732
733| 参数名   | 类型                                                         | 必填 | 说明                                                         |
734| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
735| type     | string                                                       | 是   | 监听事件,固定为'didLayout',即是否布局完成。 |
736| callback | Callback\<void\>        | 是   | 回调函数。                 |
737
738**示例:**
739
740```ts
741// Index.ets
742// 演示uiObserver.on('didLayout', callback)
743// uiObserver.off('didLayout', callback)
744
745@Entry
746@Component
747struct Index {
748  // 定义监听回调函数
749  didLayoutCallback = () => {
750    console.info("layout布局完成");
751  }
752
753  build() {
754    Column() {
755      Button('注册布局完成监听')
756        .margin({ bottom: 10 })
757        .onClick(() => {
758          // 添加监听
759          this.getUIContext().getUIObserver().on('didLayout', this.didLayoutCallback);
760        })
761      Button('解除注册注册布局完成监听')
762        .onClick(() => {
763          // 取消监听
764          this.getUIContext().getUIObserver().off('didLayout', this.didLayoutCallback);
765        })
766    }
767  }
768}
769```
770
771## off('didLayout')<sup>12+</sup>
772
773off(type: 'didLayout', callback?: Callback\<void\>): void
774
775取消监听每一帧布局完成情况。
776
777**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
778
779**系统能力:** SystemCapability.ArkUI.ArkUI.Full
780
781**参数:**
782
783| 参数名   | 类型                                                         | 必填 | 说明                                                         |
784| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
785| type     | string                                                       | 是   | 监听事件,固定为'didLayout',即是否布局完成。 |
786| callback | Callback\<void\>        | 否   | 需要被注销的回调函数。不传参数时,取消所有布局完成的监听回调。                  |
787
788
789**示例:**
790
791参考[on('didLayout')](#ondidlayout12)接口示例。
792
793## on('navDestinationSwitch')<sup>12+</sup>
794
795on(type: 'navDestinationSwitch', callback: Callback\<observer.NavDestinationSwitchInfo\>): void
796
797监听[Navigation](arkui-ts/ts-basic-components-navigation.md)的页面切换事件。
798
799**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
800
801**系统能力:** SystemCapability.ArkUI.ArkUI.Full
802
803**参数:**
804
805| 参数名   | 类型                                                         | 必填 | 说明                                                         |
806| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
807| type     | string                                                       | 是   | 监听事件,固定为'navDestinationSwitch',即[Navigation](arkui-ts/ts-basic-components-navigation.md)的页面切换事件。 |
808| callback | Callback\<observer.[NavDestinationSwitchInfo](js-apis-arkui-observer.md#navdestinationswitchinfo12)\>        | 是   | 回调函数。携带[NavDestinationSwitchInfo](js-apis-arkui-observer.md#navdestinationswitchinfo12),返回页面切换事件的信息。                 |
809
810**示例:**
811
812```ts
813// Index.ets
814// 演示UIObserver.on('navDestinationSwitch', callback)
815// UIObserver.off('navDestinationSwitch', callback)
816
817import { uiObserver } from '@kit.ArkUI';
818
819@Component
820struct PageOne {
821  build() {
822    NavDestination() {
823      Text("pageOne")
824    }.title("pageOne")
825  }
826}
827
828// 定义监听回调函数
829function callbackFunc(info: uiObserver.NavDestinationSwitchInfo) {
830  console.info(`testTag navDestinationSwitch from: ${JSON.stringify(info.from)} to: ${JSON.stringify(info.to)}`);
831}
832
833@Entry
834@Component
835struct Index {
836  private stack: NavPathStack = new NavPathStack();
837
838  @Builder
839  PageBuilder(name: string) {
840    PageOne()
841  }
842
843  aboutToAppear() {
844    let obs = this.getUIContext().getUIObserver();
845    // 添加监听
846    obs.on('navDestinationSwitch', callbackFunc);
847  }
848
849  aboutToDisappear() {
850    let obs = this.getUIContext().getUIObserver();
851    // 取消监听
852    obs.off('navDestinationSwitch', callbackFunc);
853  }
854
855  build() {
856    Column() {
857      Navigation(this.stack) {
858        Button("push").onClick(() => {
859          // 将PageOne的NavDestination入栈
860          this.stack.pushPath({ name: "pageOne" });
861        })
862      }
863      .title("Navigation")
864      .navDestination(this.PageBuilder)
865    }
866    .width('100%')
867    .height('100%')
868  }
869}
870```
871
872## off('navDestinationSwitch')<sup>12+</sup>
873
874off(type: 'navDestinationSwitch', callback?: Callback\<observer.NavDestinationSwitchInfo\>): void
875
876取消监听[Navigation](arkui-ts/ts-basic-components-navigation.md)的页面切换事件。
877
878**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
879
880**系统能力:** SystemCapability.ArkUI.ArkUI.Full
881
882**参数:**
883
884| 参数名   | 类型                                                         | 必填 | 说明                                                         |
885| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
886| type     | string                                                       | 是   | 监听事件,固定为'navDestinationSwitch',即[Navigation](arkui-ts/ts-basic-components-navigation.md)的页面切换事件。 |
887| callback | Callback\<observer.[NavDestinationSwitchInfo](js-apis-arkui-observer.md#navdestinationswitchinfo12)\>        | 否   | 需要被注销的回调函数。不传参数时,取消该[Navigation](arkui-ts/ts-basic-components-navigation.md)上所有的监听回调。                 |
888
889**示例:**
890
891参考[on('navDestinationSwitch')](#onnavdestinationswitch12)接口示例。
892
893## on('navDestinationSwitch')<sup>12+</sup>
894
895on(type: 'navDestinationSwitch', observerOptions: observer.NavDestinationSwitchObserverOptions, callback: Callback\<observer.NavDestinationSwitchInfo\>): void
896
897通过监听选项监听[Navigation](arkui-ts/ts-basic-components-navigation.md)的页面切换事件。
898
899**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
900
901**系统能力:** SystemCapability.ArkUI.ArkUI.Full
902
903**参数:**
904
905| 参数名   | 类型                                                         | 必填 | 说明                                                         |
906| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
907| type     | string                                                       | 是   | 监听事件,固定为'navDestinationSwitch',即[Navigation](arkui-ts/ts-basic-components-navigation.md)的页面切换事件。 |
908| observerOptions | observer.[NavDestinationSwitchObserverOptions](js-apis-arkui-observer.md#navdestinationswitchobserveroptions12)        | 是   | 监听选项。   |
909| callback | Callback\<observer.[NavDestinationSwitchInfo](js-apis-arkui-observer.md#navdestinationswitchinfo12)\>        | 是   | 回调函数。携带[NavDestinationSwitchInfo](js-apis-arkui-observer.md#navdestinationswitchinfo12),返回页面切换事件的信息。                 |
910
911**示例:**
912
913```ts
914// Index.ets
915// 演示UIObserver.on('navDestinationSwitch', observerOptions, callback)
916// UIObserver.off('navDestinationSwitch', observerOptions, callback)
917
918import { uiObserver } from '@kit.ArkUI';
919
920@Component
921struct PageOne {
922  build() {
923    NavDestination() {
924      Text("pageOne")
925    }.title("pageOne")
926  }
927}
928
929// 定义监听回调函数
930function callbackFunc(info: uiObserver.NavDestinationSwitchInfo) {
931  console.info(`testTag navDestinationSwitch from: ${JSON.stringify(info.from)} to: ${JSON.stringify(info.to)}`);
932}
933
934@Entry
935@Component
936struct Index {
937  private stack: NavPathStack = new NavPathStack();
938
939  @Builder
940  PageBuilder(name: string) {
941    PageOne()
942  }
943
944  aboutToAppear() {
945    let obs = this.getUIContext().getUIObserver();
946    // 添加监听,指定Navigation的id
947    obs.on('navDestinationSwitch', { navigationId: "myNavId" }, callbackFunc);
948  }
949
950  aboutToDisappear() {
951    let obs = this.getUIContext().getUIObserver();
952    // 取消监听
953    obs.off('navDestinationSwitch', { navigationId: "myNavId" }, callbackFunc);
954  }
955
956  build() {
957    Column() {
958      Navigation(this.stack) {
959        Button("push").onClick(() => {
960          // 将PageOne的NavDestination入栈
961          this.stack.pushPath({ name: "pageOne" });
962        })
963      }
964      .id("myNavId")
965      .title("Navigation")
966      .navDestination(this.PageBuilder)
967    }
968    .width('100%')
969    .height('100%')
970  }
971}
972```
973
974## off('navDestinationSwitch')<sup>12+</sup>
975
976off(type: 'navDestinationSwitch', observerOptions: observer.NavDestinationSwitchObserverOptions, callback?: Callback\<observer.NavDestinationSwitchInfo\>): void
977
978取消通过监听选项监听[Navigation](arkui-ts/ts-basic-components-navigation.md)的页面切换事件。
979
980**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
981
982**系统能力:** SystemCapability.ArkUI.ArkUI.Full
983
984**参数:**
985
986| 参数名   | 类型                                                         | 必填 | 说明                                                         |
987| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
988| type     | string                                                       | 是   | 监听事件,固定为'navDestinationSwitch',即[Navigation](arkui-ts/ts-basic-components-navigation.md)的页面切换事件。 |
989| observerOptions | observer.[NavDestinationSwitchObserverOptions](js-apis-arkui-observer.md#navdestinationswitchobserveroptions12)        | 是   | 监听选项。   |
990| callback | Callback\<observer.[NavDestinationSwitchInfo](js-apis-arkui-observer.md#navdestinationswitchinfo12)\>        | 否   | 需要被注销的回调函数。不传参数时,取消该[Navigation](arkui-ts/ts-basic-components-navigation.md)上所有的监听回调。                 |
991
992**示例:**
993
994参考[on('navDestinationSwitch')](#onnavdestinationswitch12-1)接口示例。
995
996## on('willClick')<sup>12+</sup>
997
998on(type: 'willClick', callback: GestureEventListenerCallback): void
999
1000监听点击事件指令下发情况。回调类型为[GestureEventListenerCallback](arkts-apis-uicontext-t.md#gestureeventlistenercallback12)。从API version 20开始支持屏幕朗读触控模式。
1001
1002**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1003
1004**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1005
1006**参数:**
1007
1008| 参数名   | 类型                                                         | 必填 | 说明                                                         |
1009| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
1010| type     | string                                                       | 是   | 监听事件,固定为'willClick',用于监听点击事件指令下发情况,所注册回调将于点击事件触发前触发。 |
1011| callback | [GestureEventListenerCallback](arkts-apis-uicontext-t.md#gestureeventlistenercallback12) | 是   | 回调函数。可以获得点击事件的[GestureEvent](arkui-ts/ts-gesture-common.md#gestureevent对象说明)和组件的[FrameNode](js-apis-arkui-frameNode.md)。  |
1012
1013**示例:**
1014
1015```ts
1016// Index.ets
1017// 演示uiObserver.on('willClick', callback)
1018// uiObserver.off('willClick', callback)
1019// uiObserver.off('didClick', callback)
1020// uiObserver.off('didClick', callback)
1021
1022// 定义监听回调函数
1023function willClickGestureCallback(event: GestureEvent, node?: FrameNode) {
1024  console.info('Example willClickCallback GestureEvent is called');
1025}
1026
1027function willClickCallback(event: ClickEvent, node?: FrameNode) {
1028  console.info('Example willClickCallback ClickEvent is called');
1029}
1030
1031function didClickGestureCallback(event: GestureEvent, node?: FrameNode) {
1032  console.info('Example didClickCallback GestureEvent is called');
1033}
1034
1035function didClickCallback(event: ClickEvent, node?: FrameNode) {
1036  console.info('Example didClickCallback ClickEvent is called');
1037}
1038
1039@Entry
1040@Component
1041struct ClickExample {
1042  @State clickCount: number = 0;
1043  @State tapGestureCount: number = 0;
1044
1045  aboutToAppear(): void {
1046    // 添加监听
1047    let observer = this.getUIContext().getUIObserver();
1048    observer.on('willClick', willClickGestureCallback);
1049    observer.on('willClick', willClickCallback);
1050    observer.on('didClick', didClickGestureCallback);
1051    observer.on('didClick', didClickCallback);
1052  }
1053
1054  aboutToDisappear(): void {
1055    // 取消监听
1056    let observer = this.getUIContext().getUIObserver();
1057    observer.off('willClick', willClickGestureCallback);
1058    observer.off('willClick', willClickCallback);
1059    // 如果不选择回调,则会取消所有监听的回调
1060    observer.off('didClick');
1061  }
1062
1063  build() {
1064    Column() {
1065      /**
1066       * onClick和TapGesture在后端的处理是一致的
1067       * 所以无论是触发onClick还是触发TapGesture
1068       * on('willClick')两种类型入参的回调(GestureEvent和ClickEvent)都会被触发
1069       * 同理,on('didClick')的两种回调也会被触发
1070       */
1071      Column() {
1072        Text('Click Count: ' + this.clickCount)
1073      }
1074      .height(200)
1075      .width(300)
1076      .padding(20)
1077      .border({ width: 3 })
1078      .margin(50)
1079      .onClick((event: ClickEvent) => {
1080        this.clickCount++;
1081        console.info('Example Click event is called');
1082      })
1083
1084      Column() {
1085        Text('TapGesture Count: ' + this.tapGestureCount)
1086      }
1087      .height(200)
1088      .width(300)
1089      .padding(20)
1090      .border({ width: 3 })
1091      .margin(50)
1092      .gesture(TapGesture({ count: 2 }).onAction((event: TapGestureEvent) => {
1093        this.tapGestureCount++;
1094        console.info('Example Click event is called');
1095      }))
1096    }
1097  }
1098}
1099```
1100
1101## off('willClick')<sup>12+</sup>
1102
1103off(type: 'willClick', callback?: GestureEventListenerCallback): void
1104
1105取消监听点击事件指令下发情况。从API version 20开始支持屏幕朗读触控模式。
1106
1107**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1108
1109**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1110
1111**参数:**
1112
1113| 参数名   | 类型                                                         | 必填 | 说明                                                  |
1114| -------- | ------------------------------------------------------------ | ---- | ----------------------------------------------------- |
1115| type     | string                                                       | 是   | 监听事件,固定为'willClick',即点击事件指令下发情况。 |
1116| callback | [GestureEventListenerCallback](arkts-apis-uicontext-t.md#gestureeventlistenercallback12) | 否   | 需要被注销的回调函数。不传参数时,取消所有的点击事件指令下发监听回调。                                |
1117
1118**示例:**
1119
1120参考[on('willClick')](#onwillclick12)接口示例。
1121
1122## on('didClick')<sup>12+</sup>
1123
1124on(type: 'didClick', callback: GestureEventListenerCallback): void
1125
1126监听点击事件指令下发情况。回调类型为[GestureEventListenerCallback](arkts-apis-uicontext-t.md#gestureeventlistenercallback12)。从API version 20开始支持屏幕朗读触控模式。
1127
1128**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1129
1130**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1131
1132**参数:**
1133
1134| 参数名   | 类型                                                         | 必填 | 说明                                                         |
1135| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
1136| type     | string                                                       | 是   | 监听事件,固定为'didClick',用于监听点击事件指令下发情况,所注册回调将于点击事件触发后触发。 |
1137| callback | [GestureEventListenerCallback](arkts-apis-uicontext-t.md#gestureeventlistenercallback12) | 是   | 回调函数。可以获得点击事件的[GestureEvent](arkui-ts/ts-gesture-common.md#gestureevent对象说明)和组件的[FrameNode](js-apis-arkui-frameNode.md)。  |
1138
1139**示例:**
1140
1141参考[on('willClick')](#onwillclick12)接口示例。
1142
1143## off('didClick')<sup>12+</sup>
1144
1145off(type: 'didClick', callback?: GestureEventListenerCallback): void
1146
1147取消监听点击事件指令下发情况。从API version 20开始,支持屏幕朗读触控模式。
1148
1149**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1150
1151**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1152
1153**参数:**
1154
1155| 参数名   | 类型                                                         | 必填 | 说明                                                 |
1156| -------- | ------------------------------------------------------------ | ---- | ---------------------------------------------------- |
1157| type     | string                                                       | 是   | 监听事件,固定为'didClick',即点击事件指令下发情况。 |
1158| callback | [GestureEventListenerCallback](arkts-apis-uicontext-t.md#gestureeventlistenercallback12) | 否   | 需要被注销的回调函数。不传参数时,取消所有的点击事件指令下发监听回调。                               |
1159
1160**示例:**
1161
1162参考[on('willClick')](#onwillclick12)接口示例。
1163
1164## on('willClick')<sup>12+</sup>
1165
1166on(type: 'willClick', callback: ClickEventListenerCallback): void
1167
1168监听点击事件指令下发情况。回调类型为[ClickEventListenerCallback](arkts-apis-uicontext-t.md#clickeventlistenercallback12)。从API version 20开始支持屏幕朗读触控模式。
1169
1170**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1171
1172**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1173
1174**参数:**
1175
1176| 参数名   | 类型                                                        | 必填 | 说明                                                         |
1177| -------- | ----------------------------------------------------------- | ---- | ------------------------------------------------------------ |
1178| type     | string                                                      | 是   | 监听事件,固定为'willClick',用于监听点击事件指令下发情况,所注册回调将于点击事件触发前触发。 |
1179| callback | [ClickEventListenerCallback](arkts-apis-uicontext-t.md#clickeventlistenercallback12) | 是   | 回调函数。可以获得点击事件的[ClickEvent](arkui-ts/ts-universal-events-click.md#clickevent对象说明)和组件的[FrameNode](js-apis-arkui-frameNode.md)。    |
1180
1181**示例:**
1182
1183参考[on('willClick')](#onwillclick12)接口示例。
1184
1185## off('willClick')<sup>12+</sup>
1186
1187off(type: 'willClick', callback?: ClickEventListenerCallback): void
1188
1189取消监听点击事件指令下发情况。从API version 20开始,支持屏幕朗读触控模式。
1190
1191**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1192
1193**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1194
1195**参数:**
1196
1197| 参数名   | 类型                                                        | 必填 | 说明                                                  |
1198| -------- | ----------------------------------------------------------- | ---- | ----------------------------------------------------- |
1199| type     | string                                                      | 是   | 监听事件,固定为'willClick',即点击事件指令下发情况。 |
1200| callback | [ClickEventListenerCallback](arkts-apis-uicontext-t.md#clickeventlistenercallback12) | 否   | 需要被注销的回调函数。不传参数时,取消所有的点击事件指令下发监听回调。                                |
1201
1202**示例:**
1203
1204参考[on('willClick')](#onwillclick12)接口示例。
1205
1206## on('didClick')<sup>12+</sup>
1207
1208on(type: 'didClick', callback: ClickEventListenerCallback): void
1209
1210监听点击事件指令下发情况。回调类型为[ClickEventListenerCallback](arkts-apis-uicontext-t.md#clickeventlistenercallback12)。从API version 20开始支持屏幕朗读触控模式。
1211
1212**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1213
1214**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1215
1216**参数:**
1217
1218| 参数名   | 类型                                                        | 必填 | 说明                                                         |
1219| -------- | ----------------------------------------------------------- | ---- | ------------------------------------------------------------ |
1220| type     | string                                                      | 是   | 监听事件,固定为'didClick',用于监听点击事件指令下发情况,所注册回调将于点击事件触发后触发。 |
1221| callback | [ClickEventListenerCallback](arkts-apis-uicontext-t.md#clickeventlistenercallback12) | 是   | 回调函数。可以获得点击事件的[ClickEvent](arkui-ts/ts-universal-events-click.md#clickevent对象说明)和组件的[FrameNode](js-apis-arkui-frameNode.md)。    |
1222
1223**示例:**
1224
1225参考[on('willClick')](#onwillclick12)接口示例。
1226
1227## off('didClick')<sup>12+</sup>
1228
1229off(type: 'didClick', callback?: ClickEventListenerCallback): void
1230
1231取消监听点击事件指令下发情况。从API version 20开始支持屏幕朗读触控模式。
1232
1233**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1234
1235**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1236
1237**参数:**
1238
1239| 参数名   | 类型                                                        | 必填 | 说明                                                 |
1240| -------- | ----------------------------------------------------------- | ---- | ---------------------------------------------------- |
1241| type     | string                                                      | 是   | 监听事件,固定为'didClick',即点击事件指令下发情况。 |
1242| callback | [ClickEventListenerCallback](arkts-apis-uicontext-t.md#clickeventlistenercallback12) | 否   | 需要被注销的回调函数。不传参数时,取消所有的点击事件指令下发监听回调。                               |
1243
1244**示例:**
1245
1246参考[on('willClick')](#onwillclick12)接口示例。
1247
1248## on('tabContentUpdate')<sup>12+</sup>
1249
1250on(type: 'tabContentUpdate', callback: Callback\<observer.TabContentInfo\>): void
1251
1252监听[TabContent](arkui-ts/ts-container-tabcontent.md)页面的切换事件。
1253
1254**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1255
1256**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1257
1258**参数:**
1259
1260| 参数名   | 类型                                                         | 必填 | 说明                                                         |
1261| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
1262| type     | string                                                       | 是   | 监听事件,固定为'tabContentUpdate',即[TabContent](arkui-ts/ts-container-tabcontent.md)页面的切换事件。 |
1263| callback | Callback\<observer.[TabContentInfo](js-apis-arkui-observer.md#tabcontentinfo12)\> | 是   | 回调函数。携带[TabContentInfo](js-apis-arkui-observer.md#tabcontentinfo12),返回[TabContent](arkui-ts/ts-container-tabcontent.md)页面切换事件的信息。 |
1264
1265**示例:**
1266
1267```ts
1268// Index.ets
1269// 演示uiObserver.on('tabContentUpdate', callback)
1270// uiObserver.off('tabContentUpdate', callback)
1271
1272import { uiObserver } from '@kit.ArkUI';
1273
1274// 定义监听回调函数
1275function callbackFunc(info: uiObserver.TabContentInfo) {
1276  console.info('tabContentUpdate', JSON.stringify(info));
1277}
1278
1279@Entry
1280@Component
1281struct TabsExample {
1282
1283  aboutToAppear(): void {
1284    let observer = this.getUIContext().getUIObserver();
1285    // 添加监听
1286    observer.on('tabContentUpdate', callbackFunc);
1287  }
1288
1289  aboutToDisappear(): void {
1290    let observer = this.getUIContext().getUIObserver();
1291    // 取消监听
1292    observer.off('tabContentUpdate', callbackFunc);
1293  }
1294
1295  build() {
1296    Column() {
1297      Tabs() {
1298        TabContent() {
1299          Column().width('100%').height('100%').backgroundColor('#00CB87')
1300        }.tabBar('green').id('tabContentId0')
1301
1302        TabContent() {
1303          Column().width('100%').height('100%').backgroundColor('#007DFF')
1304        }.tabBar('blue').id('tabContentId1')
1305
1306        TabContent() {
1307          Column().width('100%').height('100%').backgroundColor('#FFBF00')
1308        }.tabBar('yellow').id('tabContentId2')
1309
1310        TabContent() {
1311          Column().width('100%').height('100%').backgroundColor('#E67C92')
1312        }.tabBar('pink').id('tabContentId3')
1313      }
1314      .width(360)
1315      .height(296)
1316      .backgroundColor('#F1F3F5')
1317      .id('tabsId')
1318    }.width('100%')
1319  }
1320}
1321```
1322
1323## off('tabContentUpdate')<sup>12+</sup>
1324
1325off(type: 'tabContentUpdate', callback?: Callback\<observer.TabContentInfo\>): void
1326
1327取消监听[TabContent](arkui-ts/ts-container-tabcontent.md)页面的切换事件。
1328
1329**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1330
1331**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1332
1333**参数:**
1334
1335| 参数名   | 类型                                                         | 必填 | 说明                                                         |
1336| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
1337| type     | string                                                       | 是   | 监听事件,固定为'tabContentUpdate',即[TabContent](arkui-ts/ts-container-tabcontent.md)页面的切换事件。 |
1338| callback | Callback\<observer.[TabContentInfo](js-apis-arkui-observer.md#tabcontentinfo12)\> | 否   | 需要被注销的回调函数。不传参数时,取消该[Tabs](arkui-ts/ts-container-tabs.md)上所有的监听回调。 |
1339
1340**示例:**
1341
1342参考[on('tabContentUpdate')](#ontabcontentupdate12)接口示例。
1343
1344## on('tabContentUpdate')<sup>12+</sup>
1345
1346on(type: 'tabContentUpdate', options: observer.ObserverOptions, callback: Callback\<observer.TabContentInfo\>): void
1347
1348通过[Tabs](arkui-ts/ts-container-tabs.md)组件的id监听[TabContent](arkui-ts/ts-container-tabcontent.md)页面的切换事件。
1349
1350**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1351
1352**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1353
1354**参数:**
1355
1356| 参数名   | 类型                                                         | 必填 | 说明                                                         |
1357| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
1358| type     | string                                                       | 是   | 监听事件,固定为'tabContentUpdate',即[TabContent](arkui-ts/ts-container-tabcontent.md)页面的切换事件。 |
1359| options  | observer.[ObserverOptions](js-apis-arkui-observer.md#observeroptions12) | 是   | 指定监听的[Tabs](arkui-ts/ts-container-tabs.md)组件的id。 |
1360| callback | Callback\<observer.[TabContentInfo](js-apis-arkui-observer.md#tabcontentinfo12)\> | 是   | 回调函数。携带TabContentInfo,返回[TabContent](arkui-ts/ts-container-tabcontent.md)页面切换事件的信息。 |
1361
1362**示例:**
1363
1364```ts
1365// Index.ets
1366// 演示uiObserver.on('tabContentUpdate', options, callback)
1367// uiObserver.off('tabContentUpdate', options, callback)
1368
1369import { uiObserver } from '@kit.ArkUI';
1370
1371// 定义监听回调函数
1372function callbackFunc(info: uiObserver.TabContentInfo) {
1373  console.info('tabContentUpdate', JSON.stringify(info));
1374}
1375
1376@Entry
1377@Component
1378struct TabsExample {
1379
1380  aboutToAppear(): void {
1381    let observer = this.getUIContext().getUIObserver();
1382    // 添加监听,指定Tabs的id
1383    observer.on('tabContentUpdate', { id: 'tabsId' }, callbackFunc);
1384  }
1385
1386  aboutToDisappear(): void {
1387    let observer = this.getUIContext().getUIObserver();
1388    // 取消监听
1389    observer.off('tabContentUpdate', { id: 'tabsId' }, callbackFunc);
1390  }
1391
1392  build() {
1393    Column() {
1394      Tabs() {
1395        TabContent() {
1396          Column().width('100%').height('100%').backgroundColor('#00CB87')
1397        }.tabBar('green').id('tabContentId0')
1398
1399        TabContent() {
1400          Column().width('100%').height('100%').backgroundColor('#007DFF')
1401        }.tabBar('blue').id('tabContentId1')
1402
1403        TabContent() {
1404          Column().width('100%').height('100%').backgroundColor('#FFBF00')
1405        }.tabBar('yellow').id('tabContentId2')
1406
1407        TabContent() {
1408          Column().width('100%').height('100%').backgroundColor('#E67C92')
1409        }.tabBar('pink').id('tabContentId3')
1410      }
1411      .width(360)
1412      .height(296)
1413      .backgroundColor('#F1F3F5')
1414      .id('tabsId')
1415    }.width('100%')
1416  }
1417}
1418```
1419
1420## off('tabContentUpdate')<sup>12+</sup>
1421
1422off(type: 'tabContentUpdate', options: observer.ObserverOptions, callback?: Callback\<observer.TabContentInfo\>): void
1423
1424取消通过[Tabs](arkui-ts/ts-container-tabs.md)组件的id监听[TabContent](arkui-ts/ts-container-tabcontent.md)页面的切换事件。
1425
1426**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1427
1428**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1429
1430**参数:**
1431
1432| 参数名   | 类型                                                         | 必填 | 说明                                                         |
1433| -------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
1434| type     | string                                                       | 是   | 监听事件,固定为'tabContentUpdate',即[TabContent](arkui-ts/ts-container-tabcontent.md)页面的切换事件。 |
1435| options  | observer.[ObserverOptions](js-apis-arkui-observer.md#observeroptions12) | 是   | 指定监听的[Tabs](arkui-ts/ts-container-tabs.md)组件的id。 |
1436| callback | Callback\<observer.[TabContentInfo](js-apis-arkui-observer.md#tabcontentinfo12)\> | 否   | 需要被注销的回调函数。不传参数时,取消该[Tabs](arkui-ts/ts-container-tabs.md)上所有的监听回调。 |
1437
1438**示例:**
1439
1440参考[on('tabContentUpdate')](#ontabcontentupdate12-1)接口示例。
1441
1442## on('beforePanStart')<sup>19+</sup>
1443
1444on(type: 'beforePanStart', callback: PanListenerCallback): void
1445
1446监听Pan手势[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件,在[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件执行之前执行callback回调。支持手指滑动、鼠标滑动、鼠标滚轮和触摸板拖动,暂不支持屏幕朗读触控模式。
1447
1448**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1449
1450**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1451
1452**参数:**
1453
1454| 参数名   | 类型                                                        | 必填 | 说明                                                         |
1455| -------- | ----------------------------------------------------------- | ---- | ------------------------------------------------------------ |
1456| type     | string                                                      | 是   | 监听事件,固定为'beforePanStart',用于监听Pan手势[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件执行前的指令下发情况,所注册回调将于Pan手势[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件触发前触发。 |
1457| callback | [PanListenerCallback](arkts-apis-uicontext-t.md#panlistenercallback19) | 是   | 回调函数。可以获得Pan手势事件的[GestureEvent](arkui-ts/ts-gesture-common.md#gestureevent对象说明),[GestureRecognizer](arkui-ts/ts-gesture-common.md#gesturerecognizer12)和组件的[FrameNode](js-apis-arkui-frameNode.md)。   |
1458
1459**示例:**
1460
1461```ts
1462// Index.ets
1463// 演示uiObserver.on('beforePanStart', callback)
1464// uiObserver.off('beforePanStart', callback)
1465// uiObserver.on('afterPanStart', callback)
1466// uiObserver.off('afterPanStart', callback)
1467// uiObserver.on('beforePanEnd', callback)
1468// uiObserver.off('beforePanEnd', callback)
1469// uiObserver.on('afterPanEnd', callback)
1470// uiObserver.off('afterPanEnd', callback)
1471
1472// 在页面Component中使用
1473let TEST_TAG: string = 'node';
1474
1475// 定义监听回调函数
1476function callbackFunc() {
1477  console.info('on == beforePanStart');
1478}
1479
1480function afterPanCallBack() {
1481  console.info('on == afterPanStart');
1482}
1483
1484function beforeEndCallBack() {
1485  console.info('on == beforeEnd');
1486}
1487
1488function afterEndCallBack() {
1489  console.info('on == afterEnd');
1490}
1491
1492function beforeStartCallBack() {
1493  console.info('on == beforeStartCallBack');
1494}
1495
1496function panGestureCallBack(event: GestureEvent, current: GestureRecognizer, node?: FrameNode) {
1497  TEST_TAG = 'panGestureEvent';
1498  console.info('===' + TEST_TAG + '=== event.repeat is ' + event.repeat);
1499  console.info('===' + TEST_TAG + '=== event target is ' + event.target.id);
1500  TEST_TAG = 'panGestureCurrent';
1501  console.info('===' + TEST_TAG + '=== current.getTag() is ' + current.getTag());
1502  TEST_TAG = 'panGestureNode';
1503  console.info('===' + TEST_TAG + '=== node?.getId() is ' + node?.getId());
1504}
1505
1506
1507@Entry
1508@Component
1509struct PanExample {
1510  @State offsetX: number = 0;
1511  @State offsetY: number = 0;
1512  @State positionX: number = 0;
1513  @State positionY: number = 0;
1514  private panOption: PanGestureOptions = new PanGestureOptions({direction: PanDirection.All });
1515
1516  aboutToAppear(): void {
1517    let observer = this.getUIContext().getUIObserver();
1518    // 添加监听
1519    observer.on('beforePanStart', callbackFunc);
1520    observer.on('beforePanStart', panGestureCallBack);
1521    observer.on('beforePanStart', beforeStartCallBack);
1522    observer.on('afterPanStart', afterPanCallBack);
1523    observer.on('beforePanEnd', beforeEndCallBack);
1524    observer.on('afterPanEnd', afterEndCallBack);
1525  }
1526
1527  aboutToDisappear(): void {
1528    let observer = this.getUIContext().getUIObserver();
1529    // 取消监听
1530    observer.off('beforePanStart', callbackFunc);
1531    observer.off('beforePanStart');
1532    observer.off('afterPanStart', afterPanCallBack);
1533    observer.off('beforePanEnd');
1534    observer.off('afterPanEnd');
1535  }
1536
1537  build() {
1538    Column(){
1539      Column(){
1540        Text('PanGesture :\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
1541      }
1542      .height(200)
1543      .width(300)
1544      .padding(20)
1545      .border({ width: 3 })
1546      .margin(50)
1547      .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
1548      .id('columnOuter')
1549      .gesture(
1550        PanGesture(this.panOption)
1551          .onActionStart((event: GestureEvent) => {
1552            console.info('Pan start');
1553          })
1554          .onActionUpdate((event: GestureEvent) => {
1555            if (event) {
1556              this.offsetX = this.positionX + event.offsetX;
1557              this.offsetY = this.positionY + event.offsetY;
1558            }
1559          })
1560          .onActionEnd((event: GestureEvent) => {
1561            this.positionX = this.offsetX;
1562            this.positionY = this.offsetY;
1563            console.info('Pan end');
1564            }))
1565          }
1566  }
1567}
1568```
1569
1570## off('beforePanStart')<sup>19+</sup>
1571
1572off(type: 'beforePanStart', callback?: PanListenerCallback): void
1573
1574取消[on('beforePanStart')](#onbeforepanstart19)监听Pan手势[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件执行前的callback回调。
1575
1576**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1577
1578**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1579
1580**参数:**
1581
1582| 参数名   | 类型                                                        | 必填 | 说明                                                 |
1583| -------- | ----------------------------------------------------------- | ---- | ---------------------------------------------------- |
1584| type     | string                                                      | 是   | 监听事件,固定为'beforePanStart',即Pan手势[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件执行前的指令下发情况。 |
1585| callback | [PanListenerCallback](arkts-apis-uicontext-t.md#panlistenercallback19) | 否   | 需要被注销的回调函数。不传参数时,取消所有的Pan手势[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件执行前的指令下发监听回调。                               |
1586
1587**示例:**
1588
1589参考[on('beforePanStart')](#onbeforepanstart19)接口示例。
1590
1591## on('afterPanStart')<sup>19+</sup>
1592
1593on(type: 'afterPanStart', callback: PanListenerCallback): void
1594
1595监听Pan手势[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件执行后的指令下发情况,在[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件执行之后执行callback回调。支持手指滑动、鼠标滑动、鼠标滚轮和触摸板拖动,暂不支持屏幕朗读触控模式。
1596
1597**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1598
1599**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1600
1601**参数:**
1602
1603| 参数名   | 类型                                                        | 必填 | 说明                                                         |
1604| -------- | ----------------------------------------------------------- | ---- | ------------------------------------------------------------ |
1605| type     | string                                                      | 是   | 监听事件,固定为'afterPanStart',用于监听Pan手势[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件执行后的指令下发情况,所注册回调将于Pan手势[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件触发后触发。 |
1606| callback | [PanListenerCallback](arkts-apis-uicontext-t.md#panlistenercallback19) | 是   | 回调函数。可以获得Pan手势事件的[GestureEvent](arkui-ts/ts-gesture-common.md#gestureevent对象说明),[GestureRecognizer](arkui-ts/ts-gesture-common.md#gesturerecognizer12)和组件的[FrameNode](js-apis-arkui-frameNode.md)。   |
1607
1608**示例:**
1609
1610参考[on('beforePanStart')](#onbeforepanstart19)接口示例。
1611
1612## off('afterPanStart')<sup>19+</sup>
1613
1614off(type: 'afterPanStart', callback?: PanListenerCallback): void
1615
1616取消[on('afterPanStart')](#onafterpanstart19)监听Pan手势[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#事件)事件执行后的callback回调。
1617
1618**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1619
1620**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1621
1622**参数:**
1623
1624| 参数名   | 类型                                                        | 必填 | 说明                                                 |
1625| -------- | ----------------------------------------------------------- | ---- | ---------------------------------------------------- |
1626| type     | string                                                      | 是   | 监听事件,固定为'afterPanStart',即Pan手势[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件执行后的指令下发情况。 |
1627| callback | [PanListenerCallback](arkts-apis-uicontext-t.md#panlistenercallback19) | 否   | 需要被注销的回调函数。不传参数时,取消所有的Pan手势[onActionStart](arkui-ts/ts-basic-gestures-pangesture.md#onactionstart)事件执行后的指令下发监听回调。                               |
1628
1629**示例:**
1630
1631参考[on('beforePanStart')](#onbeforepanstart19)接口示例。
1632
1633## on('beforePanEnd')<sup>19+</sup>
1634
1635on(type: 'beforePanEnd', callback: PanListenerCallback): void
1636
1637监听Pan手势[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件执行前的指令下发情况,在[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件执行之前执行callback回调。支持手指滑动、鼠标滑动、鼠标滚轮和触摸板拖动,暂不支持屏幕朗读触控模式。
1638
1639**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1640
1641**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1642
1643**参数:**
1644
1645| 参数名   | 类型                                                        | 必填 | 说明                                                         |
1646| -------- | ----------------------------------------------------------- | ---- | ------------------------------------------------------------ |
1647| type     | string                                                      | 是   | 监听事件,固定为'beforePanEnd',用于监听Pan手势[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件执行前的指令下发情况,所注册回调将于Pan手势[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件触发前触发。 |
1648| callback | [PanListenerCallback](arkts-apis-uicontext-t.md#panlistenercallback19) | 是   | 回调函数。可以获得Pan手势事件的[GestureEvent](arkui-ts/ts-gesture-common.md#gestureevent对象说明),[GestureRecognizer](arkui-ts/ts-gesture-common.md#gesturerecognizer12)和组件的[FrameNode](js-apis-arkui-frameNode.md)。   |
1649
1650**示例:**
1651
1652参考[on('beforePanStart')](#onbeforepanstart19)接口示例。
1653
1654## off('beforePanEnd')<sup>19+</sup>
1655
1656off(type: 'beforePanEnd', callback?: PanListenerCallback): void
1657
1658取消[on('beforePanEnd')](#onbeforepanend19)监听Pan手势[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件执行前的callback回调。
1659
1660**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1661
1662**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1663
1664**参数:**
1665
1666| 参数名   | 类型                                                        | 必填 | 说明                                                 |
1667| -------- | ----------------------------------------------------------- | ---- | ---------------------------------------------------- |
1668| type     | string                                                      | 是   | 监听事件,固定为'beforePanEnd',即Pan手势[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件执行前的指令下发情况。 |
1669| callback | [PanListenerCallback](arkts-apis-uicontext-t.md#panlistenercallback19) | 否   | 需要被注销的回调函数。不传参数时,取消所有的Pan手势[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件执行前的指令下发监听回调。                               |
1670
1671**示例:**
1672
1673参考[on('beforePanStart')](#onbeforepanstart19)接口示例。
1674
1675## on('afterPanEnd')<sup>19+</sup>
1676
1677on(type: 'afterPanEnd', callback: PanListenerCallback): void
1678
1679监听Pan手势[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件执行后的指令下发情况,在[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件执行之后执行callback回调。支持手指滑动、鼠标滑动、鼠标滚轮和触摸板拖动,暂不支持屏幕朗读触控模式。
1680
1681**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1682
1683**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1684
1685**参数:**
1686
1687| 参数名   | 类型                                                        | 必填 | 说明                                                         |
1688| -------- | ----------------------------------------------------------- | ---- | ------------------------------------------------------------ |
1689| type     | string                                                      | 是   | 监听事件,固定为'beforePanEnd',用于监听Pan手势[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件执行后的指令下发情况,所注册回调将于Pan手势[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件触发后触发。 |
1690| callback | [PanListenerCallback](arkts-apis-uicontext-t.md#panlistenercallback19) | 是   | 回调函数。可以获得Pan手势事件的[GestureEvent](arkui-ts/ts-gesture-common.md#gestureevent对象说明),[GestureRecognizer](arkui-ts/ts-gesture-common.md#gesturerecognizer12)和组件的[FrameNode](js-apis-arkui-frameNode.md)。   |
1691
1692**示例:**
1693
1694参考[on('beforePanStart')](#onbeforepanstart19)接口示例。
1695
1696## off('afterPanEnd')<sup>19+</sup>
1697
1698off(type: 'afterPanEnd', callback?: PanListenerCallback): void
1699
1700取消[on('afterPanEnd')](#onafterpanend19)监听Pan手势[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件执行后的callback回调。
1701
1702**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1703
1704**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1705
1706**参数:**
1707
1708| 参数名   | 类型                                                        | 必填 | 说明                                                 |
1709| -------- | ----------------------------------------------------------- | ---- | ---------------------------------------------------- |
1710| type     | string                                                      | 是   | 监听事件,固定为'afterPanEnd',即Pan手势[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件执行后的指令下发情况。 |
1711| callback | [PanListenerCallback](arkts-apis-uicontext-t.md#panlistenercallback19) | 否   | 需要被注销的回调函数。不传参数时,取消所有的Pan手势[onActionEnd](arkui-ts/ts-basic-gestures-pangesture.md#onactionend)事件执行后的指令下发监听回调。                               |
1712
1713**示例:**
1714
1715参考[on('beforePanStart')](#onbeforepanstart19)接口示例。
1716
1717## on('nodeRenderState')<sup>20+</sup>
1718
1719on(type: 'nodeRenderState', nodeIdentity: NodeIdentity, callback: NodeRenderStateChangeCallback): void
1720
1721注册一个回调函数,以便在特定节点的渲染状态发生变化时调用,当注册成功时,此回调将立即执行一次。
1722
1723注意节点数量的限制。出于性能考虑,在单个UI实例中,注册节点太多,将会抛出异常。
1724
1725通常,当组件被移动到屏幕外时,会收到RENDER_OUT的通知。但在某些情况下,即使组件移动到屏幕外也不会触发RENDER_OUT通知。例如,具有缓存功能的组件[Swiper](./arkui-ts/ts-container-swiper.md),即使[cachedCount](./arkui-ts/ts-container-swiper.md#cachedcount15)属性中的参数isShown配置为true,也不会触发RENDER_OUT通知。
1726
1727**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
1728
1729**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1730
1731**参数:**
1732
1733| 参数名   | 类型                                                        | 必填 | 说明                                                         |
1734| -------- | ----------------------------------------------------------- | ---- | ------------------------------------------------------------ |
1735| type     | string                                                      | 是   | 监听事件,固定为'nodeRenderState',用于监听节点渲染状态发生改变。 |
1736| nodeIdentity | [NodeIdentity](arkts-apis-uicontext-t.md#nodeidentity20) | 是   | 节点标识。   |
1737| callback | [NodeRenderStateChangeCallback](arkts-apis-uicontext-t.md#noderenderstatechangecallback20) | 是   | 回调函数。可以获得节点渲染状态改变事件的[NodeRenderState](arkts-apis-uicontext-e.md#noderenderstate20)和组件的[FrameNode](js-apis-arkui-frameNode.md)。   |
1738
1739**错误码:**
1740
1741以下错误码的详细介绍请参见[注册节点渲染状态监听错误码](errorcode-node-render-monitor.md)。
1742
1743| 错误码ID   | 错误信息 |
1744| --------- | ------- |
1745| 161001    | The count of nodes monitoring render state is over the limitation. |
1746
1747**示例:**
1748
1749该示例展示了如何对目标组件添加监听和取消监听。当向左滑动,被监听组件从屏幕消失,会收到RENDER_OUT的通知,然后向右滑动,被监听组件重新出现在屏幕上,会收到RENDER_IN通知。
1750
1751```ts
1752// Index.ets
1753// 演示uiObserver.on('nodeRenderState', nodeIdentity, callback)
1754// uiObserver.off('nodeRenderState', nodeIdentity, callback)
1755
1756// 在页面Component中使用
1757import { NodeRenderState } from '@kit.ArkUI';
1758
1759@Entry
1760@Component
1761struct Index {
1762  @State fontColor: string = '#182431';
1763  @State selectedFontColor: string = '#007DFF';
1764  @State currentIndex: number = 0;
1765  @State selectedIndex: number = 0;
1766  @State notice: string = "";
1767  private controller: TabsController = new TabsController();
1768
1769  @Builder
1770  tabBuilder(index: number, name: string) {
1771    Column() {
1772      Text(name)
1773        .fontColor(this.selectedIndex === index ? this.selectedFontColor : this.fontColor)
1774        .fontSize(16)
1775        .fontWeight(this.selectedIndex === index ? 500 : 400)
1776        .lineHeight(22)
1777        .margin({ top: 17, bottom: 7 })
1778      Divider()
1779        .strokeWidth(2)
1780        .color('#007DFF')
1781        .opacity(this.selectedIndex === index ? 1 : 0)
1782    }.width('100%')
1783  }
1784
1785  build() {
1786    Column() {
1787      Tabs({ barPosition: BarPosition.Start, index: this.currentIndex, controller: this.controller }) {
1788        TabContent() {
1789          Column() {
1790            Column() {
1791              Button("被监听节点").margin({ top: 5 }).id("button_1")
1792              Button("添加监听").margin({ top: 5 }).onClick(() => {
1793                let node: FrameNode | null = this.getUIContext().getFrameNodeById("button_1");
1794                if (node) {
1795                  let observer = this.getUIContext().getUIObserver();
1796                  // 添加监听
1797                  observer.on("nodeRenderState", node?.getUniqueId(), (state: NodeRenderState, node?: FrameNode) => {
1798                    // 根据节点状态修改通知信息
1799                    if (state === 0) {
1800                      this.notice = "RENDER_IN";
1801                    } else {
1802                      this.notice = "RENDER_OUT";
1803                    }
1804                    console.info("节点状态发生改变,当前状态:", state);
1805                  })
1806                }
1807              })
1808              Button("取消监听").margin({ top: 5 }).onClick(() => {
1809                let node: FrameNode | null = this.getUIContext().getFrameNodeById("button_1");
1810                if (node) {
1811                  let observer = this.getUIContext().getUIObserver();
1812                  // 取消监听,不选择回调时,取消所有监听的回调
1813                  observer.off("nodeRenderState", node?.getUniqueId());
1814                }
1815                this.notice = "";
1816              })
1817            }
1818          }.width('100%').height('100%').backgroundColor('#00CB87')
1819        }.tabBar(this.tabBuilder(0, 'green'))
1820
1821        TabContent() {
1822          Column().width('100%').height('100%').backgroundColor('#007DFF')
1823        }.tabBar(this.tabBuilder(1, 'blue'))
1824
1825        TabContent() {
1826          Column().width('100%').height('100%').backgroundColor('#FFBF00')
1827        }.tabBar(this.tabBuilder(2, 'yellow'))
1828
1829        TabContent() {
1830          Column().width('100%').height('100%').backgroundColor('#E67C92')
1831        }.tabBar(this.tabBuilder(3, 'pink'))
1832      }
1833      .vertical(false)
1834      .barMode(BarMode.Fixed)
1835      .barWidth(360)
1836      .barHeight(56)
1837      .animationDuration(400)
1838      .onChange((index: number) => {
1839        this.currentIndex = index;
1840        this.selectedIndex = index;
1841      })
1842      .onAnimationStart((index: number, targetIndex: number, event: TabsAnimationEvent) => {
1843        if (index === targetIndex) {
1844          return;
1845        }
1846        this.selectedIndex = targetIndex;
1847      })
1848      .width(360)
1849      .height(296)
1850      .margin({ top: 52 })
1851      .backgroundColor('#F1F3F5')
1852
1853      Text(`收到的通知: ${this.notice}`)
1854        .fontSize(20)
1855        .margin(10)
1856    }.width('100%')
1857  }
1858}
1859```
1860![example](figures/node_render_status.gif)
1861
1862## off('nodeRenderState')<sup>20+</sup>
1863
1864off(type: 'nodeRenderState', nodeIdentity: NodeIdentity, callback?: NodeRenderStateChangeCallback): void
1865
1866取消监听节点渲染状态发生变化的callback回调。
1867
1868**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
1869
1870**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1871
1872**参数:**
1873
1874| 参数名   | 类型                                                        | 必填 | 说明                                                 |
1875| -------- | ----------------------------------------------------------- | ---- | ---------------------------------------------------- |
1876| type     | string                                                      | 是   | 监听事件,固定为'nodeRenderState',即节点渲染状态变化指令下发情况。 |
1877| nodeIdentity | [NodeIdentity](arkts-apis-uicontext-t.md#nodeidentity20) | 是   | 节点标识。   |
1878| callback | [NodeRenderStateChangeCallback](arkts-apis-uicontext-t.md#noderenderstatechangecallback20) | 否   | 需要被注销的回调函数。不传参数时,取消该节点所有的渲染状态变化指令下发监听回调。   |
1879
1880**示例:**
1881
1882参考[on('nodeRenderState')](#onnoderenderstate20)接口示例。
1883
1884## addGlobalGestureListener<sup>20+</sup>
1885
1886addGlobalGestureListener(type: GestureListenerType, option: GestureObserverConfigs, callback: GestureListenerCallback): void
1887
1888注册回调函数以监听手势触发信息。
1889
1890**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
1891
1892**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1893
1894**参数:**
1895
1896| 参数名   | 类型         | 必填 | 说明          |
1897| -------- | ----------- | ---- | ----------- |
1898| type     | [GestureListenerType](arkts-apis-uicontext-e.md#gesturelistenertype20)     | 是   |要监听的手势类型。  |
1899| option | [GestureObserverConfigs](arkts-apis-uicontext-i.md#gestureobserverconfigs20) | 是   |  绑定全局监听器时的配置选项。  |
1900| callback | [GestureListenerCallback](arkts-apis-uicontext-t.md#gesturelistenercallback20) | 是   |  手势状态更新时的回调函数。  |
1901
1902**示例:**
1903
1904该示例使用全局手势监听器实时追踪Tap、Pan和LongPress三个独立区域的触发状态,记录各手势的触发次数和最后操作信息,并在组件生命周期内自动管理监听器的注册与注销。
1905
1906```ts
1907// Index.ets
1908// 演示uiObserver.addGlobalGestureListener(type, option, callback)
1909// uiObserver.removeGlobalGestureListener(type, callback)
1910
1911import { GestureListenerType, GestureActionPhase, GestureTriggerInfo, GestureListenerCallback } from '@kit.ArkUI';
1912
1913@Entry
1914@Component
1915struct Index {
1916  @State message: string = '全局手势监控';
1917  @State tapCount: number = 0;
1918  @State panCount: number = 0;
1919  @State longPressCount: number = 0;
1920  @State lastAction: string = '无';
1921  @State lastArea: string = '无';
1922
1923  // 存储监听器回调引用
1924  private tapCallback?: GestureListenerCallback;
1925  private panCallback?: GestureListenerCallback;
1926  private longPressCallback?: GestureListenerCallback;
1927
1928  // 启用全局监听
1929  aboutToAppear() {
1930    this.addGlobalListeners();
1931  }
1932  // 终止全局监听
1933  aboutToDisappear() {
1934    this.removeGlobalListeners();
1935  }
1936
1937  private addGlobalListeners() {
1938    const observer = this.getUIContext().getUIObserver();
1939
1940    // Tap监听任务
1941    this.tapCallback = (info: GestureTriggerInfo) => {
1942      if (info.event?.target?.id === 'tap-area') {
1943        this.tapCount++;
1944        this.lastAction = '点击';
1945        this.lastArea = 'Tap区域';
1946      }
1947    };
1948    observer.addGlobalGestureListener(
1949      GestureListenerType.TAP,
1950      { actionPhases: [GestureActionPhase.WILL_START, GestureActionPhase.WILL_END] },
1951      this.tapCallback
1952    );
1953
1954    // Pan监听任务
1955    this.panCallback = (info: GestureTriggerInfo) => {
1956      if (info.event?.target?.id === 'pan-area') {
1957        this.panCount++;
1958        this.lastAction = '平移';
1959        this.lastArea = 'Pan区域';
1960      }
1961    };
1962    observer.addGlobalGestureListener(
1963      GestureListenerType.PAN,
1964      {
1965        actionPhases: [GestureActionPhase.WILL_START, GestureActionPhase.WILL_END]
1966      },
1967      this.panCallback
1968    );
1969
1970    // LongPress监听任务
1971    this.longPressCallback = (info: GestureTriggerInfo) => {
1972      if (info.event?.target?.id === 'longpress-area') {
1973        this.longPressCount++;
1974        this.lastAction = '长按';
1975        this.lastArea = 'LongPress区域';
1976      }
1977    };
1978    observer.addGlobalGestureListener(
1979      GestureListenerType.LONG_PRESS,
1980      {
1981        actionPhases: [GestureActionPhase.WILL_START, GestureActionPhase.WILL_END]
1982      },
1983      this.longPressCallback
1984    );
1985  }
1986
1987  private removeGlobalListeners() {
1988    const observer = this.getUIContext().getUIObserver();
1989    if (this.tapCallback) {
1990      observer.removeGlobalGestureListener(0, this.tapCallback);
1991    }
1992    if (this.panCallback) {
1993      observer.removeGlobalGestureListener(2, this.panCallback);
1994    }
1995    if (this.longPressCallback) {
1996      observer.removeGlobalGestureListener(1, this.longPressCallback);
1997    }
1998  }
1999
2000  build() {
2001    Column() {
2002      // 手势数据统计面板
2003      Row({ space: 30 }) {
2004        Column() {
2005          Text('点击次数:').fontSize(16)
2006          Text(`${this.tapCount}`).fontSize(24).fontColor('#FF6B81')
2007        }
2008        Column() {
2009          Text('平移次数:').fontSize(16)
2010          Text(`${this.panCount}`).fontSize(24).fontColor('#7BED9F')
2011        }
2012        Column() {
2013          Text('长按次数:').fontSize(16)
2014          Text(`${this.longPressCount}`).fontSize(24).fontColor('#70A1FF')
2015        }
2016      }
2017      .margin(10)
2018
2019      Text(`最后动作: ${this.lastAction} (${this.lastArea})`)
2020        .fontSize(18)
2021        .margin(10)
2022
2023      // 手势区域
2024      Row() {
2025        Text('Tap区域').fontSize(18)
2026      }
2027      .id('tap-area')
2028      .width('90%')
2029      .height(120)
2030      .margin(10)
2031      .border({ width: 2, color: '#FF6B81' })
2032      .justifyContent(FlexAlign.Center)
2033      .gesture(TapGesture().onAction((event: GestureEvent)=>{
2034        //具体实现内容
2035      }))
2036
2037      Row() {
2038        Text('Pan区域').fontSize(18)
2039      }
2040      .id('pan-area')
2041      .width('90%')
2042      .height(120)
2043      .margin(10)
2044      .border({ width: 2, color: '#7BED9F' })
2045      .justifyContent(FlexAlign.Center)
2046      .gesture(
2047        PanGesture()
2048          .onActionStart((event: GestureEvent) => {
2049            //具体实现内容
2050          })
2051          .onActionEnd((event: GestureEvent) => {
2052            //具体实现内容
2053          })
2054      )
2055
2056      Row() {
2057        Text('LongPress区域').fontSize(18)
2058      }
2059      .id('longpress-area')
2060      .width('90%')
2061      .height(120)
2062      .margin(10)
2063      .border({ width: 2, color: '#70A1FF' })
2064      .justifyContent(FlexAlign.Center)
2065      .gesture(
2066        LongPressGesture()
2067          .onAction((event: GestureEvent)=>{
2068            //具体实现内容
2069          })
2070          .onActionEnd((event: GestureEvent) => {
2071            //具体实现内容
2072          })
2073      )
2074    }
2075    .width('100%')
2076    .height('100%')
2077  }
2078}
2079```
2080![example](figures/pangesture_uiobserver_listener.gif)
2081
2082## removeGlobalGestureListener<sup>20+</sup>
2083
2084removeGlobalGestureListener(type: GestureListenerType, callback?: GestureListenerCallback): void
2085
2086移除某一手势监听器类型的回调函数。
2087
2088**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
2089
2090**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2091
2092**参数:**
2093
2094| 参数名   | 类型     | 必填 | 说明       |
2095| -------- | ---------- | ---- | --------- |
2096| type     | [GestureListenerType](arkts-apis-uicontext-e.md#gesturelistenertype20)    | 是   | 要移除监听器的事件类型。 |
2097| callback | [GestureListenerCallback](arkts-apis-uicontext-t.md#gesturelistenercallback20) | 否   | 待移除的回调函数(未提供时将清除该手势类型的所有回调)。   |
2098
2099**示例:**
2100
2101参考[addGlobalGestureListener](#addglobalgesturelistener20)接口示例。
2102