1e41f4b71Sopenharmony_ci# @ohos.graphics.displaySync (可变帧率) 2e41f4b71Sopenharmony_ci可变帧率支持让开发者以指定帧率来运行UI业务,一般用于开发者自绘制UI,并且对于帧率有特定诉求的场景。 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ci> **说明:** 5e41f4b71Sopenharmony_ci> 6e41f4b71Sopenharmony_ci> 本模块首批接口和数据定义从API version 11开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 7e41f4b71Sopenharmony_ci 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci## 导入模块 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci```ts 12e41f4b71Sopenharmony_ciimport { displaySync } from '@kit.ArkGraphics2D'; 13e41f4b71Sopenharmony_ci``` 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ci## displaySync.create 16e41f4b71Sopenharmony_cicreate(): DisplaySync 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ci创建DisplaySync对象,通过此对象设置UI自绘制内容帧率。 19e41f4b71Sopenharmony_ci 20e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 21e41f4b71Sopenharmony_ci 22e41f4b71Sopenharmony_ci**返回值:** 23e41f4b71Sopenharmony_ci 24e41f4b71Sopenharmony_ci| 类型 | 说明 | 25e41f4b71Sopenharmony_ci| ------------------ | ------------------------ | 26e41f4b71Sopenharmony_ci| [DisplaySync](#displaysync) | 返回当前创建的DisplaySync对象实例。 | 27e41f4b71Sopenharmony_ci 28e41f4b71Sopenharmony_ci**示例:** 29e41f4b71Sopenharmony_ci 30e41f4b71Sopenharmony_ci```ts 31e41f4b71Sopenharmony_cilet backDisplaySync: displaySync.DisplaySync = displaySync.create(); 32e41f4b71Sopenharmony_ci``` 33e41f4b71Sopenharmony_ci## IntervalInfo 34e41f4b71Sopenharmony_ci 35e41f4b71Sopenharmony_ci开发者可以从订阅函数中获取帧绘制的时间戳信息,包含当前帧到达的时间timestamp和下一帧预期到达的时间targetTimestamp。 36e41f4b71Sopenharmony_ci 37e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 38e41f4b71Sopenharmony_ci 39e41f4b71Sopenharmony_ci| 名称 | 类型 | 只读 | 可选 | 说明 | 40e41f4b71Sopenharmony_ci| ---------------- | ----------------------------------------- | ---- | ---- | ------------------------------------------ | 41e41f4b71Sopenharmony_ci| timestamp | number | 是 | 否 | 当前帧到达的时间(单位:纳秒)。 | 42e41f4b71Sopenharmony_ci| targetTimestamp | number| 是 | 否 | 下一帧预期到达的时间(单位:纳秒)。 | 43e41f4b71Sopenharmony_ci 44e41f4b71Sopenharmony_ci## DisplaySync 45e41f4b71Sopenharmony_ci 46e41f4b71Sopenharmony_ci 帧率和回调函数设置实例。用于帧率设置和回调函数的注册,以及启动和停止回调函数的调用。 47e41f4b71Sopenharmony_ci 48e41f4b71Sopenharmony_ci 下列API示例中都需先使用[displaySync.create()](#displaysynccreate)方法获取到DisplaySync实例,再通过此实例调用对应方法。 49e41f4b71Sopenharmony_ci 50e41f4b71Sopenharmony_ci### setExpectedFrameRateRange 51e41f4b71Sopenharmony_ci 52e41f4b71Sopenharmony_cisetExpectedFrameRateRange(rateRange: ExpectedFrameRateRange) : void 53e41f4b71Sopenharmony_ci 54e41f4b71Sopenharmony_ci设置期望的帧率范围。 55e41f4b71Sopenharmony_ci 56e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 57e41f4b71Sopenharmony_ci 58e41f4b71Sopenharmony_ci**参数:** 59e41f4b71Sopenharmony_ci 60e41f4b71Sopenharmony_ci| 参数名 | 类型 | 必填 | 说明 | 61e41f4b71Sopenharmony_ci| --------------- | ------------------------------------------ | ---- | -----------------------------| 62e41f4b71Sopenharmony_ci| rateRange | [ExpectedFrameRateRange](../apis-arkui/arkui-ts/ts-explicit-animation.md#expectedframeraterange11)| 是 | 设置DisplaySync期望的帧率。| 63e41f4b71Sopenharmony_ci 64e41f4b71Sopenharmony_ci**错误码**: 65e41f4b71Sopenharmony_ci 66e41f4b71Sopenharmony_ci以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)。 67e41f4b71Sopenharmony_ci 68e41f4b71Sopenharmony_ci| 错误码ID | 错误信息 | 69e41f4b71Sopenharmony_ci| ------- | -------- | 70e41f4b71Sopenharmony_ci| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2.Incorrect parameters types. 3. Parameter verification failed. or check ExpectedFrameRateRange if valid.| 71e41f4b71Sopenharmony_ci 72e41f4b71Sopenharmony_ci**示例:** 73e41f4b71Sopenharmony_ci 74e41f4b71Sopenharmony_ci```ts 75e41f4b71Sopenharmony_cilet range : ExpectedFrameRateRange = { 76e41f4b71Sopenharmony_ci expected: 10, 77e41f4b71Sopenharmony_ci min:0, 78e41f4b71Sopenharmony_ci max:120 79e41f4b71Sopenharmony_ci}; 80e41f4b71Sopenharmony_ci 81e41f4b71Sopenharmony_ci// 设置DisplaySync期望的帧率 82e41f4b71Sopenharmony_cibackDisplaySync?.setExpectedFrameRateRange(range) 83e41f4b71Sopenharmony_ci``` 84e41f4b71Sopenharmony_ci 85e41f4b71Sopenharmony_ci### on('frame') 86e41f4b71Sopenharmony_ci 87e41f4b71Sopenharmony_cion(type: 'frame', callback: Callback\<IntervalInfo\>): void 88e41f4b71Sopenharmony_ci 89e41f4b71Sopenharmony_ci订阅每一帧的变化。 90e41f4b71Sopenharmony_ci 91e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 92e41f4b71Sopenharmony_ci 93e41f4b71Sopenharmony_ci**参数:** 94e41f4b71Sopenharmony_ci 95e41f4b71Sopenharmony_ci| 参数名 | 类型 | 必填 | 说明 | 96e41f4b71Sopenharmony_ci| --------------- | ------------------------------------------ | ---- | -----------------------------| 97e41f4b71Sopenharmony_ci| type | 'frame'| 是 | 设置注册回调的类型(只能是'frame'类型)。| 98e41f4b71Sopenharmony_ci| callback | Callback<[IntervalInfo](#intervalinfo)>| 是 | 订阅函数。| 99e41f4b71Sopenharmony_ci 100e41f4b71Sopenharmony_ci 101e41f4b71Sopenharmony_ci**示例:** 102e41f4b71Sopenharmony_ci 103e41f4b71Sopenharmony_ci```ts 104e41f4b71Sopenharmony_cilet callback = (frameInfo: displaySync.IntervalInfo) => { 105e41f4b71Sopenharmony_ci console.info("DisplaySync", 'TimeStamp:' + frameInfo.timestamp + ' TargetTimeStamp: ' + frameInfo.targetTimestamp); 106e41f4b71Sopenharmony_ci} 107e41f4b71Sopenharmony_ci 108e41f4b71Sopenharmony_ci// 注册订阅函数 109e41f4b71Sopenharmony_cibackDisplaySync?.on("frame", callback) 110e41f4b71Sopenharmony_ci``` 111e41f4b71Sopenharmony_ci 112e41f4b71Sopenharmony_ci### off('frame') 113e41f4b71Sopenharmony_ci 114e41f4b71Sopenharmony_cioff(type: 'frame', callback\?: Callback\<IntervalInfo\>): void 115e41f4b71Sopenharmony_ci 116e41f4b71Sopenharmony_ci取消订阅每一帧的变化。 117e41f4b71Sopenharmony_ci 118e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 119e41f4b71Sopenharmony_ci 120e41f4b71Sopenharmony_ci**参数:** 121e41f4b71Sopenharmony_ci 122e41f4b71Sopenharmony_ci| 参数名 | 类型 | 必填 | 说明 | 123e41f4b71Sopenharmony_ci| --------------- | ------------------------------------------ | ---- | -----------------------------| 124e41f4b71Sopenharmony_ci| type | 'frame'| 是 | 设置注册回调的类型(只能是'frame'类型)。| 125e41f4b71Sopenharmony_ci| callback | Callback<[IntervalInfo](#intervalinfo)>| 否 | 订阅函数, 参数不填时,默认取消全部订阅函数。| 126e41f4b71Sopenharmony_ci 127e41f4b71Sopenharmony_ci 128e41f4b71Sopenharmony_ci**示例:** 129e41f4b71Sopenharmony_ci 130e41f4b71Sopenharmony_ci```ts 131e41f4b71Sopenharmony_cilet callback = (frameInfo: displaySync.IntervalInfo) => { 132e41f4b71Sopenharmony_ci console.info("DisplaySync", 'TimeStamp:' + frameInfo.timestamp + ' TargetTimeStamp: ' + frameInfo.targetTimestamp); 133e41f4b71Sopenharmony_ci} 134e41f4b71Sopenharmony_ci 135e41f4b71Sopenharmony_cibackDisplaySync?.on("frame", callback) 136e41f4b71Sopenharmony_ci 137e41f4b71Sopenharmony_ci// 取消订阅函数 138e41f4b71Sopenharmony_cibackDisplaySync?.off("frame", callback) 139e41f4b71Sopenharmony_ci``` 140e41f4b71Sopenharmony_ci 141e41f4b71Sopenharmony_ci### start 142e41f4b71Sopenharmony_ci 143e41f4b71Sopenharmony_cistart(): void 144e41f4b71Sopenharmony_ci 145e41f4b71Sopenharmony_ci开始每帧回调。 146e41f4b71Sopenharmony_ci 147e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 148e41f4b71Sopenharmony_ci 149e41f4b71Sopenharmony_ci**示例:** 150e41f4b71Sopenharmony_ci 151e41f4b71Sopenharmony_ci```ts 152e41f4b71Sopenharmony_cilet range : ExpectedFrameRateRange = { 153e41f4b71Sopenharmony_ci expected: 10, 154e41f4b71Sopenharmony_ci min:0, 155e41f4b71Sopenharmony_ci max:120 156e41f4b71Sopenharmony_ci}; 157e41f4b71Sopenharmony_ci 158e41f4b71Sopenharmony_cibackDisplaySync?.setExpectedFrameRateRange(range) 159e41f4b71Sopenharmony_ci 160e41f4b71Sopenharmony_cilet callback = (frameInfo: displaySync.IntervalInfo) => { 161e41f4b71Sopenharmony_ci console.info("DisplaySync", 'TimeStamp:' + frameInfo.timestamp + ' TargetTimeStamp: ' + frameInfo.targetTimestamp); 162e41f4b71Sopenharmony_ci} 163e41f4b71Sopenharmony_ci 164e41f4b71Sopenharmony_cibackDisplaySync?.on("frame", callback) 165e41f4b71Sopenharmony_ci 166e41f4b71Sopenharmony_ci// 开始每帧回调 167e41f4b71Sopenharmony_cibackDisplaySync?.start() 168e41f4b71Sopenharmony_ci``` 169e41f4b71Sopenharmony_ci 170e41f4b71Sopenharmony_ci> **说明:** 171e41f4b71Sopenharmony_ci> 172e41f4b71Sopenharmony_ci> start接口是将DisplaySync关联到UI实例和窗口,若在非UI页面中或者一些异步回调中进行start操作,可能无法跟踪到当前UI的上下文,导致start接口失败,会进一步导致订阅函数无法执行。 173e41f4b71Sopenharmony_ci> 因此可以使用UIContext的[runScopedTask](../apis-arkui/js-apis-arkui-UIContext.md#runscopedtask)接口来指定start函数执行的UI上下文。 174e41f4b71Sopenharmony_ci 175e41f4b71Sopenharmony_ci**示例:** 176e41f4b71Sopenharmony_ci 177e41f4b71Sopenharmony_ci```ts 178e41f4b71Sopenharmony_ciimport { displaySync } from '@kit.ArkGraphics2D'; 179e41f4b71Sopenharmony_ciimport { UIContext } from '@kit.ArkUI'; 180e41f4b71Sopenharmony_ci 181e41f4b71Sopenharmony_ci// xxx.ets 182e41f4b71Sopenharmony_ci@Entry 183e41f4b71Sopenharmony_ci@Component 184e41f4b71Sopenharmony_cistruct Index { 185e41f4b71Sopenharmony_ci // 创建DisplaySync实例 186e41f4b71Sopenharmony_ci backDisplaySync: displaySync.DisplaySync = displaySync.create(); 187e41f4b71Sopenharmony_ci 188e41f4b71Sopenharmony_ci aboutToAppear() { 189e41f4b71Sopenharmony_ci // 获取UIContext实例 190e41f4b71Sopenharmony_ci let uiContext: UIContext = this.getUIContext(); 191e41f4b71Sopenharmony_ci // 在当前UI上下文中执行DisplaySync的start接口 192e41f4b71Sopenharmony_ci uiContext?.runScopedTask(() => { 193e41f4b71Sopenharmony_ci this.backDisplaySync?.start(); 194e41f4b71Sopenharmony_ci }) 195e41f4b71Sopenharmony_ci } 196e41f4b71Sopenharmony_ci 197e41f4b71Sopenharmony_ci build() { 198e41f4b71Sopenharmony_ci // ... 199e41f4b71Sopenharmony_ci } 200e41f4b71Sopenharmony_ci} 201e41f4b71Sopenharmony_ci 202e41f4b71Sopenharmony_ci``` 203e41f4b71Sopenharmony_ci 204e41f4b71Sopenharmony_ci### stop 205e41f4b71Sopenharmony_ci 206e41f4b71Sopenharmony_cistop(): void 207e41f4b71Sopenharmony_ci 208e41f4b71Sopenharmony_ci停止每帧回调。 209e41f4b71Sopenharmony_ci 210e41f4b71Sopenharmony_ci 211e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full 212e41f4b71Sopenharmony_ci 213e41f4b71Sopenharmony_ci 214e41f4b71Sopenharmony_ci**示例:** 215e41f4b71Sopenharmony_ci 216e41f4b71Sopenharmony_ci```ts 217e41f4b71Sopenharmony_cilet range : ExpectedFrameRateRange = { 218e41f4b71Sopenharmony_ci expected: 10, 219e41f4b71Sopenharmony_ci min:0, 220e41f4b71Sopenharmony_ci max:120 221e41f4b71Sopenharmony_ci}; 222e41f4b71Sopenharmony_ci 223e41f4b71Sopenharmony_cibackDisplaySync?.setExpectedFrameRateRange(range) 224e41f4b71Sopenharmony_ci 225e41f4b71Sopenharmony_cilet callback = (frameInfo: displaySync.IntervalInfo) => { 226e41f4b71Sopenharmony_ci console.info("DisplaySync", 'TimeStamp:' + frameInfo.timestamp + ' TargetTimeStamp: ' + frameInfo.targetTimestamp); 227e41f4b71Sopenharmony_ci} 228e41f4b71Sopenharmony_ci 229e41f4b71Sopenharmony_cibackDisplaySync?.on("frame", callback) 230e41f4b71Sopenharmony_ci 231e41f4b71Sopenharmony_cibackDisplaySync?.start() 232e41f4b71Sopenharmony_ci 233e41f4b71Sopenharmony_ci// ... 234e41f4b71Sopenharmony_ci 235e41f4b71Sopenharmony_ci// 停止每帧回调 236e41f4b71Sopenharmony_cibackDisplaySync?.stop() 237e41f4b71Sopenharmony_ci```