From 39597b862a63a10583d40f5f0f5bbc8322a5e75b Mon Sep 17 00:00:00 2001 From: kola Date: Sat, 19 Oct 2024 18:37:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- index.d.ts | 23 + project.config.json | 12 +- project.private.config.json | 70 + src/app.json | 19 +- src/components/customAudio/index.json | 4 + src/components/customAudio/index.scss | 0 src/components/customAudio/index.ts | 25 + src/components/customAudio/index.wxml | 2 + src/components/customRecord/index.json | 6 + src/components/customRecord/index.scss | 109 + src/components/customRecord/index.ts | 39 + src/components/customRecord/index.wxml | 18 + src/components/upload/index.json | 6 - src/components/upload/index.scss | 9 - src/components/upload/index.ts | 24 - src/components/upload/index.wxml | 4 - src/components/uploadFile/index.json | 6 + src/components/uploadFile/index.scss | 9 + src/components/uploadFile/index.ts | 24 + src/components/uploadFile/index.wxml | 4 + src/custom-tab-bar/index.ts | 18 +- src/echart/components/ec-canvas/ec-canvas.js | 39 +- src/echart/components/homeLevel1/index.json | 5 +- src/echart/components/homeLevel1/index.scss | 272 + src/echart/components/homeLevel1/index.ts | 38 +- src/echart/components/homeLevel1/index.wxml | 161 +- src/echart/components/homeLevel2/index.json | 7 + src/echart/components/homeLevel2/index.scss | 332 + src/echart/components/homeLevel2/index.ts | 49 + src/echart/components/homeLevel2/index.wxml | 184 + src/echart/components/homeLevel3/index.json | 7 + src/echart/components/homeLevel3/index.scss | 194 + src/echart/components/homeLevel3/index.ts | 26 + src/echart/components/homeLevel3/index.wxml | 129 + src/echart/components/homeLevel4/index.json | 8 + src/echart/components/homeLevel4/index.scss | 370 + src/echart/components/homeLevel4/index.ts | 466 + src/echart/components/homeLevel4/index.wxml | 209 + src/images/doctor-rank-bg.png | Bin 0 -> 221834 bytes src/images/empty-2.png | Bin 0 -> 19827 bytes src/images/fold-down.png | Bin 0 -> 771 bytes src/images/fold-top.png | Bin 0 -> 754 bytes src/images/home-stat-bg.png | Bin 0 -> 44607 bytes src/images/icon-code.png | Bin 0 -> 1548 bytes src/images/icon-del.png | Bin 0 -> 1109 bytes src/images/icon-download.png | Bin 0 -> 471 bytes src/images/icon-edit.png | Bin 0 -> 428 bytes src/images/icon-eye.png | Bin 0 -> 1048 bytes src/images/icon-file.png | Bin 0 -> 1488 bytes src/images/icon-nore-file.png | Bin 0 -> 3630 bytes src/images/my-bg.png | Bin 0 -> 493049 bytes src/images/my-list-icon1.png | Bin 0 -> 1138 bytes src/images/my-list-icon2.png | Bin 0 -> 1524 bytes src/images/my-list-icon3.png | Bin 0 -> 1055 bytes src/images/record.png | Bin 0 -> 36522 bytes src/module1/pages/auditDoctorDetail/index.wxml | 2 +- src/module1/pages/casesDetail/index.json | 5 + src/module1/pages/casesDetail/index.scss | 116 + src/module1/pages/casesDetail/index.ts | 6 + src/module1/pages/casesDetail/index.wxml | 62 + src/module1/pages/changePhone/index.json | 5 + src/module1/pages/changePhone/index.scss | 50 + src/module1/pages/changePhone/index.ts | 77 + src/module1/pages/changePhone/index.wxml | 16 + src/module1/pages/doctorRankList/index.json | 5 + src/module1/pages/doctorRankList/index.scss | 63 + src/module1/pages/doctorRankList/index.ts | 6 + src/module1/pages/doctorRankList/index.wxml | 25 + src/module1/pages/entryCases/index.json | 10 + src/module1/pages/entryCases/index.scss | 363 + src/module1/pages/entryCases/index.ts | 15 + src/module1/pages/entryCases/index.wxml | 111 + src/module1/pages/entryCasesResult/index.json | 5 + src/module1/pages/entryCasesResult/index.scss | 50 + src/module1/pages/entryCasesResult/index.ts | 6 + src/module1/pages/entryCasesResult/index.wxml | 13 + src/module1/pages/org3/index.json | 7 + src/module1/pages/org3/index.scss | 314 + src/module1/pages/org3/index.ts | 6 + src/module1/pages/org3/index.wxml | 229 + src/module1/pages/org4/index.json | 8 + src/module1/pages/org4/index.scss | 333 + src/module1/pages/org4/index.ts | 6 + src/module1/pages/org4/index.wxml | 279 + src/module1/pages/setDoctor/index.wxml | 2 +- src/module1/pages/setInfo/index.json | 2 +- src/module1/pages/setInfo/index.wxml | 16 +- src/module1/pages/userInfo/index.json | 9 + src/module1/pages/userInfo/index.scss | 128 + src/module1/pages/userInfo/index.ts | 19 + src/module1/pages/userInfo/index.wxml | 87 + src/pages/cases/index.json | 7 +- src/pages/cases/index.scss | 464 + src/pages/cases/index.ts | 21 +- src/pages/cases/index.wxml | 237 +- src/pages/home/index.json | 10 +- src/pages/home/index.scss | 3 + src/pages/home/index.ts | 8 +- src/pages/home/index.wxml | 7 +- src/pages/my/index.json | 6 + src/pages/my/index.scss | 154 + src/pages/my/index.ts | 11 + src/pages/my/index.wxml | 65 + tsconfig.json | 2 +- typings/index.d.ts | 1 - typings/types/index.d.ts | 1 - typings/types/wx/index.d.ts | 163 - typings/types/wx/lib.wx.api.d.ts | 33751 ----------------------- typings/types/wx/lib.wx.app.d.ts | 424 - typings/types/wx/lib.wx.behavior.d.ts | 85 - typings/types/wx/lib.wx.canvas.d.ts | 2623 -- typings/types/wx/lib.wx.cloud.d.ts | 1016 - typings/types/wx/lib.wx.component.d.ts | 771 - typings/types/wx/lib.wx.event.d.ts | 1436 - typings/types/wx/lib.wx.page.d.ts | 299 - typings/types/wx/lib.wx.phys3D.d.ts | 409 - typings/types/wx/lib.wx.wasm.d.ts | 152 - typings/types/wx/lib.wx.xr-frame.d.ts | 16379 ----------- 119 files changed, 6283 insertions(+), 57611 deletions(-) create mode 100644 index.d.ts create mode 100644 src/components/customAudio/index.json create mode 100644 src/components/customAudio/index.scss create mode 100644 src/components/customAudio/index.ts create mode 100644 src/components/customAudio/index.wxml create mode 100644 src/components/customRecord/index.json create mode 100644 src/components/customRecord/index.scss create mode 100644 src/components/customRecord/index.ts create mode 100644 src/components/customRecord/index.wxml delete mode 100644 src/components/upload/index.json delete mode 100644 src/components/upload/index.scss delete mode 100644 src/components/upload/index.ts delete mode 100644 src/components/upload/index.wxml create mode 100644 src/components/uploadFile/index.json create mode 100644 src/components/uploadFile/index.scss create mode 100644 src/components/uploadFile/index.ts create mode 100644 src/components/uploadFile/index.wxml create mode 100644 src/echart/components/homeLevel2/index.json create mode 100644 src/echart/components/homeLevel2/index.scss create mode 100644 src/echart/components/homeLevel2/index.ts create mode 100644 src/echart/components/homeLevel2/index.wxml create mode 100644 src/echart/components/homeLevel3/index.json create mode 100644 src/echart/components/homeLevel3/index.scss create mode 100644 src/echart/components/homeLevel3/index.ts create mode 100644 src/echart/components/homeLevel3/index.wxml create mode 100644 src/echart/components/homeLevel4/index.json create mode 100644 src/echart/components/homeLevel4/index.scss create mode 100644 src/echart/components/homeLevel4/index.ts create mode 100644 src/echart/components/homeLevel4/index.wxml create mode 100644 src/images/doctor-rank-bg.png create mode 100644 src/images/empty-2.png create mode 100644 src/images/fold-down.png create mode 100644 src/images/fold-top.png create mode 100644 src/images/home-stat-bg.png create mode 100644 src/images/icon-code.png create mode 100644 src/images/icon-del.png create mode 100644 src/images/icon-download.png create mode 100644 src/images/icon-edit.png create mode 100644 src/images/icon-eye.png create mode 100644 src/images/icon-file.png create mode 100644 src/images/icon-nore-file.png create mode 100644 src/images/my-bg.png create mode 100644 src/images/my-list-icon1.png create mode 100644 src/images/my-list-icon2.png create mode 100644 src/images/my-list-icon3.png create mode 100644 src/images/record.png create mode 100644 src/module1/pages/casesDetail/index.json create mode 100644 src/module1/pages/casesDetail/index.scss create mode 100644 src/module1/pages/casesDetail/index.ts create mode 100644 src/module1/pages/casesDetail/index.wxml create mode 100644 src/module1/pages/changePhone/index.json create mode 100644 src/module1/pages/changePhone/index.scss create mode 100644 src/module1/pages/changePhone/index.ts create mode 100644 src/module1/pages/changePhone/index.wxml create mode 100644 src/module1/pages/doctorRankList/index.json create mode 100644 src/module1/pages/doctorRankList/index.scss create mode 100644 src/module1/pages/doctorRankList/index.ts create mode 100644 src/module1/pages/doctorRankList/index.wxml create mode 100644 src/module1/pages/entryCases/index.json create mode 100644 src/module1/pages/entryCases/index.scss create mode 100644 src/module1/pages/entryCases/index.ts create mode 100644 src/module1/pages/entryCases/index.wxml create mode 100644 src/module1/pages/entryCasesResult/index.json create mode 100644 src/module1/pages/entryCasesResult/index.scss create mode 100644 src/module1/pages/entryCasesResult/index.ts create mode 100644 src/module1/pages/entryCasesResult/index.wxml create mode 100644 src/module1/pages/org3/index.json create mode 100644 src/module1/pages/org3/index.scss create mode 100644 src/module1/pages/org3/index.ts create mode 100644 src/module1/pages/org3/index.wxml create mode 100644 src/module1/pages/org4/index.json create mode 100644 src/module1/pages/org4/index.scss create mode 100644 src/module1/pages/org4/index.ts create mode 100644 src/module1/pages/org4/index.wxml create mode 100644 src/module1/pages/userInfo/index.json create mode 100644 src/module1/pages/userInfo/index.scss create mode 100644 src/module1/pages/userInfo/index.ts create mode 100644 src/module1/pages/userInfo/index.wxml create mode 100644 src/pages/my/index.json create mode 100644 src/pages/my/index.scss create mode 100644 src/pages/my/index.ts create mode 100644 src/pages/my/index.wxml delete mode 100644 typings/types/index.d.ts delete mode 100644 typings/types/wx/index.d.ts delete mode 100644 typings/types/wx/lib.wx.api.d.ts delete mode 100644 typings/types/wx/lib.wx.app.d.ts delete mode 100644 typings/types/wx/lib.wx.behavior.d.ts delete mode 100644 typings/types/wx/lib.wx.canvas.d.ts delete mode 100644 typings/types/wx/lib.wx.cloud.d.ts delete mode 100644 typings/types/wx/lib.wx.component.d.ts delete mode 100644 typings/types/wx/lib.wx.event.d.ts delete mode 100644 typings/types/wx/lib.wx.page.d.ts delete mode 100644 typings/types/wx/lib.wx.phys3D.d.ts delete mode 100644 typings/types/wx/lib.wx.wasm.d.ts delete mode 100644 typings/types/wx/lib.wx.xr-frame.d.ts diff --git a/README.md b/README.md index a8a26f1..47d9eb5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ 1. user 打开小程序进入 身份认证页面 2. 判断图片是否涂抹 -3. 图像识别模糊 可以反向确认 通过ocr识别接口 接入ocr同时识别不到 姓名,年龄等字样,及判断该病例已被涂抹 +3. 图像识别模糊 可以反向确认 通过ocr识别接口 接入ocr同时识别不到 姓名,年龄等字样,及判断该病历已被涂抹 https://pic1.zhimg.com/50/v2-dcfbab1219ae4f7a7a6db168bb1580a2_720w.jpg?source=2c26e567 @@ -9,3 +9,7 @@ images svn 地址 svn://39.106.86.127:28386/projects/takeda/proj_src/shop/frontend/web/wt + +ui问题 +1. 首页绑定医生弹窗需要重新切图 +2. 播放语音条图片没切 diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..9d48124 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,23 @@ +interface IAppOption { + globalData: { + userInfo?: WechatMiniprogram.UserInfo + url: string + upFileUrl: string + imageUrl: string + } + userInfoReadyCallback?: WechatMiniprogram.GetUserInfoSuccessCallback + waitLogin: () => Promise + getMenuInfo: (arg0: WechatMiniprogram.Page.Instance) => void +} + +interface IAgaxParams extends WechatMiniprogram.RequestOption { + showMsg?: boolean + loading?: boolean + isJSON?: boolean +} + +declare namespace WechatMiniprogram { + export interface Wx { + ajax: (arg0: IAgaxParams) => Promise + } +} diff --git a/project.config.json b/project.config.json index 2f8a226..a1858e5 100644 --- a/project.config.json +++ b/project.config.json @@ -15,7 +15,7 @@ "coverView": false, "postcss": false, "minified": false, - "enhance": false, + "enhance": true, "showShadowRootInWxmlPanel": false, "packNpmManually": true, "packNpmRelationList": [ @@ -26,7 +26,8 @@ ], "ignoreUploadUnusedFiles": true, "compileHotReLoad": false, - "skylineRenderEnable": true + "skylineRenderEnable": true, + "es6": true }, "simulatorType": "wechat", "simulatorPluginLibVersion": {}, @@ -39,7 +40,12 @@ "libVersion": "2.32.3", "packOptions": { "ignore": [], - "include": [] + "include": [ + { + "value": "/echart/components/ec-canvas/echarts.js", + "type": "file" + } + ] }, "appid": "wxaae50c206446a964" } \ No newline at end of file diff --git a/project.private.config.json b/project.private.config.json index 7524b0e..d6f24d4 100644 --- a/project.private.config.json +++ b/project.private.config.json @@ -8,6 +8,76 @@ "miniprogram": { "list": [ { + "name": "病例详情", + "pathName": "module1/pages/casesDetail/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "录入病例结果", + "pathName": "module1/pages/entryCasesResult/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "录入病历", + "pathName": "module1/pages/entryCases/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "病历", + "pathName": "pages/cases/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "组织架构4", + "pathName": "module1/pages/org4/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "组织架构3", + "pathName": "module1/pages/org3/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "医院活跃排行榜", + "pathName": "module1/pages/doctorRankList/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "更换手机号", + "pathName": "module1/pages/changePhone/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "个人信息", + "pathName": "module1/pages/userInfo/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "我的", + "pathName": "pages/my/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { "name": "首页", "pathName": "pages/home/index", "query": "", diff --git a/src/app.json b/src/app.json index 90c2480..05a85bb 100644 --- a/src/app.json +++ b/src/app.json @@ -1,6 +1,6 @@ { "$schema": "https://dldir1.qq.com/WechatWebDev/editor-extension/wx-json/app.schema.json", - "pages": ["pages/start/index", "pages/home/index", "pages/cases/index"], + "pages": ["pages/start/index", "pages/home/index", "pages/cases/index", "pages/my/index"], "subPackages": [ { "root": "echart", @@ -19,10 +19,19 @@ "pages/cDoctorResult/index", "pages/auditDoctorList/index", "pages/auditDoctorDetail/index", - "pages/setDoctor/index" + "pages/setDoctor/index", + "pages/userInfo/index", + "pages/changePhone/index", + "pages/doctorRankList/index", + "pages/org3/index", + "pages/org4/index", + "pages/entryCases/index", + "pages/entryCasesResult/index", + "pages/casesDetail/index" ] } ], + "preloadRule": {}, "window": { "backgroundTextStyle": "light", "navigationBarBackgroundColor": "#fff", @@ -39,7 +48,11 @@ }, { "pagePath": "pages/cases/index", - "text": "病例" + "text": "病历" + }, + { + "pagePath": "pages/my/index", + "text": "我的" } ] }, diff --git a/src/components/customAudio/index.json b/src/components/customAudio/index.json new file mode 100644 index 0000000..a89ef4d --- /dev/null +++ b/src/components/customAudio/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} diff --git a/src/components/customAudio/index.scss b/src/components/customAudio/index.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/components/customAudio/index.ts b/src/components/customAudio/index.ts new file mode 100644 index 0000000..82539bc --- /dev/null +++ b/src/components/customAudio/index.ts @@ -0,0 +1,25 @@ +const _app = getApp(); + +// pages/story/a.ts +Component({ + /** + * 组件的属性列表 + */ + properties: { + + }, + + /** + * 组件的初始数据 + */ + data: { + + }, + + /** + * 组件的方法列表 + */ + methods: { + + } +}) diff --git a/src/components/customAudio/index.wxml b/src/components/customAudio/index.wxml new file mode 100644 index 0000000..dd015b7 --- /dev/null +++ b/src/components/customAudio/index.wxml @@ -0,0 +1,2 @@ + +pages/story/a.wxml diff --git a/src/components/customRecord/index.json b/src/components/customRecord/index.json new file mode 100644 index 0000000..074f50b --- /dev/null +++ b/src/components/customRecord/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-popup": "@vant/weapp/popup/index" + } +} diff --git a/src/components/customRecord/index.scss b/src/components/customRecord/index.scss new file mode 100644 index 0000000..c22fb37 --- /dev/null +++ b/src/components/customRecord/index.scss @@ -0,0 +1,109 @@ +.record { + width: 107rpx; + height: 107rpx; + border: 10rpx solid #e6f7f9; + border-radius: 50%; + .icon { + width: 107rpx; + height: 107rpx; + } + .record-page { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + z-index: 10000; + background-color: rgba(0, 0, 0, 0); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + .record-line { + position: relative; + padding: 32rpx; + border-radius: 32rpx; + background-color: rgba(1, 180, 197, 1); + display: flex; + align-items: center; + .wave { + width: 260rpx; + height: 60rpx; + } + .time { + font-size: 28rpx; + color: rgba(255, 255, 255, 1); + } + &::after { + position: absolute; + left: calc(50% - 6rpx); + bottom: -10rpx; + content: ''; + width: 0; + height: 0; + border-style: solid; + border-width: 12rpx 12rpx 0 12rpx; + border-color: rgba(1, 180, 197, 1) transparent transparent transparent; + } + } + .record-page-icon-wrap { + width: 320rpx; + height: 320rpx; + display: flex; + align-items: center; + justify-content: center; + } + .record-page-icon { + margin-top: 32rpx; + width: 0; + height: 0; + padding: 0; + // background-color: rgba(255, 255, 255, 0.5); + // border: 0 solid rgba(255, 255, 255, 0.25); + background: radial-gradient(circle, rgba(192, 192, 192, 1) 0%, rgba(133, 133, 133, 1) 100%); + border-radius: 50%; + transition: all 0.3s; + } + &.record-pape-start { + opacity: 0; + left: 0; + top: 100vh; + transition: all 0.3s; + } + &.record-page-active { + left: 0; + top: 0; + opacity: 1; + background-color: rgba(0, 0, 0, 0.7); + .record-page-icon { + width: 200rpx; + height: 200rpx; + padding: 56rpx; + // border: 28rpx solid rgba(255, 255, 255, 0.25); + border-radius: 50%; + animation: grow-bp 0.6s ease-in-out 0.3s infinite; + @keyframes grow-bp { + 0% { + padding: 0; + // border-width: 0; + } + // 25% { + // padding: 28rpx; + // } + 50% { + padding: 56rpx; + // border-width: 28rpx; + } + // 75% { + // padding: 28rpx; + // border-width: 0; + // } + 100% { + padding: 0; + // border-width: 0; + } + } + } + } + } +} diff --git a/src/components/customRecord/index.ts b/src/components/customRecord/index.ts new file mode 100644 index 0000000..1d52887 --- /dev/null +++ b/src/components/customRecord/index.ts @@ -0,0 +1,39 @@ +const _app = getApp() + +// pages/story/a.ts +Component({ + /** + * 组件的属性列表 + */ + properties: {}, + + /** + * 组件的初始数据 + */ + data: { + startShow: false, + show: false, + }, + + /** + * 组件的方法列表 + */ + methods: { + handleStart() { + this.setData({ + startShow: true, + }) + }, + handleShow() { + this.setData({ + show: true, + }) + }, + handleHide() { + this.setData({ + startShow: false, + show: false, + }) + }, + }, +}) diff --git a/src/components/customRecord/index.wxml b/src/components/customRecord/index.wxml new file mode 100644 index 0000000..c662c5a --- /dev/null +++ b/src/components/customRecord/index.wxml @@ -0,0 +1,18 @@ + + + + + + 45” + + + + + + diff --git a/src/components/upload/index.json b/src/components/upload/index.json deleted file mode 100644 index c7967a3..0000000 --- a/src/components/upload/index.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "component": true, - "usingComponents": { - "van-uploader": "@vant/weapp/uploader/index" - } -} diff --git a/src/components/upload/index.scss b/src/components/upload/index.scss deleted file mode 100644 index 14fd646..0000000 --- a/src/components/upload/index.scss +++ /dev/null @@ -1,9 +0,0 @@ -.button { - padding: 0; - line-height: 1; - background-color: transparent; - &::after { - border: none; - outline: none; - } -} diff --git a/src/components/upload/index.ts b/src/components/upload/index.ts deleted file mode 100644 index b6ba5f6..0000000 --- a/src/components/upload/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -const _app = getApp() - -// pages/story/a.ts -Component({ - /** - * 组件的属性列表 - */ - properties: { - chooseAvatar: { - type: Boolean, - value: false, - }, - }, - - /** - * 组件的初始数据 - */ - data: {}, - - /** - * 组件的方法列表 - */ - methods: {}, -}) diff --git a/src/components/upload/index.wxml b/src/components/upload/index.wxml deleted file mode 100644 index e21f98c..0000000 --- a/src/components/upload/index.wxml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/components/uploadFile/index.json b/src/components/uploadFile/index.json new file mode 100644 index 0000000..c7967a3 --- /dev/null +++ b/src/components/uploadFile/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "van-uploader": "@vant/weapp/uploader/index" + } +} diff --git a/src/components/uploadFile/index.scss b/src/components/uploadFile/index.scss new file mode 100644 index 0000000..14fd646 --- /dev/null +++ b/src/components/uploadFile/index.scss @@ -0,0 +1,9 @@ +.button { + padding: 0; + line-height: 1; + background-color: transparent; + &::after { + border: none; + outline: none; + } +} diff --git a/src/components/uploadFile/index.ts b/src/components/uploadFile/index.ts new file mode 100644 index 0000000..b6ba5f6 --- /dev/null +++ b/src/components/uploadFile/index.ts @@ -0,0 +1,24 @@ +const _app = getApp() + +// pages/story/a.ts +Component({ + /** + * 组件的属性列表 + */ + properties: { + chooseAvatar: { + type: Boolean, + value: false, + }, + }, + + /** + * 组件的初始数据 + */ + data: {}, + + /** + * 组件的方法列表 + */ + methods: {}, +}) diff --git a/src/components/uploadFile/index.wxml b/src/components/uploadFile/index.wxml new file mode 100644 index 0000000..e21f98c --- /dev/null +++ b/src/components/uploadFile/index.wxml @@ -0,0 +1,4 @@ + + + + diff --git a/src/custom-tab-bar/index.ts b/src/custom-tab-bar/index.ts index 3c80b50..6197eda 100644 --- a/src/custom-tab-bar/index.ts +++ b/src/custom-tab-bar/index.ts @@ -19,14 +19,14 @@ Component({ iconActive: 'tab-active1.png', }, { - path: '/pages/home/index', - name: '首页', + path: '/pages/cases/index', + name: '病历', icon: 'tab2.png', iconActive: 'tab-active2.png', }, { custom: true, - path: '/pages/home/index', + path: '/module1/pages/entryCases/index', }, { path: '/pages/home/index', @@ -51,9 +51,15 @@ Component({ handleTab(e: any) { const { index } = e.currentTarget.dataset const tab = this.data.tabbar[index] - wx.switchTab({ - url: tab.path, - }) + if (tab.custom) { + wx.navigateTo({ + url: tab.path, + }) + } else { + wx.switchTab({ + url: tab.path, + }) + } }, }, }) diff --git a/src/echart/components/ec-canvas/ec-canvas.js b/src/echart/components/ec-canvas/ec-canvas.js index c97c3f9..278f4a9 100644 --- a/src/echart/components/ec-canvas/ec-canvas.js +++ b/src/echart/components/ec-canvas/ec-canvas.js @@ -1,7 +1,7 @@ import WxCanvas from './wx-canvas'; +import * as echarts from './echarts'; let ctx; -let echarts function compareVersion(v1, v2) { v1 = v1.split('.') @@ -49,8 +49,7 @@ Component({ isUseNewCanvas: false }, - ready:async function () { - echarts = await require.async('../../resource/components/echart/echarts.js') + ready: function () { // Disable prograssive because drawImage doesn't support DOM as parameter // See https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.drawImage.html echarts.registerPreprocessor(option => { @@ -78,8 +77,7 @@ Component({ }, methods: { - init: async function (callback) { - echarts = await require.async('../../resource/components/echart/echarts.js') + init: function (callback) { const version = wx.getSystemInfoSync().SDKVersion const canUseNewCanvas = compareVersion(version, '2.9.0') >= 0; @@ -114,9 +112,13 @@ Component({ ctx = wx.createCanvasContext(this.data.canvasId, this); const canvas = new WxCanvas(ctx, this.data.canvasId, false); - echarts.setCanvasCreator(() => { - return canvas; - }); + if (echarts.setPlatformAPI) { + echarts.setPlatformAPI({ + createCanvas: () => canvas, + }); + } else { + echarts.setCanvasCreator(() => canvas); + }; // const canvasDpr = wx.getSystemInfoSync().pixelRatio // 微信旧的canvas不能传入dpr const canvasDpr = 1 var query = wx.createSelectorQuery().in(this); @@ -155,9 +157,24 @@ Component({ const ctx = canvasNode.getContext('2d') const canvas = new WxCanvas(ctx, this.data.canvasId, true, canvasNode) - echarts.setCanvasCreator(() => { - return canvas - }) + if (echarts.setPlatformAPI) { + echarts.setPlatformAPI({ + createCanvas: () => canvas, + loadImage: (src, onload, onerror) => { + if (canvasNode.createImage) { + const image = canvasNode.createImage(); + image.onload = onload; + image.onerror = onerror; + image.src = src; + return image; + } + console.error('加载图片依赖 `Canvas.createImage()` API,要求小程序基础库版本在 2.7.0 及以上。'); + // PENDING fallback? + } + }) + } else { + echarts.setCanvasCreator(() => canvas) + } if (typeof callback === 'function') { this.chart = callback(canvas, canvasWidth, canvasHeight, canvasDpr) diff --git a/src/echart/components/homeLevel1/index.json b/src/echart/components/homeLevel1/index.json index a89ef4d..fe436a8 100644 --- a/src/echart/components/homeLevel1/index.json +++ b/src/echart/components/homeLevel1/index.json @@ -1,4 +1,7 @@ { "component": true, - "usingComponents": {} + "usingComponents": { + "doctorAvatar": "/components/doctorAvatar/index", + "van-icon": "@vant/weapp/icon/index" + } } diff --git a/src/echart/components/homeLevel1/index.scss b/src/echart/components/homeLevel1/index.scss index e69de29..6686a4c 100644 --- a/src/echart/components/homeLevel1/index.scss +++ b/src/echart/components/homeLevel1/index.scss @@ -0,0 +1,272 @@ +.page { + padding: 36rpx 32rpx 200rpx; + .user { + display: flex; + gap: 24rpx; + align-items: center; + .avatar { + width: 112rpx; + height: 112rpx; + } + .wrap { + .w-header { + display: flex; + align-items: baseline; + gap: 16rpx; + .name { + font-size: 36rpx; + color: rgba(0, 180, 197, 1); + } + .desc { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + } + .w-footer { + margin-top: 24rpx; + .hostipal { + margin-right: 12rpx; + display: inline; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .tag { + margin-right: 12rpx; + display: inline-block; + padding: 0 8rpx; + border-radius: 4rpx; + background-color: rgba(0, 180, 197, 1); + font-size: 24rpx; + color: #fff; + } + .site { + display: inline-block; + padding: 0 8rpx; + font-size: 28rpx; + line-height: 32rpx; + color: rgba(148, 87, 30, 1); + border-radius: 4rpx; + background-color: rgba(250, 229, 206, 1); + } + } + } + } + .banner { + margin-top: 32rpx; + .title { + position: relative; + z-index: 1; + padding: 14rpx; + width: 262rpx; + height: 116rpx; + text-align: center; + font-size: 28rpx; + color: rgba(0, 180, 197, 1); + line-height: 1; + box-sizing: border-box; + background: linear-gradient(180deg, #dcf5f7 0%, #ffffff 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + border: 1rpx solid #ffffff; + } + .bg { + padding-top: 40rpx; + border-radius: 24rpx; + background-color: rgba(250, 229, 206, 1); + margin-top: -95rpx; + .b-container { + position: relative; + z-index: 2; + border: 1rpx solid #ffffff; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 16rpx 16rpx 16rpx 16rpx; + display: flex; + align-items: center; + .item { + padding: 32rpx 0; + flex: 1; + text-align: center; + .name { + font-size: 28rpx; + color: #fff; + line-height: 1; + } + .num { + margin-top: 24rpx; + font-size: 56rpx; + color: #fff; + line-height: 56rpx; + } + } + .line { + flex-shrink: 0; + height: 108rpx; + border-right: 1rpx dashed #ffffff; + opacity: 0.5; + } + } + } + } + .stat { + position: relative; + margin-top: 24rpx; + padding: 96rpx 0 32rpx; + border-radius: 16rpx; + .title { + position: absolute; + top: 0; + left: 0; + padding: 16rpx 24rpx; + font-size: 28rpx; + color: #fff; + } + .s-container { + display: flex; + .item { + flex: 1; + text-align: center; + .name { + font-size: 28rpx; + color: rgba(128, 128, 128, 1); + line-height: 1; + } + .num { + margin-top: 24rpx; + font-size: 48rpx; + color: rgba(20, 21, 21, 1); + line-height: 56rpx; + } + } + .line { + flex-shrink: 0; + height: 108rpx; + border-right: 1rpx dashed rgba(224, 224, 224, 0.5); + } + } + } + .cooperate, + .invite { + margin-top: 24rpx; + background: linear-gradient(180deg, #f1feff 0%, #ffffff 100%); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + &-header { + padding: 32rpx 20rpx; + display: flex; + align-items: center; + justify-content: space-between; + .name { + font-size: 32rpx; + color: rgba(20, 21, 21, 1); + } + .fold { + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + display: flex; + align-items: center; + gap: 12rpx; + .icon { + width: 28rpx; + height: 28rpx; + } + } + } + .doctor-list { + padding: 0 20rpx 32rpx; + transition: 0.3s max-height; + max-height: var(--fold-height); + &-fold { + padding: 0; + max-height: 0; + overflow: hidden; + } + .doctor { + margin-bottom: 20rpx; + padding: 32rpx; + display: flex; + gap: 24rpx; + background: linear-gradient(180deg, #e5f5f7 0%, #ffffff 50%); + box-shadow: 0rpx 4rpx 20rpx 0rpx rgba(0, 0, 0, 0.1); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + &:last-of-type { + margin-bottom: 0; + } + .avatar { + flex-shrink: 0; + position: relative; + width: 112rpx; + height: 112rpx; + } + .wrap { + padding-top: 8rpx; + .w-header { + display: flex; + align-items: baseline; + gap: 16rpx; + line-height: 1; + .name { + font-size: 36rpx; + color: rgba(20, 21, 21, 1); + font-weight: bold; + } + .label { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .line { + width: 1px; + height: 24rpx; + background-color: rgba(205, 205, 205, 1); + } + } + .w-container { + margin-top: 24rpx; + .hostipal { + margin-right: 12rpx; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .tag { + margin-right: 12rpx; + display: inline-block; + padding: 0 8rpx; + border-radius: 4rpx; + font-size: 24rpx; + color: rgba(255, 255, 255, 1); + line-height: 32rpx; + background-color: rgba(0, 180, 197, 1); + } + .site { + display: inline-block; + padding: 0 8rpx; + font-size: 24rpx; + color: rgba(148, 87, 30, 1); + line-height: 32rpx; + border-radius: 4rpx; + background-color: rgba(250, 229, 206, 1); + } + } + .w-footer { + margin-top: 16rpx; + display: flex; + gap: 12rpx; + flex-wrap: wrap; + .wf-label { + flex-shrink: 0; + width: 48rpx; + height: 32rpx; + } + .wf-tag { + flex-shrink: 0; + padding: 0 8rpx; + font-size: 22rpx; + color: rgba(0, 180, 197, 1); + line-height: 32rpx; + border: 1rpx solid rgba(191, 239, 244, 1); + } + } + } + } + } + } +} diff --git a/src/echart/components/homeLevel1/index.ts b/src/echart/components/homeLevel1/index.ts index 82539bc..6539630 100644 --- a/src/echart/components/homeLevel1/index.ts +++ b/src/echart/components/homeLevel1/index.ts @@ -1,25 +1,49 @@ -const _app = getApp(); +const _app = getApp() // pages/story/a.ts Component({ /** * 组件的属性列表 */ - properties: { - - }, + properties: {}, /** * 组件的初始数据 */ data: { - + fold1: false, + foldHeight1: 10000, + fold2: false, + foldHeight2: 10000, }, + attached() { + this.getHeight() + }, /** * 组件的方法列表 */ methods: { - - } + getHeight() { + const query = wx.createSelectorQuery().in(this) + query.select('#fold1').boundingClientRect() + query.select('#fold2').boundingClientRect() + query.exec((res) => { + this.setData({ + foldHeight1: res[0].height, + foldHeight2: res[1].height, + }) + }) + }, + toggleFold1() { + this.setData({ + fold1: !this.data.fold1, + }) + }, + toggleFold2() { + this.setData({ + fold2: !this.data.fold2, + }) + }, + }, }) diff --git a/src/echart/components/homeLevel1/index.wxml b/src/echart/components/homeLevel1/index.wxml index ceea2d8..e9dcb87 100644 --- a/src/echart/components/homeLevel1/index.wxml +++ b/src/echart/components/homeLevel1/index.wxml @@ -1 +1,160 @@ -11 + + + + + + 徐萌 + 主治医师 + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + + + 我提交的病历 + + + 总数 + 54 + + + + + 新病历 + + + 54 + + + + + 讨论中 + + + 54 + + + + + 已归档 + + + 54 + + + + + + 我合作的医生(2) + + + 展开 + + + + 收起 + + + + + + + + + + 徐萌 + 主任医师 + + 心内科 + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + 我合作的医生(2) + + + 展开 + + + + 收起 + + + + + + + + + + 徐萌 + 主任医师 + + 心内科 + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + diff --git a/src/echart/components/homeLevel2/index.json b/src/echart/components/homeLevel2/index.json new file mode 100644 index 0000000..fe436a8 --- /dev/null +++ b/src/echart/components/homeLevel2/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "doctorAvatar": "/components/doctorAvatar/index", + "van-icon": "@vant/weapp/icon/index" + } +} diff --git a/src/echart/components/homeLevel2/index.scss b/src/echart/components/homeLevel2/index.scss new file mode 100644 index 0000000..342ec70 --- /dev/null +++ b/src/echart/components/homeLevel2/index.scss @@ -0,0 +1,332 @@ +.page { + padding: 36rpx 32rpx 200rpx; + .user { + margin-top: 40rpx; + position: relative; + padding: 94rpx 32rpx 32rpx; + background: linear-gradient(180deg, #f1feff 0%, #ffffff 35%, #ffffff 100%); + box-shadow: 0rpx 8rpx 24rpx 0rpx rgba(0, 66, 73, 0.09); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + .avatar { + position: absolute; + top: -38rpx; + left: 32rpx; + width: 112rpx; + height: 112rpx; + } + .code { + position: absolute; + top: 38rpx; + right: 34rpx; + width: 60rpx; + height: 60rpx; + } + .wrap { + .w-header { + display: flex; + align-items: baseline; + gap: 16rpx; + .name { + font-size: 36rpx; + color: rgba(20, 21, 21, 1); + } + .desc { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + .line { + margin: 0 12rpx; + display: inline-block; + height: 24rpx; + width: 1rpx; + background-color: rgba(205, 205, 205, 1); + } + } + } + .w-container { + margin-top: 24rpx; + .hostipal { + margin-right: 12rpx; + display: inline; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .tag { + margin-right: 12rpx; + display: inline-block; + padding: 0 8rpx; + border-radius: 4rpx; + background-color: rgba(0, 180, 197, 1); + font-size: 24rpx; + color: #fff; + } + .site { + display: inline-block; + padding: 0 8rpx; + font-size: 28rpx; + line-height: 32rpx; + color: rgba(148, 87, 30, 1); + border-radius: 4rpx; + background-color: rgba(250, 229, 206, 1); + } + } + .w-footer { + margin-top: 16rpx; + display: flex; + gap: 12rpx; + flex-wrap: wrap; + .wf-label { + flex-shrink: 0; + width: 48rpx; + height: 32rpx; + } + .wf-tag { + flex-shrink: 0; + padding: 0 8rpx; + font-size: 22rpx; + color: rgba(0, 180, 197, 1); + line-height: 32rpx; + border: 1rpx solid rgba(191, 239, 244, 1); + } + } + } + } + .banner { + margin-top: 32rpx; + .title { + position: relative; + z-index: 1; + padding: 14rpx; + width: 262rpx; + height: 116rpx; + text-align: center; + font-size: 28rpx; + color: rgba(0, 180, 197, 1); + line-height: 1; + box-sizing: border-box; + background: linear-gradient(180deg, #dcf5f7 0%, #ffffff 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + border: 1rpx solid #ffffff; + } + .bg { + padding-top: 40rpx; + border-radius: 24rpx; + background-color: rgba(250, 229, 206, 1); + margin-top: -95rpx; + .b-container { + position: relative; + z-index: 2; + border: 1rpx solid #ffffff; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 16rpx 16rpx 16rpx 16rpx; + display: flex; + align-items: center; + .item { + padding: 32rpx 0; + flex: 1; + text-align: center; + .name { + font-size: 26rpx; + color: #fff; + line-height: 1; + } + .num { + margin-top: 24rpx; + font-size: 56rpx; + color: #fff; + line-height: 56rpx; + } + } + .line { + flex-shrink: 0; + height: 108rpx; + border-right: 1rpx dashed #ffffff; + opacity: 0.5; + } + } + } + } + .stat { + position: relative; + margin-top: 24rpx; + padding: 96rpx 0 32rpx; + border-radius: 16rpx; + .title { + position: absolute; + top: 0; + left: 0; + padding: 16rpx 24rpx; + font-size: 28rpx; + color: #fff; + } + .more { + position: absolute; + top: 0; + right: 0; + padding: 14rpx 20rpx; + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + } + .s-container { + display: flex; + .item { + flex: 1; + text-align: center; + .name { + font-size: 28rpx; + color: rgba(128, 128, 128, 1); + line-height: 1; + } + .num { + margin-top: 24rpx; + font-size: 48rpx; + color: rgba(20, 21, 21, 1); + line-height: 56rpx; + } + } + .line { + flex-shrink: 0; + height: 108rpx; + border-right: 1rpx dashed rgba(224, 224, 224, 0.5); + } + } + } + .cooperate, + .invite { + margin-top: 24rpx; + background: linear-gradient(180deg, #f1feff 0%, #ffffff 100%); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + &-header { + padding: 32rpx 20rpx; + display: flex; + align-items: center; + justify-content: space-between; + .name { + font-size: 32rpx; + color: rgba(20, 21, 21, 1); + } + .fold { + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + display: flex; + align-items: center; + gap: 12rpx; + .icon { + width: 28rpx; + height: 28rpx; + } + } + } + .doctor-list { + padding: 0 20rpx 32rpx; + transition: 0.3s max-height; + max-height: var(--fold-height); + &-fold { + padding: 0; + max-height: 0; + overflow: hidden; + } + .doctor { + position: relative; + margin-bottom: 20rpx; + padding: 32rpx; + display: flex; + gap: 24rpx; + background: linear-gradient(180deg, #e5f5f7 0%, #ffffff 50%); + box-shadow: 0rpx 4rpx 20rpx 0rpx rgba(0, 0, 0, 0.1); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + &:last-of-type { + margin-bottom: 0; + } + .avatar { + flex-shrink: 0; + position: relative; + width: 112rpx; + height: 112rpx; + } + .assign { + position: absolute; + top: 0; + right: 0; + padding: 2rpx 16rpx; + line-height: 28rpx; + font-size: 22rpx; + color: rgba(0, 180, 197, 1); + background-color: rgba(215, 237, 238, 1); + border-radius: 0 16rpx 0 16rpx; + } + .wrap { + padding-top: 8rpx; + .w-header { + display: flex; + align-items: baseline; + gap: 16rpx; + line-height: 1; + .name { + font-size: 36rpx; + color: rgba(20, 21, 21, 1); + font-weight: bold; + } + .label { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .line { + width: 1px; + height: 24rpx; + background-color: rgba(205, 205, 205, 1); + } + } + .w-container { + margin-top: 24rpx; + .hostipal { + margin-right: 12rpx; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .tag { + margin-right: 12rpx; + display: inline-block; + padding: 0 8rpx; + border-radius: 4rpx; + font-size: 24rpx; + color: rgba(255, 255, 255, 1); + line-height: 32rpx; + background-color: rgba(0, 180, 197, 1); + } + .site { + display: inline-block; + padding: 0 8rpx; + font-size: 24rpx; + color: rgba(148, 87, 30, 1); + line-height: 32rpx; + border-radius: 4rpx; + background-color: rgba(250, 229, 206, 1); + } + } + .w-footer { + margin-top: 16rpx; + display: flex; + gap: 12rpx; + flex-wrap: wrap; + .wf-label { + flex-shrink: 0; + width: 48rpx; + height: 32rpx; + } + .wf-tag { + flex-shrink: 0; + padding: 0 8rpx; + font-size: 22rpx; + color: rgba(0, 180, 197, 1); + line-height: 32rpx; + border: 1rpx solid rgba(191, 239, 244, 1); + } + } + } + } + } + } +} diff --git a/src/echart/components/homeLevel2/index.ts b/src/echart/components/homeLevel2/index.ts new file mode 100644 index 0000000..6539630 --- /dev/null +++ b/src/echart/components/homeLevel2/index.ts @@ -0,0 +1,49 @@ +const _app = getApp() + +// pages/story/a.ts +Component({ + /** + * 组件的属性列表 + */ + properties: {}, + + /** + * 组件的初始数据 + */ + data: { + fold1: false, + foldHeight1: 10000, + fold2: false, + foldHeight2: 10000, + }, + + attached() { + this.getHeight() + }, + /** + * 组件的方法列表 + */ + methods: { + getHeight() { + const query = wx.createSelectorQuery().in(this) + query.select('#fold1').boundingClientRect() + query.select('#fold2').boundingClientRect() + query.exec((res) => { + this.setData({ + foldHeight1: res[0].height, + foldHeight2: res[1].height, + }) + }) + }, + toggleFold1() { + this.setData({ + fold1: !this.data.fold1, + }) + }, + toggleFold2() { + this.setData({ + fold2: !this.data.fold2, + }) + }, + }, +}) diff --git a/src/echart/components/homeLevel2/index.wxml b/src/echart/components/homeLevel2/index.wxml new file mode 100644 index 0000000..b387aaa --- /dev/null +++ b/src/echart/components/homeLevel2/index.wxml @@ -0,0 +1,184 @@ + + + + + + + 徐萌 + + 主治医师 + + 心内科 + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + 我管理的病历 + + 查看全部 + + + + + 全部 + 54 + + + + + 新病历 + + + 54 + + + + + 讨论中 + + + 54 + + + + + 已归档 + + + 54 + + + + + + 我合作的医生(2) + + + 展开 + + + + 收起 + + + + + + + + + + 徐萌 + 主任医师 + + 心内科 + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + 我邀约的医生(1) + + + 展开 + + + + 收起 + + + + + + + + 蒋亮医生指派 + + + 徐萌 + 主任医师 + + 心内科 + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + diff --git a/src/echart/components/homeLevel3/index.json b/src/echart/components/homeLevel3/index.json new file mode 100644 index 0000000..fe436a8 --- /dev/null +++ b/src/echart/components/homeLevel3/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "doctorAvatar": "/components/doctorAvatar/index", + "van-icon": "@vant/weapp/icon/index" + } +} diff --git a/src/echart/components/homeLevel3/index.scss b/src/echart/components/homeLevel3/index.scss new file mode 100644 index 0000000..e3b64e7 --- /dev/null +++ b/src/echart/components/homeLevel3/index.scss @@ -0,0 +1,194 @@ +.page { + padding: 36rpx 32rpx 200rpx; + .user { + margin-top: 40rpx; + position: relative; + padding: 94rpx 32rpx 32rpx; + background: linear-gradient(180deg, #f1feff 0%, #ffffff 35%, #ffffff 100%); + box-shadow: 0rpx 8rpx 24rpx 0rpx rgba(0, 66, 73, 0.09); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + .avatar { + position: absolute; + top: -38rpx; + left: 32rpx; + width: 112rpx; + height: 112rpx; + } + .code { + position: absolute; + top: 38rpx; + right: 34rpx; + width: 60rpx; + height: 60rpx; + } + .wrap { + .w-header { + display: flex; + align-items: baseline; + gap: 16rpx; + .name { + font-size: 36rpx; + color: rgba(20, 21, 21, 1); + } + .desc { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + .line { + margin: 0 12rpx; + display: inline-block; + height: 24rpx; + width: 1rpx; + background-color: rgba(205, 205, 205, 1); + } + } + } + .w-container { + margin-top: 24rpx; + .hostipal { + margin-right: 12rpx; + display: inline; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .tag { + margin-right: 12rpx; + display: inline-block; + padding: 0 8rpx; + border-radius: 4rpx; + background-color: rgba(0, 180, 197, 1); + font-size: 24rpx; + color: #fff; + } + .site { + display: inline-block; + padding: 0 8rpx; + font-size: 28rpx; + line-height: 32rpx; + color: rgba(148, 87, 30, 1); + border-radius: 4rpx; + background-color: rgba(250, 229, 206, 1); + } + } + .w-footer { + margin-top: 16rpx; + display: flex; + gap: 12rpx; + flex-wrap: wrap; + .wf-label { + flex-shrink: 0; + width: 48rpx; + height: 32rpx; + } + .wf-tag { + flex-shrink: 0; + padding: 0 8rpx; + font-size: 22rpx; + color: rgba(0, 180, 197, 1); + line-height: 32rpx; + border: 1rpx solid rgba(191, 239, 244, 1); + } + } + } + } + .banner { + margin-top: 32rpx; + .title { + position: relative; + z-index: 1; + padding: 14rpx; + width: 262rpx; + height: 116rpx; + text-align: center; + font-size: 28rpx; + color: rgba(0, 180, 197, 1); + line-height: 1; + box-sizing: border-box; + background: linear-gradient(180deg, #dcf5f7 0%, #ffffff 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + border: 1rpx solid #ffffff; + } + .bg { + padding-top: 40rpx; + border-radius: 24rpx; + background-color: rgba(250, 229, 206, 1); + margin-top: -95rpx; + .b-container { + position: relative; + z-index: 2; + border: 1rpx solid #ffffff; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 16rpx 16rpx 16rpx 16rpx; + display: flex; + align-items: center; + .item { + padding: 32rpx 0; + flex: 1; + text-align: center; + .name { + font-size: 26rpx; + color: #fff; + line-height: 1; + } + .num { + margin-top: 24rpx; + font-size: 56rpx; + color: #fff; + line-height: 56rpx; + } + } + .line { + flex-shrink: 0; + height: 108rpx; + border-right: 1rpx dashed #ffffff; + opacity: 0.5; + } + } + } + } + .stat { + position: relative; + margin-top: 24rpx; + padding: 96rpx 0 32rpx; + border-radius: 16rpx; + .title { + position: absolute; + top: 0; + left: 0; + padding: 16rpx 24rpx; + font-size: 28rpx; + color: #fff; + } + .more { + position: absolute; + top: 0; + right: 0; + padding: 14rpx 20rpx; + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + } + .s-container { + display: flex; + .item { + flex: 1; + text-align: center; + .name { + font-size: 28rpx; + color: rgba(128, 128, 128, 1); + line-height: 1; + } + .num { + margin-top: 24rpx; + font-size: 48rpx; + color: rgba(20, 21, 21, 1); + line-height: 56rpx; + } + } + .line { + flex-shrink: 0; + height: 108rpx; + border-right: 1rpx dashed rgba(224, 224, 224, 0.5); + } + } + } +} diff --git a/src/echart/components/homeLevel3/index.ts b/src/echart/components/homeLevel3/index.ts new file mode 100644 index 0000000..38a9289 --- /dev/null +++ b/src/echart/components/homeLevel3/index.ts @@ -0,0 +1,26 @@ +const _app = getApp() + +// pages/story/a.ts +Component({ + /** + * 组件的属性列表 + */ + properties: {}, + + /** + * 组件的初始数据 + */ + data: {}, + + attached() {}, + /** + * 组件的方法列表 + */ + methods: { + handleOrg() { + wx.navigateTo({ + url: '/module1/pages/org3/index', + }) + }, + }, +}) diff --git a/src/echart/components/homeLevel3/index.wxml b/src/echart/components/homeLevel3/index.wxml new file mode 100644 index 0000000..cd8c445 --- /dev/null +++ b/src/echart/components/homeLevel3/index.wxml @@ -0,0 +1,129 @@ + + + + + + + 徐萌 + + 主治医师 + + 心内科 + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + 我管理的病历 + + + 全部 + 54 + + + + + 新病历 + + + 54 + + + + + 讨论中 + + + 54 + + + + + 已归档 + + + 54 + + + + + 我管理的医生 + + 查看全部 + + + + + 全部 + 54 + + + + + 新病历 + + + 54 + + + + + 讨论中 + + + 54 + + + + + 已归档 + + + 54 + + + + diff --git a/src/echart/components/homeLevel4/index.json b/src/echart/components/homeLevel4/index.json new file mode 100644 index 0000000..0e0d833 --- /dev/null +++ b/src/echart/components/homeLevel4/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "doctorAvatar": "/components/doctorAvatar/index", + "van-icon": "@vant/weapp/icon/index", + "ec-canvas": "../ec-canvas/ec-canvas" + } +} diff --git a/src/echart/components/homeLevel4/index.scss b/src/echart/components/homeLevel4/index.scss new file mode 100644 index 0000000..d4bcbbb --- /dev/null +++ b/src/echart/components/homeLevel4/index.scss @@ -0,0 +1,370 @@ +.page { + padding: 36rpx 32rpx 100rpx; + .user { + margin-top: 40rpx; + position: relative; + padding: 94rpx 32rpx 32rpx; + background: linear-gradient(180deg, #f1feff 0%, #ffffff 35%, #ffffff 100%); + box-shadow: 0rpx 8rpx 24rpx 0rpx rgba(0, 66, 73, 0.09); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + .avatar { + position: absolute; + top: -38rpx; + left: 32rpx; + width: 112rpx; + height: 112rpx; + } + .code { + position: absolute; + top: 38rpx; + right: 34rpx; + width: 60rpx; + height: 60rpx; + } + .wrap { + .w-header { + display: flex; + align-items: baseline; + gap: 16rpx; + .name { + font-size: 36rpx; + color: rgba(20, 21, 21, 1); + } + .desc { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + .line { + margin: 0 12rpx; + display: inline-block; + height: 24rpx; + width: 1rpx; + background-color: rgba(205, 205, 205, 1); + } + } + } + .w-container { + margin-top: 24rpx; + .hostipal { + margin-right: 12rpx; + display: inline; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .tag { + margin-right: 12rpx; + display: inline-block; + padding: 0 8rpx; + border-radius: 4rpx; + background-color: rgba(0, 180, 197, 1); + font-size: 24rpx; + color: #fff; + } + .site { + display: inline-block; + padding: 0 8rpx; + font-size: 28rpx; + line-height: 32rpx; + color: rgba(148, 87, 30, 1); + border-radius: 4rpx; + background-color: rgba(250, 229, 206, 1); + } + } + .w-footer { + margin-top: 16rpx; + display: flex; + gap: 12rpx; + flex-wrap: wrap; + .wf-label { + flex-shrink: 0; + width: 48rpx; + height: 32rpx; + } + .wf-tag { + flex-shrink: 0; + padding: 0 8rpx; + font-size: 22rpx; + color: rgba(0, 180, 197, 1); + line-height: 32rpx; + border: 1rpx solid rgba(191, 239, 244, 1); + } + } + } + } + .banner { + margin-top: 32rpx; + .title { + position: relative; + z-index: 1; + padding: 14rpx; + width: 262rpx; + height: 116rpx; + text-align: center; + font-size: 28rpx; + color: rgba(0, 180, 197, 1); + line-height: 1; + box-sizing: border-box; + background: linear-gradient(180deg, #dcf5f7 0%, #ffffff 100%); + border-radius: 24rpx 24rpx 24rpx 24rpx; + border: 1rpx solid #ffffff; + } + .bg { + padding-top: 40rpx; + border-radius: 24rpx; + background-color: rgba(250, 229, 206, 1); + margin-top: -95rpx; + .b-container { + position: relative; + z-index: 2; + border: 1rpx solid #ffffff; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 16rpx 16rpx 16rpx 16rpx; + display: flex; + align-items: center; + .item { + padding: 32rpx 0; + flex: 1; + text-align: center; + .name { + font-size: 26rpx; + color: #fff; + line-height: 1; + } + .num { + margin-top: 24rpx; + font-size: 56rpx; + color: #fff; + line-height: 56rpx; + } + } + .line { + flex-shrink: 0; + height: 108rpx; + border-right: 1rpx dashed #ffffff; + opacity: 0.5; + } + } + } + } + .stat { + position: relative; + margin-top: 24rpx; + padding: 96rpx 0 32rpx; + border-radius: 16rpx; + .title { + position: absolute; + top: 0; + left: 0; + padding: 16rpx 24rpx; + font-size: 28rpx; + color: #fff; + } + .picker { + position: absolute; + top: 8rpx; + left: 296rpx; + .picker-content { + padding: 4rpx 24rpx; + display: flex; + gap: 18rpx; + font-size: 28rpx; + color: rgba(133, 133, 133, 1); + background: #ffffff; + border-radius: 98rpx 98rpx 98rpx 98rpx; + border: 1rpx solid #f6f6f6; + } + } + .more { + position: absolute; + top: 0; + right: 0; + padding: 14rpx 20rpx; + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + } + .s-container { + display: flex; + .item { + flex: 1; + text-align: center; + .name { + font-size: 28rpx; + color: rgba(128, 128, 128, 1); + line-height: 1; + } + .num { + margin-top: 24rpx; + font-size: 48rpx; + color: rgba(20, 21, 21, 1); + line-height: 56rpx; + } + } + .line { + flex-shrink: 0; + height: 108rpx; + border-right: 1rpx dashed rgba(224, 224, 224, 0.5); + } + } + } + .department { + margin-top: 24rpx; + padding: 0 20rpx; + background: linear-gradient(180deg, #f1feff 0%, #ffffff 35%, #ffffff 100%); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + .d-header { + padding: 32rpx 0; + display: flex; + align-items: center; + justify-content: space-between; + .name { + font-size: 32rpx; + color: rgba(20, 21, 21, 1); + } + .more { + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + } + } + .d-container { + padding: 32rpx 0; + background: linear-gradient(180deg, #f3fbfd 0%, #ffffff 50%); + box-shadow: 0rpx 4rpx 20rpx 0rpx rgba(0, 0, 0, 0.08); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + display: flex; + justify-content: space-between; + .item { + flex: 1; + text-align: center; + .name { + font-size: 28rpx; + color: rgba(128, 128, 128, 1); + line-height: 1; + } + .num { + margin-top: 24rpx; + font-size: 48rpx; + color: rgba(20, 21, 21, 1); + line-height: 56rpx; + } + } + } + .tip { + padding: 20rpx 0; + font-size: 22rpx; + color: rgba(153, 153, 153, 1); + text-align: right; + } + } + .chart-card { + margin-top: 24rpx; + background: linear-gradient(180deg, #f1feff 0%, #ffffff 35%, #ffffff 100%); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + .c-header { + padding: 32rpx 20rpx; + display: flex; + align-items: center; + justify-content: space-between; + .name { + font-size: 32rpx; + color: rgba(20, 21, 21, 1); + } + .picker { + .picker-content { + padding: 8rpx 24rpx; + display: flex; + gap: 18rpx; + font-size: 28rpx; + color: rgba(133, 133, 133, 1); + background: #ffffff; + border-radius: 98rpx 98rpx 98rpx 98rpx; + border: 1rpx solid #f6f6f6; + } + } + } + .cahrt { + height: 450rpx; + } + .tip { + padding: 24rpx 20rpx 32rpx; + font-size: 22rpx; + color: rgba(153, 153, 153, 1); + text-align: right; + } + } + .rank { + margin: 24rpx -32rpx 0; + padding: 0 32rpx 100rpx; + background: linear-gradient(180deg, #f1feff 0%, #ffffff 14%, #ffffff 100%); + border-radius: 32rpx 32rpx 0 0; + border: 2rpx solid #ffffff; + .r-header { + padding: 32rpx 0; + display: flex; + align-items: center; + justify-content: space-between; + .title { + font-size: 32rpx; + color: rgba(20, 21, 21, 1); + } + .more { + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + } + } + .table { + margin-top: 40rpx; + .thead { + padding: 22rpx 0; + display: flex; + font-size: 28rpx; + color: rgba(0, 180, 197, 1); + background-color: rgba(233, 246, 247, 1); + text-align: center; + border-radius: 8rpx; + .th1 { + width: 338rpx; + } + .th2, + .th3, + .th4, + .th5 { + width: 96rpx; + white-space: nowrap; + } + } + .tbody { + border-bottom: 1rpx solid rgba(224, 224, 224, 0.5); + .tr { + display: flex; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + text-align: center; + padding: 18rpx 0; + line-height: 32rpx; + border-radius: 8rpx; + &:nth-child(even) { + background-color: rgba(248, 248, 248, 1); + } + .td1 { + padding: 12rpx 0; + width: 338rpx; + } + .td2, + .td3, + .td4, + .td5 { + padding: 12rpx 0; + width: 96rpx; + border-left: 1px dashed rgba(224, 224, 224, 1); + } + .td2 { + color: rgba(0, 180, 197, 1); + } + } + } + } + } +} diff --git a/src/echart/components/homeLevel4/index.ts b/src/echart/components/homeLevel4/index.ts new file mode 100644 index 0000000..950b9f0 --- /dev/null +++ b/src/echart/components/homeLevel4/index.ts @@ -0,0 +1,466 @@ +const app = getApp() +const echarts = require('../ec-canvas/echarts.js') + +// pages/story/a.ts +Component({ + /** + * 组件的属性列表 + */ + properties: {}, + + /** + * 组件的初始数据 + */ + data: { + ec: { + lazyLoad: true, + }, + }, + + attached() { + this.waitEchart(async () => { + const chart1: any = await this.initChart1() + const chart2: any = await this.initChart2() + const chart3: any = await this.initChart3() + }) + }, + /** + * 组件的方法列表 + */ + methods: { + ecDataTrendComponent1: null as any, + ecDataTrendComponent2: null as any, + ecDataTrendComponent3: null as any, + waitEchart(callback) { + const time = setInterval(() => { + if (this.selectComponent('#chart1')) { + console.log(this.selectComponent('#chart1')) + clearInterval(time) + callback() + } + }, 30) + }, + initChart1() { + return new Promise((reslove) => { + this.ecDataTrendComponent1 = this.selectComponent('#chart1') + this.ecDataTrendComponent1.init((canvas, width, height, dpr) => { + const chart = echarts.init(canvas, null, { + width, + height, + devicePixelRatio: dpr, // new + }) + canvas.setChart(chart) + const x: string[] = ['2024-09', '2024-10'] + const y1: string[] = ['10', '30'] + const y2: string[] = ['10', '30'] + const y3: string[] = ['10', '30'] + const y4: string[] = ['30', '90'] + + const option = { + legend: { + bottom: 0, + itemWidth: 8, + itemHeight: 8, + icon: 'circle', + lineStyle: { + width: '0', + }, + textStyle: { + color: 'rgba(103, 113, 114, 1)', + fontSize: '12', + }, + data: ['一级医生', '核心医生', '质控医生'], + }, + grid: { + top: '10%', + left: '3%', + right: '4%', + bottom: '30', + containLabel: true, + }, + xAxis: [ + { + type: 'category', + axisTick: { + show: false, + }, + axisLine: { + show: false, + }, + axisLabel: { + fontSize: 10, + color: 'rgba(40, 48, 49, 1)', + }, + data: x, + }, + ], + yAxis: [ + { + type: 'value', + minInterval: 1, + splitLine: { + show: false, + }, + axisLabel: { + fontSize: 10, + color: 'rgba(40, 48, 49, 1)', + formatter(value) { + return Math.abs(value) + }, + }, + }, + ], + series: [ + { + name: '质控医生', + type: 'bar', + stack: 'a', + label: { + show: true, + color: '#fff', + fontSize: 10, + overflow: 'truncate', + width: 30, + formatter(params) { + return Math.abs(params.value) + }, + }, + color: 'rgba(0, 180, 197, 1)', + data: y3, + }, + { + name: '核心医生', + type: 'bar', + stack: 'a', + label: { + show: true, + color: '#fff', + fontSize: 10, + overflow: 'truncate', + width: 30, + formatter(params) { + return Math.abs(params.value) + }, + }, + color: 'rgba(84, 226, 180, 1)', + data: y2, + }, + { + name: '一级医生', + type: 'bar', + stack: 'a', + label: { + show: true, + color: 'rgba(0, 180, 197, 1)', + fontSize: 10, + overflow: 'truncate', + width: 30, + }, + color: 'rgba(225, 248, 242, 1)', + data: y1, + }, + { + name: '总数', // 总数显示,生成一个总数的柱状图,将颜色设为透明, + type: 'line', // label将位置设备内部底部,造成一个总数显示在 + stack: '', // 柱状图上方的假象 + color: 'rgba(0, 0, 0, 0)', + data: y4, + symbolSize: 0, + label: { + normal: { + show: true, + position: 'top', + color: 'rgba(133, 133, 133, 1)', + fontSize: 10, + formatter: '{c}', + }, + }, + }, + ], + dataZoom: { + type: 'inside', // 有type这个属性,滚动条在最下面,也可以不行,写y:36,这表示距离顶端36px,一般就是在图上面。 + startValue: x.length - 6, + endValue: x.length - 1, + filterMode: 'none', + }, + } + + chart.setOption(option) + reslove(chart) + return chart + }) + }) + }, + initChart2() { + return new Promise((reslove) => { + this.ecDataTrendComponent2 = this.selectComponent('#chart2') + this.ecDataTrendComponent2.init((canvas, width, height, dpr) => { + const chart = echarts.init(canvas, null, { + width, + height, + devicePixelRatio: dpr, // new + }) + canvas.setChart(chart) + const x: string[] = ['2024-09', '2024-10'] + const y1: string[] = ['10', '30'] + const y2: string[] = ['10', '30'] + const y3: string[] = ['20', '60'] + + const option = { + legend: { + bottom: 0, + itemWidth: 8, + itemHeight: 8, + icon: 'circle', + lineStyle: { + width: '0', + }, + textStyle: { + color: 'rgba(103, 113, 114, 1)', + fontSize: '12', + }, + data: ['一级医生提交', '核心医生提交'], + }, + grid: { + top: '10%', + left: '3%', + right: '4%', + bottom: '30', + containLabel: true, + }, + xAxis: [ + { + type: 'category', + axisTick: { + show: false, + }, + axisLine: { + show: false, + }, + axisLabel: { + fontSize: 10, + color: 'rgba(40, 48, 49, 1)', + }, + data: x, + }, + ], + yAxis: [ + { + type: 'value', + minInterval: 1, + splitLine: { + show: false, + }, + axisLabel: { + fontSize: 10, + color: 'rgba(40, 48, 49, 1)', + formatter(value) { + return Math.abs(value) + }, + }, + }, + ], + series: [ + { + name: '核心医生提交', + type: 'bar', + stack: 'a', + label: { + show: true, + color: '#fff', + fontSize: 10, + overflow: 'truncate', + width: 30, + formatter(params) { + return Math.abs(params.value) + }, + }, + color: 'rgba(84, 226, 180, 1)', + data: y2, + }, + { + name: '一级医生提交', + type: 'bar', + stack: 'a', + label: { + show: true, + color: 'rgba(0, 180, 197, 1)', + fontSize: 10, + overflow: 'truncate', + width: 30, + }, + color: 'rgba(225, 248, 242, 1)', + data: y1, + }, + { + name: '总数', // 总数显示,生成一个总数的柱状图,将颜色设为透明, + type: 'line', // label将位置设备内部底部,造成一个总数显示在 + stack: '', // 柱状图上方的假象 + color: 'rgba(0, 0, 0, 0)', + data: y3, + symbolSize: 0, + label: { + normal: { + show: true, + position: 'top', + color: 'rgba(133, 133, 133, 1)', + fontSize: 10, + formatter: '{c}', + }, + }, + }, + ], + dataZoom: { + type: 'inside', // 有type这个属性,滚动条在最下面,也可以不行,写y:36,这表示距离顶端36px,一般就是在图上面。 + startValue: x.length - 6, + endValue: x.length - 1, + filterMode: 'none', + }, + } + + chart.setOption(option) + reslove(chart) + return chart + }) + }) + }, + initChart3() { + return new Promise((reslove) => { + this.ecDataTrendComponent3 = this.selectComponent('#chart3') + this.ecDataTrendComponent3.init((canvas, width, height, dpr) => { + const chart = echarts.init(canvas, null, { + width, + height, + devicePixelRatio: dpr, // new + }) + canvas.setChart(chart) + const x: string[] = ['2024-09', '2024-10'] + const y1: string[] = ['10', '30'] + const y2: string[] = ['10', '30'] + const y3: string[] = ['20', '60'] + + const option = { + legend: { + bottom: 0, + itemWidth: 8, + itemHeight: 8, + icon: 'circle', + lineStyle: { + width: '0', + }, + textStyle: { + color: 'rgba(103, 113, 114, 1)', + fontSize: '12', + }, + data: ['一级医生提交', '核心医生提交'], + }, + grid: { + top: '10%', + left: '3%', + right: '4%', + bottom: '30', + containLabel: true, + }, + xAxis: [ + { + type: 'category', + axisTick: { + show: false, + }, + axisLine: { + show: false, + }, + axisLabel: { + fontSize: 10, + color: 'rgba(40, 48, 49, 1)', + }, + data: x, + }, + ], + yAxis: [ + { + type: 'value', + minInterval: 1, + splitLine: { + show: false, + }, + axisLabel: { + fontSize: 10, + color: 'rgba(40, 48, 49, 1)', + formatter(value) { + return Math.abs(value) + }, + }, + }, + ], + series: [ + { + name: '核心医生提交', + type: 'bar', + stack: 'a', + label: { + show: true, + color: '#fff', + fontSize: 10, + overflow: 'truncate', + width: 30, + formatter(params) { + return Math.abs(params.value) + }, + }, + color: 'rgba(84, 226, 180, 1)', + data: y2, + }, + { + name: '一级医生提交', + type: 'bar', + stack: 'a', + label: { + show: true, + color: 'rgba(0, 180, 197, 1)', + fontSize: 10, + overflow: 'truncate', + width: 30, + }, + color: 'rgba(225, 248, 242, 1)', + data: y1, + }, + { + name: '总数', // 总数显示,生成一个总数的柱状图,将颜色设为透明, + type: 'line', // label将位置设备内部底部,造成一个总数显示在 + stack: '', // 柱状图上方的假象 + color: 'rgba(0, 0, 0, 0)', + data: y3, + symbolSize: 0, + label: { + normal: { + show: true, + position: 'top', + color: 'rgba(133, 133, 133, 1)', + fontSize: 10, + formatter: '{c}', + }, + }, + }, + ], + dataZoom: { + type: 'inside', // 有type这个属性,滚动条在最下面,也可以不行,写y:36,这表示距离顶端36px,一般就是在图上面。 + startValue: x.length - 6, + endValue: x.length - 1, + filterMode: 'none', + }, + } + + chart.setOption(option) + reslove(chart) + return chart + }) + }) + }, + handleRankDetail() { + wx.navigateTo({ + url: '/module1/pages/doctorRankList/index', + }) + }, + }, +}) diff --git a/src/echart/components/homeLevel4/index.wxml b/src/echart/components/homeLevel4/index.wxml new file mode 100644 index 0000000..b156fbf --- /dev/null +++ b/src/echart/components/homeLevel4/index.wxml @@ -0,0 +1,209 @@ + + + + + + + 徐萌 + + 主治医师 + + 心内科 + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + 本科室全部病历 + + + 全部 + + + + + 查看全部 + + + + + 全部 + 54 + + + + + 新病历 + + + 54 + + + + + 讨论中 + + + 54 + + + + + 已归档 + + + 54 + + + + + + 本科室医生 + + 查看全部 + + + + + + 医生总数 + 54 + + + 质控医生 + 54 + + + 核心医生 + 54 + + + 一级医生 + 54 + + + 注:一级医生为平台全部医生,不区分科室 + + + + + 科室医生入驻情况 + + + + + 2024年 + + + + + + + + 注:一级医生为平台全部医生,不区分科室 + + + + + 累计病历统计 + + + + + 2024年 + + + + + + + + + + + + 科室新增病历统计 + + + + + 2024年 + + + + + + + + + + + + 医院活跃排行榜 + + + + 查看全部 + + + + + + 医院 + 医生总数 + S1 + S2 + S3 + + + + 1 中山大学附属医院 + 888 + 888 + 888 + 888 + + + + + diff --git a/src/images/doctor-rank-bg.png b/src/images/doctor-rank-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..cf963f97329c06524eba175e1eb9d3638258e2c8 GIT binary patch literal 221834 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

$Sn!irJQ2#sqLK{s+uv^c6M^6_^ zMvM${`*-$&AC5Xk-vNmQve9PmV;ZxT!Aq?}{JG~HY8LVPXfwnO0Uk5v{R83sOP0Zh zAqH5o=!35=EUlJLZ&pb6bAW6XKAkwbf);yaR1il^63el zhaY^kl`-@)Qd3hiv$D!43|7R+LIs8!)!nkbd(rps+%cxSiDvy-qs`Rjl&VK(&smM1 z4mMEId3_*|>7p=f+B^?RcovT4`xust$Hti;dn}nW13KvGq3lm<@Y5h)BF@b|)7p{W zlR|V~P^iVF5~~MICb1zg8)FtXeW)t@ZD#i%Om)Y*C{Yxl{vG)K)Qg!~TX`BB%^?T& z`?m$yO2ovoYal+xT3E zwJ4ow#BTe%J}}f=&JpuT{rqV@5<2>$-Q7rN3xg7_E}Y*+cGo8D%`#~@Nuv;oLTBD^ zm#@YV38Mc_F0DXJSkbef$9Q{o#F>iTCT75gGiX%OzGzSva7-k0Iv(oixq{ z*KX@aW!2OtmxuXQDAZTvW|*5Uk^o^V6N?s_WZ?1m>Ytm^J}$bp)X&cZHO{gXbZ{yQ zAf49@3XA*VRh~l1jR}bjmq$~Y5{`_&z*XQ~v}-bosNd8aD@rTlJ{oLAz?s_4ADFAv zW3KO|S5?O)RzumwU3Eu_KrajqZimQwveVzOj@$7k(x{V4wCO7Bacu?SzP@u#f6tO- znW77a2dr#tU~nqo+jGH~Nm*GL3${%-PntxPOd6=0Q;&;ZDI7+9owyp&7~kn0*ZIfC z1j#5FR!##)Vkl2(0`tCk9%KF^Oi`o?!Sh7F6qY29G%^UqV#=ChI}j*Xc=a5MpCs z5+-f@dh$tlhOD&BYh;fyku%qjmIj%aoLt^$zU## zSNY_mtiKl94te@CVn8*5ujg7TY1LO$bJ!r)DGdpu_{xNbhmuItzdtrxExPw~NojUx z{9=hRSC%Rnru}BHVl?L*iaD9ITBc#lEc3Y~w4kr2cLg+mt(3iIl9X#Y%=IDuuDEJV zHYUndVVBdu962ZrxI3e}s1xNFhA%jay+OY6AW3ffc&F(pV>fldMA&tmhv`i3@g90E z(M)ogvFdE$kxcoCAQu=^JbOyZ`q9UyF(p)#X8_frLOrtf2&(HK2qDV&I&ni0wVT>h z3MY)2!ze^JYCbX8PYmA@D$7tRP~mS$KExpj41$oxTdQm>Jzj;R*%s@)UDmRMTkrW( zl|~K6RPFNX#ECikGdSs~8>+r1+J17P-;J2+_B2sn^}d1qwc-fg8+#ju6kLS^{z7!i zZ{sCED5L;bMEM(|LD=DBLjy&Cgm^nq)h+=GTOcSucqjNJBvDuZ`;Z1eOLYMp#~FwK7KsP22J=C=a#56_ z@cT1hJvTU(sSkw7F|Zljy(B71P&gsl48WmiwRVvzK;QuMNDh5HM?3it%Kj}_KiR~s sUIzk(2AfeNis8xsKg|E)&+Ntb5*{Q(VOI_VirOIyQ(Kcd?4`ti0Mx=>#Q*>R literal 0 HcmV?d00001 diff --git a/src/images/fold-down.png b/src/images/fold-down.png new file mode 100644 index 0000000000000000000000000000000000000000..24be7d08fc397702887cb3356dc188742bb69864 GIT binary patch literal 771 zcmV+e1N{7nP)Px%y-7qtR7gv`mQ6@hQ5462*O{k%7)%6`k&7VglTeBl&RaA)!I?!QmEb}lP$9t} zXcY*pf*`>_!$2XT0wZD+Y&8*YTm+&)-vlj^3_%hyn`WlDap(DZGtW0~MjX7mH|Mjqs9?2q|5RXGB56tl-OF6A&Y zsb2a+>D;{a!07Z4LUwNoX1_c}IM`VjI62*g+F3c55Z$yi{kPXvI2qfE)V_e&R!$yL zu8>R};aq55)wO{W#%&ONWrev|YXa3h)3k-MtFwSgWja--?x_ik8W#}ak(;_>)jRn3 z>o;jBJ;nQl;Ly(Pyj@v!&y%v9i2lF?P8fqAE;}=WyLT~l`Y2P2%e2jXDhO4uhYj^K z*92&O^^W+DpX;IOFh=wq3m5}&#+fyG;vgM$HQArXzb&~!Em-TmJ=wgm`9(Tke|AwR zUl7(qYryy{(BRC<7Hh1hwbm@=ggRm43rn=k7Ib2caIn!6s33))DyD3-lof%g^jx6f zYN@5z4XR=rfT_-sV`jgpXHa6 z@*)xav3>FV+SgKAk)>2s^Ee>Ry(dT|Ywe4ly^HbDQd^ROs#WY`U{l2a;ifC<+5VQQ z?p~?AFGXcB>mBg~tH}e_6p-H!x3oQ3+lt0V5M0`z3ios=hKV%wa|$qE(XYHpYJR+t;jP61WdAUorDgH_KHVw^w8>sEJn^SSgv zxWdPx%tVu*cR7gv`mO*F}K@^7n*JK-&79yfpu?Im)l_D*Ihhz`t7D#dsgIegJ1xs77 zP(kn{6g&xng$juvG$2xiibxWur-*EN5T!+mmLhnl7*T?Sh8VLkBeUx^+hljMOJnC2 z=AZfI{dsTSBkb`aTfFBPFWf>1fCxe_KwkA6+XS!*1_>4UB`yT`Z_8y3e3m&5k8m3d zQ4n=lU&TrQ;wZ{@a4GQ3OluBIOJk_wZgWum)vN@<6hh(yBWNRVI^)LK_816Po7rQz z&sZGq1vGHBOw8IP!5%G_j1Jg@m;4f?CA{s}?w{34N!gS^+nD7~( zeXZnyu>#8SDO?PE;rG^nDd`?SQ+8l(Qjb*_vm@u41j7E28j#nSAmr>s$6@pRJql=W zW!)Z>M_G}(d7Y|HO-h$R^rYEyHCXi6Aw|0IHSYvEgoyZ91*W7~fUa2q>tUMKHk2o0 zM4Zro8Gz240UILAS;tfo3o* zJC%L=P(4sGv~=#wNep)%Q4=JW2al}26zZXgjqezF|H;5Cy`@Ph2L45;TmFNcSUh(c zi$69EVVYcn1`m4?eDeX>pIb)2`v{AZs--Vp55eVnWb_~QbsoT4;aAgo9 z8s{EkR}c}Osz9~DZa8m6%_?_$zXZA5RV#d@7PE5zhHYQrNJujX`>yjNwQni!?(M?I z{}5#f#qtSl3fS2X_q07}7PZn^MsY-Z6MFYeMhwqv3%Y&+Z_A_2M-1&bs=YG+oHb;I z0@~Q~+5RBh<_f~)_5;PyA07*naRCr$Oy<6<9OL8Cdt$nUz&zTv|nVapo*q#~BIL3C2!Jb?k9uQF^A`?Zq zILN}FM2Z9sakvQ-gd&U(K|$dOBKg5aLW+z8l9e$+;vp|HAyPuf3la|?!Bdcu2OfQy z*$aQ&b@^3wRd;`D?>V#gKDDKp^IvOym+q>rs$W%CRo{;KR}?4;6a|jsxZm&JcO1u0 z9mnxc(f>Yu9LM>;j~vJGb`hy4P!uQ%6a|U`&xr#6zTlj!;S~j*HwEtZ`x!y~H-6XK{Z|pJ-jCz>=KVOHp3&FaaX

(>jUky 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 C$)vXc literal 0 HcmV?d00001 diff --git a/src/images/icon-code.png b/src/images/icon-code.png new file mode 100644 index 0000000000000000000000000000000000000000..72149e08b6aac04febde588e0d04b1a345e8b38a GIT binary patch literal 1548 zcmV+n2J`ueP)Px)#z{m$RA@u(TU}@zRTTctW@j5Q4}GZ8#}*1!>O+c=*6bu^p`bN8Cc%~ljA&@3 z1$|H`SV1uliVap!e5uqD!HU&JV%^P;*s{gUCIJgZd{9BC4;4fM<{=Mpf99Awn>5^= zyV;q{%(BMaw`As??|$dZJ#+qsFlpY00;NINgHV4wk9X;%R13Kbqa zk0$gJ(%GK?>9r<2k7Rs*{SjvFMM zR{|z%z7Nm~6#)BT=%0m4_}gAk(^v&}?L1b#&+x>|Be3{}1CV(M$nS=cSO}HySY|t- z+AR=mckUtD3gf^J!CF{ID?gXai=aq9lI>sD#A%IZp9DiZ*3GMU!cht9$|GOR$Plj)Z>gzM!4f9l4pEC^Q|i|FnuG`Vzk>AM?NnS2#p9v9Me0KrQSR zG%O3d#cx=+q$zKqrCaT)9GtzjUeiMnQAOwvFZ>j*t1d;Y%4Nlar$9944Uym$Jc?xesI>WX_G178K@qAVXPJ;TCjok_CV-+iSRQjv z%pQYfU9Js2E)(pee%o;{>j3Xu1ulSSY15lv7NK7=KrJO1ya0-PiSG6flrqO>o(EgK z0PQH<&PyOHt#l-uiM^XmS%`wT1z3x_1wNVhGdE0b)^DYI8ico!HC0^xhZg=k(}KIT zx53l~hDfdpw!?r(>>(`bZWK`Kr7|KM^rac4DA%KO`ih6#^ ziad;-jwxx~)yy6=X%|ZPB%I(J{>r^0-osY_9PtdYnFSH<$Kz$CAY~=eqj0M@h$lKf zl2(0{IfzJXR+hxq>LKv(-!4@VR;P!B+7ecG4@K!!1p1r*xhGs9J={EWwUw%DsU8UP zIRL*`+kKVmk19e|72zKNJm3qOxE^bUz!I{O`fwyjB6Rq+U7sHJW#+#tO2 zFxS+=Eb?K+oYqEXc*@*|JX#T-*saATkhmtHnEEcPl&*o-mKWD$`ggPF_SIzuRGHKZSVU5-ePoSVVXqK&Ra?t8kYm z!W+fh%mXlVd9KP2VGmx{lLEXEHpRF@sfktoBR++0T`u4J=LstbtTGRJLoM4TSK1}=Tr=Yh81dH}z7av-S&r778b?EyQ0oC(kk3WPvTdHQH57my+M_+bXWu8aQO*2mb|^_KN9RF80*`0000Px(4@pEpR9HvNm_djgMG!!%n%}U22npm6!GJ=96%2StFo6UTh_FHq0dt6GQ1N0g zfZ;F4ZxFh(54m{+X+lh!5>;A>9kWHA`YghDilhmOhh(WYp+Fs zXNl;|Q5X@qGhd(`5m_GYt7;E2-utHk;A8~4T}1w<>!Gmf(zwbTGcSx7-5NZos*q(_ z2>L6bUqnjVi?PnR1Q9s`*|H2?nW??^e*wUHRXxef&kO@4NwU`%b1t;?`~7_j3k&DN zdsTZew%hH#rK-nN^>1drttB6L=R5`$b0_*06Yo+SBU7Yra(mzy=fcK z)P+%a{F$m@_tt$n`=&8=#S7`#cf7)(9v`k|&KZ@0O+cmOvqCh8PM@ zX{8Sxl`)hg$w6bxXAx*s#cu;NT9>eTv3*@7J`O0HME;4=OhkT-K>r<$(llLHb<7@nE*q-&m1nTJkVBPz zg_+k?jhh5iRQ%IKbfm8FiYY59{Z%5`(iW(w_!m@l)h4YeoG~T=fZh3$zmzZeZLNTu zbLYZ^K~v-7Px$kx4{BR9Hvtmp@9yKoG`vvu_uVVPWABo}i$emL9`G#C`({*=ED2lsoA39=;osD@8`>q8mG^7+Ey84FFNf^!cNK+JmlAZr7WC8h<%7w`W>Y+I2R{&s)G3UPVf*CpaEsIH<8k=P5)M6p$)(gm58@5Bb z3y68c{%!}a9|6UJLI5Cd{otHm1He{LH9Y7QdlT2oLwLhKA2B(FJ^|LsyfjHr02=@R N002ovPDHLkV1m^2&C~z@ literal 0 HcmV?d00001 diff --git a/src/images/icon-edit.png b/src/images/icon-edit.png new file mode 100644 index 0000000000000000000000000000000000000000..8a0e519f4658b5df57d0b5af0eaacfd61ead94dd GIT binary patch literal 428 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 A`2YX_ literal 0 HcmV?d00001 diff --git a/src/images/my-bg.png b/src/images/my-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..3cdf0d556cbb51f64d5f9037ddeaa957d111e7f7 GIT binary patch literal 493049 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 指派核心医生后通过 - 被指派医生将帮您提前审核病例 + 被指派医生将帮您提前审核病历 取消 diff --git a/src/module1/pages/casesDetail/index.json b/src/module1/pages/casesDetail/index.json new file mode 100644 index 0000000..e2a906d --- /dev/null +++ b/src/module1/pages/casesDetail/index.json @@ -0,0 +1,5 @@ +{ + "navigationBarTitleText": "病历", + "navigationStyle": "default", + "usingComponents": {} +} diff --git a/src/module1/pages/casesDetail/index.scss b/src/module1/pages/casesDetail/index.scss new file mode 100644 index 0000000..2d7be6f --- /dev/null +++ b/src/module1/pages/casesDetail/index.scss @@ -0,0 +1,116 @@ +.page { + padding: 24rpx; + .detail-card { + padding-bottom: 16rpx; + position: relative; + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + background: linear-gradient(180deg, #f1feff 0%, #ffffff 35%, #ffffff 100%); + .li-header { + padding: 32rpx 32rpx 0 16rpx; + display: flex; + justify-content: space-between; + &::before { + flex-shrink: 0; + content: ''; + width: 10rpx; + height: 40rpx; + background: #00b4c5; + border-radius: 0rpx 0rpx 0rpx 0rpx; + } + .wrap { + flex: 1; + padding-left: 22rpx; + display: flex; + flex-wrap: wrap; + gap: 24rpx; + .id { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .status { + font-size: 28rpx; + &.status1 { + color: rgba(0, 180, 197, 1); + } + &.status2 { + color: rgba(247, 121, 0, 1); + } + &.status3 { + color: rgba(153, 153, 153, 1); + } + } + } + .fold { + flex-shrink: 0; + display: flex; + align-items: center; + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + .icon { + width: 32rpx; + height: 32rpx; + } + } + } + .li-row { + padding: 16rpx 32rpx; + display: flex; + line-height: 32rpx; + .label { + flex-shrink: 0; + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + width: 5em; + } + .content { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + .line { + color: rgba(205, 205, 205, 1); + } + .new { + margin-right: 12rpx; + display: inline-block; + padding: 0 8rpx; + font-size: 24rpx; + color: #fff; + background: linear-gradient(177deg, #f77900 0%, #ed4f39 88%); + border-radius: 0rpx 8rpx 0rpx 8rpx; + } + .reject { + padding: 0 8rpx; + display: inline-block; + font-size: 24rpx; + color: rgba(153, 153, 153, 1); + line-height: 32rpx; + border: 1px solid rgba(224, 224, 224, 1); + border-radius: 4rpx; + } + } + .tags { + display: flex; + gap: 12rpx; + .tag { + padding: 2rpx 8rpx; + font-size: 22rpx; + color: rgba(0, 180, 197, 1); + line-height: 32rpx; + border: 1rpx solid #bfeff4; + border-radius: 4rpx; + } + } + } + .photos { + padding: 16rpx 32rpx; + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 12rpx; + .photo { + width: 100%; + height: 148rpx; + border-radius: 8rpx; + } + } + } +} diff --git a/src/module1/pages/casesDetail/index.ts b/src/module1/pages/casesDetail/index.ts new file mode 100644 index 0000000..b792ee4 --- /dev/null +++ b/src/module1/pages/casesDetail/index.ts @@ -0,0 +1,6 @@ +const _app = getApp(); + +Page({ + data: {}, + onLoad() {}, +}); diff --git a/src/module1/pages/casesDetail/index.wxml b/src/module1/pages/casesDetail/index.wxml new file mode 100644 index 0000000..db16379 --- /dev/null +++ b/src/module1/pages/casesDetail/index.wxml @@ -0,0 +1,62 @@ + + + + + ID:2024020913049204001 + 新病历 + + + 收起 + + + + + 提交时间 + 2024-02-09 12:04:23 + + + 提交人 + + 王军 + | + 四川大学华西医院 副主任医师 + + + + 标签 + + 心律失常 + 心律失常 + 心律失常 + + + + + + + + 更新时间 + + 2024-02-09 12:04:23 + new + 已驳回 + + + + 反馈人 + + 王军 + | + 四川大学华西医院 副主任医师 + + + + diff --git a/src/module1/pages/changePhone/index.json b/src/module1/pages/changePhone/index.json new file mode 100644 index 0000000..13b6420 --- /dev/null +++ b/src/module1/pages/changePhone/index.json @@ -0,0 +1,5 @@ +{ + "navigationBarTitleText": "更换手机号", + "navigationStyle": "default", + "usingComponents": {} +} diff --git a/src/module1/pages/changePhone/index.scss b/src/module1/pages/changePhone/index.scss new file mode 100644 index 0000000..8f192ec --- /dev/null +++ b/src/module1/pages/changePhone/index.scss @@ -0,0 +1,50 @@ +pgae { +} +.page { + .container { + .form { + margin-top: 32rpx; + padding: 0 64rpx; + .row { + margin-bottom: 40rpx; + display: flex; + .input { + flex: 1; + padding: 24rpx 32rpx; + height: 40rpx; + font-size: 32rpx; + color: #000; + background: #f6f6f6; + border-radius: 96rpx 96rpx 96rpx 96rpx; + } + .place-input { + color: rgba(205, 205, 205, 1); + } + .code { + margin-left: 24rpx; + flex-shrink: 0; + width: 262rpx; + border-radius: 24rpx; + font-size: 32rpx; + color: rgba(0, 180, 197, 1); + display: flex; + align-items: center; + justify-content: center; + background-color: rgba(216, 247, 250, 1); + border-radius: 96rpx; + } + .submit { + margin-top: 24rpx; + width: 622rpx; + height: 88rpx; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 96rpx; + font-size: 32rpx; + color: #ffffff; + text-align: center; + line-height: 88rpx; + } + } + } + } +} diff --git a/src/module1/pages/changePhone/index.ts b/src/module1/pages/changePhone/index.ts new file mode 100644 index 0000000..c57e9e6 --- /dev/null +++ b/src/module1/pages/changePhone/index.ts @@ -0,0 +1,77 @@ +const app = getApp() +let timer = null as null | number + +Page({ + data: { + mobile: '', + code: '', + + codeText: '发送验证码', + }, + onLoad() {}, + getCode() { + if (timer) return + const mobile = this.data.mobile + if (!mobile) { + wx.showToast({ + title: '手机号不能为空', + icon: 'none', + }) + return + } + // 验证手机号 + if (!/^(13\d|14[579]|15[0-3,5-9]|166|17[0135-8]|18\d|19[89])\d{8}$/.test(mobile)) { + wx.showToast({ + title: '手机号格式不正确', + icon: 'none', + }) + return + } + wx.ajax({ + method: 'POST', + url: '?r=zd/login/send-verify-code', + data: { + mobile, + }, + }).then((res) => { + wx.showToast({ + icon: 'none', + title: '验证码已发送~', + }) + let time = 60 + timer = setInterval(() => { + time-- + this.setData({ + codeText: `${time}s后重新发送`, + }) + if (time <= 0) { + clearInterval(timer as number) + timer = null + this.setData({ + codeText: '发送验证码', + }) + } + }, 1000) + }) + }, + handleSubmit() { + const { mobile, code } = this.data + const { registrationSource, registChannel, regBusinessId } = app.globalData + wx.ajax({ + method: 'POST', + url: '?r=zd/account/update-telephone', + data: { + mobile, + code, + registrationSource, + registChannel, + regBusinessId, + }, + }).then((_res) => { + wx.navigateBack() + }) + }, + handleBack() { + wx.navigateBack() + }, +}) diff --git a/src/module1/pages/changePhone/index.wxml b/src/module1/pages/changePhone/index.wxml new file mode 100644 index 0000000..e5a96ef --- /dev/null +++ b/src/module1/pages/changePhone/index.wxml @@ -0,0 +1,16 @@ + + + + + + + + + {{codeText}} + + + 修改手机号 + + + + diff --git a/src/module1/pages/doctorRankList/index.json b/src/module1/pages/doctorRankList/index.json new file mode 100644 index 0000000..e0bc247 --- /dev/null +++ b/src/module1/pages/doctorRankList/index.json @@ -0,0 +1,5 @@ +{ + "navigationBarTitleText": "医院活跃排行榜", + "navigationStyle": "default", + "usingComponents": {} +} diff --git a/src/module1/pages/doctorRankList/index.scss b/src/module1/pages/doctorRankList/index.scss new file mode 100644 index 0000000..73fe4ce --- /dev/null +++ b/src/module1/pages/doctorRankList/index.scss @@ -0,0 +1,63 @@ +page { + background-color: #fff; +} +.page { + padding: 240rpx 0 0; + .container { + padding: 32rpx; + border-radius: 32rpx 32rpx 0 0; + background: #fff linear-gradient(180deg, #f1feff 0%, #ffffff 7%, #ffffff 100%); + border: 2rpx solid #ffffff; + .table { + .thead { + padding: 22rpx 0; + display: flex; + font-size: 28rpx; + color: rgba(0, 180, 197, 1); + background-color: rgba(233, 246, 247, 1); + text-align: center; + border-radius: 8rpx; + .th1 { + width: 338rpx; + } + .th2, + .th3, + .th4, + .th5 { + width: 96rpx; + white-space: nowrap; + } + } + .tbody { + border-bottom: 1rpx solid rgba(224, 224, 224, 0.5); + .tr { + display: flex; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + text-align: center; + padding: 18rpx 0; + line-height: 32rpx; + border-radius: 8rpx; + &:nth-child(even) { + background-color: rgba(248, 248, 248, 1); + } + .td1 { + padding: 12rpx 0; + width: 338rpx; + } + .td2, + .td3, + .td4, + .td5 { + padding: 12rpx 0; + width: 96rpx; + border-left: 1px dashed rgba(224, 224, 224, 1); + } + .td2 { + color: rgba(0, 180, 197, 1); + } + } + } + } + } +} diff --git a/src/module1/pages/doctorRankList/index.ts b/src/module1/pages/doctorRankList/index.ts new file mode 100644 index 0000000..b792ee4 --- /dev/null +++ b/src/module1/pages/doctorRankList/index.ts @@ -0,0 +1,6 @@ +const _app = getApp(); + +Page({ + data: {}, + onLoad() {}, +}); diff --git a/src/module1/pages/doctorRankList/index.wxml b/src/module1/pages/doctorRankList/index.wxml new file mode 100644 index 0000000..02669f3 --- /dev/null +++ b/src/module1/pages/doctorRankList/index.wxml @@ -0,0 +1,25 @@ + + + + + 医院 + 医生总数 + S1 + S2 + S3 + + + + 1 中山大学附属医院 + 888 + 888 + 888 + 888 + + + + + diff --git a/src/module1/pages/entryCases/index.json b/src/module1/pages/entryCases/index.json new file mode 100644 index 0000000..836ab88 --- /dev/null +++ b/src/module1/pages/entryCases/index.json @@ -0,0 +1,10 @@ +{ + "navigationBarTitleText": "录入新病历", + "navigationStyle": "default", + "usingComponents": { + "uploadFile": "/components/uploadFile/index", + "van-icon": "@vant/weapp/icon/index", + "customRecord": "/components/customRecord/index", + "van-popup": "@vant/weapp/popup/index" + } +} diff --git a/src/module1/pages/entryCases/index.scss b/src/module1/pages/entryCases/index.scss new file mode 100644 index 0000000..d29b43b --- /dev/null +++ b/src/module1/pages/entryCases/index.scss @@ -0,0 +1,363 @@ +page { + background-color: rgba(246, 246, 246, 1); +} +.page { + padding: 24rpx 32rpx 200rpx; + .card { + margin-bottom: 24rpx; + padding: 32rpx; + background-color: #fff; + border-radius: 16rpx; + .card-title { + font-size: 32rpx; + color: rgba(20, 21, 21, 1); + line-height: 56rpx; + .limit { + color: rgba(153, 153, 153, 1); + } + .message-select { + float: right; + padding: 8rpx 24rpx; + font-size: 28rpx; + color: rgba(255, 255, 255, 1); + line-height: 40rpx; + background: #01b4c5; + border-radius: 60rpx 60rpx 60rpx 60rpx; + } + &.required { + &::before { + display: inline; + content: '*'; + color: rgba(255, 87, 51, 1); + } + } + } + .image-files { + margin-top: 32rpx; + display: flex; + gap: 14rpx; + .upload-file { + width: 144rpx; + height: 144rpx; + background: #f6f6f6; + border-radius: 8rpx 8rpx 8rpx 8rpx; + display: flex; + align-items: center; + justify-content: center; + .add { + color: #cdcdcd; + font-size: 30px; + } + } + .photo { + position: relative; + width: 144rpx; + height: 144rpx; + border-radius: 8rpx 8rpx 8rpx 8rpx; + .p-img { + width: 100%; + height: 100%; + border-radius: inherit; + } + .del { + position: absolute; + top: 0; + right: 0; + z-index: 1; + color: #fff; + width: 32rpx; + height: 32rpx; + text-align: center; + line-height: 32rpx; + font-size: 20rpx; + border-radius: 8rpx; + background-color: rgba(0, 0, 0, 0.3); + } + .repeat { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + border-radius: inherit; + background-color: rgba(0, 0, 0, 0.3); + .icon { + width: 36rpx; + height: 36rpx; + } + .r-title { + margin-top: 8rpx; + font-size: 20rpx; + color: rgba(237, 79, 57, 1); + } + } + } + } + .remark { + margin-top: 32rpx; + padding: 32rpx; + border-radius: 16rpx; + background-color: rgba(246, 246, 246, 1); + .textarea { + font-size: 28rpx; + line-height: 32rpx; + min-height: 200rpx; + color: #000; + } + .limit { + font-size: 28rpx; + color: rgba(205, 205, 205, 1); + line-height: 32rpx; + text-align: right; + } + } + .record { + margin: 24rpx -30rpx -30rpx; + height: 198rpx; + border-radius: 16rpx; + background: linear-gradient(to bottom, #fff 0%, #fff 34%, #f6f6f6 34%, #f6f6f6 100%); + .record-btn { + display: flex; + justify-content: center; + } + .r-title { + margin-top: 12rpx; + font-size: 28rpx; + color: rgba(133, 133, 133, 1); + text-align: center; + } + } + .none-file { + margin-top: 24rpx; + padding: 26rpx; + border-radius: 16rpx; + background-color: rgba(246, 246, 246, 1); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + .nf-icon { + width: 96rpx; + height: 66rpx; + } + .nf-title { + margin-top: 14rpx; + font-size: 24rpx; + color: rgba(205, 205, 205, 1); + } + } + .file-list { + margin-top: 8rpx; + .fl-row { + margin-top: 24rpx; + display: flex; + align-content: inherit; + justify-content: space-between; + .wrap { + flex: 1; + padding: 20rpx 24rpx; + border-radius: 16rpx; + background-color: rgba(246, 246, 246, 1); + display: flex; + align-items: center; + .icon { + width: 56rpx; + height: 56rpx; + } + .name { + margin-left: 30rpx; + font-size: 32rpx; + color: rgba(128, 128, 128, 1); + } + } + .option { + display: flex; + align-items: center; + .icon { + margin-left: 16rpx; + width: 36rpx; + height: 36rpx; + } + } + } + } + } + .tags { + margin-top: 24rpx; + padding: 22rpx 32rpx; + border-radius: 16rpx; + background-color: #fff; + display: flex; + .label { + padding-top: 8rpx; + flex-shrink: 0; + width: 3em; + font-size: 32rpx; + color: rgba(20, 21, 21, 1); + } + .wrap { + flex: 1; + .tag-wrap { + display: flex; + gap: 16rpx; + flex-wrap: wrap; + .tag { + padding: 10rpx 32rpx; + font-size: 32rpx; + line-height: 44rpx; + color: rgba(133, 133, 133, 1); + background: #f6f6f6; + border-radius: 84rpx 84rpx 84rpx 84rpx; + &.active { + color: #fff; + background-color: rgba(1, 180, 197, 1); + } + } + } + .sub-tag-wrap { + margin-top: 32rpx; + padding: 32rpx; + border-radius: 16rpx; + background-color: rgba(246, 250, 250, 1); + display: flex; + flex-wrap: wrap; + gap: 16rpx; + .sub-tag { + padding: 6rpx 32rpx; + border-radius: 8rpx; + font-size: 32rpx; + color: rgba(133, 133, 133, 1); + line-height: 44rpx; + border: 1px solid rgba(255, 255, 255, 1); + background-color: rgba(255, 255, 255, 1); + &.active { + border-color: rgba(1, 180, 197, 1); + color: rgba(1, 180, 197, 1); + } + } + } + } + } + .footer { + position: fixed; + bottom: 0; + left: 0; + padding: 32rpx 32rpx calc(env(safe-area-inset-bottom) + 32rpx); + width: 100%; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: space-between; + background-color: #fff; + box-shadow: 0 -10rpx 20rpx rgba(0, 0, 0, 0.1); + .cancel { + width: 332rpx; + height: 84rpx; + text-align: center; + line-height: 88rpx; + font-size: 32rpx; + color: rgba(1, 180, 197, 1); + border-radius: 96rpx 96rpx 96rpx 96rpx; + border: 1rpx solid #01b4c5; + } + .submit { + width: 330rpx; + height: 88rpx; + text-align: center; + line-height: 88rpx; + font-size: 32rpx; + color: #fff; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 96rpx; + } + } +} + +.popup1 { + padding: 64rpx 52rpx 34rpx; + width: 580rpx; + box-sizing: border-box; + .title { + font-size: 36rpx; + color: rgba(29, 33, 41, 1); + font-weight: bold; + line-height: 56rpx; + text-align: center; + } + .btn1 { + margin-top: 24rpx; + padding: 14rpx; + font-size: 32rpx; + color: #fff; + line-height: 44rpx; + text-align: center; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 60rpx 60rpx 60rpx 60rpx; + } + .btn2 { + margin-top: 24rpx; + padding: 12rpx 14rpx; + font-size: 32rpx; + color: rgba(1, 180, 197, 1); + line-height: 44rpx; + text-align: center; + border: 1px solid rgba(1, 180, 197, 1); + border-radius: 60rpx 60rpx 60rpx 60rpx; + } + .public { + margin-top: 32rpx; + .radio { + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + .wx-radio-input { + flex-shrink: 0; + align-self: self-start; + transform: scale(0.7); + } + } + } +} + +.popup2 { + padding: 64rpx 52rpx 34rpx; + width: 580rpx; + box-sizing: border-box; + .title { + font-size: 36rpx; + color: rgba(29, 33, 41, 1); + font-weight: bold; + line-height: 56rpx; + text-align: center; + } + .content { + margin-top: 12rpx; + font-size: 32rpx; + line-height: 48rpx; + color: rgba(78, 89, 105, 1); + .link { + color: rgba(1, 180, 197, 1); + } + } + .btn { + margin-top: 24rpx; + padding: 14rpx; + font-size: 32rpx; + color: #fff; + line-height: 44rpx; + text-align: center; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 60rpx 60rpx 60rpx 60rpx; + } + .cancel { + margin-top: 24rpx; + padding: 14rpx; + font-size: 32rpx; + color: rgba(205, 205, 205, 1); + line-height: 44rpx; + text-align: center; + } +} diff --git a/src/module1/pages/entryCases/index.ts b/src/module1/pages/entryCases/index.ts new file mode 100644 index 0000000..683ab34 --- /dev/null +++ b/src/module1/pages/entryCases/index.ts @@ -0,0 +1,15 @@ +const _app = getApp() + +Page({ + data: { + show1: false, + show2: false, + }, + onLoad() {}, + + handleSubmit(){ + wx.navigateTo({ + url:"/module1/pages/entryCasesResult/index" + }) + } +}) diff --git a/src/module1/pages/entryCases/index.wxml b/src/module1/pages/entryCases/index.wxml new file mode 100644 index 0000000..237299d --- /dev/null +++ b/src/module1/pages/entryCases/index.wxml @@ -0,0 +1,111 @@ + + + + 上传病历图片 + (0/9) + + + + + + + + + + 重复图片 + + + + + + + + + + + 病历备注 + + + 0/3000 + + + + 您也可以长按录入语音 + + + + + 病历相关文件 + 从聊天记录选择文件 + + + + 还没有文件哦! + + + + + + 基因检测报告.pdf + + + + + + + + + + + 标签 + + + 消化科 + 消化科 + + + 心衰 + 心衰 + 心衰 + 心衰 + + + + + 存为草稿 + 保存并提交 + + + + + + 确认提交您的反馈信息 + 直接提交我的反馈信息 + 提交并邀约质控医生 + + 病例公开(选择公开后,本科室医生均查看病例) + + + + + + + 您的病例没有进行涂抹 + + + 请确认上传的病例 已不包含患者的隐私信息 + + 确认继续提交 + 返回 + + diff --git a/src/module1/pages/entryCasesResult/index.json b/src/module1/pages/entryCasesResult/index.json new file mode 100644 index 0000000..0c05032 --- /dev/null +++ b/src/module1/pages/entryCasesResult/index.json @@ -0,0 +1,5 @@ +{ + "navigationBarTitleText": "录入新病例", + "navigationStyle": "default", + "usingComponents": {} +} diff --git a/src/module1/pages/entryCasesResult/index.scss b/src/module1/pages/entryCasesResult/index.scss new file mode 100644 index 0000000..0a99a95 --- /dev/null +++ b/src/module1/pages/entryCasesResult/index.scss @@ -0,0 +1,50 @@ +.page { + padding: 60rpx 34rpx; + .badge { + display: block; + margin: 0 auto; + width: 200rpx; + height: 200rpx; + } + .desc { + margin-top: 16rpx; + font-size: 32rpx; + color: rgba(20, 21, 21, 1); + text-align: center; + } + .btn1 { + margin: 86rpx 124rpx 0; + padding: 22rpx; + font-size: 32rpx; + color: #fff; + line-height: 44rpx; + text-align: center; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 60rpx 60rpx 60rpx 60rpx; + } + .btn2 { + margin: 32rpx 124rpx 0; + padding: 20rpx 14rpx; + font-size: 32rpx; + color: rgba(1, 180, 197, 1); + line-height: 44rpx; + text-align: center; + border: 1px solid rgba(1, 180, 197, 1); + border-radius: 60rpx 60rpx 60rpx 60rpx; + } + .code { + margin: 90rpx auto 0; + padding: 20rpx; + display: block; + border: 4rpx solid rgba(1, 180, 197, 0.18); + width: 296rpx; + height: 296rpx; + border-radius: 16rpx; + } + .tip{ + margin-top: 32rpx; + text-align: center; + font-size: 32rpx; + color: rgba(153, 153, 153, 1); + } +} diff --git a/src/module1/pages/entryCasesResult/index.ts b/src/module1/pages/entryCasesResult/index.ts new file mode 100644 index 0000000..b792ee4 --- /dev/null +++ b/src/module1/pages/entryCasesResult/index.ts @@ -0,0 +1,6 @@ +const _app = getApp(); + +Page({ + data: {}, + onLoad() {}, +}); diff --git a/src/module1/pages/entryCasesResult/index.wxml b/src/module1/pages/entryCasesResult/index.wxml new file mode 100644 index 0000000..841a95c --- /dev/null +++ b/src/module1/pages/entryCasesResult/index.wxml @@ -0,0 +1,13 @@ + + + 病历提交后医生将收到消息提醒 + 查看我提交的病历 + 继续录入新的病历 + + 关注公众号接收病例反馈消息 + diff --git a/src/module1/pages/org3/index.json b/src/module1/pages/org3/index.json new file mode 100644 index 0000000..60837ea --- /dev/null +++ b/src/module1/pages/org3/index.json @@ -0,0 +1,7 @@ +{ + "navigationBarTitleText": "我的组织架构", + "navigationStyle": "default", + "usingComponents": { + "doctorAvatar": "/components/doctorAvatar/index" + } +} diff --git a/src/module1/pages/org3/index.scss b/src/module1/pages/org3/index.scss new file mode 100644 index 0000000..4dfaaa4 --- /dev/null +++ b/src/module1/pages/org3/index.scss @@ -0,0 +1,314 @@ +page { + background-color: rgba(246, 246, 246, 1); +} +.page { + padding-bottom: 80rpx; + .header { + padding: 32rpx; + border-radius: 0 0 32rpx 32rpx; + background-color: #fff; + .banner { + padding: 32rpx 0; + display: flex; + justify-content: space-between; + align-items: center; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 1rpx solid #ffffff; + .item { + flex: 1; + text-align: center; + .name { + font-size: 28rpx; + color: rgba(255, 255, 255, 1); + line-height: 1; + } + .num { + margin-top: 24rpx; + font-size: 56rpx; + color: rgba(255, 255, 255, 1); + line-height: 1; + } + &:nth-of-type(2) { + border-right: 1rpx dashed rgba(255, 255, 255, 0.5); + border-left: 1rpx dashed rgba(255, 255, 255, 0.5); + } + } + } + .operate { + margin-top: 32rpx; + display: flex; + gap: 24rpx; + align-items: center; + justify-content: space-between; + .search { + flex: 1; + display: flex; + gap: 12rpx; + align-items: center; + padding: 16rpx 36rpx; + border-radius: 96rpx; + background-color: rgba(246, 246, 246, 1); + .icon { + flex-shrink: 0; + width: 32rpx; + height: 32rpx; + } + .input { + font-size: 28rpx; + color: #000; + } + .place-input { + color: rgba(205, 205, 205, 1); + } + } + .invite { + flex-shrink: 0; + padding: 14rpx 24rpx; + font-size: 30rpx; + line-height: 44rpx; + color: rgba(0, 180, 197, 1); + border-radius: 72rpx 72rpx 72rpx 72rpx; + border: 1rpx solid #00b4c5; + } + } + } + + .doctor { + display: flex; + gap: 24rpx; + &:last-of-type { + margin-bottom: 0; + } + .avatar-wrap { + width: 112rpx; + flex-shrink: 0; + display: flex; + flex-direction: column; + align-items: center; + .avatar { + flex-shrink: 0; + position: relative; + width: 112rpx; + height: 112rpx; + } + } + .wrap { + padding-top: 8rpx; + .w-header { + display: flex; + align-items: baseline; + gap: 16rpx; + line-height: 1; + .wh-wrap { + flex: 1; + display: flex; + align-items: baseline; + gap: 16rpx; + .name { + font-size: 36rpx; + color: rgba(20, 21, 21, 1); + font-weight: bold; + } + .label { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .line { + width: 1px; + height: 24rpx; + background-color: rgba(205, 205, 205, 1); + } + } + .fold { + flex-shrink: 0; + display: flex; + align-items: center; + font-size: 28rpx; + gap: 8rpx; + color: rgba(153, 153, 153, 1); + .f-icon { + width: 28rpx; + height: 28rpx; + } + } + } + .w-container { + margin-top: 16rpx; + .hostipal { + margin-right: 12rpx; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .tag { + margin-right: 12rpx; + display: inline-block; + padding: 0 8rpx; + border-radius: 4rpx; + font-size: 24rpx; + color: rgba(255, 255, 255, 1); + line-height: 32rpx; + background-color: rgba(0, 180, 197, 1); + } + .site { + display: inline-block; + padding: 0 8rpx; + font-size: 24rpx; + color: rgba(148, 87, 30, 1); + line-height: 32rpx; + border-radius: 4rpx; + background-color: rgba(250, 229, 206, 1); + } + } + .w-footer { + margin-top: 16rpx; + display: flex; + gap: 12rpx; + flex-wrap: wrap; + .wf-label { + flex-shrink: 0; + width: 48rpx; + height: 32rpx; + } + .wf-tag { + flex-shrink: 0; + padding: 0 8rpx; + font-size: 22rpx; + color: rgba(0, 180, 197, 1); + line-height: 32rpx; + border: 1rpx solid rgba(191, 239, 244, 1); + } + } + } + } + + .me { + margin: 24rpx 24rpx 0; + .doctor { + padding: 24rpx; + background: linear-gradient(180deg, #e5f5f7 0%, #ffffff 50%); + box-shadow: 0rpx 4rpx 20rpx 0rpx rgba(0, 0, 0, 0.1); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + } + } + + .container { + margin: 24rpx 24rpx 0; + border-radius: 16rpx; + background-color: #fff; + .level-two { + display: flex; + .aside { + padding-left: 60rpx; + display: flex; + flex-direction: column; + .vertical { + flex-shrink: 0; + width: 1px; + height: 80rpx; + background-color: rgba(0, 180, 197, 1); + } + .across { + flex-shrink: 0; + width: 42rpx; + height: 1px; + background-color: rgba(0, 180, 197, 1); + } + } + .doctor { + padding-top: 24rpx; + padding-right: 24rpx; + .avatar-wrap { + .num { + flex-shrink: 0; + margin-top: 8rpx; + padding: 0 20rpx; + font-size: 22rpx; + color: rgba(255, 255, 255, 1); + border-radius: 64rpx; + background-color: rgba(0, 180, 197, 1); + } + .line { + flex: 1; + width: 1px; + background-color: rgba(0, 180, 197, 1); + } + } + .wrap { + padding-bottom: 24rpx; + } + } + } + .level-three { + display: flex; + .aside { + margin-left: 60rpx; + padding-left: 42rpx; + display: flex; + flex-direction: column; + .vertical { + flex-shrink: 0; + margin-left: 56rpx; + width: 1px; + height: 80rpx; + background-color: rgba(0, 180, 197, 1); + } + .across { + flex-shrink: 0; + margin-left: 56rpx; + width: 42rpx; + height: 1px; + background-color: rgba(0, 180, 197, 1); + } + .vertical-grow { + flex: 1; + margin-left: 56rpx; + width: 1px; + background-color: rgba(0, 180, 197, 1); + } + } + .doctor { + padding: 24rpx 24rpx 24rpx 0; + } + } + .level-three-only { + display: flex; + .aside { + padding-left: 60rpx; + display: flex; + flex-direction: column; + .vertical { + flex-shrink: 0; + width: 1px; + height: 80rpx; + background-color: rgba(0, 180, 197, 1); + } + .across { + flex-shrink: 0; + width: 144rpx; + height: 1px; + background-color: rgba(0, 180, 197, 1); + } + } + .doctor { + padding: 24rpx 24rpx 24rpx 0; + } + } + } + + .empty-wrap { + .empty { + margin: 174rpx auto 0; + display: block; + width: 356rpx; + height: 280rpx; + } + .e-title { + margin-top: -80rpx; + font-size: 32rpx; + color: rgba(153, 153, 153, 1); + text-align: center; + } + } +} diff --git a/src/module1/pages/org3/index.ts b/src/module1/pages/org3/index.ts new file mode 100644 index 0000000..b792ee4 --- /dev/null +++ b/src/module1/pages/org3/index.ts @@ -0,0 +1,6 @@ +const _app = getApp(); + +Page({ + data: {}, + onLoad() {}, +}); diff --git a/src/module1/pages/org3/index.wxml b/src/module1/pages/org3/index.wxml new file mode 100644 index 0000000..b2a8ffb --- /dev/null +++ b/src/module1/pages/org3/index.wxml @@ -0,0 +1,229 @@ + + + + + + + + + 邀约新医生 + + + + + + + + + + + + 徐萌 + 主任医师 + + 心内科 + + + 收起 + + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + + + + + + + + 2人 + + + + + + 徐萌 + 主任医师 + + 心内科 + + + 收起 + + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + + + + + + + + + + + 徐萌 + 主任医师 + + 心内科 + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + + + + + + + + + + + 徐萌 + 主任医师 + + 心内科 + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + + + + + + + + + + + + 徐萌 + 主任医师 + + 心内科 + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + + 没有找到您搜索的医院哦! + + diff --git a/src/module1/pages/org4/index.json b/src/module1/pages/org4/index.json new file mode 100644 index 0000000..0b4abea --- /dev/null +++ b/src/module1/pages/org4/index.json @@ -0,0 +1,8 @@ +{ + "navigationBarTitleText": "我的组织架构", + "navigationStyle": "default", + "usingComponents": { + "doctorAvatar": "/components/doctorAvatar/index", + "van-icon": "@vant/weapp/icon/index" + } +} diff --git a/src/module1/pages/org4/index.scss b/src/module1/pages/org4/index.scss new file mode 100644 index 0000000..6bfa6f6 --- /dev/null +++ b/src/module1/pages/org4/index.scss @@ -0,0 +1,333 @@ +page { + background-color: rgba(246, 246, 246, 1); +} +.page { + padding-bottom: 80rpx; + .header { + padding: 32rpx; + border-radius: 0 0 32rpx 32rpx; + background-color: #fff; + .select { + display: flex; + align-content: inherit; + gap: 14rpx; + .label { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .picker { + .picker-content { + padding: 4rpx 24rpx; + font-size: 28rpx; + color: rgba(133, 133, 133, 1); + line-height: 39rpx; + border-radius: 98rpx; + background-color: rgba(246, 246, 246, 1); + } + } + } + .banner { + margin-top: 24rpx; + padding: 32rpx 0; + display: flex; + justify-content: space-between; + align-items: center; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 1rpx solid #ffffff; + .item { + flex: 1; + text-align: center; + .name { + font-size: 28rpx; + color: rgba(255, 255, 255, 1); + line-height: 1; + } + .num { + margin-top: 24rpx; + font-size: 56rpx; + color: rgba(255, 255, 255, 1); + line-height: 1; + } + &:nth-of-type(1) { + border-right: 1rpx dashed rgba(255, 255, 255, 0.5); + } + } + } + .operate { + margin-top: 32rpx; + display: flex; + gap: 24rpx; + align-items: center; + justify-content: space-between; + .search { + flex: 1; + display: flex; + gap: 12rpx; + align-items: center; + padding: 16rpx 36rpx; + border-radius: 96rpx; + background-color: rgba(246, 246, 246, 1); + .icon { + flex-shrink: 0; + width: 32rpx; + height: 32rpx; + } + .input { + font-size: 28rpx; + color: #000; + } + .place-input { + color: rgba(205, 205, 205, 1); + } + } + .invite { + flex-shrink: 0; + padding: 14rpx 24rpx; + font-size: 30rpx; + line-height: 44rpx; + color: rgba(0, 180, 197, 1); + border-radius: 72rpx 72rpx 72rpx 72rpx; + border: 1rpx solid #00b4c5; + } + } + } + + .doctor { + display: flex; + gap: 24rpx; + &:last-of-type { + margin-bottom: 0; + } + .avatar-wrap { + width: 112rpx; + flex-shrink: 0; + display: flex; + flex-direction: column; + align-items: center; + .avatar { + flex-shrink: 0; + position: relative; + width: 112rpx; + height: 112rpx; + } + } + .wrap { + padding-top: 8rpx; + .w-header { + display: flex; + align-items: baseline; + gap: 16rpx; + line-height: 1; + .wh-wrap { + flex: 1; + display: flex; + align-items: baseline; + gap: 16rpx; + .name { + font-size: 36rpx; + color: rgba(20, 21, 21, 1); + font-weight: bold; + } + .label { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .line { + width: 1px; + height: 24rpx; + background-color: rgba(205, 205, 205, 1); + } + } + .fold { + flex-shrink: 0; + display: flex; + align-items: center; + font-size: 28rpx; + gap: 8rpx; + color: rgba(153, 153, 153, 1); + .f-icon { + width: 28rpx; + height: 28rpx; + } + } + } + .w-container { + margin-top: 16rpx; + .hostipal { + margin-right: 12rpx; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .tag { + margin-right: 12rpx; + display: inline-block; + padding: 0 8rpx; + border-radius: 4rpx; + font-size: 24rpx; + color: rgba(255, 255, 255, 1); + line-height: 32rpx; + background-color: rgba(0, 180, 197, 1); + } + .site { + display: inline-block; + padding: 0 8rpx; + font-size: 24rpx; + color: rgba(148, 87, 30, 1); + line-height: 32rpx; + border-radius: 4rpx; + background-color: rgba(250, 229, 206, 1); + } + } + .w-footer { + margin-top: 16rpx; + display: flex; + gap: 12rpx; + flex-wrap: wrap; + .wf-label { + flex-shrink: 0; + width: 48rpx; + height: 32rpx; + } + .wf-tag { + flex-shrink: 0; + padding: 0 8rpx; + font-size: 22rpx; + color: rgba(0, 180, 197, 1); + line-height: 32rpx; + border: 1rpx solid rgba(191, 239, 244, 1); + } + } + } + } + + .me { + margin: 24rpx 24rpx 0; + .doctor { + padding: 24rpx; + background: linear-gradient(180deg, #e5f5f7 0%, #ffffff 50%); + box-shadow: 0rpx 4rpx 20rpx 0rpx rgba(0, 0, 0, 0.1); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + } + } + + .container { + margin: 24rpx 24rpx 0; + border-radius: 16rpx; + background-color: #fff; + .level-two { + display: flex; + .aside { + padding-left: 60rpx; + display: flex; + flex-direction: column; + .vertical { + flex-shrink: 0; + width: 1px; + height: 80rpx; + background-color: rgba(0, 180, 197, 1); + } + .across { + flex-shrink: 0; + width: 42rpx; + height: 1px; + background-color: rgba(0, 180, 197, 1); + } + } + .doctor { + padding-top: 24rpx; + padding-right: 24rpx; + .avatar-wrap { + .num { + flex-shrink: 0; + margin-top: 8rpx; + padding: 0 20rpx; + font-size: 22rpx; + color: rgba(255, 255, 255, 1); + border-radius: 64rpx; + background-color: rgba(0, 180, 197, 1); + } + .line { + flex: 1; + width: 1px; + background-color: rgba(0, 180, 197, 1); + } + } + .wrap { + padding-bottom: 24rpx; + } + } + } + .level-three { + display: flex; + .aside { + margin-left: 60rpx; + padding-left: 42rpx; + display: flex; + flex-direction: column; + .vertical { + flex-shrink: 0; + margin-left: 56rpx; + width: 1px; + height: 80rpx; + background-color: rgba(0, 180, 197, 1); + } + .across { + flex-shrink: 0; + margin-left: 56rpx; + width: 42rpx; + height: 1px; + background-color: rgba(0, 180, 197, 1); + } + .vertical-grow { + flex: 1; + margin-left: 56rpx; + width: 1px; + background-color: rgba(0, 180, 197, 1); + } + } + .doctor { + padding: 24rpx 24rpx 24rpx 0; + } + } + .level-three-only { + display: flex; + .aside { + padding-left: 60rpx; + display: flex; + flex-direction: column; + .vertical { + flex-shrink: 0; + width: 1px; + height: 80rpx; + background-color: rgba(0, 180, 197, 1); + } + .across { + flex-shrink: 0; + width: 144rpx; + height: 1px; + background-color: rgba(0, 180, 197, 1); + } + } + .doctor { + padding: 24rpx 24rpx 24rpx 0; + } + } + } + + .empty-wrap { + .empty { + margin: 174rpx auto 0; + display: block; + width: 356rpx; + height: 280rpx; + } + .e-title { + margin-top: -80rpx; + font-size: 32rpx; + color: rgba(153, 153, 153, 1); + text-align: center; + } + } +} diff --git a/src/module1/pages/org4/index.ts b/src/module1/pages/org4/index.ts new file mode 100644 index 0000000..b792ee4 --- /dev/null +++ b/src/module1/pages/org4/index.ts @@ -0,0 +1,6 @@ +const _app = getApp(); + +Page({ + data: {}, + onLoad() {}, +}); diff --git a/src/module1/pages/org4/index.wxml b/src/module1/pages/org4/index.wxml new file mode 100644 index 0000000..d31bbe6 --- /dev/null +++ b/src/module1/pages/org4/index.wxml @@ -0,0 +1,279 @@ + + + + 所在科室: + + + 心血管内科 + + + + + + + + + + + 邀约新医生 + + + + + + + + + + + + 徐萌 + 主任医师 + + 心内科 + + + 全部收起 + + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + + + + + + 徐萌 + 主任医师 + + 心内科 + + + 收起 + + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + + + + + + + + 2人 + + + + + + 徐萌 + 主任医师 + + 心内科 + + + 收起 + + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + + + + + + + + + + + 徐萌 + 主任医师 + + 心内科 + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + + + + + + + + + + + 徐萌 + 主任医师 + + 心内科 + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + + + + + + + + + + + + 徐萌 + 主任医师 + + 心内科 + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + + + 没有找到您搜索的医院哦! + + diff --git a/src/module1/pages/setDoctor/index.wxml b/src/module1/pages/setDoctor/index.wxml index ad8c707..a8da6bf 100644 --- a/src/module1/pages/setDoctor/index.wxml +++ b/src/module1/pages/setDoctor/index.wxml @@ -3,7 +3,7 @@ 您将为 王欢医生 - 指派核心医生,帮助TA一起反馈病例 + 指派核心医生,帮助TA一起反馈病历 diff --git a/src/module1/pages/setInfo/index.json b/src/module1/pages/setInfo/index.json index 266e0cd..f87c20e 100644 --- a/src/module1/pages/setInfo/index.json +++ b/src/module1/pages/setInfo/index.json @@ -2,6 +2,6 @@ "navigationBarTitleText": "医生认证", "navigationStyle": "default", "usingComponents": { - "upload": "/components/upload/index" + "uploadFile": "/components/uploadFile/index" } } diff --git a/src/module1/pages/setInfo/index.wxml b/src/module1/pages/setInfo/index.wxml index 4a273e6..b82d3be 100644 --- a/src/module1/pages/setInfo/index.wxml +++ b/src/module1/pages/setInfo/index.wxml @@ -37,15 +37,15 @@ 查看示例 - + - - + + - - + + - + @@ -55,9 +55,9 @@ 您的头像 - + - + diff --git a/src/module1/pages/userInfo/index.json b/src/module1/pages/userInfo/index.json new file mode 100644 index 0000000..a3497e5 --- /dev/null +++ b/src/module1/pages/userInfo/index.json @@ -0,0 +1,9 @@ +{ + "navigationBarTitleText": "个人信息", + "navigationStyle": "default", + "usingComponents": { + "uploadFile": "/components/uploadFile/index", + "van-icon": "@vant/weapp/icon/index", + "van-popup": "@vant/weapp/popup/index" + } +} diff --git a/src/module1/pages/userInfo/index.scss b/src/module1/pages/userInfo/index.scss new file mode 100644 index 0000000..3e1d7df --- /dev/null +++ b/src/module1/pages/userInfo/index.scss @@ -0,0 +1,128 @@ +page { + background-color: rgba(246, 246, 246, 1); +} +.page { + padding: 48rpx 32rpx 0; + background-color: #fff; + .upload { + margin: 0 auto 0; + display: block; + width: 136rpx; + height: 136rpx; + .avatar { + width: 136rpx; + height: 136rpx; + border-radius: 50%; + } + .edit { + position: absolute; + bottom: 0; + right: 0; + width: 52rpx; + height: 52rpx; + border-radius: 50%; + background-color: #fff; + display: flex; + align-items: center; + justify-content: center; + .icon { + width: 32rpx; + height: 32rpx; + } + } + } + .row { + padding: 32rpx 0; + display: flex; + align-items: center; + justify-content: space-between; + .label { + font-size: 32rpx; + color: rgba(133, 133, 133, 1); + } + .content { + flex: 1; + text-align: right; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .picker { + flex: 1; + .picker-content { + text-align: right; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + } + } +} + +.btn { + margin: 32rpx 32rpx 0; + width: 686rpx; + height: 88rpx; + border-radius: 84rpx 84rpx 84rpx 84rpx; + border: 1rpx solid #00b4c5; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: rgba(0, 180, 197, 1); + &:first-of-type { + margin-top: 48rpx; + } +} + +.popup-brief { + padding: 32rpx 30rpx 84rpx; + .title { + display: flex; + justify-content: center; + font-size: 36rpx; + color: rgba(40, 48, 49, 1); + font-weight: bold; + } + .textarea { + padding: 30rpx; + margin-top: 32rpx; + width: 100%; + height: 216rpx; + box-sizing: border-box; + background: #f7f8f9; + border-radius: 24rpx 24rpx 24rpx 24rpx; + border: 2rpx solid #f8f9f9; + font-size: 32rx; + } + .tags { + margin-top: 32rpx; + display: flex; + flex-wrap: wrap; + gap: 20rpx; + .tag { + padding: 6rpx 44rpx; + font-size: 32rpx; + color: rgba(133, 133, 133, 1); + line-height: 44rpx; + background-color: #fff; + border: 1px solid rgba(133, 133, 133, 1); + border-radius: 8rpx; + &.active { + background-color: #fff; + border-color: rgba(1, 180, 197, 1); + color: rgba(1, 180, 197, 1); + } + } + } + .submit { + margin-top: 32rpx; + height: 84rpx; + display: flex; + justify-content: center; + align-items: center; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + font-size: 36rpx; + color: #fff; + border-radius: 64rpx 64rpx 64rpx 64rpx; + } +} diff --git a/src/module1/pages/userInfo/index.ts b/src/module1/pages/userInfo/index.ts new file mode 100644 index 0000000..c2ba94a --- /dev/null +++ b/src/module1/pages/userInfo/index.ts @@ -0,0 +1,19 @@ +const _app = getApp() + +Page({ + data: { + popupBriefShow: false, + popupSpecialtyShow: false, + }, + onLoad() {}, + changePhone() { + wx.navigateTo({ + url: '/module1/pages/changePhone/index', + }) + }, + handleBrief() { + this.setData({ + popupBriefShow: true, + }) + }, +}) diff --git a/src/module1/pages/userInfo/index.wxml b/src/module1/pages/userInfo/index.wxml new file mode 100644 index 0000000..75c2e89 --- /dev/null +++ b/src/module1/pages/userInfo/index.wxml @@ -0,0 +1,87 @@ + + + + + + + + + 姓名 + 刘大庆 + + + 电话 + 139****6754 + + + 医院 + 北京天坛医院 + + + 科室 + + + 消化科 + + + + + + 专长 + + 高血压;心脏病 + + + + + 医生简介 + + 医生简介信息 + + + + +退出登录 +更换手机号 + + + + 医生简介 + + 保存 + + + + + + 医生专长 + + 瓣膜病 + 心律失常 + 心衰 + 心肌病 + + 保存 + + diff --git a/src/pages/cases/index.json b/src/pages/cases/index.json index a97367d..1450d53 100644 --- a/src/pages/cases/index.json +++ b/src/pages/cases/index.json @@ -1,3 +1,8 @@ { - "usingComponents": {} + "navigationBarTitleText": "病历", + "navigationStyle": "default", + "usingComponents": { + "van-icon": "@vant/weapp/icon/index", + "van-popup": "@vant/weapp/popup/index" + } } diff --git a/src/pages/cases/index.scss b/src/pages/cases/index.scss index e69de29..504f27c 100644 --- a/src/pages/cases/index.scss +++ b/src/pages/cases/index.scss @@ -0,0 +1,464 @@ +page { + background-color: rgba(246, 246, 246, 1); +} +.page { + padding-bottom: 200rpx; + .header { + background-color: #fff; + border-radius: 0 0 32rpx 32rpx; + .navbar { + display: flex; + align-items: center; + justify-content: space-between; + .nav { + padding: 20rpx; + flex: 1; + text-align: center; + font-size: 32rpx; + color: rgba(133, 133, 133, 1); + line-height: 44rpx; + &.active { + position: relative; + color: rgba(0, 180, 197, 1); + &::after { + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%); + width: 48rpx; + height: 8rpx; + border-radius: 8rpx 8rpx 0 0; + content: ''; + background-color: rgba(0, 180, 197, 1); + } + } + } + } + .search { + margin: 32rpx 32rpx 0; + padding: 16rpx 32rpx; + display: flex; + align-items: center; + border-radius: 122rpx; + background-color: rgba(246, 246, 246, 1); + .icon { + margin-right: 14rpx; + width: 32rpx; + height: 32rpx; + } + .input { + flex: 1; + font-size: 28rpx; + color: #000; + } + .place-input { + color: rgba(205, 205, 205, 1); + } + } + .form { + margin: 32rpx 32rpx 0; + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 18rpx 28rpx; + .row { + display: flex; + align-items: center; + gap: 16rpx; + .label { + flex-shrink: 0; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .picker { + flex: 1; + } + .picker-content { + flex: 1; + padding: 16rpx 20rpx; + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + line-height: 32rpx; + background: #f6f6f6; + border-radius: 12rpx 12rpx 12rpx 12rpx; + display: flex; + align-items: center; + justify-content: space-between; + .content { + max-width: 6em; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + } + } + } + .station { + padding: 32rpx; + display: flex; + align-items: center; + justify-content: space-between; + .wrap { + display: flex; + align-items: center; + justify-content: space-between; + gap: 60rpx; + .item { + display: flex; + align-items: center; + justify-content: space-between; + font-size: 32rpx; + color: rgba(20, 21, 21, 1); + .radio { + transform: scale(0.7); + } + } + } + .fold { + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + } + } + } + .sort-line { + margin: 32rpx 32rpx 0; + display: flex; + align-items: center; + justify-content: space-between; + .wrap { + display: flex; + align-items: center; + gap: 16rpx; + .btn { + padding: 8rpx 24rpx; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + line-height: 32rpx; + background: #ffffff; + border-radius: 40rpx 40rpx 40rpx 40rpx; + &.active { + background-color: rgba(0, 180, 197, 1); + color: #fff; + } + } + } + .feedback { + font-size: 28rpx; + color: rgba(0, 180, 197, 1); + .wx-radio-input { + transform: scale(0.7); + } + } + } + .list { + padding: 0 32rpx; + .list-total { + padding: 24rpx 0; + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + } + .list-item { + padding-bottom: 16rpx; + position: relative; + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + background: linear-gradient(180deg, #f1feff 0%, #ffffff 35%, #ffffff 100%); + .quality { + position: absolute; + top: 0; + right: 0; + width: 120rpx; + height: 50rpx; + border-radius: 0 16rpx 0 0; + } + .li-header { + padding: 32rpx 32rpx 0 16rpx; + display: flex; + justify-content: space-between; + align-items: center; + &::before { + flex-shrink: 0; + content: ''; + width: 10rpx; + height: 40rpx; + background: #00b4c5; + border-radius: 0rpx 0rpx 0rpx 0rpx; + } + .wrap { + display: flex; + gap: 24rpx; + .id { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .status { + font-size: 28rpx; + &.status1 { + color: rgba(0, 180, 197, 1); + } + &.status2 { + color: rgba(247, 121, 0, 1); + } + &.status3 { + color: rgba(153, 153, 153, 1); + } + } + } + .option { + color: rgba(20, 21, 21, 1); + letter-spacing: -4rpx; + } + } + .li-row { + padding: 16rpx 32rpx; + display: flex; + line-height: 32rpx; + .label { + flex-shrink: 0; + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + width: 5em; + } + .content { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + .line { + color: rgba(205, 205, 205, 1); + } + .new { + margin-right: 12rpx; + display: inline-block; + padding: 0 8rpx; + font-size: 24rpx; + color: #fff; + background: linear-gradient(177deg, #f77900 0%, #ed4f39 88%); + border-radius: 0rpx 8rpx 0rpx 8rpx; + } + .reject { + padding: 0 8rpx; + display: inline-block; + font-size: 24rpx; + color: rgba(153, 153, 153, 1); + line-height: 32rpx; + border: 1px solid rgba(224, 224, 224, 1); + border-radius: 4rpx; + } + } + .tags { + display: flex; + gap: 12rpx; + .tag { + padding: 2rpx 8rpx; + font-size: 22rpx; + color: rgba(0, 180, 197, 1); + line-height: 32rpx; + border: 1rpx solid #bfeff4; + border-radius: 4rpx; + } + } + } + .photos { + padding: 16rpx 32rpx; + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 12rpx; + .photo { + width: 100%; + height: 148rpx; + border-radius: 8rpx; + } + } + } + } + .empty-1 { + margin: 174rpx auto 0; + text-align: center; + .e-img { + width: 356rpx; + height: 280rpx; + } + .e-tip { + font-size: 32rpx; + color: rgba(153, 153, 153, 1); + } + } + .empty-2 { + margin: 174rpx auto 0; + text-align: center; + .e-img { + width: 356rpx; + height: 242rpx; + } + .e-tip { + font-size: 32rpx; + color: rgba(153, 153, 153, 1); + } + } +} +.popup1 { + padding: 0 32rpx 80rpx; + .title { + padding: 32rpx; + font-size: 36rpx; + line-height: 1; + color: rgba(20, 21, 21, 1); + text-align: center; + } + .scroll { + max-height: 50vh; + overflow-y: auto; + overflow-x: hidden; + .list { + .list-item { + margin-bottom: 24rpx; + padding: 18rpx; + text-align: center; + font-size: 28rpx; + line-height: 32rpx; + background: #f6f6f6; + border-radius: 16rpx; + border: 2rpx solid #f6f6f6; + &.active { + background: rgba(29, 188, 204, 0.05); + border: 2rpx solid #00b4c5; + color: rgba(29, 188, 204, 1); + } + } + } + } + .submit { + width: 686rpx; + height: 88rpx; + font-size: 32rpx; + color: #fff; + display: flex; + align-items: center; + justify-content: center; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 96rpx 96rpx 96rpx 96rpx; + } +} + +.popup2 { + padding: 0 32rpx 80rpx; + .title { + padding: 32rpx; + font-size: 36rpx; + line-height: 1; + color: rgba(20, 21, 21, 1); + text-align: center; + } + .search { + padding: 16rpx 32rpx; + display: flex; + align-items: center; + border-radius: 122rpx; + background-color: rgba(246, 246, 246, 1); + .icon { + margin-right: 14rpx; + width: 32rpx; + height: 32rpx; + } + .input { + flex: 1; + font-size: 28rpx; + color: #000; + } + .place-input { + color: rgba(205, 205, 205, 1); + } + } + .scroll { + margin-top: 24rpx; + max-height: 50vh; + overflow-y: auto; + overflow-x: hidden; + .list { + .list-item { + margin-bottom: 24rpx; + padding: 32rpx; + border-radius: 16rpx; + border: 2rpx solid rgba(246, 246, 246, 1); + background-color: rgba(246, 246, 246, 1); + .hostipal { + font-size: 32rpx; + color: rgba(20, 21, 21, 1); + line-height: 44rpx; + .tag { + vertical-align: 4rpx; + display: inline-block; + padding: 0 8rpx; + font-size: 24rpx; + line-height: 32rpx; + color: #fff; + border-radius: 4rpx; + background-color: rgba(0, 180, 197, 1); + } + } + .site { + margin-top: 16rpx; + font-size: 28rpx; + color: rgba(133, 133, 133, 1); + } + &.active { + background: rgba(29, 188, 204, 0.05); + border: 2rpx solid #00b4c5; + color: rgba(29, 188, 204, 1); + } + } + } + } +} + +.popup3 { + padding: 32rpx 30rpx 84rpx; + .title { + display: flex; + justify-content: center; + font-size: 36rpx; + color: rgba(40, 48, 49, 1); + font-weight: bold; + } + .textarea { + padding: 30rpx; + margin-top: 32rpx; + width: 100%; + height: 216rpx; + box-sizing: border-box; + background: #f7f8f9; + border-radius: 24rpx 24rpx 24rpx 24rpx; + border: 2rpx solid #f8f9f9; + font-size: 32rx; + } + .tags { + margin-top: 32rpx; + display: flex; + flex-wrap: wrap; + gap: 20rpx; + .tag { + padding: 6rpx 44rpx; + font-size: 32rpx; + color: rgba(133, 133, 133, 1); + line-height: 44rpx; + background-color: #fff; + border: 1px solid #f6f6f6; + border-radius: 8rpx; + background: #f6f6f6; + &.active { + background-color: #fff; + border-color: rgba(1, 180, 197, 1); + color: rgba(1, 180, 197, 1); + } + } + } + .submit { + margin-top: 32rpx; + height: 84rpx; + display: flex; + justify-content: center; + align-items: center; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + font-size: 36rpx; + color: #fff; + border-radius: 64rpx 64rpx 64rpx 64rpx; + } +} diff --git a/src/pages/cases/index.ts b/src/pages/cases/index.ts index b792ee4..49a33c6 100644 --- a/src/pages/cases/index.ts +++ b/src/pages/cases/index.ts @@ -1,6 +1,21 @@ -const _app = getApp(); +const _app = getApp() Page({ - data: {}, + data: { + show1: false, + show2: false, + show3: false, + }, onLoad() {}, -}); + handleImagePreview(e) { + const { url } = e.currentTarget.dataset + wx.previewImage({ + urls: [url], + }) + }, + handleDetail(){ + wx.navigateTo({ + url:"/module1/pages/casesDetail/index" + }) + } +}) diff --git a/src/pages/cases/index.wxml b/src/pages/cases/index.wxml index a10af0e..c071f8a 100644 --- a/src/pages/cases/index.wxml +++ b/src/pages/cases/index.wxml @@ -1,2 +1,235 @@ - -pages/story/index.wxml + + + + 我的病历 + + 公开病历 + + + + 优质病历 + + + + + + + + + + 状态 + + 全全部全部全部全部全部全部全部全部全部全部部 + + + + + 医院 + + 全全部全部全部全部全部全部全部全部全部全部部 + + + + + 创建 + + + 全全部全部全部全部全部全部全部全部全部全部部 + + + + + + 更新 + + + 全全部全部全部全部全部全部全部全部全部全部部 + + + + + + 标签 + + 全全部全部全部全部全部全部全部全部全部全部部 + + + + + 地区 + + + 全全部全部全部全部全部全部全部全部全部全部部 + + + + + + + + + + 驳回 + + + + 优质 + + + + 公开 + + + + 收起 + + + + + + + 更新时间排序 + 提交时间排序 + + + + + 共有290条病历 + + + + + ID:2024020913049204001 + 讨论中 + 已公开 + + ··· + + + 提交时间 + 2024-02-09 12:04:23 + + + 提交人 + + 王军 + | + 四川大学华西医院 副主任医师 + + + + 标签 + + 心律失常 + 心律失常 + 心律失常 + + + + + + + + 更新时间 + + 2024-02-09 12:04:23 + new + 已驳回 + + + + 反馈人 + + 王军 + | + 四川大学华西医院 副主任医师 + + + + + + + 没有找到您搜索的医院哦! + + + + 没有找到您搜索的医院哦! + + + + + + 病历状态 + + + 全部 + 新病历 + 讨论中 + 已归档 + 已归档 + + + 保存 + + + + + + 选择医院 + + + + + + + + + 中山大学附属第一医院 + 三甲 + + 广东省广州市越秀区中山二路58号 + + + + 中山大学附属第一医院 + 三甲 + + 广东省广州市越秀区中山二路58号 + + + + + + + + + 选择标签 + + 瓣膜病 + 心律失常 + 心衰 + 心肌病 + + 保存 + + diff --git a/src/pages/home/index.json b/src/pages/home/index.json index 69247e2..ef1286d 100644 --- a/src/pages/home/index.json +++ b/src/pages/home/index.json @@ -1,8 +1,14 @@ { "usingComponents": { - "homeLevel1": "../../echart/components/homeLevel1/index" + "homeLevel1": "../../echart/components/homeLevel1/index", + "homeLevel2": "../../echart/components/homeLevel2/index", + "homeLevel3": "../../echart/components/homeLevel3/index", + "homeLevel4": "../../echart/components/homeLevel4/index" }, "componentPlaceholder": { - "homeLevel1": "view" + "homeLevel1": "view", + "homeLevel2": "view", + "homeLevel3": "view", + "homeLevel4": "view" } } diff --git a/src/pages/home/index.scss b/src/pages/home/index.scss index 63d26f5..e1d64f9 100644 --- a/src/pages/home/index.scss +++ b/src/pages/home/index.scss @@ -1,3 +1,6 @@ +page{ + background-color: rgba(246, 246, 246, 1); +} .page { .logo { margin-left: 32rpx; diff --git a/src/pages/home/index.ts b/src/pages/home/index.ts index b792ee4..2a3c868 100644 --- a/src/pages/home/index.ts +++ b/src/pages/home/index.ts @@ -1,6 +1,8 @@ -const _app = getApp(); +const _app = getApp() Page({ - data: {}, + data: { + level: 3, + }, onLoad() {}, -}); +}) diff --git a/src/pages/home/index.wxml b/src/pages/home/index.wxml index d221d76..d8c9c4d 100644 --- a/src/pages/home/index.wxml +++ b/src/pages/home/index.wxml @@ -1,7 +1,10 @@ - + + + + diff --git a/src/pages/my/index.json b/src/pages/my/index.json new file mode 100644 index 0000000..f57db8b --- /dev/null +++ b/src/pages/my/index.json @@ -0,0 +1,6 @@ +{ + "usingComponents": { + "doctorAvatar": "/components/doctorAvatar/index", + "van-icon": "@vant/weapp/icon/index" + } +} diff --git a/src/pages/my/index.scss b/src/pages/my/index.scss new file mode 100644 index 0000000..fd4684b --- /dev/null +++ b/src/pages/my/index.scss @@ -0,0 +1,154 @@ +page { + background-color: rgba(246, 246, 246, 1); +} +.page { + padding: 0 32rpx 280rpx; + .user { + position: relative; + padding: 102rpx 32rpx 32rpx; + background: linear-gradient(180deg, #f1feff 0%, #ffffff 35%, #ffffff 100%); + box-shadow: 0rpx 8rpx 24rpx 0rpx rgba(0, 66, 73, 0.09); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + .avatar { + position: absolute; + top: -38rpx; + left: 32rpx; + width: 112rpx; + height: 112rpx; + } + .wrap { + .w-header { + display: flex; + align-items: baseline; + gap: 16rpx; + .name { + font-size: 36rpx; + color: rgba(20, 21, 21, 1); + } + .desc { + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + .line { + margin: 0 12rpx; + display: inline-block; + height: 24rpx; + width: 1rpx; + background-color: rgba(205, 205, 205, 1); + } + } + } + .w-container { + margin-top: 24rpx; + .hostipal { + margin-right: 12rpx; + display: inline; + font-size: 28rpx; + color: rgba(20, 21, 21, 1); + } + .tag { + margin-right: 12rpx; + display: inline-block; + padding: 0 8rpx; + border-radius: 4rpx; + background-color: rgba(0, 180, 197, 1); + font-size: 24rpx; + color: #fff; + } + .site { + display: inline-block; + padding: 0 8rpx; + font-size: 28rpx; + line-height: 32rpx; + color: rgba(148, 87, 30, 1); + border-radius: 4rpx; + background-color: rgba(250, 229, 206, 1); + } + } + .w-footer { + margin-top: 16rpx; + display: flex; + gap: 12rpx; + flex-wrap: wrap; + .wf-label { + flex-shrink: 0; + width: 48rpx; + height: 32rpx; + } + .wf-tag { + flex-shrink: 0; + padding: 0 8rpx; + font-size: 22rpx; + color: rgba(0, 180, 197, 1); + line-height: 32rpx; + border: 1rpx solid rgba(191, 239, 244, 1); + } + } + } + } + .invite { + margin-top: 24rpx; + padding: 36rpx 36rpx 36rpx 42rpx; + display: flex; + align-items: center; + justify-content: space-between; + background: linear-gradient(83deg, #d8fcff 0%, rgba(240, 254, 255, 0.38) 33%, rgba(255, 255, 255, 1) 100%); + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + .code { + flex-shrink: 0; + width: 76rpx; + height: 76rpx; + } + .wrap { + .title { + font-size: 30rpx; + color: rgba(20, 21, 21, 1); + font-weight: bold; + line-height: 1; + } + .desc { + margin-top: 16rpx; + font-size: 28rpx; + color: rgba(153, 153, 153, 1); + } + } + .btn { + flex-shrink: 0; + width: 120rpx; + height: 56rpx; + font-size: 28rpx; + color: #fff; + text-align: center; + line-height: 56rpx; + background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); + border-radius: 34rpx 34rpx 34rpx 34rpx; + } + } + .list { + margin-top: 24rpx; + background: #ffffff; + border-radius: 16rpx 16rpx 16rpx 16rpx; + border: 2rpx solid #ffffff; + .list-item { + padding: 32rpx; + display: flex; + align-items: center; + justify-content: space-between; + .label { + display: flex; + align-items: center; + font-size: 32rpx; + color: rgba(0, 0, 0, 1); + .icon { + margin-right: 16rpx; + width: 44rpx; + height: 44rpx; + } + } + .more{ + color: rgba(205, 205, 205, 1); + } + } + } +} diff --git a/src/pages/my/index.ts b/src/pages/my/index.ts new file mode 100644 index 0000000..dbf579e --- /dev/null +++ b/src/pages/my/index.ts @@ -0,0 +1,11 @@ +const _app = getApp() + +Page({ + data: {}, + onLoad() {}, + handleUserInfo() { + wx.navigateTo({ + url: '/module1/pages/userInfo/index', + }) + }, +}) diff --git a/src/pages/my/index.wxml b/src/pages/my/index.wxml new file mode 100644 index 0000000..2830aba --- /dev/null +++ b/src/pages/my/index.wxml @@ -0,0 +1,65 @@ + + + + + + 徐萌 + + 主治医师 + + 心内科 + + + + 北京天坛医院 + 三甲 + 广州市/番禺区 + + + + 心律失常 + 心律失常 + 心律失常 + 心律失常 + + + + + + + 我的专属邀约码 + 出示邀约码邀请医生交流病历 + + 邀约 + + + + + + 个人信息 + + + + + + + 隐私与合规协议 + + + + + + + 账号相关 + + + + + diff --git a/tsconfig.json b/tsconfig.json index c377e06..11a248b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,7 +17,7 @@ "strictPropertyInitialization": true, "alwaysStrict": true, "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, + "noImplicitAny": false, "noImplicitReturns": true, "noImplicitThis": true, "noUnusedLocals": true, diff --git a/typings/index.d.ts b/typings/index.d.ts index ec8321a..40715d4 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1,4 +1,3 @@ -/// interface IAppOption { globalData: { diff --git a/typings/types/index.d.ts b/typings/types/index.d.ts deleted file mode 100644 index a5e8a7c..0000000 --- a/typings/types/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/typings/types/wx/index.d.ts b/typings/types/wx/index.d.ts deleted file mode 100644 index 7b4a2df..0000000 --- a/typings/types/wx/index.d.ts +++ /dev/null @@ -1,163 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) 2024 Tencent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -***************************************************************************** */ - -/// -/// -/// -/// -/// -/// -/// -/// -/// - -declare namespace WechatMiniprogram { - type IAnyObject = Record - type Optional = F extends (arg: infer P) => infer R ? (arg?: P) => R : F - type OptionalInterface = { [K in keyof T]: Optional } - interface AsyncMethodOptionLike { - success?: (...args: any[]) => void - } - type PromisifySuccessResult< - P, - T extends AsyncMethodOptionLike - > = P extends { - success: any - } - ? void - : P extends { fail: any } - ? void - : P extends { complete: any } - ? void - : Promise>[0]> - - // TODO: Extract real definition from `lib.dom.d.ts` to replace this - type IIRFilterNode = any - type WaveShaperNode = any - type ConstantSourceNode = any - type OscillatorNode = any - type GainNode = any - type BiquadFilterNode = any - type PeriodicWaveNode = any - type AudioNode = any - type ChannelSplitterNode = any - type ChannelMergerNode = any - type DelayNode = any - type DynamicsCompressorNode = any - type ScriptProcessorNode = any - type PannerNode = any - type AnalyserNode = any - type WebGLTexture = any - type WebGLRenderingContext = any - - // TODO: fill worklet type - type WorkletFunction = (...args: any) => any - type AnimationObject = any - type SharedValue = T - type DerivedValue = T -} - -declare let console: WechatMiniprogram.Console - -declare let wx: WechatMiniprogram.Wx -/** 引入模块。返回模块通过 `module.exports` 或 `exports` 暴露的接口。 */ -interface Require { - ( - /** 需要引入模块文件相对于当前文件的相对路径,或 npm 模块名,或 npm 模块路径。不支持绝对路径 */ - module: string, - /** 用于异步获取其他分包中的模块的引用结果,详见 [分包异步化]((subpackages/async)) */ - callback?: (moduleExport: any) => void, - /** 异步获取分包失败时的回调,详见 [分包异步化]((subpackages/async)) */ - errorCallback?: (err: any) => void - ): any - /** 以 Promise 形式异步引入模块。返回模块通过 `module.exports` 或 `exports` 暴露的接口。 */ - async( - /** 需要引入模块文件相对于当前文件的相对路径,或 npm 模块名,或 npm 模块路径。不支持绝对路径 */ - module: string - ): Promise -} -declare const require: Require -/** 引入插件。返回插件通过 `main` 暴露的接口。 */ -interface RequirePlugin { - ( - /** 需要引入的插件的 alias */ - module: string, - /** 用于异步获取其他分包中的插件的引用结果,详见 [分包异步化]((subpackages/async)) */ - callback?: (pluginExport: any) => void - ): any - /** 以 Promise 形式异步引入插件。返回插件通过 `main` 暴露的接口。 */ - async( - /** 需要引入的插件的 alias */ - module: string - ): Promise -} -declare const requirePlugin: RequirePlugin -/** 插件引入当前使用者小程序。返回使用者小程序通过 [插件配置中 `export` 暴露的接口](https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/using.html#%E5%AF%BC%E5%87%BA%E5%88%B0%E6%8F%92%E4%BB%B6)。 - * - * 该接口只在插件中存在 - * - * 最低基础库: `2.11.1` */ -declare function requireMiniProgram(): any -/** 当前模块对象 */ -declare let module: { - /** 模块向外暴露的对象,使用 `require` 引用该模块时可以获取 */ - exports: any -} -/** `module.exports` 的引用 */ -declare let exports: any - -/** [clearInterval(number intervalID)](https://developers.weixin.qq.com/miniprogram/dev/api/base/timer/clearInterval.html) - * - * 取消由 setInterval 设置的定时器。 */ -declare function clearInterval( - /** 要取消的定时器的 ID */ - intervalID: number -): void -/** [clearTimeout(number timeoutID)](https://developers.weixin.qq.com/miniprogram/dev/api/base/timer/clearTimeout.html) - * - * 取消由 setTimeout 设置的定时器。 */ -declare function clearTimeout( - /** 要取消的定时器的 ID */ - timeoutID: number -): void -/** [number setInterval(function callback, number delay, any rest)](https://developers.weixin.qq.com/miniprogram/dev/api/base/timer/setInterval.html) - * - * 设定一个定时器。按照指定的周期(以毫秒计)来执行注册的回调函数 */ -declare function setInterval( - /** 回调函数 */ - callback: (...args: any[]) => any, - /** 执行回调函数之间的时间间隔,单位 ms。 */ - delay?: number, - /** param1, param2, ..., paramN 等附加参数,它们会作为参数传递给回调函数。 */ - rest?: any -): number -/** [number setTimeout(function callback, number delay, any rest)](https://developers.weixin.qq.com/miniprogram/dev/api/base/timer/setTimeout.html) - * - * 设定一个定时器。在定时到期以后执行注册的回调函数 */ -declare function setTimeout( - /** 回调函数 */ - callback: (...args: any[]) => any, - /** 延迟的时间,函数的调用会在该延迟之后发生,单位 ms。 */ - delay?: number, - /** param1, param2, ..., paramN 等附加参数,它们会作为参数传递给回调函数。 */ - rest?: any -): number diff --git a/typings/types/wx/lib.wx.api.d.ts b/typings/types/wx/lib.wx.api.d.ts deleted file mode 100644 index 70a18f6..0000000 --- a/typings/types/wx/lib.wx.api.d.ts +++ /dev/null @@ -1,33751 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) 2024 Tencent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -***************************************************************************** */ - -/// - -declare namespace WechatMiniprogram { - interface AccessOption { - /** 要判断是否存在的文件/目录路径 (本地路径) */ - path: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AccessCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AccessFailCallback - /** 接口调用成功的回调函数 */ - success?: AccessSuccessCallback - } - /** 账号信息 */ - interface AccountInfo { - /** 小程序账号信息 */ - miniProgram: MiniProgram - /** 插件账号信息(仅在插件中调用时包含这一项) */ - plugin: Plugin - } - interface AddArcOption { - /** 终点 */ - end: MapPostion - /** 圆弧 id */ - id: number - /** 起始点 */ - start: MapPostion - /** 夹角角度 */ - angle?: number - /** 线的颜色 */ - color?: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AddArcCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AddArcFailCallback - /** 途经点 */ - pass?: MapPostion - /** 接口调用成功的回调函数 */ - success?: AddArcSuccessCallback - /** 线宽 */ - width?: number - } - interface AddCardOption { - /** 需要添加的卡券列表 */ - cardList: AddCardRequestInfo[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AddCardCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AddCardFailCallback - /** 接口调用成功的回调函数 */ - success?: AddCardSuccessCallback - } - /** 需要添加的卡券列表 */ - interface AddCardRequestInfo { - /** 卡券的扩展参数。需将 CardExt 对象 JSON 序列化为**字符串**传入 */ - cardExt: string - /** 卡券 ID */ - cardId: string - } - /** 卡券添加结果列表 */ - interface AddCardResponseInfo { - /** 卡券的扩展参数,结构请参考下文 */ - cardExt: string - /** 用户领取到卡券的 ID */ - cardId: string - /** 加密 code,为用户领取到卡券的code加密后的字符串,解密请参照:[code 解码接口](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1499332673_Unm7V) */ - code: string - /** 是否成功 */ - isSuccess: boolean - } - interface AddCardSuccessCallbackResult { - /** 卡券添加结果列表 */ - cardList: AddCardResponseInfo[] - errMsg: string - } - interface AddCustomLayerOption { - /** 个性化图层id */ - layerId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AddCustomLayerCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AddCustomLayerFailCallback - /** 接口调用成功的回调函数 */ - success?: AddCustomLayerSuccessCallback - } - interface AddFileToFavoritesOption { - /** 要收藏的文件地址,必须为本地路径或临时路径 */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AddFileToFavoritesCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AddFileToFavoritesFailCallback - /** 自定义文件名,若留空则使用filePath中的文件名 */ - fileName?: string - /** 接口调用成功的回调函数 */ - success?: AddFileToFavoritesSuccessCallback - } - interface AddGroundOverlayOption { - /** 图片覆盖的经纬度范围 */ - bounds: MapBounds - /** 图片图层 id */ - id: string - /** 图片路径,支持网络图片、临时路径、代码包路径 */ - src: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AddGroundOverlayCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AddGroundOverlayFailCallback - /** 图层透明度 */ - opacity?: number - /** 接口调用成功的回调函数 */ - success?: AddGroundOverlaySuccessCallback - /** 是否可见 */ - visible?: boolean - /** 图层绘制顺序 */ - zIndex?: number - } - interface AddMarkersOption { - /** 同传入 map 组件的 marker 属性 */ - markers: any[] - /** 是否先清空地图上所有 marker */ - clear?: boolean - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AddMarkersCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AddMarkersFailCallback - /** 接口调用成功的回调函数 */ - success?: AddMarkersSuccessCallback - } - interface AddPhoneCalendarOption { - /** 开始时间的 unix 时间戳 */ - startTime: number - /** 日历事件标题 */ - title: string - /** 是否提醒,默认 true */ - alarm?: boolean - /** 提醒提前量,单位秒,默认 0 表示开始时提醒 */ - alarmOffset?: number - /** 是否全天事件,默认 false */ - allDay?: boolean - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AddPhoneCalendarCompleteCallback - /** 事件说明 */ - description?: string - /** 结束时间的 unix 时间戳,默认与开始时间相同 */ - endTime?: string - /** 接口调用失败的回调函数 */ - fail?: AddPhoneCalendarFailCallback - /** 事件位置 */ - location?: string - /** 接口调用成功的回调函数 */ - success?: AddPhoneCalendarSuccessCallback - } - interface AddPhoneContactOption { - /** 名字 */ - firstName: string - /** 联系地址城市 */ - addressCity?: string - /** 联系地址国家 */ - addressCountry?: string - /** 联系地址邮政编码 */ - addressPostalCode?: string - /** 联系地址省份 */ - addressState?: string - /** 联系地址街道 */ - addressStreet?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AddPhoneContactCompleteCallback - /** 电子邮件 */ - email?: string - /** 接口调用失败的回调函数 */ - fail?: AddPhoneContactFailCallback - /** 住宅地址城市 */ - homeAddressCity?: string - /** 住宅地址国家 */ - homeAddressCountry?: string - /** 住宅地址邮政编码 */ - homeAddressPostalCode?: string - /** 住宅地址省份 */ - homeAddressState?: string - /** 住宅地址街道 */ - homeAddressStreet?: string - /** 住宅传真 */ - homeFaxNumber?: string - /** 住宅电话 */ - homePhoneNumber?: string - /** 公司电话 */ - hostNumber?: string - /** 姓氏 */ - lastName?: string - /** 中间名 */ - middleName?: string - /** 手机号 */ - mobilePhoneNumber?: string - /** 昵称 */ - nickName?: string - /** 公司 */ - organization?: string - /** 头像本地文件路径 */ - photoFilePath?: string - /** 备注 */ - remark?: string - /** 接口调用成功的回调函数 */ - success?: AddPhoneContactSuccessCallback - /** 职位 */ - title?: string - /** 网站 */ - url?: string - /** 微信号 */ - weChatNumber?: string - /** 工作地址城市 */ - workAddressCity?: string - /** 工作地址国家 */ - workAddressCountry?: string - /** 工作地址邮政编码 */ - workAddressPostalCode?: string - /** 工作地址省份 */ - workAddressState?: string - /** 工作地址街道 */ - workAddressStreet?: string - /** 工作传真 */ - workFaxNumber?: string - /** 工作电话 */ - workPhoneNumber?: string - } - interface AddPhoneRepeatCalendarOption { - /** 开始时间的 unix 时间戳 (1970年1月1日开始所经过的秒数) */ - startTime: number - /** 日历事件标题 */ - title: string - /** 是否提醒,默认 true */ - alarm?: boolean - /** 提醒提前量,单位秒,默认 0 表示开始时提醒 */ - alarmOffset?: number - /** 是否全天事件,默认 false */ - allDay?: boolean - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AddPhoneRepeatCalendarCompleteCallback - /** 事件说明 */ - description?: string - /** 结束时间的 unix 时间戳,默认与开始时间相同 */ - endTime?: string - /** 接口调用失败的回调函数 */ - fail?: AddPhoneRepeatCalendarFailCallback - /** 事件位置 */ - location?: string - /** 重复周期结束时间的 unix 时间戳,不填表示一直重复 */ - repeatEndTime?: number - /** 重复周期,默认 month 每月重复 - * - * 可选值: - * - 'day': 每天重复; - * - 'week': 每周重复; - * - 'month': 每月重复。该模式日期不能大于 28 日; - * - 'year': 每年重复; */ - repeatInterval?: 'day' | 'week' | 'month' | 'year' - /** 接口调用成功的回调函数 */ - success?: AddPhoneRepeatCalendarSuccessCallback - } - interface AddServiceOption { - /** 描述service的Object */ - service: BLEPeripheralService - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AddServiceCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AddServiceFailCallback - /** 接口调用成功的回调函数 */ - success?: AddServiceSuccessCallback - } - interface AddVideoToFavoritesOption { - /** 要收藏的视频地址,必须为本地路径或临时路径 */ - videoPath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AddVideoToFavoritesCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AddVideoToFavoritesFailCallback - /** 接口调用成功的回调函数 */ - success?: AddVideoToFavoritesSuccessCallback - /** 缩略图路径,若留空则使用视频首帧 */ - thumbPath?: string - } - interface AddVisualLayerOption { - /** 可视化图层id([创建图层指引](https://lbs.qq.com/dev/console/layers/layerEdit)) */ - layerId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AddVisualLayerCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AddVisualLayerFailCallback - /** 刷新周期,单位秒 */ - interval?: number - /** 图层透明度 */ - opacity?: number - /** 接口调用成功的回调函数 */ - success?: AddVisualLayerSuccessCallback - /** 图层绘制顺序 */ - zIndex?: number - } - /** 广播自定义参数 */ - interface AdvertiseReqObj { - /** 需要基础库: `2.20.1` - * - * 以 beacon 设备形式广播的参数。 */ - beacon?: BeaconInfoObj - /** 当前设备是否可连接 */ - connectable?: boolean - /** 广播中 deviceName 字段,默认为空 */ - deviceName?: string - /** 广播的制造商信息。仅安卓支持,iOS 因系统限制无法定制。 */ - manufacturerData?: ManufacturerData[] - /** 要广播的服务 UUID 列表。使用 16/32 位 UUID 时请参考注意事项。 */ - serviceUuids?: string[] - } - /** 订单金额信息。 */ - interface Amount { - /** 订单总需支付金额,也即是真正下单总金额,单位为分。示例值:1300 */ - order_amount: number - /** 货币类型。示例值:CNY - * - * 可选值: - * - 'CNY': 人民币; */ - currency?: 'CNY' - /** 订单总计优惠金额,单位为分。示例值:500 */ - discount?: number - /** 订单运费,单位为分。示例值:200 */ - freight?: number - /** 订单其他费用总金额,单位为分。示例值:600 */ - other_fee?: number - /** 订单所有商品的原价总和,单位为分。示例值:1000 */ - product_amount?: number - } - /** animationData */ - interface AnimationExportResult { - actions: IAnyObject[] - } - /** 动画效果 */ - interface AnimationOption { - /** 动画变化时间,单位 ms */ - duration?: number - /** 动画变化方式 - * - * 可选值: - * - 'linear': 动画从头到尾的速度是相同的; - * - 'easeIn': 动画以低速开始; - * - 'easeOut': 动画以低速结束; - * - 'easeInOut': 动画以低速开始和结束; */ - timingFunc?: 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' - } - interface AppAuthorizeSetting { - /** 允许微信使用相册的开关(仅 iOS 有效) */ - albumAuthorized: 'authorized' | 'denied' | 'not determined' - /** 允许微信使用蓝牙的开关(安卓基础库 3.5.0 以上有效) */ - bluetoothAuthorized: 'authorized' | 'denied' | 'not determined' - /** 允许微信使用摄像头的开关 */ - cameraAuthorized: 'authorized' | 'denied' | 'not determined' - /** 允许微信使用定位的开关 */ - locationAuthorized: 'authorized' | 'denied' | 'not determined' - /** 定位准确度。true 表示模糊定位,false 表示精确定位(仅 iOS 有效) */ - locationReducedAccuracy: boolean - /** 允许微信使用麦克风的开关 */ - microphoneAuthorized: 'authorized' | 'denied' | 'not determined' - /** 允许微信通知带有提醒的开关(仅 iOS 有效) */ - notificationAlertAuthorized: 'authorized' | 'denied' | 'not determined' - /** 允许微信通知的开关 */ - notificationAuthorized: 'authorized' | 'denied' | 'not determined' - /** 允许微信通知带有标记的开关(仅 iOS 有效) */ - notificationBadgeAuthorized: 'authorized' | 'denied' | 'not determined' - /** 允许微信通知带有声音的开关(仅 iOS 有效) */ - notificationSoundAuthorized: 'authorized' | 'denied' | 'not determined' - /** 允许微信读写日历的开关 */ - phoneCalendarAuthorized: 'authorized' | 'denied' | 'not determined' - } - interface AppBaseInfo { - /** 客户端基础库版本 */ - SDKVersion: string - /** 是否已打开调试。可通过右上角菜单或 [wx.setEnableDebug](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/wx.setEnableDebug.html) 打开调试。 */ - enableDebug: boolean - /** 微信字体大小缩放比例 */ - fontSizeScaleFactor: number - /** 需要基础库: `2.23.4` - * - * 微信字体大小,单位px */ - fontSizeSetting: number - /** 当前小程序运行的宿主环境 */ - host: AppBaseInfoHost - /** 微信设置的语言 */ - language: string - /** 微信版本号 */ - version: string - /** 系统当前主题,取值为`light`或`dark`,全局配置`"darkmode":true`时才能获取,否则为 undefined (不支持小游戏) - * - * 可选值: - * - 'dark': 深色主题; - * - 'light': 浅色主题; */ - theme?: 'dark' | 'light' - } - /** 当前小程序运行的宿主环境 */ - interface AppBaseInfoHost { - /** 宿主 app(第三方App) 对应的 appId (当小程序运行在第三方App环境时才返回) */ - appId: string - } - interface AppendFileOption { - /** 要追加的文本或二进制数据 */ - data: string | ArrayBuffer - /** 要追加内容的文件路径 (本地路径) */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AppendFileCompleteCallback - /** 指定写入文件的字符编码 - * - * 可选值: - * - 'ascii': ; - * - 'base64': ; - * - 'binary': ; - * - 'hex': ; - * - 'ucs2': 以小端序读取; - * - 'ucs-2': 以小端序读取; - * - 'utf16le': 以小端序读取; - * - 'utf-16le': 以小端序读取; - * - 'utf-8': ; - * - 'utf8': ; - * - 'latin1': ; */ - encoding?: - | 'ascii' - | 'base64' - | 'binary' - | 'hex' - | 'ucs2' - | 'ucs-2' - | 'utf16le' - | 'utf-16le' - | 'utf-8' - | 'utf8' - | 'latin1' - /** 接口调用失败的回调函数 */ - fail?: AppendFileFailCallback - /** 接口调用成功的回调函数 */ - success?: AppendFileSuccessCallback - } - interface ApplyBlusherStickMakeupOption { - /** 上色程度 0-1 */ - alpha: number - blendMode: string - /** 左腮红资源路径 */ - path: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ApplyBlusherStickMakeupCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ApplyBlusherStickMakeupFailCallback - /** 接口调用成功的回调函数 */ - success?: ApplyBlusherStickMakeupSuccessCallback - } - interface ApplyEyeBrowMakeupOption { - /** 上色程度 0-1 */ - alpha: number - blendMode: string - path: string - shrinkRate: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ApplyEyeBrowMakeupCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ApplyEyeBrowMakeupFailCallback - /** 接口调用成功的回调函数 */ - success?: ApplyEyeBrowMakeupSuccessCallback - } - interface ApplyEyeShadowMakeupOption { - /** 上色程度 0-1 */ - alpha: number - blendMode: string - /** 眼影资源路径 */ - path: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ApplyEyeShadowMakeupCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ApplyEyeShadowMakeupFailCallback - /** 细致效果图片资源路径 */ - shimmerPosition?: string - /** 细致效果图片资源 md5 */ - shimmerPositionMD5?: string - /** 接口调用成功的回调函数 */ - success?: ApplyEyeShadowMakeupSuccessCallback - } - interface ApplyFaceContourMakeupOption { - alpha: number - /** 高光资源路径 */ - path: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ApplyFaceContourMakeupCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ApplyFaceContourMakeupFailCallback - /** 接口调用成功的回调函数 */ - success?: ApplyFaceContourMakeupSuccessCallback - } - interface ApplyFilterOption { - /** 滤镜效果透明度,范围是 0-1 */ - alpha: number - /** 滤镜资源路径 */ - path: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ApplyFilterCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ApplyFilterFailCallback - /** 滤镜资源 md5 */ - md5?: string - /** 接口调用成功的回调函数 */ - success?: ApplyFilterSuccessCallback - } - interface ApplyLipStickMakeupOption { - /** 上色程度 0-1 */ - alpha: number - blendMode: string - faceModel: string - path: string - shimmerPath: string - shimmerType: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ApplyLipStickMakeupCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ApplyLipStickMakeupFailCallback - /** 接口调用成功的回调函数 */ - success?: ApplyLipStickMakeupSuccessCallback - } - interface ApplyStickerOption { - /** 贴纸类型 */ - stickers: Sticker[] - /** 贴纸类型 */ - type: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ApplyStickerCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ApplyStickerFailCallback - /** 接口调用成功的回调函数 */ - success?: ApplyStickerSuccessCallback - templateTransSet?: IAnyObject - } - interface Asset { - src: string - /** 可选值: - * - 'font': 字体; - * - 'image': 图片; */ - type: 'font' | 'image' - } - /** 需要基础库: `2.19.0` - * - * AudioBuffer接口表示存在内存里的一段短小的音频资源,利用[WebAudioContext.decodeAudioData](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.decodeAudioData.html)方法从一个音频文件构建,或者利用 [WebAudioContext.createBuffer](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createBuffer.html)从原始数据构建。把音频放入AudioBuffer后,可以传入到一个 AudioBufferSourceNode进行播放。 */ - interface AudioBuffer { - /** 返回存储在缓存区的PCM数据的时长(单位为秒) */ - duration: number - /** 返回存储在缓存区的PCM数据的采样帧率 */ - length: number - /** 储存在缓存区的PCM数据的通道数 */ - numberOfChannels: number - /** 存储在缓存区的PCM数据的采样率(单位为sample/s) */ - sampleRate: number - /** [AudioBuffer.copyFromChannel()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioBuffer.copyFromChannel.html) - * - * 在插件中使用:不支持 - * - * 从AudioBuffer的指定频道复制到数组终端。 */ - copyFromChannel(): void - /** [AudioBuffer.copyToChannel(Float32Array source, number channelNumber, number startInChannel)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioBuffer.copyToChannel.html) - * - * 在插件中使用:不支持 - * - * 从指定数组复制样本到audioBuffer的特定通道 - * - * **示例代码** - * - * 示例代码参考AudioBuffer.copyFromChannel */ - copyToChannel( - /** 需要复制的源数组 */ - source: Float32Array, - /** 需要复制到的目的通道号 */ - channelNumber: number, - /** 复制偏移数据量 */ - startInChannel: number - ): void - /** [Float32Array AudioBuffer.getChannelData(number channel)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioBuffer.getChannelData.html) - * - * 在插件中使用:不支持 - * - * 返回一个 Float32Array,包含了带有频道的PCM数据,由频道参数定义(有0代表第一个频道) */ - getChannelData( - /** 要获取特定通道数据的索引 */ - channel: number - ): Float32Array - } - /** 空间音频监听器,代表在一个音频场景内唯一的位置和方向信息。 */ - interface AudioListener { - /** 表示监听器的前向系统在同一笛卡尔坐标系中的水平位置,作为位置(位置x,位置和位置和位置)值。 */ - forwardX: number - /** 表示听众的前向方向在同一笛卡尔坐标系中作为位置(位置x,位置和位置和位置)值的垂直位置。 */ - forwardY: number - /** 表示与position (positionX、positionY和positionZ)值在同一笛卡尔坐标系下的听者前进方向的纵向(前后)位置。 */ - forwardZ: number - /** 右手笛卡尔坐标系中X轴的位置。 */ - positionX: number - /** 右手笛卡尔坐标系中Y轴的位置。 */ - positionY: number - /** 右手笛卡尔坐标系中Z轴的位置。 */ - positionZ: number - /** 设置监听器的方向 */ - setOrientation: (...args: any[]) => any - /** 设置监听器的位置 */ - setPosition: (...args: any[]) => any - /** 表示在与position (positionX、positionY和positionZ)值相同的笛卡尔坐标系中侦听器向前方向的水平位置。 */ - upX: number - /** 表示在与position (positionX、positionY和positionZ)值相同的笛卡尔坐标系中侦听器向上方向的水平位置。 */ - upY: number - /** 表示在与position (positionX、positionY和positionZ)值相同的笛卡尔坐标系中侦听器向后方向的水平位置。 */ - upZ: number - } - /** 需要基础库: `2.19.0` - * - * AudioParam 接口代表音频相关的参数,通常是 AudioNode(例如 GainNode.gain)的参数 */ - interface AudioParam { - /** 代表被具体的 AudioNode 创建的 AudioParam 的属性的初始值(只读) */ - defaultValue: number - /** 代表参数有效范围的最大可能值(只读) */ - maxValue: number - /** 代表参数有效范围的最小可能值(只读) */ - minValue: number - /** 当前属性的值(比如音量值或播放倍速值)(可读可写) */ - value: number - } - interface AuthPrivateMessageOption { - /** shareTicket。可以从 wx.getEnterOptionsSync 中获取。详情 [shareTicket](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html) */ - shareTicket: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AuthPrivateMessageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AuthPrivateMessageFailCallback - /** 接口调用成功的回调函数 */ - success?: AuthPrivateMessageSuccessCallback - } - interface AuthPrivateMessageSuccessCallbackResult { - /** 经过加密的activityId,解密后可得到原始的activityId。若解密后得到的activityId可以与开发者后台的活动id对应上则验证通过,否则表明valid字段不可靠(被篡改) 详细见[加密数据解密算法](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html) */ - encryptedData: string - /** 错误信息 */ - errMsg: string - /** 加密算法的初始向量,详细见[加密数据解密算法](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html) */ - iv: string - /** 验证是否通过 */ - valid: boolean - } - /** 用户授权设置信息,详情参考[权限](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html) */ - interface AuthSetting { - /** 是否授权系统日历,对应接口 [wx.addPhoneRepeatCalendar](https://developers.weixin.qq.com/miniprogram/dev/api/device/calendar/wx.addPhoneRepeatCalendar.html)、[wx.addPhoneCalendar](https://developers.weixin.qq.com/miniprogram/dev/api/device/calendar/wx.addPhoneCalendar.html) */ - 'scope.addPhoneCalendar'?: boolean - /** 是否添加通讯录联系人,对应接口 [wx.addPhoneContact](https://developers.weixin.qq.com/miniprogram/dev/api/device/contact/wx.addPhoneContact.html) */ - 'scope.addPhoneContact'?: boolean - /** 是否授权通讯地址,已取消此项授权,会默认返回true */ - 'scope.address'?: boolean - /** 是否授权蓝牙,对应接口 [wx.openBluetoothAdapter](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.openBluetoothAdapter.html)、[wx.createBLEPeripheralServer](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/wx.createBLEPeripheralServer.html) */ - 'scope.bluetooth'?: boolean - /** 是否授权摄像头,对应[[camera](https://developers.weixin.qq.com/miniprogram/dev/component/camera.html)](https://developers.weixin.qq.com/miniprogram/dev/component/camera.html) 组件 */ - 'scope.camera'?: boolean - /** 是否授权获取发票,已取消此项授权,会默认返回true */ - 'scope.invoice'?: boolean - /** 是否授权发票抬头,已取消此项授权,会默认返回true */ - 'scope.invoiceTitle'?: boolean - /** 是否授权录音功能,对应接口 [wx.startRecord](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/wx.startRecord.html) */ - 'scope.record'?: boolean - /** 是否授权模糊地理位置,对应接口 [wx.getFuzzyLocation](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.getFuzzyLocation.html) */ - 'scope.userFuzzyLocation'?: boolean - /** 是否授权用户信息,对应接口 [wx.getUserInfo](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html) */ - 'scope.userInfo'?: boolean - /** 是否授权精确地理位置,对应接口 [wx.getLocation](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.getLocation.html), [wx.chooseLocation](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.chooseLocation.html) */ - 'scope.userLocation'?: boolean - /** 是否授权微信运动步数,对应接口 [wx.getWeRunData](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/werun/wx.getWeRunData.html) */ - 'scope.werun'?: boolean - /** 是否授权保存到相册 [wx.saveImageToPhotosAlbum](https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.saveImageToPhotosAlbum.html), [wx.saveVideoToPhotosAlbum](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.saveVideoToPhotosAlbum.html) */ - 'scope.writePhotosAlbum'?: boolean - } - interface AuthorizeForMiniProgramOption { - /** 需要获取权限的 scope,详见 [scope 列表](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html#scope-列表) - * - * 可选值: - * - 'scope.record': ; - * - 'scope.writePhotosAlbum': ; - * - 'scope.camera': ; */ - scope: 'scope.record' | 'scope.writePhotosAlbum' | 'scope.camera' - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AuthorizeForMiniProgramCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AuthorizeForMiniProgramFailCallback - /** 接口调用成功的回调函数 */ - success?: AuthorizeForMiniProgramSuccessCallback - } - interface AuthorizeOption { - /** 需要获取权限的 scope,详见 [scope 列表](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html#scope-列表) */ - scope: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: AuthorizeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: AuthorizeFailCallback - /** 接口调用成功的回调函数 */ - success?: AuthorizeSuccessCallback - } - /** 设备特征列表 */ - interface BLECharacteristic { - /** 该特征支持的操作类型 */ - properties: BLECharacteristicProperties - /** 蓝牙设备特征的 UUID */ - uuid: string - } - /** 该特征支持的操作类型 */ - interface BLECharacteristicProperties { - /** 该特征是否支持 indicate 操作 */ - indicate: boolean - /** 该特征是否支持 notify 操作 */ - notify: boolean - /** 该特征是否支持 read 操作 */ - read: boolean - /** 该特征是否支持 write 操作 */ - write: boolean - /** 该特征是否支持有回复写操作 */ - writeDefault: boolean - /** 该特征是否支持无回复写操作 */ - writeNoResponse: boolean - } - interface BLEPeripheralServerCloseOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SocketTaskCloseCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SocketTaskCloseFailCallback - /** 接口调用成功的回调函数 */ - success?: SocketTaskCloseSuccessCallback - } - /** 描述service的Object */ - interface BLEPeripheralService { - /** characteristics列表 */ - characteristics: Characteristic[] - /** 蓝牙服务的 UUID */ - uuid: string - } - /** 设备服务列表 */ - interface BLEService { - /** 该服务是否为主服务 */ - isPrimary: boolean - /** 蓝牙设备服务的 UUID */ - uuid: string - } - /** BackgroundAudioManager 实例,可通过 [wx.getBackgroundAudioManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioManager.html) 获取。 -* -* **示例代码** -* -* ```js -const backgroundAudioManager = wx.getBackgroundAudioManager() - -backgroundAudioManager.title = '此时此刻' -backgroundAudioManager.epname = '此时此刻' -backgroundAudioManager.singer = '许巍' -backgroundAudioManager.coverImgUrl = 'http://y.gtimg.cn/music/photo_new/T002R300x300M000003rsKF44GyaSk.jpg?max_age=2592000' -// 设置了 src 之后会自动播放 -backgroundAudioManager.src = 'http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E061FF02C31F716658E5C81F5594D561F2E88B854E81CAAB7806D5E4F103E55D33C16F3FAC506D1AB172DE8600B37E43FAD&fromtag=46' -``` */ - interface BackgroundAudioManager { - /** 需要基础库: `3.4.8` - * - * 音频类型。可设置 "audio" 和 "music" 两种值,默认为 "audio"。不同音频类型对应的播放器样式不一样(实验特性,目前仅iOS和Android端支持) */ - audioType: string - /** 音频已缓冲的时间,仅保证当前播放时间点到此时间点内容已缓冲。(只读) */ - buffered: number - /** 封面图 URL,用于做原生音频播放器背景图。原生音频播放器中的分享功能,分享出去的卡片配图及背景也将使用该图。 */ - coverImgUrl: string - /** 当前音频的播放位置(单位:s),只有在有合法 src 时返回。(只读) */ - currentTime: number - /** 当前音频的长度(单位:s),只有在有合法 src 时返回。(只读) */ - duration: number - /** 专辑名,原生音频播放器中的分享功能,分享出去的卡片简介,也将使用该值。 */ - epname: string - /** 当前是否暂停或停止。(只读) */ - paused: boolean - /** 需要基础库: `2.11.0` - * - * 播放速度。范围 0.5-2.0,默认为 1。(Android 需要 6 及以上版本) */ - playbackRate: number - /** 需要基础库: `1.9.94` - * - * 音频协议。默认值为 'http',设置 'hls' 可以支持播放 HLS 协议的直播音频。 */ - protocol: string - /** 需要基础库: `3.4.8` - * - * 关联页面路径。设置后,当点击播放器上的小程序跳转链接时,将跳转到这个关联页面路径(实验特性,目前仅Android端支持) */ - referrerPath: string - /** 需要基础库: `2.13.0` - * - * `origin`: 发送完整的referrer; `no-referrer`: 不发送。格式固定为 `https://servicewechat.com/{appid}/{version}/page-frame.html`,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版、体验版以及审核版本,版本号为 devtools 表示为开发者工具,其余为正式版本; */ - referrerPolicy: string - /** 歌手名,原生音频播放器中的分享功能,分享出去的卡片简介,也将使用该值。 */ - singer: string - /** 音频的数据源([2.2.3](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 开始支持云文件ID)。默认为空字符串,**当设置了新的 src 时,会自动开始播放**,目前支持的格式有 m4a, aac, mp3, wav。 */ - src: string - /** 音频开始播放的位置(单位:s)。 */ - startTime: number - /** 音频标题,用于原生音频播放器音频标题(必填)。原生音频播放器中的分享功能,分享出去的卡片标题,也将使用该值。 */ - title: string - /** 页面链接,原生音频播放器中的分享功能,分享出去的卡片简介,也将使用该值。 */ - webUrl: string - /** [BackgroundAudioManager.onCanplay(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.onCanplay.html) - * - * 在插件中使用:支持 - * - * 监听背景音频进入可播放状态事件。 但不保证后面可以流畅播放 */ - onCanplay( - /** 背景音频进入可播放状态事件的监听函数 */ - listener: OnCanplayCallback - ): void - /** [BackgroundAudioManager.onEnded(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.onEnded.html) - * - * 在插件中使用:支持 - * - * 监听背景音频自然播放结束事件 */ - onEnded( - /** 背景音频自然播放结束事件的监听函数 */ - listener: OnEndedCallback - ): void - /** [BackgroundAudioManager.onError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.onError.html) - * - * 在插件中使用:支持 - * - * 监听背景音频播放错误事件 */ - onError( - /** 背景音频播放错误事件的监听函数 */ - listener: BackgroundAudioManagerOnErrorCallback - ): void - /** [BackgroundAudioManager.onNext(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.onNext.html) - * - * 在插件中使用:支持 - * - * 监听用户在系统音乐播放面板点击下一曲事件 */ - onNext( - /** 用户在系统音乐播放面板点击下一曲事件的监听函数 */ - listener: OnNextCallback - ): void - /** [BackgroundAudioManager.onPause(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.onPause.html) - * - * 在插件中使用:支持 - * - * 监听背景音频暂停事件 */ - onPause( - /** 背景音频暂停事件的监听函数 */ - listener: OnPauseCallback - ): void - /** [BackgroundAudioManager.onPlay(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.onPlay.html) - * - * 在插件中使用:支持 - * - * 监听背景音频播放事件 */ - onPlay( - /** 背景音频播放事件的监听函数 */ - listener: OnPlayCallback - ): void - /** [BackgroundAudioManager.onPrev(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.onPrev.html) - * - * 在插件中使用:支持 - * - * 监听用户在系统音乐播放面板点击上一曲事件 */ - onPrev( - /** 用户在系统音乐播放面板点击上一曲事件的监听函数 */ - listener: OnPrevCallback - ): void - /** [BackgroundAudioManager.onSeeked(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.onSeeked.html) - * - * 在插件中使用:支持 - * - * 监听背景音频完成跳转操作事件 */ - onSeeked( - /** 背景音频完成跳转操作事件的监听函数 */ - listener: OnSeekedCallback - ): void - /** [BackgroundAudioManager.onSeeking(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.onSeeking.html) - * - * 在插件中使用:支持 - * - * 监听背景音频开始跳转操作事件 */ - onSeeking( - /** 背景音频开始跳转操作事件的监听函数 */ - listener: OnSeekingCallback - ): void - /** [BackgroundAudioManager.onStop(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.onStop.html) - * - * 在插件中使用:支持 - * - * 监听背景音频停止事件 */ - onStop( - /** 背景音频停止事件的监听函数 */ - listener: InnerAudioContextOnStopCallback - ): void - /** [BackgroundAudioManager.onTimeUpdate(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.onTimeUpdate.html) - * - * 在插件中使用:支持 - * - * 监听背景音频播放进度更新事件,只有小程序在前台时会回调。 */ - onTimeUpdate( - /** 背景音频播放进度更新事件的监听函数 */ - listener: OnTimeUpdateCallback - ): void - /** [BackgroundAudioManager.onWaiting(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.onWaiting.html) - * - * 在插件中使用:支持 - * - * 监听音频加载中事件。当音频因为数据不足,需要停下来加载时会触发 */ - onWaiting( - /** 音频加载中事件的监听函数 */ - listener: OnWaitingCallback - ): void - /** [BackgroundAudioManager.pause()](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.pause.html) - * - * 在插件中使用:支持 - * - * 暂停音乐 */ - pause(): void - /** [BackgroundAudioManager.play()](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.play.html) - * - * 在插件中使用:支持 - * - * 播放音乐 */ - play(): void - /** [BackgroundAudioManager.seek(number currentTime)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.seek.html) - * - * 在插件中使用:支持 - * - * 跳转到指定位置 */ - seek( - /** 跳转的位置,单位 s。精确到小数点后 3 位,即支持 ms 级别精确度 */ - currentTime: number - ): void - /** [BackgroundAudioManager.stop()](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.stop.html) - * - * 在插件中使用:支持 - * - * 停止音乐 */ - stop(): void - } - interface BatchGetStorageOption { - /** 本地缓存中指定的 keyList */ - keyList: string[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: BatchGetStorageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: BatchGetStorageFailCallback - /** 接口调用成功的回调函数 */ - success?: BatchGetStorageSuccessCallback - } - interface BatchSetStorageOption { - /** [{ key, value }] */ - kvList: any[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: BatchSetStorageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: BatchSetStorageFailCallback - /** 接口调用成功的回调函数 */ - success?: BatchSetStorageSuccessCallback - } - /** Beacon 设备 */ - interface BeaconInfo { - /** Beacon 设备的距离,单位 m。iOS 上,proximity 为 0 时,accuracy 为 -1。 */ - accuracy: number - /** Beacon 设备的主 ID */ - major: number - /** Beacon 设备的次 ID */ - minor: number - /** 表示设备距离的枚举值(仅iOS) - * - * 可选值: - * - 0: 信号太弱不足以计算距离,或非 iOS 设备; - * - 1: 十分近; - * - 2: 比较近; - * - 3: 远; */ - proximity: 0 | 1 | 2 | 3 - /** 表示设备的信号强度,单位 dBm */ - rssi: number - /** Beacon 设备广播的 UUID */ - uuid: string - } - /** 需要基础库: `2.20.1` - * - * 以 beacon 设备形式广播的参数。 */ - interface BeaconInfoObj { - /** Beacon 设备的主 ID */ - major: number - /** Beacon 设备的次 ID */ - minor: number - /** Beacon 设备广播的 UUID */ - uuid: string - /** 用于判断距离设备 1 米时 RSSI 大小的参考值 */ - measuredPower?: number - } - interface BindWifiOption { - /** 当前 wifi 网络的 BSSID ,可通过 wx.getConnectedWifi 获取 */ - BSSID: string - } - interface BlueToothDevice { - /** 当前蓝牙设备的信号强度,单位 dBm */ - RSSI: number - /** 当前蓝牙设备的广播数据段中的 ManufacturerData 数据段。 */ - advertisData: ArrayBuffer - /** 当前蓝牙设备的广播数据段中的 ServiceUUIDs 数据段 */ - advertisServiceUUIDs: string[] - /** 当前蓝牙设备是否可连接( Android 8.0 以下不支持返回该值 ) */ - connectable: boolean - /** 蓝牙设备 id */ - deviceId: string - /** 当前蓝牙设备的广播数据段中的 LocalName 数据段 */ - localName: string - /** 蓝牙设备名称,某些设备可能没有 */ - name: string - /** 当前蓝牙设备的广播数据段中的 ServiceData 数据段 */ - serviceData: IAnyObject - } - /** 搜索到的设备列表 */ - interface BluetoothDeviceInfo { - /** 用于区分设备的 id */ - deviceId: string - /** 蓝牙设备名称,某些设备可能没有 */ - name: string - } - interface BlurOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: BlurCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: BlurFailCallback - /** 接口调用成功的回调函数 */ - success?: BlurSuccessCallback - } - /** 需要基础库: `2.28.0` - * - * 人体检测配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/body.html)。 */ - interface BodyTrack { - /** 需要基础库: `2.28.0` - * - * 人体检测模式 - * - * 可选值: - * - 1: 通过摄像头实时检测; - * - 2: 静态图片检测; */ - mode: 1 | 2 - } - interface BoundingClientRectCallbackResult { - /** 节点的下边界坐标 */ - bottom: number - /** 节点的 dataset */ - dataset: IAnyObject - /** 节点的高度 */ - height: number - /** 节点的 ID */ - id: string - /** 节点的左边界坐标 */ - left: number - /** 节点的右边界坐标 */ - right: number - /** 节点的上边界坐标 */ - top: number - /** 节点的宽度 */ - width: number - } - /** 目标边界 */ - interface BoundingClientRectResult { - /** 下边界 */ - bottom: number - /** 高度 */ - height: number - /** 左边界 */ - left: number - /** 右边界 */ - right: number - /** 上边界 */ - top: number - /** 宽度 */ - width: number - } - /** 音频源节点,通过 [WebAudioContext.createBufferSource](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createBufferSource.html)方法获得。 -* -* **示例代码** -* -* ```js -const source = audioCtx.createBufferSource() -source.buffer = AudioBuffer -source.connect(audioCtx.destination) -source.start() -``` */ - interface BufferSourceNode { - /** [AudioBuffer](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioBuffer.html) - * - * 是一个 AudioBuffer, 它定义了要播放的音频,当设置它的值为 0 时,它会定义一个静默的单通道。(可读可写) */ - buffer: AudioBuffer - /** 定义音频是否循环播放(可读可写) */ - loop?: boolean - /** 定义音频循环播放时,结束播放的位置。单位是秒,默认值是0(可读可写) */ - loopEnd?: number - /** 定义音频循环播放时,开始播放的位置。单位是秒,默认值是0(可读可写) */ - loopStart?: number - /** 定义音频播放结束事件回调函数(可读可写) */ - onended?: (...args: any[]) => any - /** [AudioParam](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioParam.html) - * - * 定义音频的播放倍速,数值越大速度越快,默认速度1.0,有效范围为 0 < playbackRate <= 2.0(可读可写) */ - playbackRate?: AudioParam - /** [BufferSourceNode.connect(AudioNode|[AudioParam](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioParam.html) destination)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/BufferSourceNode.connect.html) - * - * 在插件中使用:不支持 - * - * 连接到一个指定目标。这个指定的目标可能是另一个 AudioNode(从而将音频数据引导到下一个指定节点)或一个AudioParam, 以便上一个节点的输出数据随着时间流逝能自动地对下一个参数值进行改变 */ - connect( - /** 要建立连接的目标节点 */ - destination: AudioNode | AudioParam - ): void - /** [BufferSourceNode.disconnect()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/BufferSourceNode.disconnect.html) - * - * 在插件中使用:不支持 - * - * 与已连接的目标节点断开连接 */ - disconnect(): void - /** [BufferSourceNode.start(number when, number offset, number duration)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/BufferSourceNode.start.html) - * - * 在插件中使用:不支持 - * - * 音频源开始播放 */ - start( - /** 延迟播放的时间,单位是秒。与 AudioContext 使用相同的时间坐标系统。如果 when 小于 AudioContext.currentTime, 或者是 0,声音立即被播放。 默认值是 0 */ - when?: number, - /** 音频开始播放的位置,单位是秒。默认值是 0 */ - offset?: number, - /** 音频播放的持续时间,单位是秒。如果这个参数没有被指定,声音播放到自然结束或者使用stop() 方法结束。使用这个参数的功能与调用 start(when, offset) 和调用 stop(when+duration)效果完全相同 */ - duration?: number - ): void - /** [BufferSourceNode.stop(number when)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/BufferSourceNode.stop.html) - * - * 在插件中使用:不支持 - * - * 停止播放 */ - stop( - /** 延迟停止播放的时间,单位是秒。与 AudioContext 使用相同的时间坐标系统。省略此参数、指定值 0 或传递负值会使声音立即停止播放。 */ - when?: number - ): void - } - /** 需要基础库: `2.24.0` - * - * 缓存管理器。全局只有唯一实例,一旦被创建出来即表示接入缓存管理器。其有以下几个能力: - * - * 1. 在网络通畅时,符合一定规则的用户网络请求(目前只包括普通 wx.request 请求)会被缓存。 - * 2. 在网络通畅时,某些 wx api 调用会被缓存。 - * 3. 进入弱网/离线状态时,会提供事件给用户,用户可以决定是否使用缓存返回。 - * 4. 提供进入和退出弱网/离线状态的事件。 - * - * > 1. 缓存管理器中涉及的网络请求如无特指,均指普通的 wx.request 异步请求,参数和返回值中均不考虑涉及 ArrayBuffer 或 TypedArray 的情形。 - * > 2. 缓存管理器中的缓存不会占用 storage 空间,但是有大小限制,请勿在非必要的请求上使用缓存。 */ - interface CacheManager { - /** 全局缓存有效时间 */ - maxAge: number - /** 当前缓存模式 - * - * 可选值: - * - 'weakNetwork': 默认值,弱网/离线使用缓存返回; - * - 'always': 总是使用缓存返回; - * - 'none': 不开启,后续可手动开启/停止使用缓存返回; */ - mode: 'weakNetwork' | 'always' | 'none' - /** 全局 origin */ - origin: string - /** 当前缓存管理器状态 - * - * 可选值: - * - 0: 不使用缓存返回; - * - 1: 使用缓存返回; - * - 2: 未知; */ - state: 0 | 1 | 2 - /** [Array.<string> CacheManager.addRules(Object rules)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.addRules.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 批量添加规则,规则写法可参考 [CacheManager.addRule](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.addRule.html)。 */ - addRules( - /** 规则列表 */ - rules: IAnyObject - ): string[] - /** [CacheManager.clearCaches()](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.clearCaches.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 清空所有缓存。 */ - clearCaches(): void - /** [CacheManager.clearRules()](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.clearRules.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 清空所有规则,同时会删除对应规则下所有缓存。 */ - clearRules(): void - /** [CacheManager.deleteCache(string id)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.deleteCache.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 删除缓存。 */ - deleteCache( - /** 缓存 id */ - id: string - ): void - /** [CacheManager.deleteCaches(Array.<string> ids)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.deleteCaches.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 批量删除缓存。 */ - deleteCaches( - /** 缓存 id 列表 */ - ids: string[] - ): void - /** [CacheManager.deleteRule(string id)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.deleteRule.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 删除规则,同时会删除对应规则下所有缓存。 */ - deleteRule( - /** 规则 id */ - id: string - ): void - /** [CacheManager.deleteRules(Array.<string> ids)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.deleteRules.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 批量删除规则,同时会删除对应规则下所有缓存。 */ - deleteRules( - /** 规则 id 列表 */ - ids: string[] - ): void - /** [CacheManager.off(string eventName, function handler)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.off.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 取消事件监听。 */ - off( - /** 事件名 */ - eventName: string, - /** 事件句柄 */ - handler: (...args: any[]) => any - ): void - /** [CacheManager.on(string eventName, function handler)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.on.html) -* -* 需要基础库: `2.24.0` -* -* 在插件中使用:不支持 -* -* 监听事件。 -* -* **** -* -* 这里 request 事件会提供 request 事件对象,用于做后续的处理;在 request 事件中需要返回一个 promise,用来生成 wx.request 请求的返回内容。 -* -* #### 示例代码 -* -* ```js -async function handler(evt) { - // evt.url - 请求 url - // evt.data - 请求参数 - // evt.method - 请求方法 - // evt.request - 原始 request 方法,返回一个 promise - - // if (evt.url === '/xxx') { - // // 如果有些请求仍然希望走到网络,则可以如下处理 - // const res = await evt.request() - // // res 即为网络请求返回 - // } - - return new Promsie((resolve, reject) => { - // do sth - if (data) { - // 这里 resolve 的 data 就会作为 wx.request 的 success 回调结果返回 - resolve(data) - } else { - // 这里 reject 的错误信息就会作为 wx.request 的 fail 回调结果返回 - reject('no data') - } - }) -} -cacheManager.on('request', handler) -``` */ - on( - /** 事件名 - * - * 参数 eventName 可选值: - * - 'request': 发生 wx.request 请求,只在缓存管理器开启阶段会触发; - * - 'enterWeakNetwork': 进入弱网/离线状态; - * - 'exitWeakNetwork': 离开弱网/离线状态; */ - eventName: 'request' | 'enterWeakNetwork' | 'exitWeakNetwork', - /** 事件句柄 */ - handler: (...args: any[]) => any - ): void - /** [CacheManager.start()](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.start.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 开启缓存,仅在 mode 为 none 时生效,调用后缓存管理器的 state 会置为 1。 */ - start(): void - /** [CacheManager.stop()](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.stop.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 关闭缓存,仅在 mode 为 none 时生效,调用后缓存管理器的 state 会置为 0。 */ - stop(): void - /** [Object CacheManager.match(Object evt)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.match.html) -* -* 需要基础库: `2.24.0` -* -* 在插件中使用:不支持 -* -* 匹配命中的缓存规则,一般需要和 request 事件搭配使用。 -* -* **示例代码** -* -* ```js -function handler(evt) { - const cache = cacheManager.match(evt) - // 若有重复监听,则取第一个 handler 返回的 promise - return new Promise((resolve, reject) => { - if (cache.data) { - resolve(cache.data) - } else { - reject('no cache') - } - }) -} -cacheManager.on('request', handler) -``` */ - match( - /** request 事件对象 */ - evt: IAnyObject - ): MatchCache - /** [string CacheManager.addRule(Object rule)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.addRule.html) -* -* 需要基础库: `2.24.0` -* -* 在插件中使用:不支持 -* -* 添加规则。 -* -* **规则说明** -* -* 支持的规则写法有字符串、正则和对象三种: -* -* ### 字符串写法 -* -* 1. `addRule('/abc')`:纯 uri 串。 -* 2. `addRule('GET /abc'):带方法的 uri 串,除了匹配 uri 外,还会匹配请求方法。如例子中必须是 GET 方法请求才会被匹配。 -* 3. `addRule('/abc/:id'):带可变部分的 uri 串,id 可以是任意符合标准的字符串,表示这一段可以动态变化。比如 `/abc/123` 和 `/abc/321` 都会被匹配,而 `/abc/123/xxx` 因为多了一段,就不会被匹配。 -* 4. `addRule('/abc?aa'):带 query 参数的 uri 串,包含 aa 参数,值可以为任意值。比如 `/abc?aa=haha` 会被匹配,但是 `/abc` 就不会被匹配,因为缺少规则中声明的 aa 参数;不过如果请求是 `/abc?aa=haha&bb=123`,虽然多带了 bb 参数,但是因为包含了 aa 参数,所以也可以被匹配。 -* 5. `addRule('/abc?dd=haha'):带 query 参数的 uri 串,包含 dd 参数且值为 haha。比如 `/abc?dd=haha` 和 `/abc?dd=haha&bb=123` 会被匹配,而 `/abc?dd=123` 就不会被匹配,因为规则要求了 dd 参数的值。 -* -* > 以上写法中的 uri 串如果只有 path 部分,则会取全局 origin 进行补全。比如全局 origin 是 `https://weixin.qq.com`,而规则是 `/abc`,则会补全为 `https://weixin.qq.com/abc`。因此在前面例子中 `addRule('/abc')` 和 `addRule('https://weixin.qq.com/abc')` 的写法效果一致。所以一般情况下如果需要匹配的请求 origin 和全局 origin 一致,则规则中可忽略不写 orign。 -* -* ### 正则写法 -* -* 1. `addRule(/\/(abc|cba)$/ig)`:直接正则匹配请求的 uri,同时会比对请求 origin 和全局 origin 是否一致。 -* 2. `addRule(/^https:\/\/weixin.qq.com\/(abc|cba)$/ig)`:带有 orign 部分的正则表达式,则只匹配 uri,不再比对 origin。 -* -* ### 对象写法 -* -* 使用规则对象,可以更为详细的描述规则内容。(一般使用规则对象,是为了匹配请求参数) -* -* #### 规则对象: -* -* | 属性名 | 类型 | 默认值 | 备注 | -* |---|---|---|---| -* | id | string | | 规则 id,如果不填则会由基础库生成 | -* | method | string | | 请求方法,可选值 GET/POST/PATCH/PUT/DELETE,如果为空则表示前面提到的所有方法都能被匹配到 | -* | url | any | 必填 | uri 匹配规则,可参考规则字符串写法和正则写法 | -* | maxAge | number | 7 * 24 * 60 * 60 * 1000 | 缓存有效时间,单位为 ms,不填则默认取缓存管理器全局的缓存有效时间 | -* | dataSchema | Array\ | | 匹配请求参数 | -* -* 其中,dataSchema 用来匹配对象类型的请求参数(比如 wx.request 的 data),默认可以不填,即不做参数匹配。 -* -* dataSchema 的类型是一个 DataRule 对象数组,一个 DataRule 对象描述一个参数,比如一个 wx.request 请求的 data 是 `{a: 123, b: 'haha', c: true}`,你想要用一条规则来匹配其中的 a 和 b 参数,如果 a 是数字且 b 是字符串就能命中该规则,那么就需要在 dataSchema 中补充两个 DataRule 对象,即 `[{name: 'a', schema: {type: 'number'}}, {name: 'b', schema: {type: 'string'}}]`。 -* -* #### DataRule 对象: -* -* | 属性名 | 类型 | 默认值 | 备注 | -* |---|---|---|---| -* | name | string | | 需要匹配的参数名 | -* | schema | DataSchema/Array\ | 需要匹配的参数模式,支持数组,表示该参数值有多种模式 | -* -* name 表示要匹配的参数名,schema 为 DataSchema 对象,用来描述该参数的类型和值。 -* -* 一个 DataRule 对象也可以匹配可能拥有多种类型的参数,所以 schema 也支持为 DataSchema 对象数组。比如上述例子中,希望匹配的 a 参数必须是数值或者字符串,那么可以这么写:`{name: 'a', schema: [{type: 'number'}, {type: 'string'}]}`。 -* -* #### DataSchema 对象: -* -* | 属性名 | 类型 | 默认值 | 备注 | -* |---|---|---|---| -* | type | string | | 需要匹配的 data 对象的参数类型,string、number、boolean、null、object、any(表示任意类型),同时支持数组模式(数组模式则在类型后面加 [],如 string[] 表示字符串数组) | -* | value | string/regexp/function/Array\ | | 需要匹配的 data 对象的参数值,当 type 为基本类型时,可以用 string/regexp 来匹配固定的值,也可以通过 function 来确定值是否匹配,如果传入的 type 是 object,那么表示需要嵌套匹配值是否正确,可以传入 Array | -* -* type 参数表示要匹配的参数类型,value 表示要匹配的参数值。其中 value 支持多种写法,不同写法有如下匹配方式: -* -* 1. 字符串写法:直接判值的字符串形式是否和给定字符串一样,比如 value 值为 `123`,就要求参数值必须为 123 才能与之匹配。 -* 2. 正则写法:直接判值的字符串形式是否能被正则匹配,比如 value 值为 `/\d+/ig`,就要求参数值必须为数字,如果参数值为 `abc` 则不会被匹配。 -* 3. 函数写法:在匹配时会调用用户传入的函数,交由用户判断是否匹配。 -* 4. DataRule 数组写法:当参数类型为对象时,那么字符串写法和正则写法就无法使用,需要传入 DataRule 数组来进行匹配,即通过嵌套 DataRule 数组的方式来匹配嵌套的对象。 -* -* ### 示例代码 -* -* ```js -const ruleId = cacheManager.addRule({ - id: 'haha-rule', - method: 'GET', - url: '/haha', - maxAge: 123455, - dataSchema: [ - // data 字段的匹配,默认为空,表示不匹配 - // 类型可以是:string、number、boolean、null、object、any(表示任意类型均可),以及这些类型的数组表示方式 - {name: 'aaa', schema: {type: 'string'}}, // 类型为 string - {name: 'bbb', schema: [{type: 'number'}, {type: 'string'}]}, // 类型为 number, string - {name: 'ccc', schema: {type: 'string', value: 'abc'}}, // 值为 abc - {name: 'ddd', schema: {type: 'string', value: /(abc|cba)/ig}}, // 值符合该正则匹配,如果该值不是字符串类型,则会被尝试转成字符串后再进行比较 - {name: 'ddd', schema: {type: 'string', value: val => val === '123'}}, // 传入函数来校验值 - {name: 'eee', schema: {type: 'object', value: [{ // 类型为对象,则通过嵌套的方式来逐层校验 - name: 'aaa', schema: {type: 'string'}, - // ... - // 嵌套 dataSchema,同上面的方式一样来匹配嵌套的对象 - }]}}, - {name: 'fff', schema: {type: 'string[]'}}, // 类型为 string 数组 - {name: 'ggg', schema: {type: 'any'}}, // 类型为任意类型 - {name: 'hhh', schema: {type: 'any[]'}}, // 类型为任意类型的数组 - }], -}) -``` -* -* ### 补充说明 -* -* 用户可以添加多条规则,每条规则都会去解析网络请求,然后判断是否命中规则。假设有多条规则命中,则取第一条命中的规则。 -* -* ### 缓存覆盖 -* -* 不同的网络请求也可能命中同一条规则,所以每条规则可能对应多个缓存。每条规则会有一个规则 id,每个缓存会有一个缓存 id,一个规则 id 可能对应多个缓存 id,而缓存管理器的缓存存储是基于缓存 id 标识的,如果两个不同的请求生成了同样的缓存 id,那么后发生的请求结果缓存会覆盖前者。因此使用时需要思考缓存的覆盖情况,目前缓存 id 生成方式如下: -* -* 1. 规则使用字符串写法:那么按 method + url + 规则中声明的 query 参数来生成缓存 id。 -* -* > 需要注意的是这里不使用真实请求中的 query 参数来生成缓存 id,而是使用规则中匹配到的 query 来生成缓存 id。比如规则是 `/abc?aa=123`,请求是 GET 方法的 `/abc?aa=123&bb=123`,那么就会基于 `GET /abc?aa=123` 来生成缓存 id。而规则里没有声明 `bb=123`,所以 bb 参数不会被纳入缓存 id 的生成基准。 -* -* 2. 规则使用正则写法:那么只按 method + url 生成缓存 id,不考虑 query 参数。 -* 3. 规则使用对象写法:如果规则对象中的 url 是字符串写法,那么按 method + url + 规则中声明的 query 参数 + 规则中 dataSchema 声明的请求参数来生成缓存 id;如果规则对象中的 url 是正则写法,那么按 method + url + 规则中 dataSchema 声明的请求参数来生成缓存 id。 -* -* > 生成缓存 id 时没有使用请求中完整的 query 参数或者请求参数来作为基准,是考虑到很多请求可能会带上 token 或时间戳等参数。因为此参数存在不确定性,会导致每次请求生成的缓存 id 都不同,进而导致缓存命中率下降,故采取规则中声明的 query 参数和 dataSchema 声明的请求参数来作为生成缓存 id 的基准。 */ - addRule( - /** 规则 */ - rule: IAnyObject - ): string - } - interface CameraContextSetZoomOption { - /** 缩放级别,范围[1, maxZoom]。zoom 可取小数,精确到小数后一位。maxZoom 可在 bindinitdone 返回值中获取。 */ - zoom: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetZoomCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetZoomFailCallback - /** 接口调用成功的回调函数 */ - success?: CameraContextSetZoomSuccessCallback - } - interface CameraContextStartRecordOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartRecordCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartRecordFailCallback - /** 需要基础库: `2.22.0` - * - * 是否开启镜像 */ - selfieMirror?: boolean - /** 接口调用成功的回调函数 */ - success?: CameraContextStartRecordSuccessCallback - /** 需要基础库: `2.22.0` - * - * 录制时长上限,单位为秒,最长不能超过 5 分钟 */ - timeout?: number - /** 超过录制时长上限时会结束录像并触发此回调,录像异常退出时也会触发此回调 */ - timeoutCallback?: StartRecordTimeoutCallback - } - interface CameraContextStopRecordOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopRecordCompleteCallback - /** 启动视频压缩,压缩效果同`chooseVideo` */ - compressed?: boolean - /** 接口调用失败的回调函数 */ - fail?: StopRecordFailCallback - /** 接口调用成功的回调函数 */ - success?: CameraContextStopRecordSuccessCallback - } - interface CameraFrameListenerStartOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartFailCallback - /** 接口调用成功的回调函数 */ - success?: StartSuccessCallback - /** [Worker](https://developers.weixin.qq.com/miniprogram/dev/api/worker/Worker.html) - * - * 需要基础库: `2.25.1` - * - * 可选参数。如果需要在 iOS ExperimentalWorker 内监听摄像头帧数据,则需要传入对应 Worker 对象。详情 [Worker.getCameraFrameData](https://developers.weixin.qq.com/miniprogram/dev/api/worker/Worker.getCameraFrameData.html) */ - worker?: Worker - } - /** 需要基础库: `2.7.0` - * - * Canvas 实例,可通过 [SelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html) 获取。 - * - * **示例代码** - * - * 2D Canvas 示例 - * [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/SHfgCmmq7UcM) - * - * WebGL 示例 - * [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/qEGUOqmf7T8z) */ - interface Canvas { - /** 画布高度 */ - height: number - /** 画布宽度 */ - width: number - /** [Canvas.cancelAnimationFrame(number requestID)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.cancelAnimationFrame.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 取消由 requestAnimationFrame 添加到计划中的动画帧请求。支持在 2D Canvas 和 WebGL Canvas 下使用, 但不支持混用 2D 和 WebGL 的方法。 */ - cancelAnimationFrame(requestID: number): void - /** [[ImageData](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/ImageData.html) Canvas.createImageData()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.createImageData.html) - * - * 需要基础库: `2.9.0` - * - * 在插件中使用:支持 - * - * 创建一个 ImageData 对象。仅支持在 2D Canvas 中使用。 */ - createImageData(): ImageData - /** [[Image](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Image.html) Canvas.createImage()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.createImage.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 创建一个图片对象。 支持在 2D Canvas 和 WebGL Canvas 下使用, 但不支持混用 2D 和 WebGL 的方法。 */ - createImage(): Image - /** [[Path2D](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.html) Canvas.createPath2D([Path2D](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.html) path)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.createPath2D.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 创建 Path2D 对象 */ - createPath2D( - /** [Path2D](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.html) */ - path: Path2D - ): Path2D - /** [[RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) Canvas.getContext(string contextType)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.getContext.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 该方法返回 Canvas 的绘图上下文 - * - * **** - * - * 支持获取 2D 和 WebGL 绘图上下文 */ - getContext( - /** 上下文类型 - * - * 参数 contextType 可选值: - * - '2d': 2d 绘图上下文; */ - contextType: '2d' - ): CanvasRenderingContext.CanvasRenderingContext2D - /** [[RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) Canvas.getContext(string contextType)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.getContext.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 该方法返回 Canvas 的绘图上下文 - * - * **** - * - * 支持获取 2D 和 WebGL 绘图上下文 */ - getContext( - /** 上下文类型 - * - * 参数 contextType 可选值: - * - 'webgl': webgl 绘图上下文; */ - contextType: 'webgl' - ): CanvasRenderingContext.WebGLRenderingContext - /** [[RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) Canvas.getContext(string contextType)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.getContext.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 该方法返回 Canvas 的绘图上下文 - * - * **** - * - * 支持获取 2D 和 WebGL 绘图上下文 */ - getContext( - /** 上下文类型 - * - * 参数 contextType 可选值: - * - 'webgl2': webgl2 绘图上下文; */ - contextType: 'webgl2' - ): CanvasRenderingContext.WebGL2RenderingContext - /** [number Canvas.requestAnimationFrame(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.requestAnimationFrame.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 在下次进行重绘时执行。 支持在 2D Canvas 和 WebGL Canvas 下使用, 但不支持混用 2D 和 WebGL 的方法。 */ - requestAnimationFrame( - /** 执行的 callback */ - callback: (...args: any[]) => any - ): number - /** [string Canvas.toDataURL(string type, number encoderOptions)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.toDataURL.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 返回一个包含图片展示的 data URI 。可以使用 type 参数其类型,默认为 PNG 格式。 */ - toDataURL( - /** 图片格式,默认为 image/png */ - type: string, - /** 在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。 */ - encoderOptions: number - ): string - } - /** @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 - * - * canvas 组件的绘图上下文。CanvasContext 是旧版的接口, 新版 Canvas 2D 接口与 Web 一致。 */ - interface CanvasContext { - /** 需要基础库: `1.9.90` - * - * 填充颜色。用法同 [CanvasContext.setFillStyle()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setFillStyle.html)。 */ - fillStyle: string | CanvasGradient - /** 需要基础库: `1.9.90` - * - * 当前字体样式的属性。符合 [CSS font 语法](https://developer.mozilla.org/zh-CN/docs/Web/CSS/font) 的 DOMString 字符串,至少需要提供字体大小和字体族名。默认值为 10px sans-serif。 */ - font: string - /** 全局画笔透明度。范围 0-1,0 表示完全透明,1 表示完全不透明。 */ - globalAlpha: number - /** 需要基础库: `1.9.90` - * - * 在绘制新形状时应用的合成操作的类型。目前安卓版本只适用于 `fill` 填充块的合成,用于 `stroke` 线段的合成效果都是 `source-over`。 - * - * 目前支持的操作有 - * - 安卓:xor, source-over, source-atop, destination-out, lighter, overlay, darken, lighten, hard-light - * - iOS:xor, source-over, source-atop, destination-over, destination-out, lighter, multiply, overlay, darken, lighten, color-dodge, color-burn, hard-light, soft-light, difference, exclusion, saturation, luminosity */ - globalCompositeOperation: string - /** 需要基础库: `1.9.90` - * - * 线条的端点样式。用法同 [CanvasContext.setLineCap()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setLineCap.html)。 */ - lineCap: string - /** 需要基础库: `1.9.90` - * - * 虚线偏移量,初始值为0 */ - lineDashOffset: number - /** 需要基础库: `1.9.90` - * - * 线条的交点样式。用法同 [CanvasContext.setLineJoin()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setLineJoin.html)。 - * - * 可选值: - * - 'bevel': 斜角; - * - 'round': 圆角; - * - 'miter': 尖角; */ - lineJoin: 'bevel' | 'round' | 'miter' - /** 需要基础库: `1.9.90` - * - * 线条的宽度。用法同 [CanvasContext.setLineWidth()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setLineWidth.html)。 */ - lineWidth: number - /** 需要基础库: `1.9.90` - * - * 最大斜接长度。用法同 [CanvasContext.setMiterLimit()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setMiterLimit.html)。 */ - miterLimit: number - /** 需要基础库: `1.9.90` - * - * 阴影的模糊级别 */ - shadowBlur: number - /** 需要基础库: `1.9.90` - * - * 阴影的颜色 */ - shadowColor: number - /** 需要基础库: `1.9.90` - * - * 阴影相对于形状在水平方向的偏移 */ - shadowOffsetX: number - /** 需要基础库: `1.9.90` - * - * 阴影相对于形状在竖直方向的偏移 */ - shadowOffsetY: number - /** 需要基础库: `1.9.90` - * - * 边框颜色。用法同 [CanvasContext.setStrokeStyle()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setStrokeStyle.html)。 */ - strokeStyle: string | CanvasGradient - /** [CanvasContext.arc(number x, number y, number r, number sAngle, number eAngle, boolean counterclockwise)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.arc.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 创建一条弧线。 -* -* - 创建一个圆可以指定起始弧度为 0,终止弧度为 2 * Math.PI。 -* - 用 `stroke` 或者 `fill` 方法来在 `canvas` 中画弧线。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -// Draw coordinates -ctx.arc(100, 75, 50, 0, 2 * Math.PI) -ctx.setFillStyle('#EEEEEE') -ctx.fill() - -ctx.beginPath() -ctx.moveTo(40, 75) -ctx.lineTo(160, 75) -ctx.moveTo(100, 15) -ctx.lineTo(100, 135) -ctx.setStrokeStyle('#AAAAAA') -ctx.stroke() - -ctx.setFontSize(12) -ctx.setFillStyle('black') -ctx.fillText('0', 165, 78) -ctx.fillText('0.5*PI', 83, 145) -ctx.fillText('1*PI', 15, 78) -ctx.fillText('1.5*PI', 83, 10) - -// Draw points -ctx.beginPath() -ctx.arc(100, 75, 2, 0, 2 * Math.PI) -ctx.setFillStyle('lightgreen') -ctx.fill() - -ctx.beginPath() -ctx.arc(100, 25, 2, 0, 2 * Math.PI) -ctx.setFillStyle('blue') -ctx.fill() - -ctx.beginPath() -ctx.arc(150, 75, 2, 0, 2 * Math.PI) -ctx.setFillStyle('red') -ctx.fill() - -// Draw arc -ctx.beginPath() -ctx.arc(100, 75, 50, 0, 1.5 * Math.PI) -ctx.setStrokeStyle('#333333') -ctx.stroke() - -ctx.draw() -``` -* -* ![](@program/dev/image/canvas/arc.png) -* -* 针对 arc(100, 75, 50, 0, 1.5 * Math.PI)的三个关键坐标如下: -* -* - 绿色: 圆心 (100, 75) -* - 红色: 起始弧度 (0) -* - 蓝色: 终止弧度 (1.5 * Math.PI) */ - arc( - /** 圆心的 x 坐标 */ - x: number, - /** 圆心的 y 坐标 */ - y: number, - /** 圆的半径 */ - r: number, - /** 起始弧度,单位弧度(在3点钟方向) */ - sAngle: number, - /** 终止弧度 */ - eAngle: number, - /** 弧度的方向是否是逆时针 */ - counterclockwise?: boolean - ): void - /** [CanvasContext.arcTo(number x1, number y1, number x2, number y2, number radius)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.arcTo.html) - * - * 需要基础库: `1.9.90` - * - * 在插件中使用:支持 - * @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 - * - * @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** - * - * 根据控制点和半径绘制圆弧路径。 */ - arcTo( - /** 第一个控制点的 x 轴坐标 */ - x1: number, - /** 第一个控制点的 y 轴坐标 */ - y1: number, - /** 第二个控制点的 x 轴坐标 */ - x2: number, - /** 第二个控制点的 y 轴坐标 */ - y2: number, - /** 圆弧的半径 */ - radius: number - ): void - /** [CanvasContext.beginPath()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.beginPath.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 开始创建一个路径。需要调用 `fill` 或者 `stroke` 才会使用路径进行填充或描边 -* -* - 在最开始的时候相当于调用了一次 `beginPath`。 -* - 同一个路径内的多次 `setFillStyle`、`setStrokeStyle`、`setLineWidth`等设置,以最后一次设置为准。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -// begin path -ctx.rect(10, 10, 100, 30) -ctx.setFillStyle('yellow') -ctx.fill() - -// begin another path -ctx.beginPath() -ctx.rect(10, 40, 100, 30) - -// only fill this rect, not in current path -ctx.setFillStyle('blue') -ctx.fillRect(10, 70, 100, 30) - -ctx.rect(10, 100, 100, 30) - -// it will fill current path -ctx.setFillStyle('red') -ctx.fill() -ctx.draw() -``` -* -* ![](@program/dev/image/canvas/fill-path.png) */ - beginPath(): void - /** [CanvasContext.bezierCurveTo(number cp1x, number cp1y, number cp2x, number cp2y, number x, number y)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.bezierCurveTo.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 创建三次方贝塞尔曲线路径。曲线的起始点为路径中前一个点。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -// Draw points -ctx.beginPath() -ctx.arc(20, 20, 2, 0, 2 * Math.PI) -ctx.setFillStyle('red') -ctx.fill() - -ctx.beginPath() -ctx.arc(200, 20, 2, 0, 2 * Math.PI) -ctx.setFillStyle('lightgreen') -ctx.fill() - -ctx.beginPath() -ctx.arc(20, 100, 2, 0, 2 * Math.PI) -ctx.arc(200, 100, 2, 0, 2 * Math.PI) -ctx.setFillStyle('blue') -ctx.fill() - -ctx.setFillStyle('black') -ctx.setFontSize(12) - -// Draw guides -ctx.beginPath() -ctx.moveTo(20, 20) -ctx.lineTo(20, 100) -ctx.lineTo(150, 75) - -ctx.moveTo(200, 20) -ctx.lineTo(200, 100) -ctx.lineTo(70, 75) -ctx.setStrokeStyle('#AAAAAA') -ctx.stroke() - -// Draw quadratic curve -ctx.beginPath() -ctx.moveTo(20, 20) -ctx.bezierCurveTo(20, 100, 200, 100, 200, 20) -ctx.setStrokeStyle('black') -ctx.stroke() - -ctx.draw() -``` -* -* ![](@program/dev/image/canvas/bezier-curve.png) -* -* 针对 moveTo(20, 20) bezierCurveTo(20, 100, 200, 100, 200, 20) 的三个关键坐标如下: -* -* - 红色:起始点(20, 20) -* - 蓝色:两个控制点(20, 100) (200, 100) -* - 绿色:终止点(200, 20) */ - bezierCurveTo( - /** 第一个贝塞尔控制点的 x 坐标 */ - cp1x: number, - /** 第一个贝塞尔控制点的 y 坐标 */ - cp1y: number, - /** 第二个贝塞尔控制点的 x 坐标 */ - cp2x: number, - /** 第二个贝塞尔控制点的 y 坐标 */ - cp2y: number, - /** 结束点的 x 坐标 */ - x: number, - /** 结束点的 y 坐标 */ - y: number - ): void - /** [CanvasContext.clearRect(number x, number y, number width, number height)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.clearRect.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 清除画布上在该矩形区域内的内容 -* -* **示例代码** -* -* clearRect 并非画一个白色的矩形在地址区域,而是清空,为了有直观感受,对 canvas 加了一层背景色。 -* ```html -* -* ``` -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.setFillStyle('red') -ctx.fillRect(0, 0, 150, 200) -ctx.setFillStyle('blue') -ctx.fillRect(150, 0, 150, 200) -ctx.clearRect(10, 10, 150, 75) -ctx.draw() -``` -* ![](@program/dev/image/canvas/clear-rect.png) */ - clearRect( - /** 矩形路径左上角的横坐标 */ - x: number, - /** 矩形路径左上角的纵坐标 */ - y: number, - /** 矩形路径的宽度 */ - width: number, - /** 矩形路径的高度 */ - height: number - ): void - /** [CanvasContext.clip()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.clip.html) -* -* 需要基础库: `1.6.0` -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 从原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内(不能访问画布上的其他区域)。可以在使用 `clip` 方法前通过使用 `save` 方法对当前画布区域进行保存,并在以后的任意时间通过`restore`方法对其进行恢复。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -wx.downloadFile({ - url: 'http://is5.mzstatic.com/image/thumb/Purple128/v4/75/3b/90/753b907c-b7fb-5877-215a-759bd73691a4/source/50x50bb.jpg', - success: function(res) { - ctx.save() - ctx.beginPath() - ctx.arc(50, 50, 25, 0, 2*Math.PI) - ctx.clip() - ctx.drawImage(res.tempFilePath, 25, 25) - ctx.restore() - ctx.draw() - } -}) -``` -* ![](@program/dev/image/canvas/clip.png) */ - clip(): void - /** [CanvasContext.closePath()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.closePath.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 关闭一个路径。会连接起点和终点。如果关闭路径后没有调用 `fill` 或者 `stroke` 并开启了新的路径,那之前的路径将不会被渲染。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.moveTo(10, 10) -ctx.lineTo(100, 10) -ctx.lineTo(100, 100) -ctx.closePath() -ctx.stroke() -ctx.draw() -``` -* ![](@program/dev/image/canvas/close-line.png) -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -// begin path -ctx.rect(10, 10, 100, 30) -ctx.closePath() - -// begin another path -ctx.beginPath() -ctx.rect(10, 40, 100, 30) - -// only fill this rect, not in current path -ctx.setFillStyle('blue') -ctx.fillRect(10, 70, 100, 30) - -ctx.rect(10, 100, 100, 30) - -// it will fill current path -ctx.setFillStyle('red') -ctx.fill() -ctx.draw() -``` -* -* ![](@program/dev/image/canvas/close-path.png) */ - closePath(): void - /** [CanvasContext.createPattern(string image, string repetition)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.createPattern.html) - * - * 需要基础库: `1.9.90` - * - * 在插件中使用:支持 - * @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 - * - * @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** - * - * 对指定的图像创建模式的方法,可在指定的方向上重复元图像 */ - createPattern( - /** 重复的图像源,支持代码包路径和本地临时路径 (本地路径) */ - image: string, - /** 如何重复图像 - * - * 参数 repetition 可选值: - * - 'repeat': 水平竖直方向都重复; - * - 'repeat-x': 水平方向重复; - * - 'repeat-y': 竖直方向重复; - * - 'no-repeat': 不重复; */ - repetition: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat' - ): void - /** [CanvasContext.draw(boolean reserve, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.draw.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 将之前在绘图上下文中的描述(路径、变形、样式)画到 canvas 中。 -* -* **示例代码** -* -* 第二次 draw() reserve 为 true。所以保留了上一次的绘制结果,在上下文设置的 fillStyle 'red' 也变成了默认的 'black'。 -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -ctx.setFillStyle('red') -ctx.fillRect(10, 10, 150, 100) -ctx.draw() -ctx.fillRect(50, 50, 150, 100) -ctx.draw(true) -``` -* ![](@program/dev/image/canvas/reserve.png) -* -* **示例代码** -* -* 第二次 draw() reserve 为 false。所以没有保留了上一次的绘制结果和在上下文设置的 fillStyle 'red'。 -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -ctx.setFillStyle('red') -ctx.fillRect(10, 10, 150, 100) -ctx.draw() -ctx.fillRect(50, 50, 150, 100) -ctx.draw() -``` -* ![](@program/dev/image/canvas/un-reserve.png) */ - draw( - /** 本次绘制是否接着上一次绘制。即 reserve 参数为 false,则在本次调用绘制之前 native 层会先清空画布再继续绘制;若 reserve 参数为 true,则保留当前画布上的内容,本次调用 drawCanvas 绘制的内容覆盖在上面,默认 false。 */ - reserve?: boolean, - /** 绘制完成后执行的回调函数 */ - callback?: (...args: any[]) => any - ): void - /** [CanvasContext.drawImage(string imageResource, number sx, number sy, number sWidth, number sHeight, number dx, number dy, number dWidth, number dHeight)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.drawImage.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 绘制图像到画布 -* -* **示例代码** -* -* 有三个版本的写法: -* -* - drawImage(imageResource, dx, dy) -* - drawImage(imageResource, dx, dy, dWidth, dHeight) -* - drawImage(imageResource, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) 从 1.9.0 起支持 -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -wx.chooseImage({ - success: function(res){ - ctx.drawImage(res.tempFilePaths[0], 0, 0, 150, 100) - ctx.draw() - } -}) - -``` -* ![](@program/dev/image/canvas/draw-image.png) */ - drawImage( - /** 所要绘制的图片资源(网络图片要通过 getImageInfo / downloadFile 先下载) */ - imageResource: string, - /** imageResource的左上角在目标 canvas 上 x 轴的位置 */ - dx: number, - /** imageResource的左上角在目标 canvas 上 y 轴的位置 */ - dy: number - ): void - /** [CanvasContext.drawImage(string imageResource, number sx, number sy, number sWidth, number sHeight, number dx, number dy, number dWidth, number dHeight)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.drawImage.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 绘制图像到画布 -* -* **示例代码** -* -* 有三个版本的写法: -* -* - drawImage(imageResource, dx, dy) -* - drawImage(imageResource, dx, dy, dWidth, dHeight) -* - drawImage(imageResource, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) 从 1.9.0 起支持 -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -wx.chooseImage({ - success: function(res){ - ctx.drawImage(res.tempFilePaths[0], 0, 0, 150, 100) - ctx.draw() - } -}) - -``` -* ![](@program/dev/image/canvas/draw-image.png) */ - drawImage( - /** 所要绘制的图片资源(网络图片要通过 getImageInfo / downloadFile 先下载) */ - imageResource: string, - /** imageResource的左上角在目标 canvas 上 x 轴的位置 */ - dx: number, - /** imageResource的左上角在目标 canvas 上 y 轴的位置 */ - dy: number, - /** 在目标画布上绘制imageResource的宽度,允许对绘制的imageResource进行缩放 */ - dWidth: number, - /** 在目标画布上绘制imageResource的高度,允许对绘制的imageResource进行缩放 */ - dHeight: number - ): void - /** [CanvasContext.drawImage(string imageResource, number sx, number sy, number sWidth, number sHeight, number dx, number dy, number dWidth, number dHeight)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.drawImage.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 绘制图像到画布 -* -* **示例代码** -* -* 有三个版本的写法: -* -* - drawImage(imageResource, dx, dy) -* - drawImage(imageResource, dx, dy, dWidth, dHeight) -* - drawImage(imageResource, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) 从 1.9.0 起支持 -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -wx.chooseImage({ - success: function(res){ - ctx.drawImage(res.tempFilePaths[0], 0, 0, 150, 100) - ctx.draw() - } -}) - -``` -* ![](@program/dev/image/canvas/draw-image.png) */ - drawImage( - /** 所要绘制的图片资源(网络图片要通过 getImageInfo / downloadFile 先下载) */ - imageResource: string, - /** 需要绘制到画布中的,imageResource的矩形(裁剪)选择框的左上角 x 坐标 */ - sx: number, - /** 需要绘制到画布中的,imageResource的矩形(裁剪)选择框的左上角 y 坐标 */ - sy: number, - /** 需要绘制到画布中的,imageResource的矩形(裁剪)选择框的宽度 */ - sWidth: number, - /** 需要绘制到画布中的,imageResource的矩形(裁剪)选择框的高度 */ - sHeight: number, - /** imageResource的左上角在目标 canvas 上 x 轴的位置 */ - dx: number, - /** imageResource的左上角在目标 canvas 上 y 轴的位置 */ - dy: number, - /** 在目标画布上绘制imageResource的宽度,允许对绘制的imageResource进行缩放 */ - dWidth: number, - /** 在目标画布上绘制imageResource的高度,允许对绘制的imageResource进行缩放 */ - dHeight: number - ): void - /** [CanvasContext.fill()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.fill.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 对当前路径中的内容进行填充。默认的填充色为黑色。 -* -* **示例代码** -* -* 如果当前路径没有闭合,fill() 方法会将起点和终点进行连接,然后填充。 -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.moveTo(10, 10) -ctx.lineTo(100, 10) -ctx.lineTo(100, 100) -ctx.fill() -ctx.draw() -``` -* -* fill() 填充的的路径是从 beginPath() 开始计算,但是不会将 fillRect() 包含进去。 -* -* ![](@program/dev/image/canvas/fill-line.png) -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -// begin path -ctx.rect(10, 10, 100, 30) -ctx.setFillStyle('yellow') -ctx.fill() - -// begin another path -ctx.beginPath() -ctx.rect(10, 40, 100, 30) - -// only fill this rect, not in current path -ctx.setFillStyle('blue') -ctx.fillRect(10, 70, 100, 30) - -ctx.rect(10, 100, 100, 30) - -// it will fill current path -ctx.setFillStyle('red') -ctx.fill() -ctx.draw() -``` -* -* ![](@program/dev/image/canvas/fill-path.png) */ - fill(): void - /** [CanvasContext.fillRect(number x, number y, number width, number height)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.fillRect.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 填充一个矩形。用 [`setFillStyle`](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setFillStyle.html) 设置矩形的填充色,如果没设置默认是黑色。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.setFillStyle('red') -ctx.fillRect(10, 10, 150, 75) -ctx.draw() -``` -* ![](@program/dev/image/canvas/fill-rect.png) */ - fillRect( - /** 矩形路径左上角的横坐标 */ - x: number, - /** 矩形路径左上角的纵坐标 */ - y: number, - /** 矩形路径的宽度 */ - width: number, - /** 矩形路径的高度 */ - height: number - ): void - /** [CanvasContext.fillText(string text, number x, number y, number maxWidth)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.fillText.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 在画布上绘制被填充的文本 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -ctx.setFontSize(20) -ctx.fillText('Hello', 20, 20) -ctx.fillText('MINA', 100, 100) - -ctx.draw() -``` -* ![](@program/dev/image/canvas/text.png) */ - fillText( - /** 在画布上输出的文本 */ - text: string, - /** 绘制文本的左上角 x 坐标位置 */ - x: number, - /** 绘制文本的左上角 y 坐标位置 */ - y: number, - /** 需要绘制的最大宽度,可选 */ - maxWidth?: number - ): void - /** [CanvasContext.lineTo(number x, number y)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.lineTo.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 增加一个新点,然后创建一条从上次指定点到目标点的线。用 `stroke` 方法来画线条 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.moveTo(10, 10) -ctx.rect(10, 10, 100, 50) -ctx.lineTo(110, 60) -ctx.stroke() -ctx.draw() -``` -* ![](@program/dev/image/canvas/line-to.png) */ - lineTo( - /** 目标位置的 x 坐标 */ - x: number, - /** 目标位置的 y 坐标 */ - y: number - ): void - /** [CanvasContext.moveTo(number x, number y)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.moveTo.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 把路径移动到画布中的指定点,不创建线条。用 `stroke` 方法来画线条 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.moveTo(10, 10) -ctx.lineTo(100, 10) - -ctx.moveTo(10, 50) -ctx.lineTo(100, 50) -ctx.stroke() -ctx.draw() -``` -* ![](@program/dev/image/canvas/move-to.png) */ - moveTo( - /** 目标位置的 x 坐标 */ - x: number, - /** 目标位置的 y 坐标 */ - y: number - ): void - /** [CanvasContext.quadraticCurveTo(number cpx, number cpy, number x, number y)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.quadraticCurveTo.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 创建二次贝塞尔曲线路径。曲线的起始点为路径中前一个点。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -// Draw points -ctx.beginPath() -ctx.arc(20, 20, 2, 0, 2 * Math.PI) -ctx.setFillStyle('red') -ctx.fill() - -ctx.beginPath() -ctx.arc(200, 20, 2, 0, 2 * Math.PI) -ctx.setFillStyle('lightgreen') -ctx.fill() - -ctx.beginPath() -ctx.arc(20, 100, 2, 0, 2 * Math.PI) -ctx.setFillStyle('blue') -ctx.fill() - -ctx.setFillStyle('black') -ctx.setFontSize(12) - -// Draw guides -ctx.beginPath() -ctx.moveTo(20, 20) -ctx.lineTo(20, 100) -ctx.lineTo(200, 20) -ctx.setStrokeStyle('#AAAAAA') -ctx.stroke() - -// Draw quadratic curve -ctx.beginPath() -ctx.moveTo(20, 20) -ctx.quadraticCurveTo(20, 100, 200, 20) -ctx.setStrokeStyle('black') -ctx.stroke() - -ctx.draw() -``` -* -* ![](@program/dev/image/canvas/quadratic-curve-to.png) -* -* 针对 moveTo(20, 20) quadraticCurveTo(20, 100, 200, 20) 的三个关键坐标如下: -* -* - 红色:起始点(20, 20) -* - 蓝色:控制点(20, 100) -* - 绿色:终止点(200, 20) */ - quadraticCurveTo( - /** 贝塞尔控制点的 x 坐标 */ - cpx: number, - /** 贝塞尔控制点的 y 坐标 */ - cpy: number, - /** 结束点的 x 坐标 */ - x: number, - /** 结束点的 y 坐标 */ - y: number - ): void - /** [CanvasContext.rect(number x, number y, number width, number height)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.rect.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 创建一个矩形路径。需要用 [`fill`](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.fill.html) 或者 [`stroke`](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.stroke.html) 方法将矩形真正的画到 `canvas` 中 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.rect(10, 10, 150, 75) -ctx.setFillStyle('red') -ctx.fill() -ctx.draw() -``` -* ![](@program/dev/image/canvas/fill-rect.png) */ - rect( - /** 矩形路径左上角的横坐标 */ - x: number, - /** 矩形路径左上角的纵坐标 */ - y: number, - /** 矩形路径的宽度 */ - width: number, - /** 矩形路径的高度 */ - height: number - ): void - /** [CanvasContext.restore()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.restore.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 恢复之前保存的绘图上下文。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -// save the default fill style -ctx.save() -ctx.setFillStyle('red') -ctx.fillRect(10, 10, 150, 100) - -// restore to the previous saved state -ctx.restore() -ctx.fillRect(50, 50, 150, 100) - -ctx.draw() -``` -* ![](@program/dev/image/canvas/save-restore.png) */ - restore(): void - /** [CanvasContext.rotate(number rotate)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.rotate.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 以原点为中心顺时针旋转当前坐标轴。多次调用旋转的角度会叠加。原点可以用 `translate` 方法修改。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -ctx.strokeRect(100, 10, 150, 100) -ctx.rotate(20 * Math.PI / 180) -ctx.strokeRect(100, 10, 150, 100) -ctx.rotate(20 * Math.PI / 180) -ctx.strokeRect(100, 10, 150, 100) - -ctx.draw() -``` -* ![](@program/dev/image/canvas/rotate.png) */ - rotate( - /** 旋转角度,以弧度计 degrees * Math.PI/180;degrees 范围为 0-360 */ - rotate: number - ): void - /** [CanvasContext.save()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.save.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 保存绘图上下文。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -// save the default fill style -ctx.save() -ctx.setFillStyle('red') -ctx.fillRect(10, 10, 150, 100) - -// restore to the previous saved state -ctx.restore() -ctx.fillRect(50, 50, 150, 100) - -ctx.draw() -``` -* ![](@program/dev/image/canvas/save-restore.png) */ - save(): void - /** [CanvasContext.scale(number scaleWidth, number scaleHeight)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.scale.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 在调用后,之后创建的路径其横纵坐标会被缩放。多次调用倍数会相乘。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -ctx.strokeRect(10, 10, 25, 15) -ctx.scale(2, 2) -ctx.strokeRect(10, 10, 25, 15) -ctx.scale(2, 2) -ctx.strokeRect(10, 10, 25, 15) - -ctx.draw() -``` -* ![](@program/dev/image/canvas/scale.png) */ - scale( - /** 横坐标缩放的倍数 (1 = 100%,0.5 = 50%,2 = 200%) */ - scaleWidth: number, - /** 纵坐标轴缩放的倍数 (1 = 100%,0.5 = 50%,2 = 200%) */ - scaleHeight: number - ): void - /** [CanvasContext.setFillStyle(string|[CanvasGradient](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasGradient.html) color)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setFillStyle.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [1.9.90](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [CanvasContext.fillStyle](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 设置填充色。 -* -* **代码示例** -* -* ```js -const ctx = wx.createCanvasContext('myCanvas') -ctx.setFillStyle('red') -ctx.fillRect(10, 10, 150, 75) -ctx.draw() -``` -* ![](@program/dev/image/canvas/fill-rect.png) */ - setFillStyle( - /** 填充的颜色,默认颜色为 black。 */ - color: string | CanvasGradient - ): void - /** [CanvasContext.setFontSize(number fontSize)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setFontSize.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [1.9.90](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [CanvasContext.font](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 设置字体的字号 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -ctx.setFontSize(20) -ctx.fillText('20', 20, 20) -ctx.setFontSize(30) -ctx.fillText('30', 40, 40) -ctx.setFontSize(40) -ctx.fillText('40', 60, 60) -ctx.setFontSize(50) -ctx.fillText('50', 90, 90) - -ctx.draw() -``` -* ![](@program/dev/image/canvas/font-size.png) */ - setFontSize( - /** 字体的字号 */ - fontSize: number - ): void - /** [CanvasContext.setGlobalAlpha(number alpha)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setGlobalAlpha.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [1.9.90](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [CanvasContext.globalAlpha](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 设置全局画笔透明度。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -ctx.setFillStyle('red') -ctx.fillRect(10, 10, 150, 100) -ctx.setGlobalAlpha(0.2) -ctx.setFillStyle('blue') -ctx.fillRect(50, 50, 150, 100) -ctx.setFillStyle('yellow') -ctx.fillRect(100, 100, 150, 100) - -ctx.draw() -``` -* ![](@program/dev/image/canvas/global-alpha.png) */ - setGlobalAlpha( - /** 透明度。范围 0-1,0 表示完全透明,1 表示完全不透明。 */ - alpha: number - ): void - /** [CanvasContext.setLineCap(string lineCap)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setLineCap.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [1.9.90](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [CanvasContext.lineCap](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 设置线条的端点样式 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.beginPath() -ctx.moveTo(10, 10) -ctx.lineTo(150, 10) -ctx.stroke() - -ctx.beginPath() -ctx.setLineCap('butt') -ctx.setLineWidth(10) -ctx.moveTo(10, 30) -ctx.lineTo(150, 30) -ctx.stroke() - -ctx.beginPath() -ctx.setLineCap('round') -ctx.setLineWidth(10) -ctx.moveTo(10, 50) -ctx.lineTo(150, 50) -ctx.stroke() - -ctx.beginPath() -ctx.setLineCap('square') -ctx.setLineWidth(10) -ctx.moveTo(10, 70) -ctx.lineTo(150, 70) -ctx.stroke() - -ctx.draw() -``` -* ![](@program/dev/image/canvas/line-cap.png) */ - setLineCap( - /** 线条的结束端点样式 - * - * 参数 lineCap 可选值: - * - 'butt': 向线条的每个末端添加平直的边缘。; - * - 'round': 向线条的每个末端添加圆形线帽。; - * - 'square': 向线条的每个末端添加正方形线帽。; */ - lineCap: 'butt' | 'round' | 'square' - ): void - /** [CanvasContext.setLineDash(Array.<number> pattern, number offset)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setLineDash.html) -* -* 需要基础库: `1.6.0` -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [1.9.90](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [CanvasContext.lineDashOffset](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 设置虚线样式。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -ctx.setLineDash([10, 20], 5); - -ctx.beginPath(); -ctx.moveTo(0,100); -ctx.lineTo(400, 100); -ctx.stroke(); - -ctx.draw() -``` -* ![](@program/dev/image/canvas/set-line-dash.png) */ - setLineDash( - /** 一组描述交替绘制线段和间距(坐标空间单位)长度的数字 */ - pattern: number[], - /** 虚线偏移量 */ - offset: number - ): void - /** [CanvasContext.setLineJoin(string lineJoin)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setLineJoin.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [1.9.90](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [CanvasContext.lineJoin](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 设置线条的交点样式 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.beginPath() -ctx.moveTo(10, 10) -ctx.lineTo(100, 50) -ctx.lineTo(10, 90) -ctx.stroke() - -ctx.beginPath() -ctx.setLineJoin('bevel') -ctx.setLineWidth(10) -ctx.moveTo(50, 10) -ctx.lineTo(140, 50) -ctx.lineTo(50, 90) -ctx.stroke() - -ctx.beginPath() -ctx.setLineJoin('round') -ctx.setLineWidth(10) -ctx.moveTo(90, 10) -ctx.lineTo(180, 50) -ctx.lineTo(90, 90) -ctx.stroke() - -ctx.beginPath() -ctx.setLineJoin('miter') -ctx.setLineWidth(10) -ctx.moveTo(130, 10) -ctx.lineTo(220, 50) -ctx.lineTo(130, 90) -ctx.stroke() - -ctx.draw() -``` -* ![](@program/dev/image/canvas/line-join.png) */ - setLineJoin( - /** 线条的结束交点样式 - * - * 参数 lineJoin 可选值: - * - 'bevel': 斜角; - * - 'round': 圆角; - * - 'miter': 尖角; */ - lineJoin: 'bevel' | 'round' | 'miter' - ): void - /** [CanvasContext.setLineWidth(number lineWidth)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setLineWidth.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [1.9.90](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [CanvasContext.lineWidth](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 设置线条的宽度 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.beginPath() -ctx.moveTo(10, 10) -ctx.lineTo(150, 10) -ctx.stroke() - -ctx.beginPath() -ctx.setLineWidth(5) -ctx.moveTo(10, 30) -ctx.lineTo(150, 30) -ctx.stroke() - -ctx.beginPath() -ctx.setLineWidth(10) -ctx.moveTo(10, 50) -ctx.lineTo(150, 50) -ctx.stroke() - -ctx.beginPath() -ctx.setLineWidth(15) -ctx.moveTo(10, 70) -ctx.lineTo(150, 70) -ctx.stroke() - -ctx.draw() -``` -* -* ![](@program/dev/image/canvas/line-width.png) */ - setLineWidth( - /** 线条的宽度,单位px */ - lineWidth: number - ): void - /** [CanvasContext.setMiterLimit(number miterLimit)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setMiterLimit.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [1.9.90](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [CanvasContext.miterLimit](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 设置最大斜接长度。斜接长度指的是在两条线交汇处内角和外角之间的距离。当 [CanvasContext.setLineJoin()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setLineJoin.html) 为 miter 时才有效。超过最大倾斜长度的,连接处将以 lineJoin 为 bevel 来显示。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.beginPath() -ctx.setLineWidth(10) -ctx.setLineJoin('miter') -ctx.setMiterLimit(1) -ctx.moveTo(10, 10) -ctx.lineTo(100, 50) -ctx.lineTo(10, 90) -ctx.stroke() - -ctx.beginPath() -ctx.setLineWidth(10) -ctx.setLineJoin('miter') -ctx.setMiterLimit(2) -ctx.moveTo(50, 10) -ctx.lineTo(140, 50) -ctx.lineTo(50, 90) -ctx.stroke() - -ctx.beginPath() -ctx.setLineWidth(10) -ctx.setLineJoin('miter') -ctx.setMiterLimit(3) -ctx.moveTo(90, 10) -ctx.lineTo(180, 50) -ctx.lineTo(90, 90) -ctx.stroke() - -ctx.beginPath() -ctx.setLineWidth(10) -ctx.setLineJoin('miter') -ctx.setMiterLimit(4) -ctx.moveTo(130, 10) -ctx.lineTo(220, 50) -ctx.lineTo(130, 90) -ctx.stroke() - -ctx.draw() -``` -* ![](@program/dev/image/canvas/miter-limit.png) */ - setMiterLimit( - /** 最大斜接长度 */ - miterLimit: number - ): void - /** [CanvasContext.setShadow(number offsetX, number offsetY, number blur, string color)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setShadow.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [1.9.90](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [CanvasContext.shadowOffsetX|CanvasContext.shadowOffsetY|CanvasContext.shadowColor|CanvasContext.shadowBlur](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 设定阴影样式。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.setFillStyle('red') -ctx.setShadow(10, 50, 50, 'blue') -ctx.fillRect(10, 10, 150, 75) -ctx.draw() -``` -* ![](@program/dev/image/canvas/shadow.png) */ - setShadow( - /** 阴影相对于形状在水平方向的偏移,默认值为 0。 */ - offsetX: number, - /** 阴影相对于形状在竖直方向的偏移,默认值为 0。 */ - offsetY: number, - /** 阴影的模糊级别,数值越大越模糊。范围 0- 100。,默认值为 0。 */ - blur: number, - /** 阴影的颜色。默认值为 black。 */ - color: string - ): void - /** [CanvasContext.setStrokeStyle(string|[CanvasGradient](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasGradient.html) color)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setStrokeStyle.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [1.9.90](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [CanvasContext.strokeStyle](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 设置描边颜色。 -* -* **代码示例** -* -* ```js -const ctx = wx.createCanvasContext('myCanvas') -ctx.setStrokeStyle('red') -ctx.strokeRect(10, 10, 150, 75) -ctx.draw() -``` -* ![](@program/dev/image/canvas/stroke-rect.png) */ - setStrokeStyle( - /** 描边的颜色,默认颜色为 black。 */ - color: string | CanvasGradient - ): void - /** [CanvasContext.setTextAlign(string align)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setTextAlign.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 设置文字的对齐 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -ctx.setStrokeStyle('red') -ctx.moveTo(150, 20) -ctx.lineTo(150, 170) -ctx.stroke() - -ctx.setFontSize(15) -ctx.setTextAlign('left') -ctx.fillText('textAlign=left', 150, 60) - -ctx.setTextAlign('center') -ctx.fillText('textAlign=center', 150, 80) - -ctx.setTextAlign('right') -ctx.fillText('textAlign=right', 150, 100) - -ctx.draw() -``` -* -* ![](@program/dev/image/canvas/set-text-align.png) */ - setTextAlign( - /** 文字的对齐方式 - * - * 参数 align 可选值: - * - 'left': 左对齐; - * - 'center': 居中对齐; - * - 'right': 右对齐; */ - align: 'left' | 'center' | 'right' - ): void - /** [CanvasContext.setTextBaseline(string textBaseline)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setTextBaseline.html) -* -* 需要基础库: `1.4.0` -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 设置文字的竖直对齐 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -ctx.setStrokeStyle('red') -ctx.moveTo(5, 75) -ctx.lineTo(295, 75) -ctx.stroke() - -ctx.setFontSize(20) - -ctx.setTextBaseline('top') -ctx.fillText('top', 5, 75) - -ctx.setTextBaseline('middle') -ctx.fillText('middle', 50, 75) - -ctx.setTextBaseline('bottom') -ctx.fillText('bottom', 120, 75) - -ctx.setTextBaseline('normal') -ctx.fillText('normal', 200, 75) - -ctx.draw() -``` -* ![](@program/dev/image/canvas/set-text-baseline.png) */ - setTextBaseline( - /** 文字的竖直对齐方式 - * - * 参数 textBaseline 可选值: - * - 'top': 顶部对齐; - * - 'bottom': 底部对齐; - * - 'middle': 居中对齐; - * - 'normal': ; */ - textBaseline: 'top' | 'bottom' | 'middle' | 'normal' - ): void - /** [CanvasContext.setTransform(number scaleX, number skewX, number skewY, number scaleY, number translateX, number translateY)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setTransform.html) - * - * 需要基础库: `1.9.90` - * - * 在插件中使用:支持 - * @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 - * - * @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** - * - * 使用矩阵重新设置(覆盖)当前变换的方法 */ - setTransform( - /** 水平缩放 */ - scaleX: number, - /** 水平倾斜 */ - skewX: number, - /** 垂直倾斜 */ - skewY: number, - /** 垂直缩放 */ - scaleY: number, - /** 水平移动 */ - translateX: number, - /** 垂直移动 */ - translateY: number - ): void - /** [CanvasContext.stroke()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.stroke.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 画出当前路径的边框。默认颜色色为黑色。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.moveTo(10, 10) -ctx.lineTo(100, 10) -ctx.lineTo(100, 100) -ctx.stroke() -ctx.draw() -``` -* ![](@program/dev/image/canvas/stroke-line.png) -* -* stroke() 描绘的的路径是从 beginPath() 开始计算,但是不会将 strokeRect() 包含进去。 -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -// begin path -ctx.rect(10, 10, 100, 30) -ctx.setStrokeStyle('yellow') -ctx.stroke() - -// begin another path -ctx.beginPath() -ctx.rect(10, 40, 100, 30) - -// only stoke this rect, not in current path -ctx.setStrokeStyle('blue') -ctx.strokeRect(10, 70, 100, 30) - -ctx.rect(10, 100, 100, 30) - -// it will stroke current path -ctx.setStrokeStyle('red') -ctx.stroke() -ctx.draw() -``` -* -* ![](@program/dev/image/canvas/stroke-path.png) */ - stroke(): void - /** [CanvasContext.strokeRect(number x, number y, number width, number height)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.strokeRect.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 画一个矩形(非填充)。 用 [`setStrokeStyle`](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setStrokeStyle.html) 设置矩形线条的颜色,如果没设置默认是黑色。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') -ctx.setStrokeStyle('red') -ctx.strokeRect(10, 10, 150, 75) -ctx.draw() -``` -* ![](@program/dev/image/canvas/stroke-rect.png) */ - strokeRect( - /** 矩形路径左上角的横坐标 */ - x: number, - /** 矩形路径左上角的纵坐标 */ - y: number, - /** 矩形路径的宽度 */ - width: number, - /** 矩形路径的高度 */ - height: number - ): void - /** [CanvasContext.strokeText(string text, number x, number y, number maxWidth)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.strokeText.html) - * - * 需要基础库: `1.9.90` - * - * 在插件中使用:支持 - * @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 - * - * @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** - * - * 给定的 (x, y) 位置绘制文本描边的方法 */ - strokeText( - /** 要绘制的文本 */ - text: string, - /** 文本起始点的 x 轴坐标 */ - x: number, - /** 文本起始点的 y 轴坐标 */ - y: number, - /** 需要绘制的最大宽度,可选 */ - maxWidth?: number - ): void - /** [CanvasContext.transform(number scaleX, number skewX, number skewY, number scaleY, number translateX, number translateY)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.transform.html) - * - * 需要基础库: `1.9.90` - * - * 在插件中使用:支持 - * @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 - * - * @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** - * - * 使用矩阵多次叠加当前变换的方法 */ - transform( - /** 水平缩放 */ - scaleX: number, - /** 水平倾斜 */ - skewX: number, - /** 垂直倾斜 */ - skewY: number, - /** 垂直缩放 */ - scaleY: number, - /** 水平移动 */ - translateX: number, - /** 垂直移动 */ - translateY: number - ): void - /** [CanvasContext.translate(number x, number y)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.translate.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 对当前坐标系的原点 (0, 0) 进行变换。默认的坐标系原点为页面左上角。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -ctx.strokeRect(10, 10, 150, 100) -ctx.translate(20, 20) -ctx.strokeRect(10, 10, 150, 100) -ctx.translate(20, 20) -ctx.strokeRect(10, 10, 150, 100) - -ctx.draw() -``` -* -* ![](@program/dev/image/canvas/translate.png) */ - translate( - /** 水平坐标平移量 */ - x: number, - /** 竖直坐标平移量 */ - y: number - ): void - /** [Object CanvasContext.measureText(string text)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.measureText.html) - * - * 需要基础库: `1.9.90` - * - * 在插件中使用:支持 - * @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 - * - * @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** - * - * 测量文本尺寸信息。目前仅返回文本宽度。同步接口。 */ - measureText( - /** 要测量的文本 */ - text: string - ): TextMetrics - /** [[CanvasGradient](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasGradient.html) CanvasContext.createCircularGradient(number x, number y, number r)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.createCircularGradient.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 创建一个圆形的渐变颜色。起点在圆心,终点在圆环。返回的`CanvasGradient`对象需要使用 [CanvasGradient.addColorStop()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasGradient.addColorStop.html) 来指定渐变点,至少要两个。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -// Create circular gradient -const grd = ctx.createCircularGradient(75, 50, 50) -grd.addColorStop(0, 'red') -grd.addColorStop(1, 'white') - -// Fill with gradient -ctx.setFillStyle(grd) -ctx.fillRect(10, 10, 150, 80) -ctx.draw() -``` -* ![](@program/dev/image/canvas/circular-gradient.png) */ - createCircularGradient( - /** 圆心的 x 坐标 */ - x: number, - /** 圆心的 y 坐标 */ - y: number, - /** 圆的半径 */ - r: number - ): CanvasGradient - /** [[CanvasGradient](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasGradient.html) CanvasContext.createLinearGradient(number x0, number y0, number x1, number y1)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.createLinearGradient.html) -* -* 在插件中使用:支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 创建一个线性的渐变颜色。返回的`CanvasGradient`对象需要使用 [CanvasGradient.addColorStop()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasGradient.addColorStop.html) 来指定渐变点,至少要两个。 -* -* **示例代码** -* -* ```javascript -const ctx = wx.createCanvasContext('myCanvas') - -// Create linear gradient -const grd = ctx.createLinearGradient(0, 0, 200, 0) -grd.addColorStop(0, 'red') -grd.addColorStop(1, 'white') - -// Fill with gradient -ctx.setFillStyle(grd) -ctx.fillRect(10, 10, 150, 80) -ctx.draw() -``` -* ![](@program/dev/image/canvas/linear-gradient.png) */ - createLinearGradient( - /** 起点的 x 坐标 */ - x0: number, - /** 起点的 y 坐标 */ - y0: number, - /** 终点的 x 坐标 */ - x1: number, - /** 终点的 y 坐标 */ - y1: number - ): CanvasGradient - } - interface CanvasGetImageDataOption { - /** 画布标识,传入 [canvas](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 组件的 `canvas-id` 属性。 */ - canvasId: string - /** 将要被提取的图像数据矩形区域的高度 */ - height: number - /** 将要被提取的图像数据矩形区域的宽度 */ - width: number - /** 将要被提取的图像数据矩形区域的左上角横坐标 */ - x: number - /** 将要被提取的图像数据矩形区域的左上角纵坐标 */ - y: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CanvasGetImageDataCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CanvasGetImageDataFailCallback - /** 接口调用成功的回调函数 */ - success?: CanvasGetImageDataSuccessCallback - } - interface CanvasGetImageDataSuccessCallbackResult { - /** 图像像素点数据,一维数组,每四项表示一个像素点的 rgba */ - data: Uint8ClampedArray - /** 图像数据矩形的高度 */ - height: number - /** 图像数据矩形的宽度 */ - width: number - errMsg: string - } - interface CanvasPutImageDataOption { - /** 画布标识,传入 [canvas](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 组件的 canvas-id 属性。 */ - canvasId: string - /** 图像像素点数据,一维数组,每四项表示一个像素点的 rgba */ - data: Uint8ClampedArray - /** 源图像数据矩形区域的高度 */ - height: number - /** 源图像数据矩形区域的宽度 */ - width: number - /** 源图像数据在目标画布中的位置偏移量(x 轴方向的偏移量) */ - x: number - /** 源图像数据在目标画布中的位置偏移量(y 轴方向的偏移量) */ - y: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CanvasPutImageDataCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CanvasPutImageDataFailCallback - /** 接口调用成功的回调函数 */ - success?: CanvasPutImageDataSuccessCallback - } - interface CanvasToTempFilePathOption { - /** 画布标识,传入 [canvas](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 组件实例 (canvas type="2d" 时使用该属性)。 */ - canvas?: IAnyObject - /** 画布标识,传入 [canvas](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 组件的 canvas-id */ - canvasId?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CanvasToTempFilePathCompleteCallback - /** 需要基础库: `1.2.0` - * - * 输出的图片的高度 */ - destHeight?: number - /** 需要基础库: `1.2.0` - * - * 输出的图片的宽度 */ - destWidth?: number - /** 接口调用失败的回调函数 */ - fail?: CanvasToTempFilePathFailCallback - /** 需要基础库: `1.7.0` - * - * 目标文件的类型 - * - * 可选值: - * - 'jpg': jpg 图片; - * - 'png': png 图片; */ - fileType?: 'jpg' | 'png' - /** 需要基础库: `1.2.0` - * - * 指定的画布区域的高度 */ - height?: number - /** 需要基础库: `1.7.0` - * - * 图片的质量,目前仅对 jpg 有效。取值范围为 (0, 1],不在范围内时当作 1.0 处理。 */ - quality?: number - /** 接口调用成功的回调函数 */ - success?: CanvasToTempFilePathSuccessCallback - /** 需要基础库: `1.2.0` - * - * 指定的画布区域的宽度 */ - width?: number - /** 需要基础库: `1.2.0` - * - * 指定的画布区域的左上角横坐标 */ - x?: number - /** 需要基础库: `1.2.0` - * - * 指定的画布区域的左上角纵坐标 */ - y?: number - } - interface CanvasToTempFilePathSuccessCallbackResult { - /** 生成文件的临时路径 (本地路径) */ - tempFilePath: string - errMsg: string - } - /** characteristics列表 */ - interface Characteristic { - /** characteristic 的 UUID */ - uuid: string - /** 描述符数据 */ - descriptors?: CharacteristicDescriptor[] - /** 特征权限 */ - permission?: CharacteristicPermission - /** 特征支持的操作 */ - properties?: CharacteristicProperties - /** 特征对应的二进制值 */ - value?: ArrayBuffer - } - /** 描述符数据 */ - interface CharacteristicDescriptor { - /** Descriptor 的 UUID */ - uuid: string - /** 描述符的权限 */ - permission?: DescriptorPermission - /** 描述符数据 */ - value?: ArrayBuffer - } - /** 特征权限 */ - interface CharacteristicPermission { - /** 加密读请求 */ - readEncryptionRequired?: boolean - /** 可读 */ - readable?: boolean - /** 加密写请求 */ - writeEncryptionRequired?: boolean - /** 可写 */ - writeable?: boolean - } - /** 特征支持的操作 */ - interface CharacteristicProperties { - /** 回包 */ - indicate?: boolean - /** 订阅 */ - notify?: boolean - /** 读 */ - read?: boolean - /** 写 */ - write?: boolean - /** 无回复写 */ - writeNoResponse?: boolean - } - interface CheckIsAddedToMyMiniProgramOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CheckIsAddedToMyMiniProgramCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CheckIsAddedToMyMiniProgramFailCallback - /** 接口调用成功的回调函数 */ - success?: CheckIsAddedToMyMiniProgramSuccessCallback - } - interface CheckIsAddedToMyMiniProgramSuccessCallbackResult { - /** 是否被添加至 「我的小程序」 */ - added: boolean - errMsg: string - } - interface CheckIsOpenAccessibilityOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CheckIsOpenAccessibilityCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CheckIsOpenAccessibilityFailCallback - /** 接口调用成功的回调函数 */ - success?: CheckIsOpenAccessibilitySuccessCallback - } - interface CheckIsOpenAccessibilitySuccessCallbackOption { - /** iOS 上开启辅助功能旁白,安卓开启 talkback 时返回 true */ - open: boolean - errMsg: string - } - interface CheckIsSoterEnrolledInDeviceOption { - /** 认证方式 - * - * 可选值: - * - 'fingerPrint': 指纹识别; - * - 'facial': 人脸识别; - * - 'speech': 声纹识别(暂未支持); */ - checkAuthMode: 'fingerPrint' | 'facial' | 'speech' - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CheckIsSoterEnrolledInDeviceCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CheckIsSoterEnrolledInDeviceFailCallback - /** 接口调用成功的回调函数 */ - success?: CheckIsSoterEnrolledInDeviceSuccessCallback - } - interface CheckIsSoterEnrolledInDeviceSuccessCallbackResult { - /** 错误信息 */ - errMsg: string - /** 是否已录入信息 */ - isEnrolled: boolean - } - interface CheckIsSupportSoterAuthenticationOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CheckIsSupportSoterAuthenticationCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CheckIsSupportSoterAuthenticationFailCallback - /** 接口调用成功的回调函数 */ - success?: CheckIsSupportSoterAuthenticationSuccessCallback - } - interface CheckIsSupportSoterAuthenticationSuccessCallbackResult { - /** 该设备支持的可被SOTER识别的生物识别方式 - * - * 可选值: - * - 'fingerPrint': 指纹识别; - * - 'facial': 人脸识别; - * - 'speech': 声纹识别(暂未支持); */ - supportMode: Array<'fingerPrint' | 'facial' | 'speech'> - errMsg: string - } - interface CheckSessionOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CheckSessionCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CheckSessionFailCallback - /** 接口调用成功的回调函数 */ - success?: CheckSessionSuccessCallback - } - interface ChooseAddressOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ChooseAddressCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ChooseAddressFailCallback - /** 接口调用成功的回调函数 */ - success?: ChooseAddressSuccessCallback - } - interface ChooseAddressSuccessCallbackResult { - /** 国标收货地址第二级地址 */ - cityName: string - /** 国标收货地址第三级地址 */ - countyName: string - /** 详细收货地址信息(包括街道地址) */ - detailInfo: string - /** 新选择器详细收货地址信息 */ - detailInfoNew: string - /** 错误信息 */ - errMsg: string - /** 收货地址国家码 */ - nationalCode: string - /** 邮编 */ - postalCode: string - /** 国标收货地址第一级地址 */ - provinceName: string - /** 国标收货地址第四级地址 */ - streetName: string - /** 收货人手机号码 */ - telNumber: string - /** 收货人姓名 */ - userName: string - } - interface ChooseContactOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ChooseContactCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ChooseContactFailCallback - /** 接口调用成功的回调函数 */ - success?: ChooseContactSuccessCallback - } - interface ChooseContactSuccessCallbackOption { - /** 联系人姓名 */ - displayName: string - /** 手机号 */ - phoneNumber: string - /** 选定联系人的所有手机号(部分 Android 系统只能选联系人而不能选特定手机号) */ - phoneNumberList: string - errMsg: string - } - /** 返回选择的文件的本地临时文件对象数组 */ - interface ChooseFile { - /** 选择的文件名称 */ - name: string - /** 本地临时文件路径 (本地路径) */ - path: string - /** 本地临时文件大小,单位 B */ - size: number - /** 选择的文件的会话发送时间,Unix时间戳,工具暂不支持此属性 */ - time: number - /** 选择的文件类型 - * - * 可选值: - * - 'video': 选择了视频文件; - * - 'image': 选择了图片文件; - * - 'file': 选择了除图片和视频的文件; */ - type: 'video' | 'image' | 'file' - } - interface ChooseImageOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ChooseImageCompleteCallback - /** 最多可以选择的图片张数 */ - count?: number - /** 接口调用失败的回调函数 */ - fail?: ChooseImageFailCallback - /** 所选的图片的尺寸 - * - * 可选值: - * - 'original': 原图; - * - 'compressed': 压缩图; */ - sizeType?: Array<'original' | 'compressed'> - /** 选择图片的来源 - * - * 可选值: - * - 'album': 从相册选图; - * - 'camera': 使用相机; */ - sourceType?: Array<'album' | 'camera'> - /** 接口调用成功的回调函数 */ - success?: ChooseImageSuccessCallback - } - interface ChooseImageSuccessCallbackResult { - /** 图片的本地临时文件路径列表 (本地路径) */ - tempFilePaths: string[] - /** 需要基础库: `1.2.0` - * - * 图片的本地临时文件列表 */ - tempFiles: ImageFile[] - errMsg: string - } - interface ChooseInvoiceOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ChooseInvoiceCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ChooseInvoiceFailCallback - /** 接口调用成功的回调函数 */ - success?: ChooseInvoiceSuccessCallback - } - interface ChooseInvoiceSuccessCallbackResult { - /** 用户选中的发票信息,格式为一个 JSON 字符串,包含三个字段: card_id:所选发票卡券的 cardId,encrypt_code:所选发票卡券的加密 code,报销方可以通过 cardId 和 encryptCode 获得报销发票的信息,app_id: 发票方的 appId。 */ - invoiceInfo: string - errMsg: string - } - interface ChooseInvoiceTitleOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ChooseInvoiceTitleCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ChooseInvoiceTitleFailCallback - /** 接口调用成功的回调函数 */ - success?: ChooseInvoiceTitleSuccessCallback - } - interface ChooseInvoiceTitleSuccessCallbackResult { - /** 银行账号 */ - bankAccount: string - /** 银行名称 */ - bankName: string - /** 单位地址 */ - companyAddress: string - /** 错误信息 */ - errMsg: string - /** 抬头税号 */ - taxNumber: string - /** 手机号码 */ - telephone: string - /** 抬头名称 */ - title: string - /** 抬头类型 - * - * 可选值: - * - 0: 单位; - * - 1: 个人; */ - type: 0 | 1 - } - interface ChooseLicensePlateOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ChooseLicensePlateCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ChooseLicensePlateFailCallback - /** 接口调用成功的回调函数 */ - success?: ChooseLicensePlateSuccessCallback - } - interface ChooseLicensePlateSuccessCallbackResult { - /** 用户选择的车牌号 */ - plateNumber: string - errMsg: string - } - interface ChooseLocationOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ChooseLocationCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ChooseLocationFailCallback - /** 需要基础库: `2.9.0` - * - * 目标地纬度 */ - latitude?: number - /** 需要基础库: `2.9.0` - * - * 目标地经度 */ - longitude?: number - /** 接口调用成功的回调函数 */ - success?: ChooseLocationSuccessCallback - } - interface ChooseLocationSuccessCallbackResult { - /** 详细地址 */ - address: string - /** 纬度,浮点数,范围为-90~90,负数表示南纬。使用 gcj02 国测局坐标系 */ - latitude: number - /** 经度,浮点数,范围为-180~180,负数表示西经。使用 gcj02 国测局坐标系 */ - longitude: number - /** 位置名称 */ - name: string - errMsg: string - } - interface ChooseMediaOption { - /** 仅在 sourceType 为 camera 时生效,使用前置或后置摄像头 - * - * 可选值: - * - 'back': 使用后置摄像头; - * - 'front': 使用前置摄像头; */ - camera?: 'back' | 'front' - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ChooseMediaCompleteCallback - /** 最多可以选择的文件个数,基础库2.25.0前,最多可支持9个文件,2.25.0及以后最多可支持20个文件 */ - count?: number - /** 接口调用失败的回调函数 */ - fail?: ChooseMediaFailCallback - /** 拍摄视频最长拍摄时间,单位秒。时间范围为 3s 至 60s 之间。不限制相册。 */ - maxDuration?: number - /** 文件类型 - * - * 可选值: - * - 'image': 只能拍摄图片或从相册选择图片; - * - 'video': 只能拍摄视频或从相册选择视频; - * - 'mix': 可同时选择图片和视频; */ - mediaType?: Array<'image' | 'video' | 'mix'> - /** 是否压缩所选文件,基础库2.25.0前仅对 mediaType 为 image 时有效,2.25.0及以后对全量 mediaType 有效 */ - sizeType?: string[] - /** 图片和视频选择的来源 - * - * 可选值: - * - 'album': 从相册选择; - * - 'camera': 使用相机拍摄; */ - sourceType?: Array<'album' | 'camera'> - /** 接口调用成功的回调函数 */ - success?: ChooseMediaSuccessCallback - } - interface ChooseMediaSuccessCallbackResult { - /** 本地临时文件列表 */ - tempFiles: MediaFile[] - /** 文件类型,有效值有 image 、video、mix */ - type: string - errMsg: string - } - interface ChooseMessageFileOption { - /** 最多可以选择的文件个数,可以 0~100 */ - count: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ChooseMessageFileCompleteCallback - /** 需要基础库: `2.6.0` - * - * 根据文件拓展名过滤,仅 type==file 时有效。每一项都不能是空字符串。默认不过滤。 */ - extension?: string[] - /** 接口调用失败的回调函数 */ - fail?: ChooseMessageFileFailCallback - /** 接口调用成功的回调函数 */ - success?: ChooseMessageFileSuccessCallback - /** 所选的文件的类型 - * - * 可选值: - * - 'all': 从所有文件选择; - * - 'video': 只能选择视频文件; - * - 'image': 只能选择图片文件; - * - 'file': 可以选择除了图片和视频之外的其它的文件; */ - type?: 'all' | 'video' | 'image' | 'file' - } - interface ChooseMessageFileSuccessCallbackResult { - /** 返回选择的文件的本地临时文件对象数组 */ - tempFiles: ChooseFile[] - errMsg: string - } - interface ChoosePoiOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ChoosePoiCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ChoosePoiFailCallback - /** 接口调用成功的回调函数 */ - success?: ChoosePoiSuccessCallback - } - interface ChoosePoiSuccessCallbackResult { - /** 详细地址 */ - address: string - /** 城市名称 */ - city: number - /** 纬度,浮点数,范围为-90~90,负数表示南纬。使用 gcj02 国测局坐标系(即将废弃) */ - latitude: number - /** 经度,浮点数,范围为-180~180,负数表示西经。使用 gcj02 国测局坐标系(即将废弃) */ - longitude: number - /** 位置名称 */ - name: string - /** 选择城市时,值为 1,选择精确位置时,值为 2 */ - type: number - errMsg: string - } - interface ChooseVideoOption { - /** 默认拉起的是前置或者后置摄像头。部分 Android 手机下由于系统 ROM 不支持无法生效 - * - * 可选值: - * - 'back': 默认拉起后置摄像头; - * - 'front': 默认拉起前置摄像头; */ - camera?: 'back' | 'front' - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ChooseVideoCompleteCallback - /** 需要基础库: `1.6.0` - * - * 是否压缩所选择的视频文件 */ - compressed?: boolean - /** 接口调用失败的回调函数 */ - fail?: ChooseVideoFailCallback - /** 拍摄视频最长拍摄时间,单位秒 */ - maxDuration?: number - /** 视频选择的来源 - * - * 可选值: - * - 'album': 从相册选择视频; - * - 'camera': 使用相机拍摄视频; */ - sourceType?: Array<'album' | 'camera'> - /** 接口调用成功的回调函数 */ - success?: ChooseVideoSuccessCallback - } - interface ChooseVideoSuccessCallbackResult { - /** 选定视频的时间长度 */ - duration: number - /** 返回选定视频的高度 */ - height: number - /** 选定视频的数据量大小 */ - size: number - /** 选定视频的临时文件路径 (本地路径) */ - tempFilePath: string - /** 返回选定视频的宽度 */ - width: number - errMsg: string - } - interface ClearFiltersOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ClearFiltersCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ClearFiltersFailCallback - /** 接口调用成功的回调函数 */ - success?: ClearFiltersSuccessCallback - } - interface ClearMakeupsOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ClearMakeupsCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ClearMakeupsFailCallback - /** 接口调用成功的回调函数 */ - success?: ClearMakeupsSuccessCallback - } - interface ClearOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ClearCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ClearFailCallback - /** 接口调用成功的回调函数 */ - success?: ClearSuccessCallback - } - interface ClearStickersOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ClearStickersCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ClearStickersFailCallback - /** 接口调用成功的回调函数 */ - success?: ClearStickersSuccessCallback - } - interface ClearStorageOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ClearStorageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ClearStorageFailCallback - /** 接口调用成功的回调函数 */ - success?: ClearStorageSuccessCallback - } - /** 菜单按钮的布局位置信息 */ - interface ClientRect { - /** 下边界坐标,单位:px */ - bottom: number - /** 高度,单位:px */ - height: number - /** 左边界坐标,单位:px */ - left: number - /** 右边界坐标,单位:px */ - right: number - /** 上边界坐标,单位:px */ - top: number - /** 宽度,单位:px */ - width: number - } - interface CloseBLEConnectionOption { - /** 蓝牙设备 id */ - deviceId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CloseBLEConnectionCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CloseBLEConnectionFailCallback - /** 接口调用成功的回调函数 */ - success?: CloseBLEConnectionSuccessCallback - } - interface CloseBluetoothAdapterOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CloseBluetoothAdapterCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CloseBluetoothAdapterFailCallback - /** 接口调用成功的回调函数 */ - success?: CloseBluetoothAdapterSuccessCallback - } - interface CloseSocketOption { - /** 一个数字值表示关闭连接的状态号,表示连接被关闭的原因。 */ - code?: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CloseSocketCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CloseSocketFailCallback - /** 一个可读的字符串,表示连接被关闭的原因。这个字符串必须是不长于 123 字节的 UTF-8 文本(不是字符)。 */ - reason?: string - /** 接口调用成功的回调函数 */ - success?: CloseSocketSuccessCallback - } - interface CloseSyncOption { - /** 需要被关闭的文件描述符。fd 通过 [FileSystemManager.open](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.open.html) 或 [FileSystemManager.openSync](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.openSync.html) 接口获得 */ - fd: string - } - /** 颜色。可以用以下几种方式来表示 canvas 中使用的颜色: - * - * - RGB 颜色: 如 `'rgb(255, 0, 0)'` - * - RGBA 颜色:如 `'rgba(255, 0, 0, 0.3)'` - * - 16 进制颜色: 如 `'#FF0000'` - * - 预定义的颜色: 如 `'red'` - * - * 其中预定义颜色有以下148个: - * *注意**: Color Name 大小写不敏感 - * - * | Color Name | HEX | - * | -------------------- | ------- | - * | AliceBlue | #F0F8FF | - * | AntiqueWhite | #FAEBD7 | - * | Aqua | #00FFFF | - * | Aquamarine | #7FFFD4 | - * | Azure | #F0FFFF | - * | Beige | #F5F5DC | - * | Bisque | #FFE4C4 | - * | Black | #000000 | - * | BlanchedAlmond | #FFEBCD | - * | Blue | #0000FF | - * | BlueViolet | #8A2BE2 | - * | Brown | #A52A2A | - * | BurlyWood | #DEB887 | - * | CadetBlue | #5F9EA0 | - * | Chartreuse | #7FFF00 | - * | Chocolate | #D2691E | - * | Coral | #FF7F50 | - * | CornflowerBlue | #6495ED | - * | Cornsilk | #FFF8DC | - * | Crimson | #DC143C | - * | Cyan | #00FFFF | - * | DarkBlue | #00008B | - * | DarkCyan | #008B8B | - * | DarkGoldenRod | #B8860B | - * | DarkGray | #A9A9A9 | - * | DarkGrey | #A9A9A9 | - * | DarkGreen | #006400 | - * | DarkKhaki | #BDB76B | - * | DarkMagenta | #8B008B | - * | DarkOliveGreen | #556B2F | - * | DarkOrange | #FF8C00 | - * | DarkOrchid | #9932CC | - * | DarkRed | #8B0000 | - * | DarkSalmon | #E9967A | - * | DarkSeaGreen | #8FBC8F | - * | DarkSlateBlue | #483D8B | - * | DarkSlateGray | #2F4F4F | - * | DarkSlateGrey | #2F4F4F | - * | DarkTurquoise | #00CED1 | - * | DarkViolet | #9400D3 | - * | DeepPink | #FF1493 | - * | DeepSkyBlue | #00BFFF | - * | DimGray | #696969 | - * | DimGrey | #696969 | - * | DodgerBlue | #1E90FF | - * | FireBrick | #B22222 | - * | FloralWhite | #FFFAF0 | - * | ForestGreen | #228B22 | - * | Fuchsia | #FF00FF | - * | Gainsboro | #DCDCDC | - * | GhostWhite | #F8F8FF | - * | Gold | #FFD700 | - * | GoldenRod | #DAA520 | - * | Gray | #808080 | - * | Grey | #808080 | - * | Green | #008000 | - * | GreenYellow | #ADFF2F | - * | HoneyDew | #F0FFF0 | - * | HotPink | #FF69B4 | - * | IndianRed | #CD5C5C | - * | Indigo | #4B0082 | - * | Ivory | #FFFFF0 | - * | Khaki | #F0E68C | - * | Lavender | #E6E6FA | - * | LavenderBlush | #FFF0F5 | - * | LawnGreen | #7CFC00 | - * | LemonChiffon | #FFFACD | - * | LightBlue | #ADD8E6 | - * | LightCoral | #F08080 | - * | LightCyan | #E0FFFF | - * | LightGoldenRodYellow | #FAFAD2 | - * | LightGray | #D3D3D3 | - * | LightGrey | #D3D3D3 | - * | LightGreen | #90EE90 | - * | LightPink | #FFB6C1 | - * | LightSalmon | #FFA07A | - * | LightSeaGreen | #20B2AA | - * | LightSkyBlue | #87CEFA | - * | LightSlateGray | #778899 | - * | LightSlateGrey | #778899 | - * | LightSteelBlue | #B0C4DE | - * | LightYellow | #FFFFE0 | - * | Lime | #00FF00 | - * | LimeGreen | #32CD32 | - * | Linen | #FAF0E6 | - * | Magenta | #FF00FF | - * | Maroon | #800000 | - * | MediumAquaMarine | #66CDAA | - * | MediumBlue | #0000CD | - * | MediumOrchid | #BA55D3 | - * | MediumPurple | #9370DB | - * | MediumSeaGreen | #3CB371 | - * | MediumSlateBlue | #7B68EE | - * | MediumSpringGreen | #00FA9A | - * | MediumTurquoise | #48D1CC | - * | MediumVioletRed | #C71585 | - * | MidnightBlue | #191970 | - * | MintCream | #F5FFFA | - * | MistyRose | #FFE4E1 | - * | Moccasin | #FFE4B5 | - * | NavajoWhite | #FFDEAD | - * | Navy | #000080 | - * | OldLace | #FDF5E6 | - * | Olive | #808000 | - * | OliveDrab | #6B8E23 | - * | Orange | #FFA500 | - * | OrangeRed | #FF4500 | - * | Orchid | #DA70D6 | - * | PaleGoldenRod | #EEE8AA | - * | PaleGreen | #98FB98 | - * | PaleTurquoise | #AFEEEE | - * | PaleVioletRed | #DB7093 | - * | PapayaWhip | #FFEFD5 | - * | PeachPuff | #FFDAB9 | - * | Peru | #CD853F | - * | Pink | #FFC0CB | - * | Plum | #DDA0DD | - * | PowderBlue | #B0E0E6 | - * | Purple | #800080 | - * | RebeccaPurple | #663399 | - * | Red | #FF0000 | - * | RosyBrown | #BC8F8F | - * | RoyalBlue | #4169E1 | - * | SaddleBrown | #8B4513 | - * | Salmon | #FA8072 | - * | SandyBrown | #F4A460 | - * | SeaGreen | #2E8B57 | - * | SeaShell | #FFF5EE | - * | Sienna | #A0522D | - * | Silver | #C0C0C0 | - * | SkyBlue | #87CEEB | - * | SlateBlue | #6A5ACD | - * | SlateGray | #708090 | - * | SlateGrey | #708090 | - * | Snow | #FFFAFA | - * | SpringGreen | #00FF7F | - * | SteelBlue | #4682B4 | - * | Tan | #D2B48C | - * | Teal | #008080 | - * | Thistle | #D8BFD8 | - * | Tomato | #FF6347 | - * | Turquoise | #40E0D0 | - * | Violet | #EE82EE | - * | Wheat | #F5DEB3 | - * | White | #FFFFFF | - * | WhiteSmoke | #F5F5F5 | - * | Yellow | #FFFF00 | - * | YellowGreen | #9ACD32 | */ - interface Color {} - interface CompressImageOption { - /** 图片路径,图片的路径,支持本地路径、代码包路径 */ - src: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CompressImageCompleteCallback - /** 需要基础库: `2.26.0` - * - * 压缩后图片的高度,单位为px,若不填写则默认以compressedWidth为准等比缩放 */ - compressedHeight?: number - /** 需要基础库: `2.26.0` - * - * 压缩后图片的宽度,单位为px,若不填写则默认以compressedHeight为准等比缩放。 */ - compressedWidth?: number - /** 接口调用失败的回调函数 */ - fail?: CompressImageFailCallback - /** 压缩质量,范围0~100,数值越小,质量越低,压缩率越高(仅对jpg有效)。 */ - quality?: number - /** 接口调用成功的回调函数 */ - success?: CompressImageSuccessCallback - } - interface CompressImageSuccessCallbackResult { - /** 压缩后图片的临时文件路径 (本地路径) */ - tempFilePath: string - errMsg: string - } - interface CompressVideoOption { - /** 码率,单位 kbps */ - bitrate: number - /** 帧率 */ - fps: number - /** 相对于原视频的分辨率比例,取值范围(0, 1] */ - resolution: number - /** 视频文件路径,可以是临时文件路径也可以是永久文件路径 */ - src: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CompressVideoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CompressVideoFailCallback - /** 压缩质量 - * - * 可选值: - * - 'low': 低; - * - 'medium': 中; - * - 'high': 高; */ - quality?: 'low' | 'medium' | 'high' - /** 接口调用成功的回调函数 */ - success?: CompressVideoSuccessCallback - } - interface CompressVideoSuccessCallbackResult { - /** 压缩后的大小,单位 kB */ - size: string - /** 压缩后的临时文件地址 */ - tempFilePath: string - errMsg: string - } - interface ConnectSocketOption { - /** 开发者服务器 wss 接口地址 */ - url: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ConnectSocketCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ConnectSocketFailCallback - /** 需要基础库: `2.29.0` - * - * 强制使用蜂窝网络发送请求 */ - forceCellularNetwork?: boolean - /** HTTP Header,Header 中不能设置 Referer */ - header?: IAnyObject - /** 需要基础库: `2.8.0` - * - * 是否开启压缩扩展 */ - perMessageDeflate?: boolean - /** 需要基础库: `1.4.0` - * - * 子协议数组 */ - protocols?: string[] - /** 接口调用成功的回调函数 */ - success?: ConnectSocketSuccessCallback - /** 需要基础库: `2.4.0` - * - * 建立 TCP 连接的时候的 TCP_NODELAY 设置 */ - tcpNoDelay?: boolean - /** 需要基础库: `2.10.0` - * - * 超时时间,单位为毫秒 */ - timeout?: number - } - interface ConnectWifiOption { - /** Wi-Fi 设备 SSID */ - SSID: string - /** Wi-Fi 设备密码 */ - password: string - /** Wi-Fi 设备 BSSID */ - BSSID?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ConnectWifiCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ConnectWifiFailCallback - /** 需要基础库: `2.12.0` - * - * 跳转到系统设置页进行连接 */ - maunal?: boolean - /** 需要基础库: `2.22.0` - * - * 是否需要返回部分 Wi-Fi 信息,仅安卓生效 */ - partialInfo?: boolean - /** 接口调用成功的回调函数 */ - success?: ConnectWifiSuccessCallback - } - /** 一个字典对象,用于指定是否禁用规范化(默认启用规范化) */ - interface Constraints { - /** 如果指定为true则禁用标准化,默认为false */ - disableNormalization?: boolean - } - interface ContextCallbackResult { - /** 节点对应的 Context 对象 */ - context: IAnyObject - } - interface CopyFileOption { - /** 目标文件路径,支持本地路径 */ - destPath: string - /** 源文件路径,支持本地路径 */ - srcPath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CopyFileCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CopyFileFailCallback - /** 接口调用成功的回调函数 */ - success?: CopyFileSuccessCallback - } - interface CreateBLEConnectionOption { - /** 蓝牙设备 id */ - deviceId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CreateBLEConnectionCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CreateBLEConnectionFailCallback - /** 接口调用成功的回调函数 */ - success?: CreateBLEConnectionSuccessCallback - /** 超时时间,单位 ms,不填表示不会超时 */ - timeout?: number - } - interface CreateBLEPeripheralServerOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CreateBLEPeripheralServerCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CreateBLEPeripheralServerFailCallback - /** 接口调用成功的回调函数 */ - success?: CreateBLEPeripheralServerSuccessCallback - } - interface CreateBLEPeripheralServerSuccessCallbackResult { - /** [BLEPeripheralServer](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.html) - * - * 外围设备的服务端。 */ - server: BLEPeripheralServer - errMsg: string - } - interface CreateCacheManagerOption { - /** 额外的缓存处理 */ - extra?: ExtraOption - /** 全局缓存有效时间,单位为毫秒,默认为 7 天,最长不超过 30 天 */ - maxAge?: number - /** 缓存模式 - * - * 可选值: - * - 'weakNetwork': 弱网/离线使用缓存返回; - * - 'always': 总是使用缓存返回; - * - 'none': 不开启,后续可手动开启/停止使用缓存返回; */ - mode?: 'weakNetwork' | 'always' | 'none' - /** 全局 origin */ - origin?: string - } - interface CreateInferenceSessionOption { - /** 模型文件路径,目前只执行后缀为.onnx格式(支持代码包路径,和本地文件系统路径) */ - model: string - /** 是否使用NPU推理,仅对IOS有效 */ - allowNPU?: boolean - /** 是否生成量化模型推理 */ - allowQuantize?: boolean - /** 推理精度,有效值为 0 - 4。一般来说,使用的precesionLevel等级越低,推理速度越快,但可能会损失精度。推荐开发者在开发时,在效果满足需求时优先使用更低精度以提高推理速度,节约能耗。 - * - * 可选值: - * - 0: 使用fp16 存储浮点,fp16计算,Winograd 算法也采取fp16 计算,开启近似math计算; - * - 1: 使用fp16 存储浮点,fp16计算,禁用 Winograd 算法,开启近似math计算; - * - 2: 使用fp16 存储浮点,fp32计算,开启 Winograd,开启近似math计算; - * - 3: 使用fp32 存储浮点,fp32计算,开启 Winograd,开启近似math计算; - * - 4: 使用fp32 存储浮点,fp32计算,开启 Winograd,关闭近似math计算; */ - precesionLevel?: 0 | 1 | 2 | 3 | 4 - /** 输入典型分辨率 */ - typicalShape?: IAnyObject - } - interface CreateInnerAudioContextOption { - /** 需要基础库: `2.19.0` - * - * 是否使用 WebAudio 作为底层音频驱动,默认关闭。对于短音频、播放频繁的音频建议开启此选项,开启后将获得更优的性能表现。由于开启此选项后也会带来一定的内存增长,因此对于长音频建议关闭此选项。 */ - useWebAudioImplement?: boolean - } - /** 选项 */ - interface CreateIntersectionObserverOption { - /** 初始的相交比例,如果调用时检测到的相交比例与这个值不相等且达到阈值,则会触发一次监听器的回调函数。 */ - initialRatio?: number - /** 需要基础库: `3.5.7` - * - * 是否使用原生观察器模式。 */ - nativeMode?: boolean - /** 需要基础库: `2.0.0` - * - * 是否同时观测多个目标节点(而非一个),如果设为 true ,observe 的 targetSelector 将选中多个节点(注意:同时选中过多节点将影响渲染性能) */ - observeAll?: boolean - /** 一个数值数组,包含所有阈值。 */ - thresholds?: number[] - } - interface CreateInterstitialAdOption { - /** 广告单元 id */ - adUnitId: string - } - interface CreateMediaRecorderOption { - /** 指定录制的时长(s),到达自动停止。最大 7200,最小 5 */ - duration?: number - /** 视频 fps */ - fps?: number - /** 视频关键帧间隔 */ - gop?: number - /** 画布录制高度 */ - height?: number - /** 视频比特率(kbps),最小值 600,最大值 3000 */ - videoBitsPerSecond?: number - /** 画布录制宽度 */ - width?: number - } - interface CreateOffscreenCanvasOption { - /** 在自定义组件下,当前组件实例的 this */ - compInst?: Component.TrivialInstance | Page.TrivialInstance - /** 画布高度 */ - height?: number - /** 创建的离屏 canvas 类型 - * - * 可选值: - * - 'webgl': webgl类型上下文; - * - '2d': 2d类型上下文; */ - type?: 'webgl' | '2d' - /** 画布宽度 */ - width?: number - } - interface CreateRewardedVideoAdOption { - /** 广告单元 id */ - adUnitId: string - /** 需要基础库: `2.8.0` - * - * 是否启用多例模式,默认为false */ - multiton?: boolean - } - /** 可选参数 */ - interface CreateWorkerOption { - /** 需要基础库: `2.13.0` - * - * 是否使用实验worker。在iOS下,实验worker的JS运行效率比非实验worker提升数倍,如需在worker内进行重度计算的建议开启此选项。同时,实验worker存在极小概率会在系统资源紧张时被系统回收,因此建议配合 worker.onProcessKilled 事件使用,在worker被回收后可重新创建一个。 */ - useExperimentalWorker?: boolean - } - interface CropImageOption { - /** 裁剪比例 - * - * 可选值: - * - '16:9': 宽高比为16比9; - * - '9:16': 宽高比为9比16; - * - '4:3': 宽高比为4比3; - * - '3:4': 宽高比为3比4; - * - '5:4': 宽高比为5比4; - * - '4:5': 宽高比为4比5; - * - '1:1': 宽高比为1比1; */ - cropScale: '16:9' | '9:16' | '4:3' | '3:4' | '5:4' | '4:5' | '1:1' - /** 图片路径,图片的路径,支持本地路径、代码包路径 */ - src: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: CropImageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: CropImageFailCallback - /** 接口调用成功的回调函数 */ - success?: CropImageSuccessCallback - } - interface CropImageSuccessCallbackResult { - /** 编辑后图片的临时文件路径 (本地路径) */ - tempFilePath: string - errMsg: string - } - interface CurrentState { - /** 当前缓存中的日志条数 */ - logCount: number - /** 当前缓存中最大可存日志条数 */ - maxLogCount: number - /** 当前缓存最大可用空间,以字节为单位 */ - maxSize: number - /** 当前缓存中已使用空间,以字节为单位 */ - size: number - } - /** 自定义路由动画配置 */ - interface CustomRouteConfig { - /** 遮罩层背景色,支持 `rgba()` 和 `#RRGGBBAA` 写法 */ - barrierColor: string - /** 点击遮罩层返回上一页 */ - barrierDismissible: boolean - /** 无障碍语义 */ - barrierLabel: string - /** 是否与前一个页面联动,决定前一个页 `secondaryAnimation` 是否生效 */ - canTransitionFrom: boolean - /** 是否与下一个页面联动,决定当前页 `secondaryAnimation` 是否生效 */ - canTransitionTo: boolean - /** 是否保持前一个页面状态 */ - maintainState: boolean - /** 下一个页面推入后,不显示前一个页面 */ - opaque: boolean - /** 页面推出动画时长,单位 ms */ - reverseTransitionDuration: number - /** 页面推入动画时长,单位 ms */ - transitionDuration: number - } - /** 自定义路由上下文对象 */ - interface CustomRouteContext { - /** 返回上一级,效果同 `wx.navigateBack`,仅可用于 `worklet` 函数内 */ - didPop: (...args: any[]) => any - /** 动画控制器,影响推入页面的进入和退出过渡效果 */ - primaryAnimation: SharedValue - /** 动画控制器状态 */ - primaryAnimationStatus: SharedValue - /** 动画控制器,影响栈顶页面的推出过渡效果 */ - secondaryAnimation: SharedValue - /** 动画控制器状态 */ - secondaryAnimationStatus: SharedValue - /** 手势开始控制路由,与共享元素动画有关 */ - startUserGesture: (...args: any[]) => any - /** 手势不再控制路由,与 `startUserGesture` 成对调用 */ - stopUserGesture: (...args: any[]) => any - /** 当前路由进度由手势控制 */ - userGestureInProgress: SharedValue - } - /** 弹幕内容 */ - interface Danmu { - /** 弹幕文字 */ - text: string - /** 弹幕颜色 */ - color?: string - } - /** 动画配置 */ - interface DecayOption { - /** 边界值,长度为 2 的数组 */ - clamp?: any[] - /** 衰减速率 */ - deceleration?: number - /** 初速度 */ - velocity?: number - } - /** 帧深度纹理buffer对象 */ - interface DepthBufferRes { - /** 深度纹理buffer */ - DepthAddress: ArrayBuffer - /** 深度纹理高 */ - height: number - /** 深度纹理宽 */ - width: number - } - /** 需要基础库: `3.0.0` - * - * 深度识别配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/depth.html)。 */ - interface DepthTrack { - /** 需要基础库: `3.0.0` - * - * 深度识别模式 - * - * 可选值: - * - 1: 通过摄像头实时检测; - * - 2: 静态图片检测; */ - mode: 1 | 2 - } - /** 可选的字体描述符 */ - interface DescOption { - /** 字体样式,可选值为 normal / italic / oblique */ - style?: string - /** 设置小型大写字母的字体显示文本,可选值为 normal / small-caps / inherit */ - variant?: string - /** 字体粗细,可选值为 normal / bold / 100 / 200../ 900 */ - weight?: string - } - /** 描述符的权限 */ - interface DescriptorPermission { - /** 读 */ - read?: boolean - /** 写 */ - write?: boolean - } - /** 指定 marker 移动到的目标点 */ - interface DestinationOption { - /** 纬度 */ - latitude: number - /** 经度 */ - longitude: number - } - interface DetectBodyOption { - /** 人脸图像像素点数据,每四项表示一个像素点的 RGBA */ - frameBuffer: ArrayBuffer - /** 图像高度 */ - height: number - /** 图像宽度 */ - width: number - /** 评分阈值。正常情况传入 0.8 即可。 */ - scoreThreshold?: number - /** 图像源类型。正常情况传入 1 即可。当输入的图片是来自一个连续视频的每一帧图像时,sourceType 传入 0 会得到更优的效果 - * - * 可选值: - * - 1: 表示输入的图片是随机的图片; - * - 0: 表示输入的图片是来自一个连续视频的每一帧图像; */ - sourceType?: 1 | 0 - } - interface DetectDepthOption { - /** 需要识别深度的图像像素点数据,每四项表示一个像素点的 RGBA */ - frameBuffer: ArrayBuffer - /** 图像高度 */ - height: number - /** 图像宽度 */ - width: number - } - interface DetectFaceOption { - /** 人脸图像像素点数据,每四项表示一个像素点的 RGBA */ - frameBuffer: ArrayBuffer - /** 图像高度 */ - height: number - /** 图像宽度 */ - width: number - /** 算法模型类型。正常情况传入 1 即可。0、1、2 分别表示小、中、大模型,模型越大识别准确率越高,但资源占用也越高。建议根据用户设备性能进行选择。 - * - * 可选值: - * - 0: 小模型; - * - 1: 中模型; - * - 2: 大模型; */ - modelModel?: 0 | 1 | 2 - /** 评分阈值。正常情况传入 0.8 即可。 */ - scoreThreshold?: number - /** 图像源类型。正常情况传入 1 即可。当输入的图片是来自一个连续视频的每一帧图像时,sourceType 传入 0 会得到更优的效果 - * - * 可选值: - * - 1: 表示输入的图片是随机的图片; - * - 0: 表示输入的图片是来自一个连续视频的每一帧图像; */ - sourceType?: 1 | 0 - } - interface DetectHandOption { - /** 人脸图像像素点数据,每四项表示一个像素点的 RGBA */ - frameBuffer: ArrayBuffer - /** 图像高度 */ - height: number - /** 图像宽度 */ - width: number - /** 算法检测模式 - * - * 可选值: - * - 0: 检测模式,输出框和点; - * - 1: 手势模式,输出框和手势分类; - * - 2: 结合0和1模式,输出框、点、手势分类; */ - algoMode?: 0 | 1 | 2 - /** 评分阈值。正常情况传入 0.8 即可。 */ - scoreThreshold?: number - } - interface DeviceInfo { - /** 应用(微信APP)二进制接口类型(仅 Android 支持) */ - abi: string - /** 设备性能等级(仅 Android 支持)。取值为:-2 或 0(该设备无法运行小游戏),-1(性能未知),>=1(设备性能值,该值越高,设备性能越好,目前最高不到50)
注意:从基础库3.4.5开始,本返回值停止维护,请使用[wx.getDeviceBenchmarkInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getDeviceBenchmarkInfo.html)获取设备性能等级 */ - benchmarkLevel: number - /** 设备品牌 */ - brand: string - /** 需要基础库: `2.29.0` - * - * 设备 CPU 型号(仅 Android 支持)(Tips: GPU 型号可通过 WebGLRenderingContext.getExtension('WEBGL_debug_renderer_info') 来获取) */ - cpuType: string - /** 需要基础库: `2.25.1` - * - * 设备二进制接口类型(仅 Android 支持) */ - deviceAbi: string - /** 需要基础库: `2.30.0` - * - * 设备内存大小,单位为 MB */ - memorySize: string - /** 设备型号。新机型刚推出一段时间会显示unknown,微信会尽快进行适配。 */ - model: string - /** 客户端平台 */ - platform: string - /** 操作系统及版本 */ - system: string - } - interface DeviceVoIPInfo { - /** 需要基础库: `2.30.4` - * - * 设备组的唯一标识 id(仅设备组时) */ - group_id: string - /** 设备型号 id。通过微信公众平台注册设备获得。(仅单台设备时) */ - model_id: string - /** 设备唯一序列号。(仅单台设备时) */ - sn: string - /** 设备(组)授权状态。0:未授权;1:已授权 */ - status: number - } - interface DisableAlertBeforeUnloadOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: DisableAlertBeforeUnloadCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: DisableAlertBeforeUnloadFailCallback - /** 接口调用成功的回调函数 */ - success?: DisableAlertBeforeUnloadSuccessCallback - } - interface DownloadFileOption { - /** 下载资源的 url */ - url: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: DownloadFileCompleteCallback - /** 需要基础库: `2.10.4` - * - * 是否开启 http2 */ - enableHttp2?: boolean - /** 是否开启 profile,默认开启。开启后可在接口回调的 res.profile 中查看性能调试信息。 */ - enableProfile?: boolean - /** 需要基础库: `2.10.4` - * - * 是否开启 Quic 协议(gQUIC Q43) */ - enableQuic?: boolean - /** 接口调用失败的回调函数 */ - fail?: DownloadFileFailCallback - /** 需要基础库: `1.8.0` - * - * 指定文件下载后存储的路径 (本地路径) */ - filePath?: string - /** HTTP 请求的 Header,Header 中不能设置 Referer */ - header?: IAnyObject - /** 接口调用成功的回调函数 */ - success?: DownloadFileSuccessCallback - /** 需要基础库: `2.10.0` - * - * 超时时间,单位为毫秒,默认值为 60000 即一分钟。 */ - timeout?: number - /** 需要基础库: `3.4.1` - * - * 使用高性能模式,暂仅支持 Android,默认关闭。该模式下有更优的网络性能表现。 */ - useHighPerformanceMode?: boolean - } - interface DownloadFileSuccessCallbackResult { - /** 用户文件路径 (本地路径)。传入 filePath 时会返回,跟传入的 filePath 一致 */ - filePath: string - /** 需要基础库: `2.10.4` - * - * 网络请求过程中一些调试信息,[查看详细说明](https://developers.weixin.qq.com/miniprogram/dev/framework/performance/network.html) */ - profile: RequestProfile - /** 开发者服务器返回的 HTTP 状态码 */ - statusCode: number - /** 临时文件路径 (本地路径)。没传入 filePath 指定文件存储路径时会返回,下载后的文件会存储到一个临时文件 */ - tempFilePath: string - errMsg: string - } - interface DownloadTaskOnHeadersReceivedListenerResult { - /** 开发者服务器返回的 HTTP Response Header */ - header: IAnyObject - } - interface DownloadTaskOnProgressUpdateListenerResult { - /** 下载进度百分比 */ - progress: number - /** 预期需要下载的数据总长度,单位 Bytes */ - totalBytesExpectedToWrite: number - /** 已经下载的数据长度,单位 Bytes */ - totalBytesWritten: number - } - interface DraggableSheetContextScrollToOption { - /** 是否启用滚动动画 */ - animated?: boolean - /** 滚动动画时长(ms) */ - duration?: number - /** 缓动函数 */ - easingFunction?: string - /** 绝对目标位置 */ - pixels?: number - /** 相对目标位置 */ - size?: number - } - interface EditImageOption { - /** 图片路径,图片的路径,支持本地路径、代码包路径 */ - src: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: EditImageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: EditImageFailCallback - /** 接口调用成功的回调函数 */ - success?: EditImageSuccessCallback - } - interface EnableAlertBeforeUnloadOption { - /** 询问对话框内容 */ - message: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: EnableAlertBeforeUnloadCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: EnableAlertBeforeUnloadFailCallback - /** 接口调用成功的回调函数 */ - success?: EnableAlertBeforeUnloadSuccessCallback - } - /** 文件读取结果。res.entries 是一个对象,key是文件路径,value是一个对象 FileItem ,表示该文件的读取结果。每个 FileItem 包含 data (文件内容) 和 errMsg (错误信息) 属性。 */ - interface EntriesResult { - /** 文件路径 */ - [path: string]: ZipFileItem - } - /** 要读取的压缩包内的文件列表(当传入"all" 时表示读取压缩包内所有文件) */ - interface EntryItem { - /** 压缩包内文件路径 */ - path: string - /** 指定读取文件的字符编码,如果不传 encoding,则以 ArrayBuffer 格式读取文件的二进制内容 - * - * 可选值: - * - 'ascii': ; - * - 'base64': ; - * - 'binary': ; - * - 'hex': ; - * - 'ucs2': 以小端序读取; - * - 'ucs-2': 以小端序读取; - * - 'utf16le': 以小端序读取; - * - 'utf-16le': 以小端序读取; - * - 'utf-8': ; - * - 'utf8': ; - * - 'latin1': ; */ - encoding?: - | 'ascii' - | 'base64' - | 'binary' - | 'hex' - | 'ucs2' - | 'ucs-2' - | 'utf16le' - | 'utf-16le' - | 'utf-8' - | 'utf8' - | 'latin1' - /** 指定文件的长度,如果不指定,则读到文件末尾。有效范围:[1, fileLength]。单位:byte */ - length?: number - /** 从文件指定位置开始读,如果不指定,则从文件头开始读。读取的范围应该是左闭右开区间 [position, position+length)。有效范围:[0, fileLength - 1]。单位:byte */ - position?: number - } - /** 要擦除的线段数组。详见 [polyline 属性](https://developers.weixin.qq.com/miniprogram/dev/component/map.html#polyline)。 */ - interface EraseLineOptions { - /** 线段的 id。 */ - id: number - /** 指定线段的某一段,线段起点 index 为 0 */ - index: number - /** 指定线段某一段中的点 */ - point: MapPostion - /** 为 true 时擦除,false 时置灰 */ - clear?: boolean - } - interface EraseLinesOption { - /** 要擦除的线段数组。详见 [polyline 属性](https://developers.weixin.qq.com/miniprogram/dev/component/map.html#polyline)。 */ - lines: EraseLineOptions[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: EraseLinesCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: EraseLinesFailCallback - /** 接口调用成功的回调函数 */ - success?: EraseLinesSuccessCallback - } - /** 错误 */ - interface Error { - /** 错误 */ - message: string - /** 错误调用堆栈 */ - stack: string - } - /** 需要基础库: `3.4.0` - * - * 网络请求过程中的一些异常信息(例如:TCPSocket.connect 传了 enableHttpDNS: true,但最终未使用 HttpDNS 时,exception 就会说明未使用 HttpDNS 的原因) */ - interface Exception { - /** 需要基础库: `3.4.0` - * - * 异常信息 */ - reasons: TCPExceptionReason[] - } - /** 本次请求底层失败信息,所有失败信息均符合Errno错误码 */ - interface ExceptionReason { - /** 错误原因 */ - errMsg: string - /** 错误码 */ - errno: string - } - interface ExecuteVisualLayerCommandOption { - /** 图层指令 */ - command: string - /** 可视化图层id */ - layerId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ExecuteVisualLayerCommandCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ExecuteVisualLayerCommandFailCallback - /** 接口调用成功的回调函数 */ - success?: ExecuteVisualLayerCommandSuccessCallback - } - interface ExecuteVisualLayerCommandSuccessCallbackResult { - /** SDK 返回的 JSON 数据 */ - data: string - /** 调用结果 */ - errMsg: string - } - interface ExitCastingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ExitCastingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ExitCastingFailCallback - /** 接口调用成功的回调函数 */ - success?: ExitCastingSuccessCallback - } - interface ExitFullScreenOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ExitFullScreenCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ExitFullScreenFailCallback - /** 接口调用成功的回调函数 */ - success?: ExitFullScreenSuccessCallback - } - interface ExitMiniProgramOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ExitMiniProgramCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ExitMiniProgramFailCallback - /** 接口调用成功的回调函数 */ - success?: ExitMiniProgramSuccessCallback - } - interface ExitPictureInPictureOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ExitPictureInPictureCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ExitPictureInPictureFailCallback - /** 接口调用成功的回调函数 */ - success?: ExitPictureInPictureSuccessCallback - } - interface ExitVoIPChatOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ExitVoIPChatCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ExitVoIPChatFailCallback - /** 接口调用成功的回调函数 */ - success?: ExitVoIPChatSuccessCallback - } - /** 客服信息 */ - interface ExtInfoOption { - /** 客服链接 */ - url: string - } - /** 额外的缓存处理 */ - interface ExtraOption { - /** 需要缓存的 wx api 接口,不传则表示支持缓存的接口全都做缓存处理。返回的如果是缓存数据,开发者可通过 fromCache 标记区分 - * - * 可选值: - * - 'wx.login': ; - * - 'wx.checkSession': ; - * - 'wx.getSetting': ; */ - apiList?: Array<'wx.login' | 'wx.checkSession' | 'wx.getSetting'> - } - interface ExtractDataSourceOption { - /** 视频源地址,只支持本地文件 */ - source: string - } - /** 人脸角度信息,取值范围 [-1, 1],数值越接近 0 表示越正对摄像头 */ - interface FaceAngel { - /** 仰俯角(点头) */ - pitch: number - /** 翻滚角(左右倾) */ - roll: number - /** 偏航角(摇头) */ - yaw: number - } - /** 人脸置信度,取值范围 [0, 1],数值越大置信度越高(遮挡越少) */ - interface FaceConf { - /** 整体可信度 */ - global: number - /** 左眼可信度 */ - leftEye: number - /** 嘴巴可信度 */ - mouth: number - /** 鼻子可信度 */ - nose: number - /** 右眼可信度 */ - rightEye: number - } - interface FaceDetectOption { - /** 图像像素点数据,每四项表示一个像素点的 RGBA */ - frameBuffer: ArrayBuffer - /** 图像高度 */ - height: number - /** 图像宽度 */ - width: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: FaceDetectCompleteCallback - /** 是否返回当前图像的人脸角度信息 */ - enableAngle?: boolean - /** 是否返回当前图像的人脸的置信度(可表示器官遮挡情况) */ - enableConf?: boolean - /** 是否返回多张人脸的信息 */ - enableMultiFace?: boolean - /** 是否返回当前图像的人脸(106 个点) */ - enablePoint?: boolean - /** 接口调用失败的回调函数 */ - fail?: FaceDetectFailCallback - /** 接口调用成功的回调函数 */ - success?: FaceDetectSuccessCallback - } - interface FaceDetectSuccessCallbackResult { - /** 人脸角度信息,取值范围 [-1, 1],数值越接近 0 表示越正对摄像头 */ - angleArray: FaceAngel - /** 人脸置信度,取值范围 [0, 1],数值越大置信度越高(遮挡越少) */ - confArray: FaceConf - /** 脸部方框数值,对象包含 height, width, originX, originY 四个属性 (origin 为方框左上角坐标) */ - detectRect: IAnyObject - /** 多人模式(enableMultiFace)下的人脸信息,每个对象包含上述其它属性 */ - faceInfo: IAnyObject[] - /** 标记人脸轮廓的 106 个点位置数组,数组每个对象包含 x 和 y */ - pointArray: IAnyObject[] - /** 脸部中心点横坐标,检测不到人脸则为 -1 */ - x: number - /** 脸部中心点纵坐标,检测不到人脸则为 -1 */ - y: number - errMsg: string - } - /** 需要基础库: `2.25.0` - * - * 人脸检测配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/face.html)。安卓微信8.0.25开始支持,iOS微信8.0.24开始支持。 */ - interface FaceTrack { - /** 需要基础库: `2.25.0` - * - * 人脸检测模式 - * - * 可选值: - * - 1: 通过摄像头实时检测; - * - 2: 静态图片检测; */ - mode: 1 | 2 - } - interface Fields { - /** 需要基础库: `2.1.0` - * - * 指定样式名列表,返回节点对应样式名的当前值 */ - computedStyle?: string[] - /** 需要基础库: `2.4.2` - * - * 是否返回节点对应的 Context 对象 */ - context?: boolean - /** 是否返回节点 dataset */ - dataset?: boolean - /** 是否返回节点 id */ - id?: boolean - /** 是否返回节点 mark */ - mark?: boolean - /** 需要基础库: `2.7.0` - * - * 是否返回节点对应的 Node 实例 */ - node?: boolean - /** 指定属性名列表,返回节点对应属性名的当前属性值(只能获得组件文档中标注的常规属性值,id class style 和事件绑定的属性值不可获取) */ - properties?: string[] - /** 是否返回节点布局位置(`left` `right` `top` `bottom`) */ - rect?: boolean - /** 需要基础库: `3.3.0` - * - * 是否返回节点对应的 Ref 对象,仅 `Skyline` 下支持 */ - ref?: boolean - /** 否 是否返回节点的 `scrollLeft` `scrollTop`,节点必须是 `scroll-view` 或者 `viewport` */ - scrollOffset?: boolean - /** 是否返回节点尺寸(`width` `height`) */ - size?: boolean - } - /** 文件数组 */ - interface FileItem { - /** 文件保存时的时间戳,从1970/01/01 08:00:00 到当前时间的秒数 */ - createTime: number - /** 文件路径 (本地路径) */ - filePath: string - /** 本地文件大小,以字节为单位 */ - size: number - } - /** 每个 FileStats 对象包含 path 和 Stats */ - interface FileStats { - /** 文件/目录路径 */ - path: string - /** [Stats](https://developers.weixin.qq.com/miniprogram/dev/api/file/Stats.html) - * - * Stats 对象,即描述文件状态的对象 */ - stats: Stats - } - interface FileSystemManagerCloseOption { - /** 需要被关闭的文件描述符。fd 通过 [FileSystemManager.open](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.open.html) 或 [FileSystemManager.openSync](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.openSync.html) 接口获得 */ - fd: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: FileSystemManagerCloseCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: FileSystemManagerCloseFailCallback - /** 接口调用成功的回调函数 */ - success?: FileSystemManagerCloseSuccessCallback - } - /** 打开的文件信息数组,只有从聊天素材场景打开(scene为1173)才会携带该参数 */ - interface ForwardMaterials { - /** 文件名 */ - name: string - /** 文件路径(如果是webview则是url) */ - path: string - /** 文件大小 */ - size: number - /** 文件的mimetype类型 */ - type: string - } - /** 视频帧数据,若取不到则返回 null。当缓冲区为空的时候可能暂停取不到数据。 */ - interface FrameDataOptions { - /** 帧数据 */ - data: ArrayBuffer - /** 帧数据高度 */ - height: number - /** 帧原始 dts */ - pkDts: number - /** 帧原始 pts */ - pkPts: number - /** 帧数据宽度 */ - width: number - } - interface FromScreenLocationOption { - /** x 坐标值 */ - x: number - /** y 坐标值 */ - y: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: FromScreenLocationCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: FromScreenLocationFailCallback - /** 接口调用成功的回调函数 */ - success?: FromScreenLocationSuccessCallback - } - interface FstatOption { - /** 文件描述符。fd 通过 [FileSystemManager.open](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.open.html) 或 [FileSystemManager.openSync](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.openSync.html) 接口获得 */ - fd: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: FstatCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: FstatFailCallback - /** 接口调用成功的回调函数 */ - success?: FstatSuccessCallback - } - interface FstatSuccessCallbackResult { - /** [Stats](https://developers.weixin.qq.com/miniprogram/dev/api/file/Stats.html) - * - * Stats 对象,包含了文件的状态信息 */ - stats: Stats - errMsg: string - } - interface FstatSyncOption { - /** 文件描述符。fd 通过 [FileSystemManager.open](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.open.html) 或 [FileSystemManager.openSync](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.openSync.html) 接口获得 */ - fd: string - } - interface FtruncateOption { - /** 文件描述符。fd 通过 [FileSystemManager.open](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.open.html) 或 [FileSystemManager.openSync](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.openSync.html) 接口获得 */ - fd: string - /** 截断位置,默认0。如果 length 小于文件长度(单位:字节),则只有前面 length 个字节会保留在文件中,其余内容会被删除;如果 length 大于文件长度,则会对其进行扩展,并且扩展部分将填充空字节('\0') */ - length: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: FtruncateCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: FtruncateFailCallback - /** 接口调用成功的回调函数 */ - success?: FtruncateSuccessCallback - } - interface FtruncateSyncOption { - /** 文件描述符。fd 通过 [FileSystemManager.open](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.open.html) 或 [FileSystemManager.openSync](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.openSync.html) 接口获得 */ - fd: string - /** 截断位置,默认0。如果 length 小于文件长度(单位:字节),则只有前面 length 个字节会保留在文件中,其余内容会被删除;如果 length 大于文件长度,则会对其进行扩展,并且扩展部分将填充空字节('\0') */ - length: number - } - interface GeneralCallbackResult { - /** 错误信息 */ - errMsg: string - } - interface GetAtqaOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetAtqaCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetAtqaFailCallback - /** 接口调用成功的回调函数 */ - success?: GetAtqaSuccessCallback - } - interface GetAtqaSuccessCallbackResult { - /** 返回 ATQA/SENS_RES 数据 */ - atqa: ArrayBuffer - errMsg: string - } - interface GetAvailableAudioSourcesOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetAvailableAudioSourcesCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetAvailableAudioSourcesFailCallback - /** 接口调用成功的回调函数 */ - success?: GetAvailableAudioSourcesSuccessCallback - } - interface GetAvailableAudioSourcesSuccessCallbackResult { - /** 支持的音频输入源列表,可在 [RecorderManager.start()](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.start.html) 接口中使用。返回值定义参考 https://developer.android.com/reference/kotlin/android/media/MediaRecorder.AudioSource - * - * 可选值: - * - 'auto': 自动设置,默认使用手机麦克风,插上耳麦后自动切换使用耳机麦克风,所有平台适用; - * - 'buildInMic': 手机麦克风,仅限 iOS; - * - 'headsetMic': 耳机麦克风,仅限 iOS; - * - 'mic': 麦克风(没插耳麦时是手机麦克风,插耳麦时是耳机麦克风),仅限 Android; - * - 'camcorder': 同 mic,适用于录制音视频内容,仅限 Android; - * - 'voice_communication': 同 mic,适用于实时沟通,仅限 Android; - * - 'voice_recognition': 同 mic,适用于语音识别,仅限 Android; */ - audioSources: Array< - | 'auto' - | 'buildInMic' - | 'headsetMic' - | 'mic' - | 'camcorder' - | 'voice_communication' - | 'voice_recognition' - > - errMsg: string - } - interface GetBLEDeviceCharacteristicsOption { - /** 蓝牙设备 id。需要已经通过 [wx.createBLEConnection](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.createBLEConnection.html) 建立连接 */ - deviceId: string - /** 蓝牙服务 UUID。需要先调用 [wx.getBLEDeviceServices](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.getBLEDeviceServices.html) 获取 */ - serviceId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetBLEDeviceCharacteristicsCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetBLEDeviceCharacteristicsFailCallback - /** 接口调用成功的回调函数 */ - success?: GetBLEDeviceCharacteristicsSuccessCallback - } - interface GetBLEDeviceCharacteristicsSuccessCallbackResult { - /** 设备特征列表 */ - characteristics: BLECharacteristic[] - errMsg: string - } - interface GetBLEDeviceRSSIOption { - /** 蓝牙设备 id */ - deviceId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetBLEDeviceRSSICompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetBLEDeviceRSSIFailCallback - /** 接口调用成功的回调函数 */ - success?: GetBLEDeviceRSSISuccessCallback - } - interface GetBLEDeviceRSSISuccessCallbackResult { - /** 信号强度,单位 dBm */ - RSSI: number - errMsg: string - } - interface GetBLEDeviceServicesOption { - /** 蓝牙设备 id。需要已经通过 [wx.createBLEConnection](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.createBLEConnection.html) 建立连接 */ - deviceId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetBLEDeviceServicesCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetBLEDeviceServicesFailCallback - /** 接口调用成功的回调函数 */ - success?: GetBLEDeviceServicesSuccessCallback - } - interface GetBLEDeviceServicesSuccessCallbackResult { - /** 设备服务列表 */ - services: BLEService[] - errMsg: string - } - interface GetBLEMTUOption { - /** 蓝牙设备 id */ - deviceId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetBLEMTUCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetBLEMTUFailCallback - /** 接口调用成功的回调函数 */ - success?: GetBLEMTUSuccessCallback - /** 写模式 (iOS 特有参数) - * - * 可选值: - * - 'write': 有回复写; - * - 'writeNoResponse': 无回复写; */ - writeType?: 'write' | 'writeNoResponse' - } - interface GetBLEMTUSuccessCallbackResult { - /** 最大传输单元 */ - mtu: number - errMsg: string - } - interface GetBackgroundAudioPlayerStateOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetBackgroundAudioPlayerStateCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetBackgroundAudioPlayerStateFailCallback - /** 接口调用成功的回调函数 */ - success?: GetBackgroundAudioPlayerStateSuccessCallback - } - interface GetBackgroundAudioPlayerStateSuccessCallbackResult { - /** 选定音频的播放位置(单位:s),只有在音乐播放中时返回 */ - currentPosition: number - /** 歌曲数据链接,只有在音乐播放中时返回 */ - dataUrl: string - /** 音频的下载进度百分比,只有在音乐播放中时返回 */ - downloadPercent: number - /** 选定音频的长度(单位:s),只有在音乐播放中时返回 */ - duration: number - /** 播放状态 - * - * 可选值: - * - 0: 暂停中; - * - 1: 播放中; - * - 2: 没有音乐播放; */ - status: 0 | 1 | 2 - errMsg: string - } - interface GetBackgroundFetchDataOption { - /** 缓存数据类别,取值为 periodic 或 pre */ - fetchType: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetBackgroundFetchDataCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetBackgroundFetchDataFailCallback - /** 接口调用成功的回调函数 */ - success?: GetBackgroundFetchDataSuccessCallback - } - interface GetBackgroundFetchDataSuccessCallbackResult { - /** 缓存数据 */ - fetchedData: string - /** 小程序页面路径 */ - path: string - /** 传给页面的 query 参数 */ - query: string - /** 进入小程序的场景值 */ - scene: number - /** 客户端拿到缓存数据的时间戳 ms。(iOS 时间戳存在异常,8.0.27 修复) */ - timeStamp: number - errMsg: string - } - interface GetBackgroundFetchTokenOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetBackgroundFetchTokenCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetBackgroundFetchTokenFailCallback - /** 接口调用成功的回调函数 */ - success?: GetBackgroundFetchTokenSuccessCallback - } - interface GetBackgroundFetchTokenSuccessCallbackResult { - /** 接口调用结果 */ - errMsg: string - /** 自定义的登录态 */ - token: string - } - interface GetBatteryInfoOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetBatteryInfoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetBatteryInfoFailCallback - /** 接口调用成功的回调函数 */ - success?: GetBatteryInfoSuccessCallback - } - interface GetBatteryInfoSuccessCallbackResult { - /** 是否正在充电中 */ - isCharging: boolean - /** 需要基础库: `3.4.3` - * - * 是否处于省电模式,目前仅 iOS 端支持 */ - isLowPowerModeEnabled: boolean - /** 设备电量,范围 1 - 100 */ - level: number - errMsg: string - } - interface GetBatteryInfoSyncResult { - /** 是否正在充电中 */ - isCharging: boolean - /** 需要基础库: `3.4.3` - * - * 是否处于省电模式,目前仅 iOS 端支持 */ - isLowPowerModeEnabled: boolean - /** 设备电量,范围 1 - 100 */ - level: number - } - interface GetBeaconsOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetBeaconsCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetBeaconsFailCallback - /** 接口调用成功的回调函数 */ - success?: GetBeaconsSuccessCallback - } - interface GetBeaconsSuccessCallbackResult { - /** Beacon 设备列表 */ - beacons: BeaconInfo[] - errMsg: string - } - interface GetBluetoothAdapterStateOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetBluetoothAdapterStateCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetBluetoothAdapterStateFailCallback - /** 接口调用成功的回调函数 */ - success?: GetBluetoothAdapterStateSuccessCallback - } - interface GetBluetoothAdapterStateSuccessCallbackResult { - /** 蓝牙适配器是否可用 */ - available: boolean - /** 是否正在搜索设备 */ - discovering: boolean - errMsg: string - } - interface GetBluetoothDevicesOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetBluetoothDevicesCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetBluetoothDevicesFailCallback - /** 接口调用成功的回调函数 */ - success?: GetBluetoothDevicesSuccessCallback - } - interface GetBluetoothDevicesSuccessCallbackResult { - /** UUID 对应的已连接设备列表 */ - devices: BlueToothDevice[] - errMsg: string - } - interface GetCenterLocationOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetCenterLocationCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetCenterLocationFailCallback - /** 图标路径,支持网络路径、本地路径、代码包路径 */ - iconPath?: string - /** 接口调用成功的回调函数 */ - success?: GetCenterLocationSuccessCallback - } - interface GetCenterLocationSuccessCallbackResult { - /** 纬度 */ - latitude: number - /** 经度 */ - longitude: number - errMsg: string - } - interface GetChannelsLiveInfoOption { - /** 视频号 id,以“sph”开头的id,可在视频号助手获取 */ - finderUserName: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetChannelsLiveInfoCompleteCallback - /** 需要基础库: `2.29.0` - * - * 结束时间,筛选指定时间段的直播。若上传了startTime,未上传endTime,则endTime默认取当前时间 */ - endTime?: number - /** 接口调用失败的回调函数 */ - fail?: GetChannelsLiveInfoFailCallback - /** 需要基础库: `2.29.0` - * - * 起始时间,筛选指定时间段的直播。若上传了endTime,未上传startTime,则startTime默认为0 */ - startTime?: number - /** 接口调用成功的回调函数 */ - success?: GetChannelsLiveInfoSuccessCallback - } - interface GetChannelsLiveInfoSuccessCallbackResult { - /** 直播主题 */ - description: string - /** 直播 feedId */ - feedId: string - /** 视频号头像 */ - headUrl: string - /** 视频号昵称 */ - nickname: string - /** 直播 nonceId */ - nonceId: string - /** 需要基础库: `2.29.0` - * - * 除最近的一条直播外,其他的直播列表(注意:每次最多返回按时间戳增序排列的15个直播信息,其中时间最近的那个直播会在接口其他的返回参数中展示,其余的直播会在该字段中展示)。 */ - otherInfos: any[] - /** 需要基础库: `2.29.0` - * - * 直播回放状态 - * - * 可选值: - * - 0: 未生成; - * - 1: 已生成; - * - 3: 生成中; - * - 6: 已过期; */ - replayStatus: 0 | 1 | 3 | 6 - /** 直播状态 - * - * 可选值: - * - 1: 直播状态不存在(针对未开过直播的主播); - * - 2: 直播中; - * - 3: 直播已结束; - * - 4: 直播准备中(未开播); */ - status: 1 | 2 | 3 | 4 - errMsg: string - } - interface GetChannelsLiveNoticeInfoOption { - /** 视频号 id,以“sph”开头的id,可在视频号助手获取 */ - finderUserName: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetChannelsLiveNoticeInfoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetChannelsLiveNoticeInfoFailCallback - /** 接口调用成功的回调函数 */ - success?: GetChannelsLiveNoticeInfoSuccessCallback - } - interface GetChannelsLiveNoticeInfoSuccessCallbackResult { - /** 直播封面 */ - headUrl: string - /** 视频号昵称 */ - nickname: string - /** 预告 id */ - noticeId: string - /** 需要基础库: `2.24.6` - * - * 除最近的一条预告信息外,其他的预告信息列表(注意:每次最多返回按时间戳增序排列的15个预告信息,其中时间最近的那个预告信息会在接口其他的返回参数中展示,其余的预告信息会在该字段中展示)。 */ - otherInfos: any[] - /** 是否可预约 */ - reservable: boolean - /** 开始时间 */ - startTime: string - /** 预告状态:0可用 1取消 2已用 */ - status: number - errMsg: string - } - interface GetChannelsShareKeyOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetChannelsShareKeyCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetChannelsShareKeyFailCallback - /** 接口调用成功的回调函数 */ - success?: GetChannelsShareKeySuccessCallback - } - interface GetChannelsShareKeySuccessCallbackResult { - /** 推广员 */ - promoter: PromoterResult - /** 分享者 openid */ - sharerOpenId: string - errMsg: string - } - interface GetClipboardDataOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetClipboardDataCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetClipboardDataFailCallback - /** 接口调用成功的回调函数 */ - success?: GetClipboardDataSuccessCallback - } - interface GetClipboardDataSuccessCallbackOption { - /** 剪贴板的内容 */ - data: string - errMsg: string - } - interface GetCommonConfigOption { - /** 0:通用配置模式 1:实验模式, 参数与返回结果的使用等效于接口[wx.getExptInfoSync](https://developers.weixin.qq.com/miniprogram/dev/api/data-analysis/wx.getExptInfoSync.html) */ - mode: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetCommonConfigCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetCommonConfigFailCallback - /** 需要获取的数据指标的对象数组,每个string的格式约定:配置类型_分表key */ - keys?: string[] - /** 接口调用成功的回调函数 */ - success?: GetCommonConfigSuccessCallback - } - interface GetCommonConfigSuccessCallbackResult { - /** 根据conf_type来确定conf内容,conf_type为1时conf是一个json数组, 类似"[{xxx},{xxx}]", 每一项对应表类型每一行配置内容, 其中conf_type为2时conf是一个json对象,类似"{xxxx}" */ - conf: string - /** 配置类型, 1-表类型 2-kv类型 */ - conf_type: number - /** 错误码 */ - errcode: number - /** 错误信息 */ - errmsg: string - /** 过期时间,单位秒. 0表示当次有效 */ - expire_sec: number - errMsg: string - } - interface GetConnectedBluetoothDevicesOption { - /** 蓝牙设备主服务的 UUID 列表(支持 16/32/128 位 UUID) */ - services: string[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetConnectedBluetoothDevicesCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetConnectedBluetoothDevicesFailCallback - /** 接口调用成功的回调函数 */ - success?: GetConnectedBluetoothDevicesSuccessCallback - } - interface GetConnectedBluetoothDevicesSuccessCallbackResult { - /** 搜索到的设备列表 */ - devices: BluetoothDeviceInfo[] - errMsg: string - } - interface GetConnectedWifiOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetConnectedWifiCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetConnectedWifiFailCallback - /** 需要基础库: `2.22.0` - * - * 是否需要返回部分 Wi-Fi 信息 */ - partialInfo?: boolean - /** 接口调用成功的回调函数 */ - success?: GetConnectedWifiSuccessCallback - } - interface GetConnectedWifiSuccessCallbackResult { - /** [WifiInfo](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/WifiInfo.html) - * - * Wi-Fi 信息 */ - wifi: WifiInfo - errMsg: string - } - interface GetContentsOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetContentsCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetContentsFailCallback - /** 接口调用成功的回调函数 */ - success?: GetContentsSuccessCallback - } - interface GetContentsSuccessCallbackResult { - /** 表示内容的delta对象 */ - delta: IAnyObject - /** 带标签的HTML内容 */ - html: string - /** 纯文本内容 */ - text: string - errMsg: string - } - interface GetDeviceBenchmarkInfoOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetDeviceBenchmarkInfoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetDeviceBenchmarkInfoFailCallback - /** 接口调用成功的回调函数 */ - success?: GetDeviceBenchmarkInfoSuccessCallback - } - interface GetDeviceBenchmarkInfoSuccessCallbackResult { - /** 需要基础库: `3.4.5` - * - * 设备性能等级。-1(性能未知),>=1(设备性能值,该值越高,设备性能越好,目前最高不超过50)
注意:设备的benchmarkLevel值不会随着时间的推移而变化 */ - benchmarkLevel: number - /** 需要基础库: `3.4.5` - * - * 设备机型档位。0(档位未知),1(高档机),2(中档机),3(低档机)
注意:设备的机型档位会随着时间的推移而变化,因此在使用时请谨慎对待;若业务逻辑依赖于机型档位,但担心受到机型档位变化的影响,请参考[设备档位映射文档](https://developers.weixin.qq.com/minigame/dev/guide/performance/perf-benchmarkLevel.html)自行判断机型档位 */ - modelLevel: number - errMsg: string - } - interface GetDeviceVoIPListOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetDeviceVoIPListCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetDeviceVoIPListFailCallback - /** 接口调用成功的回调函数 */ - success?: GetDeviceVoIPListSuccessCallback - } - interface GetDeviceVoIPListSuccessCallbackResult { - list: DeviceVoIPInfo[] - errMsg: string - } - interface GetExtConfigOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetExtConfigCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetExtConfigFailCallback - /** 接口调用成功的回调函数 */ - success?: GetExtConfigSuccessCallback - } - interface GetExtConfigSuccessCallbackResult { - /** 第三方平台自定义的数据 */ - extConfig: IAnyObject - errMsg: string - } - interface GetFileInfoOption { - /** 要读取的文件路径 (本地路径) */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetFileInfoCompleteCallback - /** 计算文件摘要的算法 - * - * 可选值: - * - 'md5': md5 算法; - * - 'sha1': sha1 算法; - * - 'sha256': sha256 算法; */ - digestAlgorithm?: 'md5' | 'sha1' | 'sha256' - /** 接口调用失败的回调函数 */ - fail?: GetFileInfoFailCallback - /** 接口调用成功的回调函数 */ - success?: GetFileInfoSuccessCallback - } - interface GetFileInfoSuccessCallbackResult { - /** 按照传入的 digestAlgorithm 计算得出的的文件摘要 */ - digest: string - /** 文件大小,以字节为单位 */ - size: number - errMsg: string - } - interface GetFuzzyLocationOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetFuzzyLocationCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetFuzzyLocationFailCallback - /** 接口调用成功的回调函数 */ - success?: GetFuzzyLocationSuccessCallback - /** 返回的坐标类型 - * - * 可选值: - * - 'wgs84': 返回 gps 坐标; - * - 'gcj02': 返回 gcj02 坐标,可用于 wx.openLocation; */ - type?: 'wgs84' | 'gcj02' - } - interface GetFuzzyLocationSuccessCallbackResult { - /** 纬度,范围为 -90~90,负数表示南纬 */ - latitude: number - /** 经度,范围为 -180~180,负数表示西经 */ - longitude: number - errMsg: string - } - interface GetGroupEnterInfoOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetGroupEnterInfoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetGroupEnterInfoFailCallback - /** 接口调用成功的回调函数 */ - success?: GetGroupEnterInfoSuccessCallback - } - interface GetGroupEnterInfoSuccessCallbackResult { - /** 需要基础库: `2.7.0` - * - * 敏感数据对应的云 ID,开通[云开发](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html)的小程序才会返回,可通过云调用直接获取开放数据,详细见[云调用直接获取开放数据](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-cloud) */ - cloudID: string - /** 包括敏感数据在内的完整转发信息的加密数据,详细见[加密数据解密算法](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html) */ - encryptedData: string - /** 错误信息 */ - errMsg: string - /** 加密算法的初始向量,详细见[加密数据解密算法](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html) */ - iv: string - } - interface GetHCEStateOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetHCEStateCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetHCEStateFailCallback - /** 接口调用成功的回调函数 */ - success?: GetHCEStateSuccessCallback - } - interface GetHistoricalBytesOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetHistoricalBytesCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetHistoricalBytesFailCallback - /** 接口调用成功的回调函数 */ - success?: GetHistoricalBytesSuccessCallback - } - interface GetHistoricalBytesSuccessCallbackResult { - /** 返回历史二进制数据 */ - histBytes: ArrayBuffer - errMsg: string - } - interface GetImageInfoOption { - /** 图片的路径,支持网络路径、本地路径、代码包路径 */ - src: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetImageInfoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetImageInfoFailCallback - /** 接口调用成功的回调函数 */ - success?: GetImageInfoSuccessCallback - } - interface GetImageInfoSuccessCallbackResult { - /** 图片原始高度,单位px。不考虑旋转。 */ - height: number - /** 需要基础库: `1.9.90` - * - * [拍照时设备方向](http://sylvana.net/jpegcrop/exif_orientation.html) - * - * 可选值: - * - 'up': 默认方向(手机横持拍照),对应 Exif 中的 1。或无 orientation 信息。; - * - 'up-mirrored': 同 up,但镜像翻转,对应 Exif 中的 2; - * - 'down': 旋转180度,对应 Exif 中的 3; - * - 'down-mirrored': 同 down,但镜像翻转,对应 Exif 中的 4; - * - 'left-mirrored': 同 left,但镜像翻转,对应 Exif 中的 5; - * - 'right': 顺时针旋转90度,对应 Exif 中的 6; - * - 'right-mirrored': 同 right,但镜像翻转,对应 Exif 中的 7; - * - 'left': 逆时针旋转90度,对应 Exif 中的 8; */ - orientation: - | 'up' - | 'up-mirrored' - | 'down' - | 'down-mirrored' - | 'left-mirrored' - | 'right' - | 'right-mirrored' - | 'left' - /** 图片的本地路径 */ - path: string - /** 需要基础库: `1.9.90` - * - * 图片格式 - * - * 可选值: - * - 'unknown': 未知格式; - * - 'jpeg': jpeg压缩格式; - * - 'png': png压缩格式; - * - 'gif': gif压缩格式; - * - 'tiff': tiff压缩格式; */ - type: 'unknown' | 'jpeg' | 'png' | 'gif' | 'tiff' - /** 图片原始宽度,单位px。不考虑旋转。 */ - width: number - errMsg: string - } - interface GetInferenceEnvInfoOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetInferenceEnvInfoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetInferenceEnvInfoFailCallback - /** 接口调用成功的回调函数 */ - success?: GetInferenceEnvInfoSuccessCallback - } - interface GetInferenceEnvInfoSuccessCallbackResult { - /** AI推理引擎版本 */ - ver: string - errMsg: string - } - interface GetLatestUserKeyOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetLatestUserKeyCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetLatestUserKeyFailCallback - /** 接口调用成功的回调函数 */ - success?: GetLatestUserKeySuccessCallback - } - interface GetLatestUserKeySuccessCallbackResult { - /** 用户加密密钥 */ - encryptKey: string - /** 密钥过期时间 */ - expireTime: number - /** 密钥初始向量 */ - iv: string - /** 密钥版本 */ - version: number - errMsg: string - } - interface GetLocalIPAddressOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetLocalIPAddressCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetLocalIPAddressFailCallback - /** 接口调用成功的回调函数 */ - success?: GetLocalIPAddressSuccessCallback - } - interface GetLocalIPAddressSuccessCallbackResult { - /** 错误信息 */ - errMsg: string - /** 本机局域网IP地址 */ - localip: string - /** 本机局域网子网掩码,基础库 2.24.0 开始支持 */ - netmask: string - } - interface GetLocationOption { - /** 需要基础库: `1.6.0` - * - * 传入 true 会返回高度信息,由于获取高度需要较高精确度,会减慢接口返回速度 */ - altitude?: boolean - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetLocationCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetLocationFailCallback - /** 需要基础库: `2.9.0` - * - * 高精度定位超时时间(ms),指定时间内返回最高精度,该值3000ms以上高精度定位才有效果 */ - highAccuracyExpireTime?: number - /** 需要基础库: `2.9.0` - * - * 开启高精度定位 */ - isHighAccuracy?: boolean - /** 接口调用成功的回调函数 */ - success?: GetLocationSuccessCallback - /** wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标 */ - type?: string - } - interface GetLocationSuccessCallbackResult { - /** 位置的精确度,反应与真实位置之间的接近程度,可以理解成10即与真实位置相差10m,越小越精确 */ - accuracy: number - /** 需要基础库: `1.2.0` - * - * 高度,单位 m */ - altitude: number - /** 需要基础库: `1.2.0` - * - * 水平精度,单位 m */ - horizontalAccuracy: number - /** 纬度,范围为 -90~90,负数表示南纬 */ - latitude: number - /** 经度,范围为 -180~180,负数表示西经 */ - longitude: number - /** 速度,单位 m/s */ - speed: number - /** 需要基础库: `1.2.0` - * - * 垂直精度,单位 m(Android 无法获取,返回 0) */ - verticalAccuracy: number - errMsg: string - } - interface GetLogManagerOption { - /** 需要基础库: `2.3.2` - * - * 取值为0/1,取值为0表示会把 `App`、`Page` 的生命周期函数和 `wx` 命名空间下的函数调用写入日志,取值为1则不会。默认值是 0 */ - level?: number - } - interface GetMaxTransceiveLengthOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetMaxTransceiveLengthCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetMaxTransceiveLengthFailCallback - /** 接口调用成功的回调函数 */ - success?: GetMaxTransceiveLengthSuccessCallback - } - interface GetMaxTransceiveLengthSuccessCallbackResult { - /** 最大传输长度 */ - length: number - errMsg: string - } - interface GetMaxZoomOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetMaxZoomCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetMaxZoomFailCallback - /** 接口调用成功的回调函数 */ - success?: GetMaxZoomSuccessCallback - } - interface GetMaxZoomSuccessCallbackResult { - /** 最大放缩级别 */ - maxZoom: string - errMsg: string - } - interface GetNetworkTypeOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetNetworkTypeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetNetworkTypeFailCallback - /** 接口调用成功的回调函数 */ - success?: GetNetworkTypeSuccessCallback - } - interface GetNetworkTypeSuccessCallbackResult { - /** 需要基础库: `2.22.1` - * - * 设备是否使用了网络代理 */ - hasSystemProxy: boolean - /** 网络类型 - * - * 可选值: - * - 'wifi': wifi 网络; - * - '2g': 2g 网络; - * - '3g': 3g 网络; - * - '4g': 4g 网络; - * - '5g': 5g 网络; - * - 'unknown': Android 下不常见的网络类型; - * - 'none': 无网络; */ - networkType: 'wifi' | '2g' | '3g' | '4g' | '5g' | 'unknown' | 'none' - /** 信号强弱,单位 dbm */ - signalStrength: number - /** 需要基础库: `3.5.3` - * - * 是否处于弱网环境 */ - weakNet: boolean - errMsg: string - } - interface GetPrivacySettingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetPrivacySettingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetPrivacySettingFailCallback - /** 接口调用成功的回调函数 */ - success?: GetPrivacySettingSuccessCallback - } - interface GetPrivacySettingSuccessCallbackResult { - /** 是否需要用户授权隐私协议(如果开发者没有在「MP后台-设置-服务内容声明-用户隐私保护指引」中声明隐私收集类型则会返回false;如果开发者声明了隐私收集,且用户之前同意过隐私协议则会返回false;如果开发者声明了隐私收集,且用户还没同意过则返回true;如果用户之前同意过、但后来小程序又新增了隐私收集类型也会返回true) */ - needAuthorization: boolean - /** 隐私授权协议的名称 */ - privacyContractName: string - errMsg: string - } - interface GetRandomValuesOption { - /** 整数,生成随机数的字节数,最大 1048576 */ - length: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetRandomValuesCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetRandomValuesFailCallback - /** 接口调用成功的回调函数 */ - success?: GetRandomValuesSuccessCallback - } - interface GetRandomValuesSuccessCallbackResult { - /** 随机数内容,长度为传入的字节数 */ - randomValues: ArrayBuffer - errMsg: string - } - interface GetRegionOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetRegionCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetRegionFailCallback - /** 接口调用成功的回调函数 */ - success?: GetRegionSuccessCallback - } - interface GetRegionSuccessCallbackResult { - /** 东北角经纬度 */ - northeast: MapPostion - /** 西南角经纬度 */ - southwest: MapPostion - errMsg: string - } - interface GetRendererUserAgentOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetRendererUserAgentCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetRendererUserAgentFailCallback - /** 接口调用成功的回调函数 */ - success?: GetRendererUserAgentSuccessCallback - } - interface GetRotateOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetRotateCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetRotateFailCallback - /** 接口调用成功的回调函数 */ - success?: GetRotateSuccessCallback - } - interface GetRotateSuccessCallbackResult { - /** 旋转角 */ - rotate: number - errMsg: string - } - interface GetSakOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetSakCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetSakFailCallback - /** 接口调用成功的回调函数 */ - success?: GetSakSuccessCallback - } - interface GetSakSuccessCallbackResult { - /** 返回 SAK/SEL_RES 数据 */ - sak: number - errMsg: string - } - interface GetSavedFileListOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetSavedFileListCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetSavedFileListFailCallback - /** 接口调用成功的回调函数 */ - success?: GetSavedFileListSuccessCallback - } - interface GetSavedFileListSuccessCallbackResult { - /** 文件数组 */ - fileList: FileItem[] - errMsg: string - } - interface GetScaleOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetScaleCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetScaleFailCallback - /** 接口调用成功的回调函数 */ - success?: GetScaleSuccessCallback - } - interface GetScaleSuccessCallbackResult { - /** 缩放值 */ - scale: number - errMsg: string - } - interface GetScreenBrightnessOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetScreenBrightnessCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetScreenBrightnessFailCallback - /** 接口调用成功的回调函数 */ - success?: GetScreenBrightnessSuccessCallback - } - interface GetScreenBrightnessSuccessCallbackOption { - /** 屏幕亮度值,范围 0 ~ 1,0 最暗,1 最亮 */ - value: number - errMsg: string - } - interface GetScreenRecordingStateOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetScreenRecordingStateCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetScreenRecordingStateFailCallback - /** 接口调用成功的回调函数 */ - success?: GetScreenRecordingStateSuccessCallback - } - interface GetScreenRecordingStateSuccessCallbackResult { - /** 录屏状态 - * - * 可选值: - * - 'on': 开启; - * - 'off': 关闭; */ - state: 'on' | 'off' - errMsg: string - } - interface GetSelectedTextRangeOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetSelectedTextRangeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetSelectedTextRangeFailCallback - /** 接口调用成功的回调函数 */ - success?: GetSelectedTextRangeSuccessCallback - } - interface GetSelectedTextRangeSuccessCallbackResult { - /** 输入框光标结束位置 */ - end: number - /** 输入框光标起始位置 */ - start: number - errMsg: string - } - interface GetSelectionTextOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetSelectionTextCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetSelectionTextFailCallback - /** 接口调用成功的回调函数 */ - success?: GetSelectionTextSuccessCallback - } - interface GetSelectionTextSuccessCallbackResult { - /** 纯文本内容 */ - text: string - errMsg: string - } - interface GetSettingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetSettingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetSettingFailCallback - /** 接口调用成功的回调函数 */ - success?: GetSettingSuccessCallback - /** 需要基础库: `2.10.1` - * - * 是否同时获取用户订阅消息的订阅状态,默认不获取。注意:withSubscriptions 只返回用户勾选过订阅面板中的“总是保持以上选择,不再询问”的订阅消息。 */ - withSubscriptions?: boolean - } - interface GetSettingSuccessCallbackResult { - /** [AuthSetting](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/AuthSetting.html) - * - * 用户授权结果 */ - authSetting: AuthSetting - /** [SubscriptionsSetting](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/SubscriptionsSetting.html) - * - * 需要基础库: `2.10.1` - * - * 用户订阅消息设置,接口参数`withSubscriptions`值为`true`时才会返回。 */ - subscriptionsSetting: SubscriptionsSetting - /** [AuthSetting](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/AuthSetting.html) - * - * 在插件中调用时,当前宿主小程序的用户授权结果 */ - miniprogramAuthSetting?: AuthSetting - errMsg: string - } - interface GetShareInfoOption { - /** shareTicket,详见[获取更多转发信息](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html#获取更多转发信息) */ - shareTicket: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetShareInfoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetShareInfoFailCallback - /** 接口调用成功的回调函数 */ - success?: GetShareInfoSuccessCallback - /** 需要基础库: `1.9.90` - * - * 超时时间,单位 ms */ - timeout?: number - } - interface GetSkewOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetSkewCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetSkewFailCallback - /** 接口调用成功的回调函数 */ - success?: GetSkewSuccessCallback - } - interface GetSkewSuccessCallbackResult { - /** 倾斜角 */ - skew: number - errMsg: string - } - interface GetSkylineInfoOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetSkylineInfoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetSkylineInfoFailCallback - /** 接口调用成功的回调函数 */ - success?: GetSkylineInfoSuccessCallback - } - interface GetStorageInfoOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetStorageInfoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetStorageInfoFailCallback - /** 接口调用成功的回调函数 */ - success?: GetStorageInfoSuccessCallback - } - interface GetStorageInfoSuccessCallbackOption { - /** 当前占用的空间大小, 单位 KB */ - currentSize: number - /** 当前 storage 中所有的 key */ - keys: string[] - /** 限制的空间大小,单位 KB */ - limitSize: number - errMsg: string - } - interface GetStorageInfoSyncOption { - /** 当前占用的空间大小, 单位 KB */ - currentSize: number - /** 当前 storage 中所有的 key */ - keys: string[] - /** 限制的空间大小,单位 KB */ - limitSize: number - } - interface GetStorageOption { - /** 本地缓存中指定的 key */ - key: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetStorageCompleteCallback - /** 需要基础库: `2.21.3` - * - * 是否开启加密存储。只有异步的 getStorage 接口支持开启加密存储。开启后,将会对 data 使用 AES128 解密,接口回调耗时将会增加。若开启加密存储,setStorage 和 getStorage 需要同时声明 encrypt 的值为 true */ - encrypt?: boolean - /** 接口调用失败的回调函数 */ - fail?: GetStorageFailCallback - /** 接口调用成功的回调函数 */ - success?: GetStorageSuccessCallback - } - interface GetStorageSuccessCallbackResult { - /** key对应的内容 */ - data: T - errMsg: string - } - interface GetSystemInfoAsyncOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetSystemInfoAsyncCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetSystemInfoAsyncFailCallback - /** 接口调用成功的回调函数 */ - success?: GetSystemInfoAsyncSuccessCallback - } - interface GetSystemInfoOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetSystemInfoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetSystemInfoFailCallback - /** 接口调用成功的回调函数 */ - success?: GetSystemInfoSuccessCallback - } - interface GetUserInfoOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetUserInfoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetUserInfoFailCallback - /** 显示用户信息的语言 - * - * 可选值: - * - 'en': 英文; - * - 'zh_CN': 简体中文; - * - 'zh_TW': 繁体中文; */ - lang?: 'en' | 'zh_CN' | 'zh_TW' - /** 接口调用成功的回调函数 */ - success?: GetUserInfoSuccessCallback - /** 是否带上登录态信息。当 withCredentials 为 true 时,要求此前有调用过 wx.login 且登录态尚未过期,此时返回的数据会包含 encryptedData, iv 等敏感信息;当 withCredentials 为 false 时,不要求有登录态,返回的数据不包含 encryptedData, iv 等敏感信息。 */ - withCredentials?: boolean - } - interface GetUserInfoSuccessCallbackResult { - /** 需要基础库: `2.7.0` - * - * 敏感数据对应的云 ID,开通[云开发](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html)的小程序才会返回,可通过云调用直接获取开放数据,详细见[云调用直接获取开放数据](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-cloud) */ - cloudID: string - /** 包括敏感数据在内的完整用户信息的加密数据,详见 [用户数据的签名验证和加解密](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#加密数据解密算法) */ - encryptedData: string - /** 加密算法的初始向量,详见 [用户数据的签名验证和加解密](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#加密数据解密算法) */ - iv: string - /** 不包括敏感信息的原始数据字符串,用于计算签名 */ - rawData: string - /** 使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,详见 [用户数据的签名验证和加解密](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html) */ - signature: string - /** [UserInfo](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/UserInfo.html) - * - * 用户信息对象,不包含 openid 等敏感信息 */ - userInfo: UserInfo - errMsg: string - } - interface GetUserProfileOption { - /** 声明获取用户个人信息后的用途,不超过30个字符 */ - desc: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetUserProfileCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetUserProfileFailCallback - /** 显示用户信息的语言 - * - * 可选值: - * - 'en': 英文; - * - 'zh_CN': 简体中文; - * - 'zh_TW': 繁体中文; */ - lang?: 'en' | 'zh_CN' | 'zh_TW' - /** 接口调用成功的回调函数 */ - success?: GetUserProfileSuccessCallback - } - interface GetUserProfileSuccessCallbackResult { - /** 需要基础库: `2.10.4` - * - * 敏感数据对应的云 ID,开通[云开发](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html)的小程序才会返回,可通过云调用直接获取开放数据,详细见[云调用直接获取开放数据](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-cloud) */ - cloudID: string - /** 需要基础库: `2.10.4` - * - * 包括敏感数据在内的完整用户信息的加密数据,详见 [用户数据的签名验证和加解密](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#加密数据解密算法) */ - encryptedData: string - /** 需要基础库: `2.10.4` - * - * 加密算法的初始向量,详见 [用户数据的签名验证和加解密](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#加密数据解密算法) */ - iv: string - /** 需要基础库: `2.10.4` - * - * 不包括敏感信息的原始数据字符串,用于计算签名 */ - rawData: string - /** 需要基础库: `2.10.4` - * - * 使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,详见 [用户数据的签名验证和加解密](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html) */ - signature: string - /** [UserInfo](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/UserInfo.html) - * - * 需要基础库: `2.10.4` - * - * 用户信息对象 */ - userInfo: UserInfo - errMsg: string - } - interface GetVideoInfoOption { - /** 视频文件路径,可以是临时文件路径也可以是永久文件路径 */ - src: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetVideoInfoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetVideoInfoFailCallback - /** 接口调用成功的回调函数 */ - success?: GetVideoInfoSuccessCallback - } - interface GetVideoInfoSuccessCallbackResult { - /** 视频码率,单位 kbps */ - bitrate: number - /** 视频长度 */ - duration: number - /** 视频帧率 */ - fps: number - /** 视频的长,单位 px */ - height: number - /** 画面方向 - * - * 可选值: - * - 'up': 默认; - * - 'down': 180度旋转; - * - 'left': 逆时针旋转90度; - * - 'right': 顺时针旋转90度; - * - 'up-mirrored': 同up,但水平翻转; - * - 'down-mirrored': 同down,但水平翻转; - * - 'left-mirrored': 同left,但垂直翻转; - * - 'right-mirrored': 同right,但垂直翻转; */ - orientation: - | 'up' - | 'down' - | 'left' - | 'right' - | 'up-mirrored' - | 'down-mirrored' - | 'left-mirrored' - | 'right-mirrored' - /** 视频大小,单位 kB */ - size: number - /** 视频格式 */ - type: string - /** 视频的宽,单位 px */ - width: number - errMsg: string - } - interface GetWeRunDataOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetWeRunDataCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetWeRunDataFailCallback - /** 接口调用成功的回调函数 */ - success?: GetWeRunDataSuccessCallback - } - interface GetWeRunDataSuccessCallbackResult { - /** 需要基础库: `2.7.0` - * - * 敏感数据对应的云 ID,开通云开发的小程序才会返回,可通过云调用直接获取开放数据,详细见[云调用直接获取开放数据](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-cloud) */ - cloudID: string - /** 包括敏感数据在内的完整用户信息的加密数据,详细见[加密数据解密算法](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html)。解密后得到的数据结构见后文 */ - encryptedData: string - /** 加密算法的初始向量,详细见[加密数据解密算法](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html) */ - iv: string - errMsg: string - } - interface GetWifiListOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: GetWifiListCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: GetWifiListFailCallback - /** 接口调用成功的回调函数 */ - success?: GetWifiListSuccessCallback - } - /** 需要基础库: `2.28.0` - * - * 手势检测配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/hand.html)。 */ - interface HandTrack { - /** 需要基础库: `2.28.0` - * - * 手势检测模式 - * - * 可选值: - * - 1: 通过摄像头实时检测; - * - 2: 静态图片检测; */ - mode: 1 | 2 - } - interface HideHomeButtonOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: HideHomeButtonCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: HideHomeButtonFailCallback - /** 接口调用成功的回调函数 */ - success?: HideHomeButtonSuccessCallback - } - interface HideKeyboardOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: HideKeyboardCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: HideKeyboardFailCallback - /** 接口调用成功的回调函数 */ - success?: HideKeyboardSuccessCallback - } - interface HideLoadingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: HideLoadingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: HideLoadingFailCallback - /** 需要基础库: `2.22.1` - * - * 目前 toast 和 loading 相关接口可以相互混用,此参数可用于取消混用特性 */ - noConflict?: boolean - /** 接口调用成功的回调函数 */ - success?: HideLoadingSuccessCallback - } - interface HideNavigationBarLoadingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: HideNavigationBarLoadingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: HideNavigationBarLoadingFailCallback - /** 接口调用成功的回调函数 */ - success?: HideNavigationBarLoadingSuccessCallback - } - interface HideShareMenuOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: HideShareMenuCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: HideShareMenuFailCallback - /** 需要基础库: `2.11.3` - * - * 本接口为 Beta 版本,暂只在 Android 平台支持。需要隐藏的转发按钮名称列表,默认['shareAppMessage', 'shareTimeline']。按钮名称合法值包含 "shareAppMessage"、"shareTimeline" 两种 */ - menus?: string[] - /** 接口调用成功的回调函数 */ - success?: HideShareMenuSuccessCallback - } - interface HideTabBarOption { - /** 是否需要动画效果 */ - animation?: boolean - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: HideTabBarCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: HideTabBarFailCallback - /** 接口调用成功的回调函数 */ - success?: HideTabBarSuccessCallback - } - interface HideTabBarRedDotOption { - /** tabBar 的哪一项,从左边算起 */ - index: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: HideTabBarRedDotCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: HideTabBarRedDotFailCallback - /** 接口调用成功的回调函数 */ - success?: HideTabBarRedDotSuccessCallback - } - interface HideToastOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: HideToastCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: HideToastFailCallback - /** 需要基础库: `2.22.1` - * - * 目前 toast 和 loading 相关接口可以相互混用,此参数可用于取消混用特性 */ - noConflict?: boolean - /** 接口调用成功的回调函数 */ - success?: HideToastSuccessCallback - } - /** 检测结果 */ - interface HitTestRes { - /** 包含位置、旋转、放缩信息的矩阵,以列为主序 */ - transform: Float32Array - } - /** 需要基础库: `3.3.0` - * - * 身份证检测配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/idcard.html)。 */ - interface IDCardTrack { - /** 需要基础库: `3.3.0` - * - * 身份证检测模式 - * - * 可选值: - * - 2: 静态图片检测; */ - mode: 2 - } - /** 需要基础库: `2.7.0` - * - * 图片对象 */ - interface Image { - /** 图片的真实高度 */ - height: number - /** 图片加载发生错误后触发的回调函数 */ - onerror: (...args: any[]) => any - /** 图片加载完成后触发的回调函数 */ - onload: (...args: any[]) => any - /** 需要基础库: `2.13.0` - * - * `origin`: 发送完整的referrer; `no-referrer`: 不发送。格式固定为 `https://servicewechat.com/{appid}/{version}/page-frame.html`,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版、体验版以及审核版本,版本号为 devtools 表示为开发者工具,其余为正式版本; */ - referrerPolicy: string - /** 图片的 URL。v2.11.0 起支持传递 base64 Data URI */ - src: string - /** 图片的真实宽度 */ - width: number - } - /** 需要基础库: `2.9.0` - * - * ImageData 对象 */ - interface ImageData { - /** 一维数组,包含以 RGBA 顺序的数据,数据使用 0 至 255(包含)的整数表示 */ - data: Uint8ClampedArray - /** 使用像素描述 ImageData 的实际高度 */ - height: number - /** 使用像素描述 ImageData 的实际宽度 */ - width: number - } - /** 需要基础库: `1.2.0` - * - * 图片的本地临时文件列表 */ - interface ImageFile { - /** 本地临时文件路径 (本地路径) */ - path: string - /** 本地临时文件大小,单位 B */ - size: number - } - interface IncludePointsOption { - /** 要显示在可视区域内的坐标点列表 */ - points: MapPostion[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: IncludePointsCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: IncludePointsFailCallback - /** 坐标点形成的矩形边缘到地图边缘的距离,单位像素。格式为[上,右,下,左]。开发者工具暂不支持padding参数。 */ - padding?: number[] - /** 接口调用成功的回调函数 */ - success?: IncludePointsSuccessCallback - } - interface InitFaceDetectOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: InitFaceDetectCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: InitFaceDetectFailCallback - /** 接口调用成功的回调函数 */ - success?: InitFaceDetectSuccessCallback - } - interface InitMarkerClusterOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: InitMarkerClusterCompleteCallback - /** 启用默认的聚合样式 */ - enableDefaultStyle?: boolean - /** 接口调用失败的回调函数 */ - fail?: InitMarkerClusterFailCallback - /** 聚合算法的可聚合距离,即距离小于该值的点会聚合至一起,以像素为单位 */ - gridSize?: number - /** 接口调用成功的回调函数 */ - success?: InitMarkerClusterSuccessCallback - /** 点击已经聚合的标记点时是否实现聚合分离 */ - zoomOnClick?: boolean - } - /** InnerAudioContext 实例,可通过 [wx.createInnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createInnerAudioContext.html) 接口获取实例。注意,音频播放过程中,可能被系统中断,可通过 [wx.onAudioInterruptionBegin](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onAudioInterruptionBegin.html)、[wx.onAudioInterruptionEnd](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onAudioInterruptionEnd.html)事件来处理这种情况。 -* -* **支持格式** -* -* | 格式 | iOS | Android | -* | ---- | ---- | ------- | -* | flac | x | √ | -* | m4a | √ | √ | -* | ogg | x | √ | -* | ape | x | √ | -* | amr | x | √ | -* | wma | x | √ | -* | wav | √ | √ | -* | mp3 | √ | √ | -* | mp4 | x | √ | -* | aac | √ | √ | -* | aiff | √ | x | -* | caf | √ | x | -* -* **示例代码** -* -* ```js -const innerAudioContext = wx.createInnerAudioContext() -innerAudioContext.autoplay = true -innerAudioContext.src = 'http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E061FF02C31F716658E5C81F5594D561F2E88B854E81CAAB7806D5E4F103E55D33C16F3FAC506D1AB172DE8600B37E43FAD&fromtag=46' -innerAudioContext.onPlay(() => { - console.log('开始播放') -}) -innerAudioContext.onError((res) => { - console.log(res.errMsg) - console.log(res.errCode) -}) -``` */ - interface InnerAudioContext { - /** 是否自动开始播放,默认为 `false` */ - autoplay: boolean - /** 音频缓冲的时间点,仅保证当前播放时间点到此时间点内容已缓冲(只读) */ - buffered: number - /** 当前音频的播放位置(单位 s)。只有在当前有合法的 src 时返回,时间保留小数点后 6 位(currentTime 属性在基础库 2.26.2 之前只读,基础库 2.26.2 开始可读可写,改变 currentTime 值等同于调用 seek) */ - currentTime: number - /** 当前音频的长度(单位 s)。只有在当前有合法的 src 时返回(只读) */ - duration: number - /** 是否循环播放,默认为 `false` */ - loop: boolean - /** 是否遵循系统静音开关,默认为 `true`。当此参数为 `false` 时,即使用户打开了静音开关,也能继续发出声音。从 2.3.0 版本开始此参数不生效,使用 [wx.setInnerAudioOption](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.setInnerAudioOption.html) 接口统一设置。 */ - obeyMuteSwitch: boolean - /** 当前是是否暂停或停止状态(只读) */ - paused: boolean - /** 需要基础库: `2.11.0` - * - * 播放速度。范围 0.5-2.0,默认为 1。(Android 需要 6 及以上版本) */ - playbackRate: number - /** 需要基础库: `2.13.0` - * - * `origin`: 发送完整的referrer; `no-referrer`: 不发送。格式固定为 `https://servicewechat.com/{appid}/{version}/page-frame.html`,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版、体验版以及审核版本,版本号为 devtools 表示为开发者工具,其余为正式版本; */ - referrerPolicy: string - /** 音频资源的地址,用于直接播放。[2.2.3](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 开始支持云文件ID */ - src: string - /** 开始播放的位置(单位:s),默认为 0 */ - startTime: number - /** 需要基础库: `1.9.90` - * - * 音量。范围 0~1。默认为 1 */ - volume: number - /** [InnerAudioContext.destroy()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.destroy.html) - * - * 在插件中使用:支持 - * - * 销毁当前实例 */ - destroy(): void - /** [InnerAudioContext.offCanplay(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.offCanplay.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:支持 -* -* 移除音频进入可以播放状态的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InnerAudioContext.onCanplay(listener) -InnerAudioContext.offCanplay(listener) // 需传入与监听时同一个的函数对象 -``` */ - offCanplay( - /** onCanplay 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffCanplayCallback - ): void - /** [InnerAudioContext.offEnded(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.offEnded.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:支持 -* -* 移除音频自然播放至结束的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InnerAudioContext.onEnded(listener) -InnerAudioContext.offEnded(listener) // 需传入与监听时同一个的函数对象 -``` */ - offEnded( - /** onEnded 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffEndedCallback - ): void - /** [InnerAudioContext.offError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.offError.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:支持 -* -* 移除音频播放错误事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InnerAudioContext.onError(listener) -InnerAudioContext.offError(listener) // 需传入与监听时同一个的函数对象 -``` */ - offError( - /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: InnerAudioContextOffErrorCallback - ): void - /** [InnerAudioContext.offPause(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.offPause.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:支持 -* -* 移除音频暂停事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InnerAudioContext.onPause(listener) -InnerAudioContext.offPause(listener) // 需传入与监听时同一个的函数对象 -``` */ - offPause( - /** onPause 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffPauseCallback - ): void - /** [InnerAudioContext.offPlay(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.offPlay.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:支持 -* -* 移除音频播放事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InnerAudioContext.onPlay(listener) -InnerAudioContext.offPlay(listener) // 需传入与监听时同一个的函数对象 -``` */ - offPlay( - /** onPlay 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffPlayCallback - ): void - /** [InnerAudioContext.offSeeked(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.offSeeked.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:支持 -* -* 移除音频完成跳转操作的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InnerAudioContext.onSeeked(listener) -InnerAudioContext.offSeeked(listener) // 需传入与监听时同一个的函数对象 -``` */ - offSeeked( - /** onSeeked 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffSeekedCallback - ): void - /** [InnerAudioContext.offSeeking(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.offSeeking.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:支持 -* -* 移除音频进行跳转操作的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InnerAudioContext.onSeeking(listener) -InnerAudioContext.offSeeking(listener) // 需传入与监听时同一个的函数对象 -``` */ - offSeeking( - /** onSeeking 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffSeekingCallback - ): void - /** [InnerAudioContext.offStop(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.offStop.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:支持 -* -* 移除音频停止事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InnerAudioContext.onStop(listener) -InnerAudioContext.offStop(listener) // 需传入与监听时同一个的函数对象 -``` */ - offStop( - /** onStop 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffStopCallback - ): void - /** [InnerAudioContext.offTimeUpdate(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.offTimeUpdate.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:支持 -* -* 移除音频播放进度更新事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InnerAudioContext.onTimeUpdate(listener) -InnerAudioContext.offTimeUpdate(listener) // 需传入与监听时同一个的函数对象 -``` */ - offTimeUpdate( - /** onTimeUpdate 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffTimeUpdateCallback - ): void - /** [InnerAudioContext.offWaiting(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.offWaiting.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:支持 -* -* 移除音频加载中事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InnerAudioContext.onWaiting(listener) -InnerAudioContext.offWaiting(listener) // 需传入与监听时同一个的函数对象 -``` */ - offWaiting( - /** onWaiting 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffWaitingCallback - ): void - /** [InnerAudioContext.onCanplay(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.onCanplay.html) - * - * 在插件中使用:支持 - * - * 监听音频进入可以播放状态的事件。但不保证后面可以流畅播放 */ - onCanplay( - /** 音频进入可以播放状态的事件的监听函数 */ - listener: OnCanplayCallback - ): void - /** [InnerAudioContext.onEnded(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.onEnded.html) - * - * 在插件中使用:支持 - * - * 监听音频自然播放至结束的事件 */ - onEnded( - /** 音频自然播放至结束的事件的监听函数 */ - listener: OnEndedCallback - ): void - /** [InnerAudioContext.onError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.onError.html) - * - * 在插件中使用:支持 - * - * 监听音频播放错误事件 - * - * **Tips** - * - * 1. errCode=100001 时,如若 errMsg 中有 INNERCODE -11828 ,请先检查 response header 是否缺少 Content-Length - * 2. errCode=100001 时,如若 errMsg 中有 systemErrCode:200333420,请检查文件编码格式和 fileExtension 是否一致 */ - onError( - /** 音频播放错误事件的监听函数 */ - listener: InnerAudioContextOnErrorCallback - ): void - /** [InnerAudioContext.onPause(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.onPause.html) - * - * 在插件中使用:支持 - * - * 监听音频暂停事件 */ - onPause( - /** 音频暂停事件的监听函数 */ - listener: OnPauseCallback - ): void - /** [InnerAudioContext.onPlay(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.onPlay.html) - * - * 在插件中使用:支持 - * - * 监听音频播放事件 */ - onPlay( - /** 音频播放事件的监听函数 */ - listener: OnPlayCallback - ): void - /** [InnerAudioContext.onSeeked(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.onSeeked.html) - * - * 在插件中使用:支持 - * - * 监听音频完成跳转操作的事件 */ - onSeeked( - /** 音频完成跳转操作的事件的监听函数 */ - listener: OnSeekedCallback - ): void - /** [InnerAudioContext.onSeeking(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.onSeeking.html) - * - * 在插件中使用:支持 - * - * 监听音频进行跳转操作的事件 */ - onSeeking( - /** 音频进行跳转操作的事件的监听函数 */ - listener: OnSeekingCallback - ): void - /** [InnerAudioContext.onStop(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.onStop.html) - * - * 在插件中使用:支持 - * - * 监听音频停止事件 */ - onStop( - /** 音频停止事件的监听函数 */ - listener: InnerAudioContextOnStopCallback - ): void - /** [InnerAudioContext.onTimeUpdate(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.onTimeUpdate.html) - * - * 在插件中使用:支持 - * - * 监听音频播放进度更新事件 */ - onTimeUpdate( - /** 音频播放进度更新事件的监听函数 */ - listener: OnTimeUpdateCallback - ): void - /** [InnerAudioContext.onWaiting(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.onWaiting.html) - * - * 在插件中使用:支持 - * - * 监听音频加载中事件。当音频因为数据不足,需要停下来加载时会触发 */ - onWaiting( - /** 音频加载中事件的监听函数 */ - listener: OnWaitingCallback - ): void - /** [InnerAudioContext.pause()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.pause.html) - * - * 在插件中使用:支持 - * - * 暂停。暂停后的音频再播放会从暂停处开始播放 */ - pause(): void - /** [InnerAudioContext.play()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.play.html) - * - * 在插件中使用:支持 - * - * 播放 */ - play(): void - /** [InnerAudioContext.seek(number position)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.seek.html) - * - * 在插件中使用:支持 - * - * 跳转到指定位置 */ - seek( - /** 跳转的时间,单位 s。精确到小数点后 3 位,即支持 ms 级别精确度 */ - position: number - ): void - /** [InnerAudioContext.stop()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.stop.html) - * - * 在插件中使用:支持 - * - * 停止。停止后的音频再播放会从头开始播放。 */ - stop(): void - } - interface InnerAudioContextOnErrorListenerResult { - /** 可选值: - * - 10001: 系统错误; - * - 10002: 网络错误; - * - 10003: 文件错误; - * - 10004: 格式错误; - * - -1: 未知错误; */ - errCode: 10001 | 10002 | 10003 | 10004 | -1 - errMsg: string - } - interface InsertDividerOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: InsertDividerCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: InsertDividerFailCallback - /** 接口调用成功的回调函数 */ - success?: InsertDividerSuccessCallback - } - interface InsertImageOption { - /** 图片地址,仅支持 http(s)、base64、云图片(2.8.0)、临时文件(2.8.3)。 */ - src: string - /** 图像无法显示时的替代文本 */ - alt?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: InsertImageCompleteCallback - /** data 被序列化为 name=value;name1=value2 的格式挂在属性 data-custom 上 */ - data?: IAnyObject - /** 添加到图片 img 标签上的类名 */ - extClass?: string - /** 接口调用失败的回调函数 */ - fail?: InsertImageFailCallback - /** 图片高度 (pixels/百分比) */ - height?: string - /** 插入图片后是否自动换行,默认换行 */ - nowrap?: boolean - /** 接口调用成功的回调函数 */ - success?: InsertImageSuccessCallback - /** 图片宽度(pixels/百分比) */ - width?: string - } - interface InsertTextOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: InsertTextCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: InsertTextFailCallback - /** 接口调用成功的回调函数 */ - success?: InsertTextSuccessCallback - /** 文本内容 */ - text?: string - } - interface IntersectionObserverObserveCallbackResult { - /** 目标边界 */ - boundingClientRect: BoundingClientRectResult - /** 节点自定义数据属性 */ - dataset: Record - /** 节点 ID */ - id: string - /** 相交比例 */ - intersectionRatio: number - /** 相交区域的边界 */ - intersectionRect: IntersectionRectResult - /** 参照区域的边界 */ - relativeRect: RelativeRectResult - /** 相交检测时的时间戳 */ - time: number - } - /** 相交区域的边界 */ - interface IntersectionRectResult { - /** 下边界 */ - bottom: number - /** 高度 */ - height: number - /** 左边界 */ - left: number - /** 右边界 */ - right: number - /** 上边界 */ - top: number - /** 宽度 */ - width: number - } - interface InterstitialAdOnErrorListenerResult { - /** 错误码 - * - * 可选值: - * - 1000: 后端接口调用失败; - * - 1001: 参数错误; - * - 1002: 广告单元无效; - * - 1003: 内部错误; - * - 1004: 无合适的广告; - * - 1005: 广告组件审核中; - * - 1006: 广告组件被驳回; - * - 1007: 广告组件被封禁; - * - 1008: 广告单元已关闭; */ - errCode: 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 - /** 错误信息 */ - errMsg: string - } - interface IsBluetoothDevicePairedOption { - /** 蓝牙设备 id */ - deviceId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: IsBluetoothDevicePairedCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: IsBluetoothDevicePairedFailCallback - /** 接口调用成功的回调函数 */ - success?: IsBluetoothDevicePairedSuccessCallback - } - interface IsConnectedOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: IsConnectedCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: IsConnectedFailCallback - /** 接口调用成功的回调函数 */ - success?: IsConnectedSuccessCallback - } - interface Join1v1ChatOption { - /** 呼叫方信息 */ - caller: VoIP1v1ChatUser - /** 接听方信息 */ - listener: VoIP1v1ChatUser - /** 窗口背景色(音频通话背景以及小窗模式背景) - * - * 可选值: - * - 0: #262930; - * - 1: #FA5151; - * - 2: #FA9D3B; - * - 3: #3D7257; - * - 4: #1485EE; - * - 5: #6467F0; */ - backgroundType?: 0 | 1 | 2 | 3 | 4 | 5 - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: Join1v1ChatCompleteCallback - /** 不允许切换到语音通话 */ - disableSwitchVoice?: boolean - /** 接口调用失败的回调函数 */ - fail?: Join1v1ChatFailCallback - /** 小窗样式 */ - minWindowType?: number - /** 通话类型 - * - * 可选值: - * - 'voice': 语音通话; - * - 'video': 视频通话; */ - roomType?: 'voice' | 'video' - /** 接口调用成功的回调函数 */ - success?: Join1v1ChatSuccessCallback - } - interface JoinVoIPChatOption { - /** 小游戏内此房间/群聊的 ID。同一时刻传入相同 groupId 的用户会进入到同个实时语音房间。 */ - groupId: string - /** 验证所需的随机字符串 */ - nonceStr: string - /** 签名,用于验证小游戏的身份 */ - signature: string - /** 验证所需的时间戳 */ - timeStamp: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: JoinVoIPChatCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: JoinVoIPChatFailCallback - /** 需要基础库: `2.29.0` - * - * 开启后,joinVoIPChat 会同时走 Wi-Fi 和蜂窝网络2种网络模式,保证实时通话体验。 */ - forceCellularNetwork?: boolean - /** 静音设置 */ - muteConfig?: MuteConfig - /** 房间类型 - * - * 可选值: - * - 'voice': 音频房间,用于语音通话; - * - 'video': 视频房间,结合 [voip-room](https://developers.weixin.qq.com/miniprogram/dev/component/voip-room.html) 组件可显示成员画面; */ - roomType?: 'voice' | 'video' - /** 接口调用成功的回调函数 */ - success?: JoinVoIPChatSuccessCallback - } - interface JoinVoIPChatSuccessCallbackResult { - /** 错误码 */ - errCode: number - /** 调用结果 */ - errMsg: string - /** 在此通话中的成员 openId 名单 */ - openIdList: string[] - } - interface KvList { - /** key 本地缓存中指定的 key */ - key: string - /** data 需要存储的内容。只支持原生类型、Date、及能够通过`JSON.stringify`序列化的对象。 */ - value: any - } - /** 启动参数 */ - interface LaunchOptionsApp { - /** 需要基础库: `2.20.0` - * - * API 类别 - * - * 可选值: - * - 'default': 默认类别; - * - 'nativeFunctionalized': 原生功能化,视频号直播商品、商品橱窗等场景打开的小程序; - * - 'browseOnly': 仅浏览,朋友圈快照页等场景打开的小程序; - * - 'embedded': 内嵌,通过打开半屏小程序能力打开的小程序; */ - apiCategory: - | 'default' - | 'nativeFunctionalized' - | 'browseOnly' - | 'embedded' - /** 打开的文件信息数组,只有从聊天素材场景打开(scene为1173)才会携带该参数 */ - forwardMaterials: ForwardMaterials[] - /** 启动小程序的路径 (代码包路径) */ - path: string - /** 启动小程序的 query 参数 */ - query: Record - /** 来源信息。从另一个小程序、公众号或 App 进入小程序时返回。否则返回 `{}`。(参见后文注意) */ - referrerInfo: ReferrerInfo - /** 启动小程序的[场景值](https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/scene.html) */ - scene: number - /** 从微信群聊/单聊打开小程序时,chatType 表示具体微信群聊/单聊类型 - * - * 可选值: - * - 1: 微信联系人单聊; - * - 2: 企业微信联系人单聊; - * - 3: 普通微信群聊; - * - 4: 企业微信互通群聊; */ - chatType?: 1 | 2 | 3 | 4 - /** shareTicket,详见[获取更多转发信息](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html#获取更多转发信息) */ - shareTicket?: string - } - /** 帧深度纹理buffer对象,width * height 大小的 深度值(float32) */ - interface LegSegmentBufferRes { - /** 腿部分割纹理buffer,width * height 大小的 裁剪值(0 为不是脚,越靠近 255 越接近腿部区域)(uint8) */ - DepthAddress: ArrayBuffer - /** 腿部分割纹理高 */ - height: number - /** 腿部分割纹理宽 */ - width: number - } - interface LivePlayerContextRequestFullScreenOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequestFullScreenCompleteCallback - /** 设置全屏时的方向 - * - * 可选值: - * - 0: 正常竖向; - * - 90: 屏幕逆时针90度; - * - -90: 屏幕顺时针90度; */ - direction?: 0 | 90 | -90 - /** 接口调用失败的回调函数 */ - fail?: RequestFullScreenFailCallback - /** 接口调用成功的回调函数 */ - success?: RequestFullScreenSuccessCallback - } - interface LivePlayerContextSnapshotOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SnapshotCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SnapshotFailCallback - /** 需要基础库: `2.10.0` - * - * 图片的质量 - * - * 可选值: - * - 'raw': 原图; - * - 'compressed': 压缩图; */ - quality?: 'raw' | 'compressed' - /** 需要基础库: `2.25.0` - * - * 截取的源类型 - * - * 可选值: - * - 'stream': 截取视频源; - * - 'view': 截取渲染后的画面; */ - sourceType?: 'stream' | 'view' - /** 接口调用成功的回调函数 */ - success?: LivePlayerContextSnapshotSuccessCallback - } - interface LivePlayerContextSnapshotSuccessCallbackResult { - /** 图片的高度 */ - height: string - /** 图片文件的临时路径 (本地路径) */ - tempImagePath: string - /** 图片的宽度 */ - width: string - errMsg: string - } - interface LivePusherContextSetZoomOption { - /** 缩放级别,范围[1, maxZoom]。zoom 可取小数,精确到小数后一位。 */ - zoom: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetZoomCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetZoomFailCallback - /** 接口调用成功的回调函数 */ - success?: LivePusherContextSetZoomSuccessCallback - } - interface LivePusherContextSnapshotOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SnapshotCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SnapshotFailCallback - /** 需要基础库: `2.10.0` - * - * 图片的质量 - * - * 可选值: - * - 'raw': 原图; - * - 'compressed': 压缩图; */ - quality?: 'raw' | 'compressed' - /** 需要基础库: `2.25.0` - * - * 截取的源类型 - * - * 可选值: - * - 'stream': 截取视频源; - * - 'view': 截取渲染后的画面; */ - sourceType?: 'stream' | 'view' - /** 接口调用成功的回调函数 */ - success?: LivePusherContextSnapshotSuccessCallback - } - interface LivePusherContextSnapshotSuccessCallbackResult { - /** 图片的高度 */ - height: string - /** 图片文件的临时路径 */ - tempImagePath: string - /** 图片的宽度 */ - width: string - errMsg: string - } - interface LivePusherContextStartOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartFailCallback - /** 接口调用成功的回调函数 */ - success?: StartSuccessCallback - } - interface LoadFontFaceCompleteCallbackResult { - /** 加载字体结果 */ - status: string - } - interface LoadFontFaceOption { - /** 定义的字体名称 */ - family: string - /** 字体资源的地址。建议格式为 TTF 和 WOFF,WOFF2 在低版本的iOS上会不兼容。 */ - source: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: LoadFontFaceCompleteCallback - /** 可选的字体描述符 */ - desc?: DescOption - /** 接口调用失败的回调函数 */ - fail?: LoadFontFaceFailCallback - /** 需要基础库: `2.10.0` - * - * 是否全局生效 */ - global?: boolean - /** 字体作用范围,可选值为 webview / native,默认 webview,设置 native 可在 Canvas 2D 下使用 */ - scopes?: any[] - /** 接口调用成功的回调函数 */ - success?: LoadFontFaceSuccessCallback - } - interface LoginOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: LoginCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: LoginFailCallback - /** 接口调用成功的回调函数 */ - success?: LoginSuccessCallback - /** 需要基础库: `1.9.90` - * - * 超时时间,单位ms */ - timeout?: number - } - interface LoginSuccessCallbackResult { - /** 用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 [code2Session](https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html),使用 code 换取 openid、unionid、session_key 等信息 */ - code: string - errMsg: string - } - interface MakeBluetoothPairOption { - /** 蓝牙设备 id */ - deviceId: string - /** pin 码,Base64 格式。 */ - pin: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: MakeBluetoothPairCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: MakeBluetoothPairFailCallback - /** 接口调用成功的回调函数 */ - success?: MakeBluetoothPairSuccessCallback - /** 超时时间,单位 ms */ - timeout?: number - } - interface MakePhoneCallOption { - /** 需要拨打的电话号码 */ - phoneNumber: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: MakePhoneCallCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: MakePhoneCallFailCallback - /** 接口调用成功的回调函数 */ - success?: MakePhoneCallSuccessCallback - } - /** 广播的制造商信息。仅安卓支持,iOS 因系统限制无法定制。 */ - interface ManufacturerData { - /** 制造商ID,0x 开头的十六进制 */ - manufacturerId: string - /** 制造商信息 */ - manufacturerSpecificData?: ArrayBuffer - } - /** 图片覆盖的经纬度范围 */ - interface MapBounds { - /** 东北角经纬度 */ - northeast: MapPostion - /** 西南角经纬度 */ - southwest: MapPostion - } - interface MapPostion { - /** 纬度 */ - latitude: number - /** 经度 */ - longitude: number - } - /** 用来扩展(或收缩)参照节点布局区域的边界 */ - interface Margins { - /** 节点布局区域的下边界 */ - bottom?: number - /** 节点布局区域的左边界 */ - left?: number - /** 节点布局区域的右边界 */ - right?: number - /** 节点布局区域的上边界 */ - top?: number - } - /** 匹配到的缓存 */ - interface MatchCache { - /** 缓存 id */ - cacheId: string - /** 缓存创建时间 */ - createTime: number - /** 缓存内容,会带有 fromCache 标记,方便开发者区分内容是否来自缓存 */ - data: any - /** 缓存有效时间 */ - maxAge: number - /** 命中的规则 id */ - ruleId: string - } - /** MediaAudioPlayer 实例,可通过 [wx.createMediaAudioPlayer](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createMediaAudioPlayer.html) 接口获取实例。 */ - interface MediaAudioPlayer { - /** 音量。范围 0~1。默认为 1 */ - volume: number - /** [Promise MediaAudioPlayer.addAudioSource([VideoDecoder](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.html) source)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/MediaAudioPlayer.addAudioSource.html) - * - * 在插件中使用:支持 - * - * 添加音频源 */ - addAudioSource( - /** [VideoDecoder](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.html) - * - * 视频解码器实例。作为音频源添加到音频播放器中 */ - source: VideoDecoder - ): Promise - /** [Promise MediaAudioPlayer.destroy()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/MediaAudioPlayer.destroy.html) - * - * 在插件中使用:支持 - * - * 销毁播放器 */ - destroy(): Promise - /** [Promise MediaAudioPlayer.removeAudioSource([VideoDecoder](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.html) source)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/MediaAudioPlayer.removeAudioSource.html) - * - * 在插件中使用:支持 - * - * 移除音频源 */ - removeAudioSource( - /** [VideoDecoder](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.html) - * - * 视频解码器实例 */ - source: VideoDecoder - ): Promise - /** [Promise MediaAudioPlayer.start()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/MediaAudioPlayer.start.html) - * - * 在插件中使用:支持 - * - * 启动播放器 */ - start(): Promise - /** [Promise MediaAudioPlayer.stop()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/MediaAudioPlayer.stop.html) - * - * 在插件中使用:支持 - * - * 停止播放器 */ - stop(): Promise - } - /** 本地临时文件列表 */ - interface MediaFile { - /** 视频的时间长度 */ - duration: number - /** 文件类型 - * - * 可选值: - * - 'image': 图片; - * - 'video': 视频; */ - fileType: 'image' | 'video' - /** 视频的高度 */ - height: number - /** 本地临时文件大小,单位 B */ - size: number - /** 本地临时文件路径 (本地路径) */ - tempFilePath: string - /** 视频缩略图临时文件路径 */ - thumbTempFilePath: string - /** 视频的宽度 */ - width: number - } - interface MediaQueryObserverObserveCallbackResult { - /** 页面的当前状态是否满足所指定的 media query */ - matches: boolean - } - /** 需要预览的资源列表 */ - interface MediaSource { - /** 图片或视频的地址 */ - url: string - /** 视频的封面图片 */ - poster?: string - /** 资源的类型,默认为图片 - * - * 可选值: - * - 'image': 图片; - * - 'video': 视频; */ - type?: 'image' | 'video' - } - /** 需要基础库: `2.9.0` - * - * 可通过 [MediaContainer.extractDataSource](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/MediaContainer.extractDataSource.html) 返回。 - * - * [MediaTrack](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/MediaTrack.html) 音频或视频轨道,可以对轨道进行一些操作 */ - interface MediaTrack { - /** 轨道长度,只读 */ - duration: number - /** 轨道类型,只读 - * - * 可选值: - * - 'audio': 音频轨道; - * - 'video': 视频轨道; */ - kind: 'audio' | 'video' - /** 音量,音频轨道下有效,可写 */ - volume: number - } - /** 小程序账号信息 */ - interface MiniProgram { - /** 小程序 appId */ - appId: string - /** 需要基础库: `2.10.0` - * - * 小程序版本 - * - * 可选值: - * - 'develop': 开发版; - * - 'trial': 体验版; - * - 'release': 正式版; */ - envVersion: 'develop' | 'trial' | 'release' - /** 需要基础库: `2.10.2` - * - * 线上小程序版本号 */ - version: string - } - interface MkdirOption { - /** 创建的目录路径 (本地路径) */ - dirPath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: MkdirCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: MkdirFailCallback - /** 需要基础库: `2.3.0` - * - * 是否在递归创建该目录的上级目录后再创建该目录。如果对应的上级目录已经存在,则不创建该上级目录。如 dirPath 为 a/b/c/d 且 recursive 为 true,将创建 a 目录,再在 a 目录下创建 b 目录,以此类推直至创建 a/b/c 目录下的 d 目录。 */ - recursive?: boolean - /** 接口调用成功的回调函数 */ - success?: MkdirSuccessCallback - } - interface MoveAlongOption { - /** 平滑移动的时间 */ - duration: number - /** 指定 marker */ - markerId: number - /** 移动路径的坐标串,坐标点格式 `{longitude, latitude}` */ - path: any[] - /** 平滑移动触发 map 组件 interpolatepoint 事件的插值精度,单位为 m。默认不触发。 */ - precision: IAnyObject - /** 根据路径方向自动改变 marker 的旋转角度 */ - autoRotate?: boolean - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: MoveAlongCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: MoveAlongFailCallback - /** 接口调用成功的回调函数 */ - success?: MoveAlongSuccessCallback - } - interface MoveToLocationOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: MoveToLocationCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: MoveToLocationFailCallback - /** 需要基础库: `2.8.0` - * - * 纬度 */ - latitude?: number - /** 需要基础库: `2.8.0` - * - * 经度 */ - longitude?: number - /** 接口调用成功的回调函数 */ - success?: MoveToLocationSuccessCallback - } - /** 静音设置 */ - interface MuteConfig { - /** 是否静音耳机 */ - muteEarphone?: boolean - /** 是否静音麦克风 */ - muteMicrophone?: boolean - } - interface MuteOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: MuteCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: MuteFailCallback - /** 接口调用成功的回调函数 */ - success?: MuteSuccessCallback - } - /** 需要基础库: `2.11.2` */ - interface NFCAdapter { - /** 标签类型枚举 */ - tech: TechType - /** [NFCAdapter.offDiscovered(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.offDiscovered.html) -* -* 需要基础库: `2.11.2` -* -* 在插件中使用:支持 -* -* 移除 NFC Tag的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -NFCAdapter.onDiscovered(listener) -NFCAdapter.offDiscovered(listener) // 需传入与监听时同一个的函数对象 -``` */ - offDiscovered( - /** onDiscovered 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffDiscoveredCallback - ): void - /** [NFCAdapter.onDiscovered(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.onDiscovered.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 监听 NFC Tag */ - onDiscovered( - /** 的监听函数 */ - listener: OnDiscoveredCallback - ): void - /** [NFCAdapter.startDiscovery(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.startDiscovery.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 */ - startDiscovery(option?: StartDiscoveryOption): void - /** [NFCAdapter.stopDiscovery(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.stopDiscovery.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 */ - stopDiscovery(option?: StopDiscoveryOption): void - /** [[IsoDep](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/IsoDep.html) NFCAdapter.getIsoDep()](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.getIsoDep.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取IsoDep实例,实例支持ISO-DEP (ISO 14443-4)标准的读写 */ - getIsoDep(): IsoDep - /** [[MifareClassic](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareClassic.html) NFCAdapter.getMifareClassic()](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.getMifareClassic.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取MifareClassic实例,实例支持MIFARE Classic标签的读写 */ - getMifareClassic(): MifareClassic - /** [[MifareUltralight](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareUltralight.html) NFCAdapter.getMifareUltralight()](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.getMifareUltralight.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取MifareUltralight实例,实例支持MIFARE Ultralight标签的读写 */ - getMifareUltralight(): MifareUltralight - /** [[Ndef](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/Ndef.html) NFCAdapter.getNdef()](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.getNdef.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取Ndef实例,实例支持对NDEF格式的NFC标签上的NDEF数据的读写 */ - getNdef(): Ndef - /** [[NfcA](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcA.html) NFCAdapter.getNfcA()](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.getNfcA.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取NfcA实例,实例支持NFC-A (ISO 14443-3A)标准的读写 */ - getNfcA(): NfcA - /** [[NfcB](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcB.html) NFCAdapter.getNfcB()](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.getNfcB.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取NfcB实例,实例支持NFC-B (ISO 14443-3B)标准的读写 */ - getNfcB(): NfcB - /** [[NfcF](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcF.html) NFCAdapter.getNfcF()](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.getNfcF.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取NfcF实例,实例支持NFC-F (JIS 6319-4)标准的读写 */ - getNfcF(): NfcF - /** [[NfcV](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcV.html) NFCAdapter.getNfcV()](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.getNfcV.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取NfcV实例,实例支持NFC-V (ISO 15693)标准的读写 */ - getNfcV(): NfcV - } - interface NavigateBackMiniProgramOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: NavigateBackMiniProgramCompleteCallback - /** 需要返回给上一个小程序的数据,上一个小程序可在 `App.onShow` 中获取到这份数据。 [详情](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html)。 */ - extraData?: IAnyObject - /** 接口调用失败的回调函数 */ - fail?: NavigateBackMiniProgramFailCallback - /** 接口调用成功的回调函数 */ - success?: NavigateBackMiniProgramSuccessCallback - } - interface NavigateBackOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: NavigateBackCompleteCallback - /** 返回的页面数,如果 delta 大于现有页面数,则返回到首页。 */ - delta?: number - /** 接口调用失败的回调函数 */ - fail?: NavigateBackFailCallback - /** 接口调用成功的回调函数 */ - success?: NavigateBackSuccessCallback - } - interface NavigateToMiniProgramOption { - /** 要打开的小程序 appId */ - appId?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: NavigateToMiniProgramCompleteCallback - /** 要打开的小程序版本。仅在当前小程序为开发版或体验版时此参数有效。如果当前小程序是正式版,则打开的小程序必定是正式版。 - * - * 可选值: - * - 'develop': 开发版; - * - 'trial': 体验版; - * - 'release': 正式版; */ - envVersion?: 'develop' | 'trial' | 'release' - /** 需要传递给目标小程序的数据,目标小程序可在 `App.onLaunch`,`App.onShow` 中获取到这份数据。如果跳转的是小游戏,可以在 [wx.onShow](#)、[wx.getLaunchOptionsSync](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/life-cycle/wx.getLaunchOptionsSync.html) 中可以获取到这份数据数据。 */ - extraData?: IAnyObject - /** 接口调用失败的回调函数 */ - fail?: NavigateToMiniProgramFailCallback - /** 需要基础库: `2.24.0` - * - * 不reLaunch目标小程序,直接打开目标跳转的小程序退后台时的页面,需满足以下条件:1. 目标跳转的小程序生命周期未被销毁;2. 且目标当次启动的path、query与上次启动相同,apiCategory以wx.getApiCategory接口的返回结果为准。 */ - noRelaunchIfPathUnchanged?: boolean - /** 打开的页面路径,如果为空则打开首页。path 中 ? 后面的部分会成为 query,在小程序的 `App.onLaunch`、`App.onShow` 和 `Page.onLoad` 的回调函数或小游戏的 [wx.onShow](#) 回调函数、[wx.getLaunchOptionsSync](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/life-cycle/wx.getLaunchOptionsSync.html) 中可以获取到 query 数据。对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。 */ - path?: string - /** 需要基础库: `2.18.1` - * - * 小程序链接,当传递该参数后,可以不传 appId 和 path。链接可以通过【小程序菜单】->【复制链接】获取。 */ - shortLink?: string - /** 接口调用成功的回调函数 */ - success?: NavigateToMiniProgramSuccessCallback - } - interface NavigateToOption { - /** 需要跳转的应用内非 tabBar 的页面的路径 (代码包路径), 路径后可以带参数。参数与路径之间使用 `?` 分隔,参数键与参数值用 `=` 相连,不同参数用 `&` 分隔;如 'path?key=value&key2=value2' */ - url: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: NavigateToCompleteCallback - /** 页面间通信接口,用于监听被打开页面发送到当前页面的数据。基础库 2.7.3 开始支持。 */ - events?: IAnyObject - /** 接口调用失败的回调函数 */ - fail?: NavigateToFailCallback - /** 3.4.0 自定义路由配置,相关文档 [自定义路由](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/custom-route.html) */ - routeConfig?: IAnyObject - /** 3.4.0 自定义路由参数,相关文档 [自定义路由](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/custom-route.html) */ - routeOptions?: IAnyObject - /** 2.29.2 自定义路由类型,相关文档 [自定义路由](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/custom-route.html) */ - routeType?: string - /** 接口调用成功的回调函数 */ - success?: NavigateToSuccessCallback - } - interface NavigateToSuccessCallbackResult { - /** [EventChannel](https://developers.weixin.qq.com/miniprogram/dev/api/route/EventChannel.html) - * - * 和被打开页面进行通信 */ - eventChannel: EventChannel - errMsg: string - } - interface NdefCloseOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: NdefCloseCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: NdefCloseFailCallback - /** 接口调用成功的回调函数 */ - success?: NdefCloseSuccessCallback - } - interface NdefConnectOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ConnectCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ConnectFailCallback - /** 接口调用成功的回调函数 */ - success?: ConnectSuccessCallback - } - interface NodeCallbackResult { - /** 节点对应的 Node 实例 */ - node: IAnyObject - } - interface NotifyBLECharacteristicValueChangeOption { - /** 蓝牙特征的 UUID */ - characteristicId: string - /** 蓝牙设备 id */ - deviceId: string - /** 蓝牙特征对应服务的 UUID */ - serviceId: string - /** 是否启用 notify */ - state: boolean - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: NotifyBLECharacteristicValueChangeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: NotifyBLECharacteristicValueChangeFailCallback - /** 接口调用成功的回调函数 */ - success?: NotifyBLECharacteristicValueChangeSuccessCallback - /** 需要基础库: `2.4.0` - * - * 设置特征订阅类型,有效值有 `notification` 和 `indication` */ - type?: string - } - /** 需要基础库: `2.27.0` - * - * OCR检测配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/ocr.html)。 */ - interface OCRTrack { - /** 需要基础库: `2.27.0` - * - * OCR检测模式 - * - * 可选值: - * - 1: 通过摄像头实时检测; - * - 2: 静态图片检测; */ - mode: 1 | 2 - } - /** media query 描述符 */ - interface ObserveDescriptor { - /** 页面高度( px 为单位) */ - height: number - /** 页面最大高度( px 为单位) */ - maxHeight: number - /** 页面最大宽度( px 为单位) */ - maxWidth: number - /** 页面最小高度( px 为单位) */ - minHeight: number - /** 页面最小宽度( px 为单位) */ - minWidth: number - /** 屏幕方向( `landscape` 或 `portrait` ) */ - orientation: string - /** 页面宽度( px 为单位) */ - width: number - } - /** 设置 type 监听单个类型的指标,设置 entryTypes 监听多个类型指标。 */ - interface ObserveOption { - /** 指标类型列表。不能和 type 同时使用。 */ - entryTypes?: string[] - /** 指标类型。不能和 entryTypes 同时使用 - * - * 可选值: - * - 'navigation': 路由; - * - 'render': 渲染; - * - 'script': 脚本; */ - type?: 'navigation' | 'render' | 'script' - } - /** 需要基础库: `2.7.0` - * - * 离屏 canvas 实例,可通过 [wx.createOffscreenCanvas](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.createOffscreenCanvas.html) 创建。 */ - interface OffscreenCanvas { - /** 画布高度 */ - height: number - /** 画布宽度 */ - width: number - /** [[Image](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Image.html) OffscreenCanvas.createImage()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/OffscreenCanvas.createImage.html) - * - * 需要基础库: `2.7.3` - * - * 在插件中使用:需要基础库 `2.16.1` - * - * 创建一个图片对象。支持在 2D Canvas 和 WebGL Canvas 下使用, 但不支持混用 2D 和 WebGL 的方法。 - * - * **** - * - * 注意不允许混用 webgl 和 2d 画布创建的图片对象,使用时请注意尽量使用 canvas 自身的 `createImage` 创建图片对象。 */ - createImage(): Image - /** [[RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) OffscreenCanvas.getContext(string contextType)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/OffscreenCanvas.getContext.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:需要基础库 `2.16.1` - * - * 该方法返回 OffscreenCanvas 的绘图上下文 - * - * **** - * - * 注意不允许混用 webgl 和 2d 绘图上下文,传入的 contextType 必须要与 `wx.createOffscreenCanvas` 传入的 type 类型一致。 */ - getContext( - /** 绘图上下文类型,需要与 createOffscreenCanvas 时传入的 type 一致 - * - * 参数 contextType 可选值: - * - 'webgl': webgl类型上下文; - * - '2d': 2d类型上下文; */ - contextType: 'webgl' | '2d' - ): any - } - interface OnAccelerometerChangeListenerResult { - /** X 轴 */ - x: number - /** Y 轴 */ - y: number - /** Z 轴 */ - z: number - } - interface OnAfterPageLoadListenerResult { - /** 组件框架 - * - * 可选值: - * - 'exparser': 旧版小程序组件框架; - * - 'glass-easel': 新版小程序组件框架; */ - componentFramework: 'exparser' | 'glass-easel' - /** 路由打开类型 */ - openType: string - /** 页面实例 */ - page: IAnyObject - /** 页面路径 */ - path: string - /** 路由参数 */ - query: IAnyObject - /** 路由事件 id */ - routeEventId: string - } - interface OnAfterPageUnloadListenerResult { - /** 页面路径 */ - path: string - /** 路由事件 id */ - routeEventId: string - } - interface OnApiCategoryChangeListenerResult { - /** API 类别 - * - * 可选值: - * - 'default': 默认类别; - * - 'nativeFunctionalized': 原生功能化,视频号直播商品、商品橱窗等场景打开的小程序; - * - 'browseOnly': 仅浏览,朋友圈快照页等场景打开的小程序; - * - 'embedded': 内嵌,通过打开半屏小程序能力打开的小程序; */ - apiCategory: - | 'default' - | 'nativeFunctionalized' - | 'browseOnly' - | 'embedded' - } - interface OnAppRouteDoneListenerResult { - /** 路由打开类型 */ - openType: string - /** 页面路径 */ - path: string - /** 路由参数 */ - query: IAnyObject - /** 路由事件 id */ - routeEventId: string - /** 路由下发的时间戳 */ - timeStamp: number - /** 当前页面 id */ - webviewId: number - } - interface OnAppRouteListenerResult { - /** 是否未找到页面 */ - notFound: boolean - /** 路由打开类型 */ - openType: string - /** 当前打开页面的相关配置 */ - page: IAnyObject - /** 页面路径 */ - path: string - /** 可选值: - * - 'min': 视频页面缩小为小窗; - * - 'max': 视频小窗还原为页面; */ - pipMode: 'min' | 'max' - /** 路由参数 */ - query: IAnyObject - /** 渲染引擎 - * - * 可选值: - * - 'webview': Webview 渲染引擎; - * - 'skyline': Skyline 渲染引擎; - * - 'xr-frame': xr-frame 解决方案; */ - renderer: 'webview' | 'skyline' | 'xr-frame' - /** 路由事件 id */ - routeEventId: string - /** 路由下发的时间戳 */ - timeStamp: number - /** 当前页面 id */ - webviewId: number - } - interface OnBLECharacteristicValueChangeListenerResult { - /** 蓝牙特征的 UUID */ - characteristicId: string - /** 蓝牙设备 id */ - deviceId: string - /** 蓝牙特征对应服务的 UUID */ - serviceId: string - /** 特征最新的值 */ - value: ArrayBuffer - } - interface OnBLEConnectionStateChangeListenerResult { - /** 是否处于已连接状态 */ - connected: boolean - /** 蓝牙设备 id */ - deviceId: string - } - interface OnBLEMTUChangeListenerResult { - /** 蓝牙设备 id */ - deviceId: string - /** 最大传输单元 */ - mtu: number - } - interface OnBLEPeripheralConnectionStateChangedListenerResult { - /** 连接目前状态 */ - connected: boolean - /** 连接状态变化的设备 id */ - deviceId: string - /** server 的 UUID */ - serverId: string - } - interface OnBackgroundFetchDataListenerResult { - /** 缓存数据类别,取值为 periodic 或 pre */ - fetchType: string - /** 缓存数据 */ - fetchedData: string - /** 小程序页面路径 */ - path: string - /** 传给页面的 query 参数 */ - query: string - /** 进入小程序的场景值 */ - scene: number - /** 客户端拿到缓存数据的时间戳 */ - timeStamp: number - } - interface OnBatteryInfoChangeListenerResult { - /** 是否处于省电模式 */ - isLowPowerModeEnabled: boolean - } - interface OnBeaconServiceChangeListenerResult { - /** 服务目前是否可用 */ - available: boolean - /** 目前是否处于搜索状态 */ - discovering: boolean - } - interface OnBeaconUpdateListenerResult { - /** 当前搜寻到的所有 Beacon 设备列表 */ - beacons: BeaconInfo[] - } - interface OnBeforeAppRouteListenerResult { - /** 是否未找到页面 */ - notFound: boolean - /** 路由打开类型 */ - openType: string - /** 当前打开页面的相关配置 */ - page: IAnyObject - /** 页面路径 */ - path: string - /** 可选值: - * - 'min': 视频页面缩小为小窗; - * - 'max': 视频小窗还原为页面; */ - pipMode: 'min' | 'max' - /** 路由参数 */ - query: IAnyObject - /** 渲染引擎 - * - * 可选值: - * - 'webview': Webview 渲染引擎; - * - 'skyline': Skyline 渲染引擎; - * - 'xr-frame': xr-frame 解决方案; */ - renderer: 'webview' | 'skyline' | 'xr-frame' - /** 路由事件 id */ - routeEventId: string - /** 当前页面 id */ - webviewId: number - } - interface OnBeforePageLoadListenerResult { - /** 组件框架 - * - * 可选值: - * - 'exparser': 旧版小程序组件框架; - * - 'glass-easel': 新版小程序组件框架; */ - componentFramework: 'exparser' | 'glass-easel' - /** 路由打开类型 */ - openType: string - /** 页面路径 */ - path: string - /** 路由参数 */ - query: IAnyObject - /** 路由事件 id */ - routeEventId: string - } - interface OnBeforePageUnloadListenerResult { - /** 页面实例 */ - page: IAnyObject - /** 页面路径 */ - path: string - /** 路由事件 id */ - routeEventId: string - } - interface OnBluetoothAdapterStateChangeListenerResult { - /** 蓝牙适配器是否可用 */ - available: boolean - /** 蓝牙适配器是否处于搜索状态 */ - discovering: boolean - } - interface OnBluetoothDeviceFoundListenerResult { - /** 新搜索到的设备列表 */ - devices: BlueToothDevice[] - } - interface OnCameraFrameCallbackResult { - /** 图像像素点数据,一维数组,每四项表示一个像素点的 rgba */ - data: ArrayBuffer - /** 图像数据矩形的高度 */ - height: number - /** 图像数据矩形的宽度 */ - width: number - } - interface OnCharacteristicReadRequestListenerResult { - /** 唯一标识码,调用 [writeCharacteristicValue](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.writeCharacteristicValue.html) 时使用 */ - callbackId: number - /** 蓝牙特征的 UUID */ - characteristicId: string - /** 蓝牙特征对应服务的 UUID */ - serviceId: string - } - interface OnCharacteristicSubscribedListenerResult { - /** 蓝牙特征的 UUID */ - characteristicId: string - /** 蓝牙特征对应服务的 UUID */ - serviceId: string - } - interface OnCharacteristicWriteRequestListenerResult { - /** 唯一标识码,调用 [writeCharacteristicValue](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.writeCharacteristicValue.html) 时使用 */ - callbackId: number - /** 蓝牙特征的 UUID */ - characteristicId: string - /** 蓝牙特征对应服务的 UUID */ - serviceId: string - /** 请求写入特征的二进制数据值 */ - value: ArrayBuffer - } - interface OnCheckForUpdateListenerResult { - /** 是否有新版本 */ - hasUpdate: boolean - } - interface OnChunkReceivedListenerResult { - /** 返回的chunk buffer */ - data: ArrayBuffer - } - interface OnCompassChangeListenerResult { - /** 需要基础库: `2.4.0` - * - * 精度 */ - accuracy: number | string - /** 面对的方向度数 */ - direction: number - } - interface OnConnectListenerResult { - /** 需要基础库: `3.4.0` - * - * 网络请求过程中的一些异常信息(例如:TCPSocket.connect 传了 enableHttpDNS: true,但最终未使用 HttpDNS 时,exception 就会说明未使用 HttpDNS 的原因) */ - exception: Exception - /** 需要基础库: `3.4.1` - * - * 接收端地址信息(目前仅iOS和Android端支持) */ - localInfo: OnConnectListenerResultLocalInfo - /** 需要基础库: `3.4.1` - * - * 发送端地址信息(目前仅iOS和Android端支持) */ - remoteInfo: OnConnectListenerResultRemoteInfo - /** 需要基础库: `3.4.0` - * - * 本次连接是否使用了 HttpDNS */ - useHttpDNS: boolean - } - /** 需要基础库: `3.4.1` - * - * 接收端地址信息(目前仅iOS和Android端支持) */ - interface OnConnectListenerResultLocalInfo { - /** 需要基础库: `3.4.1` - * - * 接收消息的 socket 的地址 */ - address: string - /** 需要基础库: `3.4.1` - * - * 使用的协议族,为 IPv4 或者 IPv6 */ - family: string - /** 需要基础库: `3.4.1` - * - * 端口号 */ - port: number - } - /** 需要基础库: `3.4.1` - * - * 发送端地址信息(目前仅iOS和Android端支持) */ - interface OnConnectListenerResultRemoteInfo { - /** 需要基础库: `3.4.1` - * - * 发送消息的 socket 的地址 */ - address: string - /** 需要基础库: `3.4.1` - * - * 使用的协议族,为 IPv4 或者 IPv6 */ - family: string - /** 需要基础库: `3.4.1` - * - * 端口号 */ - port: number - } - interface OnCopyUrlListenerResult { - /** 用短链打开小程序时当前页面携带的查询字符串。小程序中使用时,应在进入页面时调用 `wx.onCopyUrl` 自定义 `query`,退出页面时调用 `wx.offCopyUrl`,防止影响其它页面。 */ - query: string - } - interface OnCustomRendererEventCallbackResult { - /** 推流高度 */ - height: number - /** 推流宽度 */ - width: number - } - interface OnDeviceMotionChangeListenerResult { - /** 当 手机坐标 X/Y 和 地球 X/Y 重合时,绕着 Z 轴转动的夹角为 alpha,范围值为 [0, 2*PI)。逆时针转动为正。 */ - alpha: number - /** 当手机坐标 Y/Z 和地球 Y/Z 重合时,绕着 X 轴转动的夹角为 beta。范围值为 [-1*PI, PI) 。顶部朝着地球表面转动为正。也有可能朝着用户为正。 */ - beta: number - /** 当手机 X/Z 和地球 X/Z 重合时,绕着 Y 轴转动的夹角为 gamma。范围值为 [-1*PI/2, PI/2)。右边朝着地球表面转动为正。 */ - gamma: number - } - interface OnDiscoveredListenerResult { - id: ArrayBuffer - /** 可选,NdefMessage 数组,消息格式为 {id: ArrayBuffer, type: ArrayBuffer, payload: ArrayBuffer} */ - messages: any[] - /** tech 数组,用于匹配NFC卡片具体可以使用什么标准(NfcA等实例)处理 */ - techs: any[] - } - interface OnEmbeddedMiniProgramHeightChangeListenerResult { - /** 可视高度 */ - height: number - /** 半屏小程序初始高度 */ - initialHeight: number - } - interface OnFrameRecordedListenerResult { - /** 录音分片数据 */ - frameBuffer: ArrayBuffer - /** 当前帧是否正常录音结束前的最后一帧 */ - isLastFrame: boolean - } - interface OnGetWifiListListenerResult { - /** Wi-Fi 列表数据 */ - wifiList: WifiInfo[] - } - interface OnGyroscopeChangeListenerResult { - /** x 轴的角速度 */ - x: number - /** y 轴的角速度 */ - y: number - /** z 轴的角速度 */ - z: number - } - interface OnHCEMessageListenerResult { - /** `messageType=1` 时 ,客户端接收到 NFC 设备的指令 */ - data: ArrayBuffer - /** 消息类型 - * - * 可选值: - * - 1: HCE APDU Command类型,小程序需对此指令进行处理,并调用 sendHCEMessage 接口返回处理指令; - * - 2: 设备离场事件类型; */ - messageType: 1 | 2 - /** `messageType=2` 时,原因 */ - reason: number - } - interface OnKeyboardHeightChangeListenerResult { - /** 键盘高度 */ - height: number - } - interface OnLazyLoadErrorListenerResult { - /** 详细信息 */ - errMsg: string - /** 异步组件所属的分包 */ - subpackage: any[] - /** 'subpackage' 失败类型 */ - type: string - } - interface OnLocalServiceFoundListenerResult { - /** 服务的 ip 地址 */ - ip: string - /** 服务的端口 */ - port: number - /** 服务的名称 */ - serviceName: string - /** 服务的类型 */ - serviceType: string - } - interface OnLocalServiceLostListenerResult { - /** 服务的名称 */ - serviceName: string - /** 服务的类型 */ - serviceType: string - } - interface OnLocationChangeErrorListenerResult { - /** 错误码 */ - errCode: number - } - interface OnLocationChangeListenerResult { - /** 位置的精确度 */ - accuracy: number - /** 需要基础库: `1.2.0` - * - * 高度,单位 m */ - altitude: number - /** 需要基础库: `1.2.0` - * - * 水平精度,单位 m */ - horizontalAccuracy: number - /** 纬度,范围为 -90~90,负数表示南纬。使用 gcj02 国测局坐标系 */ - latitude: number - /** 经度,范围为 -180~180,负数表示西经。使用 gcj02 国测局坐标系 */ - longitude: number - /** 速度,单位 m/s */ - speed: number - /** 需要基础库: `1.2.0` - * - * 垂直精度,单位 m(Android 无法获取,返回 0) */ - verticalAccuracy: number - } - interface OnMemoryWarningListenerResult { - /** 内存告警等级,只有 Android 才有,对应系统宏定义 - * - * 可选值: - * - 5: TRIM_MEMORY_RUNNING_MODERATE; - * - 10: TRIM_MEMORY_RUNNING_LOW; - * - 15: TRIM_MEMORY_RUNNING_CRITICAL; */ - level: 5 | 10 | 15 - } - interface OnMenuButtonBoundingClientRectWeightChangeListenerResult { - /** 下边界坐标,单位:px */ - bottom: number - /** 高度,单位:px */ - height: number - /** 左边界坐标,单位:px */ - left: number - /** 右边界坐标,单位:px */ - right: number - /** 上边界坐标,单位:px */ - top: number - /** 宽度,单位:px */ - width: number - } - interface OnMessageListenerResultLocalInfo { - /** 接收消息的 socket 的地址 */ - address: string - /** 使用的协议族,为 IPv4 或者 IPv6 */ - family: string - /** 端口号 */ - port: number - } - interface OnNetworkStatusChangeListenerResult { - /** 当前是否有网络连接 */ - isConnected: boolean - /** 网络类型 - * - * 可选值: - * - 'wifi': wifi 网络; - * - '2g': 2g 网络; - * - '3g': 3g 网络; - * - '4g': 4g 网络; - * - '5g': 5g 网络; - * - 'unknown': Android 下不常见的网络类型; - * - 'none': 无网络; */ - networkType: 'wifi' | '2g' | '3g' | '4g' | '5g' | 'unknown' | 'none' - } - interface OnNetworkWeakChangeListenerResult { - /** 当前网络类型 */ - networkType: string - /** 当前是否处于弱网状态 */ - weakNet: boolean - } - interface OnOpenListenerResult { - /** 需要基础库: `2.0.0` - * - * 连接成功的 HTTP 响应 Header */ - header: IAnyObject - /** 需要基础库: `2.10.4` - * - * 网络请求过程中一些调试信息 */ - profile: SocketProfile - } - interface OnPageNotFoundListenerResult { - /** 是否本次启动的首个页面(例如从分享等入口进来,首个页面是开发者配置的分享页面) */ - isEntryPage: boolean - /** 不存在页面的路径 (代码包路径) */ - path: string - /** 打开不存在页面的 query 参数 */ - query: Record - } - interface OnScreenRecordingStateChangedListenerResult { - /** 录屏状态 - * - * 可选值: - * - 'start': 开始录屏; - * - 'stop': 结束录屏; */ - state: 'start' | 'stop' - } - interface OnSocketOpenListenerResult { - /** 需要基础库: `2.0.0` - * - * 连接成功的 HTTP 响应 Header */ - header: IAnyObject - } - interface OnStopListenerResult { - /** 录音总时长,单位:ms */ - duration: number - /** 录音文件大小,单位:Byte */ - fileSize: number - /** 录音文件的临时路径 (本地路径) */ - tempFilePath: string - } - interface OnThemeChangeListenerResult { - /** 系统当前的主题,取值为`light`或`dark` - * - * 可选值: - * - 'dark': 深色主题; - * - 'light': 浅色主题; */ - theme: 'dark' | 'light' - } - interface OnUnhandledRejectionListenerResult { - /** 被拒绝的 Promise 对象 */ - promise: Promise - /** 拒绝原因,一般是一个 Error 对象 */ - reason: string - } - interface OnUserCaptureScreenListenerResult { - /** 需要基础库: `3.3.0` - * - * 如果该参数存在,则其它的参数将会以 resolve 结果为准,如果一秒内不 resolve,分享会使用上面传入的默认参数 */ - promise?: Promise - /** 需要基础库: `3.3.0` - * - * 支持开发者自定义一键打开小程序时的 query */ - query?: string - } - interface OnVoIPChatInterruptedListenerResult { - /** 错误码 */ - errCode: number - /** 调用结果(错误原因) */ - errMsg: string - } - interface OnVoIPChatMembersChangedListenerResult { - /** 错误码 */ - errCode: number - /** 调用结果 */ - errMsg: string - /** 还在实时语音通话中的成员 openId 名单 */ - openIdList: string[] - } - interface OnVoIPChatSpeakersChangedListenerResult { - /** 错误码 */ - errCode: number - /** 调用结果(错误原因) */ - errMsg: string - /** 还在实时语音通话中的成员 openId 名单 */ - openIdList: string[] - } - interface OnVoIPChatStateChangedListenerResult { - /** 事件码 */ - code: number - /** 附加信息 */ - data: IAnyObject - /** 错误码 */ - errCode: number - /** 调用结果 */ - errMsg: string - } - interface OnVoIPVideoMembersChangedListenerResult { - /** 错误码 */ - errCode: number - /** 调用结果 */ - errMsg: string - /** 开启视频的成员名单 */ - openIdList: string[] - } - interface OnWifiConnectedListenerResult { - /** [WifiInfo](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/WifiInfo.html) - * - * Wi-Fi 信息 */ - wifi: WifiInfo - } - interface OnWifiConnectedWithPartialInfoListenerResult { - /** [WifiInfo](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/WifiInfo.html) - * - * 只包含 SSID 属性的 WifiInfo 对象 */ - wifi: WifiInfo - } - interface OnWindowResizeListenerResult { - size: Size - } - interface OpenAppAuthorizeSettingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenAppAuthorizeSettingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenAppAuthorizeSettingFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenAppAuthorizeSettingSuccessCallback - } - interface OpenBluetoothAdapterOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenBluetoothAdapterCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenBluetoothAdapterFailCallback - /** 需要基础库: `2.10.0` - * - * 蓝牙模式,可作为主/从设备,仅 iOS 需要。 - * - * 可选值: - * - 'central': 主机模式; - * - 'peripheral': 从机(外围设备)模式; */ - mode?: 'central' | 'peripheral' - /** 接口调用成功的回调函数 */ - success?: OpenBluetoothAdapterSuccessCallback - } - interface OpenCardOption { - /** 需要打开的卡券列表 */ - cardList: OpenCardRequestInfo[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenCardCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenCardFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenCardSuccessCallback - } - /** 需要打开的卡券列表 */ - interface OpenCardRequestInfo { - /** 卡券 ID */ - cardId: string - /** 由 [wx.addCard](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/card/wx.addCard.html) 的返回对象中的加密 code 通过解密后得到,解密请参照:[code 解码接口](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1499332673_Unm7V) */ - code: string - } - interface OpenChannelsActivityOption { - /** 视频 feedId */ - feedId: string - /** 视频号 id,以“sph”开头的id,可在视频号助手获取 */ - finderUserName: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenChannelsActivityCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenChannelsActivityFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenChannelsActivitySuccessCallback - } - interface OpenChannelsEventOption { - /** 活动 id */ - eventId: string - /** 视频号 id,以“sph”开头的id,可在视频号助手获取 */ - finderUserName: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenChannelsEventCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenChannelsEventFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenChannelsEventSuccessCallback - } - interface OpenChannelsLiveOption { - /** 视频号 id,以“sph”开头的id,可在视频号助手获取 */ - finderUserName: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenChannelsLiveCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenChannelsLiveFailCallback - /** 直播 feedId,通过 getChannelsLiveInfo 接口获取(基础库 v2.19.2 之前的版本需要填写) */ - feedId?: string - /** 直播 nonceId,通过 getChannelsLiveInfo 接口获取(基础库 v2.19.2 之前的版本需要填写) */ - nonceId?: string - /** 接口调用成功的回调函数 */ - success?: OpenChannelsLiveSuccessCallback - } - interface OpenChannelsUserProfileOption { - /** 视频号 id */ - finderUserName: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenChannelsUserProfileCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenChannelsUserProfileFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenChannelsUserProfileSuccessCallback - } - interface OpenCustomerServiceChatOption { - /** 企业ID */ - corpId: string - /** 客服信息 */ - extInfo: ExtInfoOption - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenCustomerServiceChatCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenCustomerServiceChatFailCallback - /** 气泡消息图片 */ - sendMessageImg?: string - /** 气泡消息小程序路径 */ - sendMessagePath?: string - /** 气泡消息标题 */ - sendMessageTitle?: string - /** 是否发送小程序气泡消息 */ - showMessageCard?: boolean - /** 接口调用成功的回调函数 */ - success?: OpenCustomerServiceChatSuccessCallback - } - interface OpenDocumentOption { - /** 文件路径 (本地路径) ,可通过 downloadFile 获得 */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenDocumentCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenDocumentFailCallback - /** 需要基础库: `1.4.0` - * - * 文件类型,指定文件类型打开文件 - * - * 可选值: - * - 'doc': doc 格式; - * - 'docx': docx 格式; - * - 'xls': xls 格式; - * - 'xlsx': xlsx 格式; - * - 'ppt': ppt 格式; - * - 'pptx': pptx 格式; - * - 'pdf': pdf 格式; */ - fileType?: 'doc' | 'docx' | 'xls' | 'xlsx' | 'ppt' | 'pptx' | 'pdf' - /** 需要基础库: `2.11.0` - * - * 是否显示右上角菜单 */ - showMenu?: boolean - /** 接口调用成功的回调函数 */ - success?: OpenDocumentSuccessCallback - } - interface OpenEmbeddedMiniProgramOption { - /** 要打开的小程序 appId */ - appId: string - /** 需要基础库: `2.33.0` - * - * 打开的小程序是否支持全屏 */ - allowFullScreen?: boolean - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenEmbeddedMiniProgramCompleteCallback - /** 要打开的小程序版本。仅在当前小程序为开发版或体验版时此参数有效。如果当前小程序是正式版,则打开的小程序必定是正式版。 - * - * 可选值: - * - 'develop': 开发版; - * - 'trial': 体验版; - * - 'release': 正式版; */ - envVersion?: 'develop' | 'trial' | 'release' - /** 需要传递给目标小程序的数据,目标小程序可在 `App.onLaunch`,`App.onShow` 中获取到这份数据。如果跳转的是小游戏,可以在 [wx.onShow](#)、[wx.getLaunchOptionsSync](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/life-cycle/wx.getLaunchOptionsSync.html) 中可以获取到这份数据数据。 */ - extraData?: IAnyObject - /** 接口调用失败的回调函数 */ - fail?: OpenEmbeddedMiniProgramFailCallback - /** 需要基础库: `2.24.0` - * - * 不reLaunch目标小程序,直接打开目标跳转的小程序退后台时的页面,需满足以下条件:1. 目标跳转的小程序生命周期未被销毁;2. 且目标当次启动的path、query与上次启动相同,apiCategory以wx.getApiCategory接口的返回结果为准。 */ - noRelaunchIfPathUnchanged?: boolean - /** 打开的页面路径,如果为空则打开首页。path 中 ? 后面的部分会成为 query,在小程序的 `App.onLaunch`、`App.onShow` 和 `Page.onLoad` 的回调函数或小游戏的 [wx.onShow](#) 回调函数、[wx.getLaunchOptionsSync](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/life-cycle/wx.getLaunchOptionsSync.html) 中可以获取到 query 数据。对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。 */ - path?: string - /** 小程序链接,当传递该参数后,可以不传 appId 和 path。链接可以通过【小程序菜单】->【复制链接】获取。仅 verify=binding 支持。 */ - shortLink?: string - /** 接口调用成功的回调函数 */ - success?: OpenEmbeddedMiniProgramSuccessCallback - /** 需要基础库: `2.24.3` - * - * 校验方式。 - * - * 可选值: - * - 'binding': 校验小程序管理后台的绑定关系。; - * - 'unionProduct': 校验目标打开链接是否为[小程序联盟](https://developers.weixin.qq.com/doc/ministore/union/brief-introduction.html)商品。; */ - verify?: 'binding' | 'unionProduct' - } - interface OpenHKOfflinePayViewOption { - /** 随机字符串,长度为32个字符以下 */ - nonceStr: string - /** 业务数据包,开发者目前无需感知,直接传空字符串即可 */ - package: string - /** 签名,具体见微信支付文档 */ - paySign: string - /** 时间戳,从 1970 年 1 月 1 日 00:00:00 至今的秒数,即当前的时间 */ - timeStamp: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenHKOfflinePayViewCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenHKOfflinePayViewFailCallback - /** 签名算法,应与后台下单时的值一致,目前仅支持 SHA1 - * - * 可选值: - * - 'SHA1': SHA1签名算法; */ - signType?: 'SHA1' - /** 接口调用成功的回调函数 */ - success?: OpenHKOfflinePayViewSuccessCallback - } - interface OpenLocationOption { - /** 纬度,范围为-90~90,负数表示南纬。使用 gcj02 国测局坐标系 */ - latitude: number - /** 经度,范围为-180~180,负数表示西经。使用 gcj02 国测局坐标系 */ - longitude: number - /** 地址的详细说明 */ - address?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenLocationCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenLocationFailCallback - /** 位置名 */ - name?: string - /** 缩放比例,范围5~18 */ - scale?: number - /** 接口调用成功的回调函数 */ - success?: OpenLocationSuccessCallback - } - interface OpenMapAppOption { - /** 目的地名称 */ - destination: string - /** 目的地纬度 */ - latitude: number - /** 目的地经度 */ - longitude: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenMapAppCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenMapAppFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenMapAppSuccessCallback - } - interface OpenOfficialAccountArticleOption { - /** 需要打开的公众号地址 */ - url: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenOfficialAccountArticleCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenOfficialAccountArticleFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenOfficialAccountArticleSuccessCallback - } - interface OpenOfficialAccountArticleSuccessCallbackResult { - /** 为 true 时,表示用户点击了取消(用于 Android 系统区分点击蒙层关闭还是点击取消按钮关闭) */ - cancel: boolean - /** 为 true 时,表示用户点击了确定按钮 */ - confirm: boolean - errMsg: string - } - interface OpenOption { - /** 文件路径 (本地路径) */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenFailCallback - /** 文件系统标志,默认值: 'r' - * - * 可选值: - * - 'a': 打开文件用于追加。 如果文件不存在,则创建该文件; - * - 'ax': 类似于 'a',但如果路径存在,则失败; - * - 'a+': 打开文件用于读取和追加。 如果文件不存在,则创建该文件; - * - 'ax+': 类似于 'a+',但如果路径存在,则失败; - * - 'as': 打开文件用于追加(在同步模式中)。 如果文件不存在,则创建该文件; - * - 'as+': 打开文件用于读取和追加(在同步模式中)。 如果文件不存在,则创建该文件; - * - 'r': 打开文件用于读取。 如果文件不存在,则会发生异常; - * - 'r+': 打开文件用于读取和写入。 如果文件不存在,则会发生异常; - * - 'w': 打开文件用于写入。 如果文件不存在则创建文件,如果文件存在则截断文件; - * - 'wx': 类似于 'w',但如果路径存在,则失败; - * - 'w+': 打开文件用于读取和写入。 如果文件不存在则创建文件,如果文件存在则截断文件; - * - 'wx+': 类似于 'w+',但如果路径存在,则失败; */ - flag?: - | 'a' - | 'ax' - | 'a+' - | 'ax+' - | 'as' - | 'as+' - | 'r' - | 'r+' - | 'w' - | 'wx' - | 'w+' - | 'wx+' - /** 接口调用成功的回调函数 */ - success?: OpenSuccessCallback - } - interface OpenPrivacyContractOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenPrivacyContractCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenPrivacyContractFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenPrivacyContractSuccessCallback - } - interface OpenSettingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenSettingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenSettingFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenSettingSuccessCallback - /** 需要基础库: `2.10.3` - * - * 是否同时获取用户订阅消息的订阅状态,默认不获取。注意:withSubscriptions 只返回用户勾选过订阅面板中的“总是保持以上选择,不再询问”的订阅消息。 */ - withSubscriptions?: boolean - } - interface OpenSettingSuccessCallbackResult { - /** [AuthSetting](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/AuthSetting.html) - * - * 用户授权结果 */ - authSetting: AuthSetting - /** [SubscriptionsSetting](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/SubscriptionsSetting.html) - * - * 需要基础库: `2.10.3` - * - * 用户订阅消息设置,接口参数`withSubscriptions`值为`true`时才会返回。 */ - subscriptionsSetting: SubscriptionsSetting - errMsg: string - } - interface OpenSingleStickerViewOption { - /** 表情链接,可前往[表情开放平台](https://sticker.weixin.qq.com/cgi-bin/mmemoticon-bin/loginpage?t=login/index),在详情页中的「小程序跳转链接」入口复制 */ - url: IAnyObject - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenSingleStickerViewCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenSingleStickerViewFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenSingleStickerViewSuccessCallback - } - interface OpenStickerIPViewOption { - /** 表情IP合辑链接,可前往[表情开放平台](https://sticker.weixin.qq.com/cgi-bin/mmemoticon-bin/loginpage?t=login/index),在详情页中的「小程序跳转链接」入口复制 */ - url: IAnyObject - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenStickerIPViewCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenStickerIPViewFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenStickerIPViewSuccessCallback - } - interface OpenStickerSetViewOption { - /** 表情专辑链接,可前往[表情开放平台](https://sticker.weixin.qq.com/cgi-bin/mmemoticon-bin/loginpage?t=login/index),在详情页中的「小程序跳转链接」入口复制 */ - url: IAnyObject - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenStickerSetViewCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenStickerSetViewFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenStickerSetViewSuccessCallback - } - interface OpenSuccessCallbackResult { - /** 文件描述符 */ - fd: string - errMsg: string - } - interface OpenSyncOption { - /** 文件路径 (本地路径) */ - filePath: string - /** 文件系统标志,默认值: 'r' - * - * 可选值: - * - 'a': 打开文件用于追加。 如果文件不存在,则创建该文件; - * - 'ax': 类似于 'a',但如果路径存在,则失败; - * - 'a+': 打开文件用于读取和追加。 如果文件不存在,则创建该文件; - * - 'ax+': 类似于 'a+',但如果路径存在,则失败; - * - 'as': 打开文件用于追加(在同步模式中)。 如果文件不存在,则创建该文件; - * - 'as+': 打开文件用于读取和追加(在同步模式中)。 如果文件不存在,则创建该文件; - * - 'r': 打开文件用于读取。 如果文件不存在,则会发生异常; - * - 'r+': 打开文件用于读取和写入。 如果文件不存在,则会发生异常; - * - 'w': 打开文件用于写入。 如果文件不存在则创建文件,如果文件存在则截断文件; - * - 'wx': 类似于 'w',但如果路径存在,则失败; - * - 'w+': 打开文件用于读取和写入。 如果文件不存在则创建文件,如果文件存在则截断文件; - * - 'wx+': 类似于 'w+',但如果路径存在,则失败; */ - flag?: - | 'a' - | 'ax' - | 'a+' - | 'ax+' - | 'as' - | 'as+' - | 'r' - | 'r+' - | 'w' - | 'wx' - | 'w+' - | 'wx+' - } - interface OpenSystemBluetoothSettingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenSystemBluetoothSettingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenSystemBluetoothSettingFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenSystemBluetoothSettingSuccessCallback - } - interface OpenVideoEditorOption { - /** 视频源的路径,只支持本地路径 */ - filePath: string - /** 需要基础库: `2.16.1` - * - * 视频裁剪的最大长度 */ - maxDuration: string - /** 需要基础库: `2.16.1` - * - * 视频裁剪的最小长度 */ - minDuration: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: OpenVideoEditorCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: OpenVideoEditorFailCallback - /** 接口调用成功的回调函数 */ - success?: OpenVideoEditorSuccessCallback - } - interface OpenVideoEditorSuccessCallbackResult { - /** 剪辑后生成的视频文件的时长,单位毫秒(ms) */ - duration: number - /** 剪辑后生成的视频文件大小,单位字节数(byte) */ - size: number - /** 编辑后生成的视频文件的临时路径 */ - tempFilePath: string - /** 编辑后生成的缩略图文件的临时路径 */ - tempThumbPath: string - errMsg: string - } - interface PageScrollToOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PageScrollToCompleteCallback - /** 滚动动画的时长,单位 ms */ - duration?: number - /** 接口调用失败的回调函数 */ - fail?: PageScrollToFailCallback - /** 需要基础库: `2.23.1` - * - * 偏移距离,需要和 selector 参数搭配使用,可以滚动到 selector 加偏移距离的位置,单位 px */ - offsetTop?: number - /** 滚动到页面的目标位置,单位 px */ - scrollTop?: number - /** 需要基础库: `2.7.3` - * - * 选择器 */ - selector?: string - /** 接口调用成功的回调函数 */ - success?: PageScrollToSuccessCallback - } - interface PauseBGMOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PauseBGMCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: PauseBGMFailCallback - /** 接口调用成功的回调函数 */ - success?: PauseBGMSuccessCallback - } - interface PauseBackgroundAudioOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PauseBackgroundAudioCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: PauseBackgroundAudioFailCallback - /** 接口调用成功的回调函数 */ - success?: PauseBackgroundAudioSuccessCallback - } - interface PauseOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PauseCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: PauseFailCallback - /** 接口调用成功的回调函数 */ - success?: PauseSuccessCallback - } - interface PauseVoiceOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PauseVoiceCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: PauseVoiceFailCallback - /** 接口调用成功的回调函数 */ - success?: PauseVoiceSuccessCallback - } - /** 单条性能数据。具体数据口径请参考[性能数据文档]((performance/perf_data##_1-4-%E9%80%9A%E8%BF%87-wx-getPerformance-%E5%9C%A8%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%86%85%E8%8E%B7%E5%8F%96)) */ - interface PerformanceEntry { - /** 需要基础库: `2.24.0` - * - * 解析域名结束时间。仅 resourceTiming 指标有效。 */ - domainLookupEnd: number - /** 需要基础库: `2.24.0` - * - * 解析域名开始时间。仅 resourceTiming 指标有效。 */ - domainLookupStart: number - /** 耗时 ms。仅对于表示阶段的指标有效。 */ - duration: number - /** 指标类型 - * - * 可选值: - * - 'navigation': 路由; - * - 'render': 渲染; - * - 'script': 脚本; */ - entryType: 'navigation' | 'render' | 'script' - /** 需要基础库: `2.21.2` - * - * 注入文件列表。仅 evaluateScript 指标有效。 */ - fileList: string[] - /** 需要基础库: `2.21.2` - * - * 首次渲染参数在渲染层收到的时间。仅 firstRender 指标有效。 */ - initDataRecvTime: number - /** 需要基础库: `2.21.2` - * - * 首次渲染参数从逻辑层发出的时间。仅 firstRender 指标有效。 */ - initDataSendTime: number - /** 需要基础库: `2.24.0` - * - * 初始化性能条目的资源类型。仅 resourceTiming 指标有效。 - * - * 可选值: - * - 'audio': 音频; - * - 'cover-image': cover-image 组件的图片; - * - 'image': 组件的图片; - * - 'open-data': 组件的图片; */ - initiatorType: 'audio' | 'cover-image' | 'image' | 'open-data' - /** 分包名,主包表示为 __APP__ (2.21.2 开始)。仅 evaluateScript 指标有效。 */ - moduleName: string - /** 指标名称 - * - * 可选值: - * - 'appLaunch': 小程序启动耗时。(entryType: navigation); - * - 'route': 路由处理耗时。(entryType: navigation); - * - 'firstRender': 页面首次渲染耗时。(entryType: render); - * - 'firstPaint': 页面首次绘制(FP)时间点,无 duration。(iOS 不支持)(entryType: render); - * - 'firstContentfulPaint': 页面首次内容绘制(FCP)时间点,无 duration。(iOS 14.5 以下版本不支持)(entryType: render); - * - 'largestContentfulPaint': 页面最大内容绘制(LCP)时间点,无 duration。(iOS 不支持)(entryType: render); - * - 'evaluateScript': 逻辑层 JS 代码注入耗时。(entryType: script); - * - 'downloadPackage': 代码包下载耗时。(entryType: loadPackage); - * - 'resourceTiming': 视图层资源加载耗时。(entryType: resource); */ - name: - | 'appLaunch' - | 'route' - | 'firstRender' - | 'firstPaint' - | 'firstContentfulPaint' - | 'largestContentfulPaint' - | 'evaluateScript' - | 'downloadPackage' - | 'resourceTiming' - /** 路由真正响应开始时间。仅 navigation 类型指标有效。 */ - navigationStart: number - /** 路由详细类型,与小程序路由方法对应。仅 navigation 类型指标有效。 */ - navigationType: string - /** 需要基础库: `2.24.0` - * - * 代码包名称。仅 downloadPackage 指标有效。 */ - packageName: string - /** 需要基础库: `2.24.0` - * - * 代码包大小。仅 downloadPackage 指标有效。 */ - packageSize: number - /** 需要基础库: `2.23.1` - * - * path 对应页面实例 Id(随机生成,不保证递增)。仅 render/navigation 指标有效。 */ - pageId: number - /** 页面路径。仅 render 和 navigation 类型指标有效。 */ - path: string - /** 需要基础库: `2.23.1` - * - * referrerPath对应页面实例 Id(随机生成,不保证递增)。仅 route 指标有效。 */ - referrerPageId: number - /** 需要基础库: `2.23.1` - * - * 页面跳转来源页面路径。仅 route 指标有效。 */ - referrerPath: number - /** 开始时间,不同指标的具体含义会有差异。 */ - startTime: number - /** 需要基础库: `2.24.0` - * - * 表示获取资源的大小(以八位字节为单位)的数字。仅 resourceTiming 指标有效。(iOS 不支持) */ - transferSize: number - /** 需要基础库: `2.24.0` - * - * 资源路径。仅 resourceTiming 指标有效。 */ - uri: string - /** 需要基础库: `2.21.2` - * - * 渲染层代码注入完成时间。仅 firstRender 指标有效。 */ - viewLayerReadyTime: number - /** 需要基础库: `2.21.2` - * - * 渲染层执行渲染结束时间。仅 firstRender 指标有效。 */ - viewLayerRenderEndTime: number - /** 需要基础库: `2.21.2` - * - * 渲染层执行渲染开始时间。仅 firstRender 指标有效。 */ - viewLayerRenderStartTime: number - } - /** 需要基础库: `2.11.0` - * - * PerformanceObserver 对象,用于监听性能相关事件 */ - interface PerformanceObserver { - /** 获取当前支持的所有性能指标类型 */ - supportedEntryTypes: any[] - /** [PerformanceObserver.disconnect()](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/PerformanceObserver.disconnect.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 停止监听 */ - disconnect(): void - /** [PerformanceObserver.observe(Object options)](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/PerformanceObserver.observe.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 开始监听 */ - observe( - /** 设置 type 监听单个类型的指标,设置 entryTypes 监听多个类型指标。 */ - options: ObserveOption - ): void - } - /** 平面跟踪配置 */ - interface PlaneTrack { - /** 平面跟踪配置模式 - * - * 可选值: - * - 1: 检测横向平面; - * - 2: 检测纵向平面,只有 v2 版本支持; - * - 3: 检测横向和纵向平面,只有 v2 版本支持; */ - mode: 1 | 2 | 3 - } - interface PlayBGMOption { - /** 加入背景混音的资源地址 */ - url: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PlayBGMCompleteCallback - /** 需要基础库: `2.31.0` - * - * BGM结束播放时间点,单位ms,0代表播放至文件结尾,若入参为负或超过文件长度,则默认播放至文件结尾 */ - endTimeMs?: number - /** 接口调用失败的回调函数 */ - fail?: PlayBGMFailCallback - /** 需要基础库: `2.31.0` - * - * BGM开始播时间点,单位ms,若入参为负或超过文件长度,则默认从文件开头进行播放 */ - startTimeMs?: number - /** 接口调用成功的回调函数 */ - success?: PlayBGMSuccessCallback - } - interface PlayBackgroundAudioOption { - /** 音乐链接,目前支持的格式有 m4a, aac, mp3, wav */ - dataUrl: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PlayBackgroundAudioCompleteCallback - /** 封面URL */ - coverImgUrl?: string - /** 接口调用失败的回调函数 */ - fail?: PlayBackgroundAudioFailCallback - /** 接口调用成功的回调函数 */ - success?: PlayBackgroundAudioSuccessCallback - /** 音乐标题 */ - title?: string - } - interface PlayOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PlayCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: PlayFailCallback - /** 接口调用成功的回调函数 */ - success?: PlaySuccessCallback - } - interface PlayVoiceOption { - /** 需要播放的语音文件的文件路径 (本地路径) */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PlayVoiceCompleteCallback - /** 需要基础库: `1.6.0` - * - * 指定播放时长,到达指定的播放时长后会自动停止播放,单位:秒 */ - duration?: number - /** 接口调用失败的回调函数 */ - fail?: PlayVoiceFailCallback - /** 接口调用成功的回调函数 */ - success?: PlayVoiceSuccessCallback - } - /** 插件账号信息(仅在插件中调用时包含这一项) */ - interface Plugin { - /** 插件 appId */ - appId: string - /** 插件版本号 */ - version: string - } - interface PluginLoginOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PluginLoginCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: PluginLoginFailCallback - /** 接口调用成功的回调函数 */ - success?: PluginLoginSuccessCallback - } - interface PluginLoginSuccessCallbackResult { - /** 用于换取 openpid 的凭证(有效期五分钟)。插件开发者可以用此 code 在开发者服务器后台调用 [getPluginOpenPId](https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/basic-info/getPluginOpenPId.html) 换取 openpid。 */ - code: string - errMsg: string - } - interface PostMessageToReferrerMiniProgramOption { - /** 要打开的小程序 appId */ - extraData?: IAnyObject - } - interface PreDownloadSubpackageOption { - /** 分包加载结束回调事件(加载成功、失败都会执行) */ - complete: (...args: any[]) => any - /** 分包加载失败回调事件 */ - fail: (...args: any[]) => any - /** 分包的类型。目前仅支持填 "workers",表示 workers 分包。 */ - packageType: string - /** 分包加载成功回调事件 */ - success: (...args: any[]) => any - } - interface PreDownloadSubpackageTaskOnProgressUpdateListenerResult { - /** 分包下载进度百分比 */ - progress: number - /** 预期需要下载的数据总长度,单位 Bytes */ - totalBytesExpectedToWrite: number - /** 已经下载的数据长度,单位 Bytes */ - totalBytesWritten: number - } - interface PreloadAssetsOption { - data: Asset[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PreloadAssetsCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: PreloadAssetsFailCallback - /** 接口调用成功的回调函数 */ - success?: PreloadAssetsSuccessCallback - } - interface PreloadSkylineViewOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PreloadSkylineViewCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: PreloadSkylineViewFailCallback - /** 接口调用成功的回调函数 */ - success?: PreloadSkylineViewSuccessCallback - } - interface PreloadWebviewOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PreloadWebviewCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: PreloadWebviewFailCallback - /** 接口调用成功的回调函数 */ - success?: PreloadWebviewSuccessCallback - } - interface PreviewImageOption { - /** 需要预览的图片链接列表。[2.2.3](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起支持云文件ID。 */ - urls: string[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PreviewImageCompleteCallback - /** 当前显示图片的链接 */ - current?: string - /** 接口调用失败的回调函数 */ - fail?: PreviewImageFailCallback - /** 需要基础库: `2.13.0` - * - * `origin`: 发送完整的referrer; `no-referrer`: 不发送。格式固定为 `https://servicewechat.com/{appid}/{version}/page-frame.html`,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版、体验版以及审核版本,版本号为 devtools 表示为开发者工具,其余为正式版本; */ - referrerPolicy?: string - /** 需要基础库: `2.13.0` - * - * 是否显示长按菜单。 */ - showmenu?: boolean - /** 接口调用成功的回调函数 */ - success?: PreviewImageSuccessCallback - } - interface PreviewMediaOption { - /** 需要预览的资源列表 */ - sources: MediaSource[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: PreviewMediaCompleteCallback - /** 当前显示的资源序号 */ - current?: number - /** 接口调用失败的回调函数 */ - fail?: PreviewMediaFailCallback - /** 需要基础库: `2.13.0` - * - * `origin`: 发送完整的referrer; `no-referrer`: 不发送。格式固定为 `https://servicewechat.com/{appid}/{version}/page-frame.html`,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版、体验版以及审核版本,版本号为 devtools 表示为开发者工具,其余为正式版本; */ - referrerPolicy?: string - /** 需要基础库: `2.13.0` - * - * 是否显示长按菜单。 */ - showmenu?: boolean - /** 接口调用成功的回调函数 */ - success?: PreviewMediaSuccessCallback - } - /** 订单详细商品信息列表。 */ - interface ProductInfo { - /** 商户侧该商品所属的类目。示例值:玩偶 */ - category: string - /** 商品主图的url,大小建议64*64。示例值:https://mp.weixin.qq.com/123 */ - head_img: string - /** 该商品原价,单位为分。示例值:5000 */ - org_price: number - /** 商户商品详请页小程序路径。示例值:pages/index */ - path: string - /** 用户购买该商品的数量。示例值:5 */ - quantity: number - /** 该商品售价,单位为分。示例值:4000 */ - sale_price: number - /** 商户系统内该商品的sku属性。示例值:50cm */ - sku_attr: string - /** 商户系统内该商品的skuid。示例值:sku123 */ - sku_id: string - /** 商户系统内该商品的spuid。示例值:spu123456 */ - spu_id: string - /** 商品标题。示例值:QQ长鹅 */ - title: string - } - /** 推广员 */ - interface PromoterResult { - /** 推广员昵称 */ - finderNickname: string - /** 推广员 id */ - promoterId: string - /** 推广员 openid */ - promoterOpenId: string - } - interface ReLaunchOption { - /** 需要跳转的应用内页面路径 (代码包路径),路径后可以带参数。参数与路径之间使用?分隔,参数键与参数值用=相连,不同参数用&分隔;如 'path?key=value&key2=value2' */ - url: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ReLaunchCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ReLaunchFailCallback - /** 接口调用成功的回调函数 */ - success?: ReLaunchSuccessCallback - } - interface ReadBLECharacteristicValueOption { - /** 蓝牙特征的 UUID */ - characteristicId: string - /** 蓝牙设备 id */ - deviceId: string - /** 蓝牙特征对应服务的 UUID */ - serviceId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ReadBLECharacteristicValueCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ReadBLECharacteristicValueFailCallback - /** 接口调用成功的回调函数 */ - success?: ReadBLECharacteristicValueSuccessCallback - } - interface ReadCompressedFileOption { - /** 文件压缩类型,目前仅支持 'br'。 - * - * 可选值: - * - 'br': brotli压缩文件; */ - compressionAlgorithm: 'br' - /** 要读取的文件的路径 (本地用户文件或代码包文件) */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ReadCompressedFileCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ReadCompressedFileFailCallback - /** 接口调用成功的回调函数 */ - success?: ReadCompressedFileSuccessCallback - } - interface ReadCompressedFileSuccessCallbackResult { - /** 文件内容 */ - data: ArrayBuffer - errMsg: string - } - interface ReadCompressedFileSyncOption { - /** 文件压缩类型,目前仅支持 'br'。 - * - * 可选值: - * - 'br': brotli压缩文件; */ - compressionAlgorithm: 'br' - /** 要读取的文件的路径 (本地用户文件或代码包文件) */ - filePath: string - } - interface ReadFileOption { - /** 要读取的文件的路径 (本地路径) */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ReadFileCompleteCallback - /** 指定读取文件的字符编码,如果不传 encoding,则以 ArrayBuffer 格式读取文件的二进制内容 - * - * 可选值: - * - 'ascii': ; - * - 'base64': ; - * - 'binary': ; - * - 'hex': ; - * - 'ucs2': 以小端序读取; - * - 'ucs-2': 以小端序读取; - * - 'utf16le': 以小端序读取; - * - 'utf-16le': 以小端序读取; - * - 'utf-8': ; - * - 'utf8': ; - * - 'latin1': ; */ - encoding?: - | 'ascii' - | 'base64' - | 'binary' - | 'hex' - | 'ucs2' - | 'ucs-2' - | 'utf16le' - | 'utf-16le' - | 'utf-8' - | 'utf8' - | 'latin1' - /** 接口调用失败的回调函数 */ - fail?: ReadFileFailCallback - /** 需要基础库: `2.10.0` - * - * 指定文件的长度,如果不指定,则读到文件末尾。有效范围:[1, fileLength]。单位:byte */ - length?: number - /** 需要基础库: `2.10.0` - * - * 从文件指定位置开始读,如果不指定,则从文件头开始读。读取的范围应该是左闭右开区间 [position, position+length)。有效范围:[0, fileLength - 1]。单位:byte */ - position?: number - /** 接口调用成功的回调函数 */ - success?: ReadFileSuccessCallback - } - interface ReadFileSuccessCallbackResult { - /** 文件内容 */ - data: string | ArrayBuffer - errMsg: string - } - interface ReadOption { - /** 数据写入的缓冲区,必须是 ArrayBuffer 实例 */ - arrayBuffer: ArrayBuffer - /** 文件描述符。fd 通过 [FileSystemManager.open](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.open.html) 或 [FileSystemManager.openSync](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.openSync.html) 接口获得 */ - fd: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ReadCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ReadFailCallback - /** 要从文件中读取的字节数,默认0 */ - length?: number - /** 缓冲区中的写入偏移量,默认0 */ - offset?: number - /** 文件读取的起始位置,如不传或传 null,则会从当前文件指针的位置读取。如果 position 是正整数,则文件指针位置会保持不变并从 position 读取文件。 */ - position?: number - /** 接口调用成功的回调函数 */ - success?: ReadSuccessCallback - } - /** 文件读取结果。 通过 [FileSystemManager.readSync](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readSync.html) 接口返回 */ - interface ReadResult { - /** 被写入的缓存区的对象,即接口入参的 arrayBuffer */ - arrayBuffer: ArrayBuffer - /** 实际读取的字节数 */ - bytesRead: number - } - interface ReadSuccessCallbackResult { - /** 被写入的缓存区的对象,即接口入参的 arrayBuffer */ - arrayBuffer: ArrayBuffer - /** 实际读取的字节数 */ - bytesRead: number - errMsg: string - } - interface ReadSyncOption { - /** 数据写入的缓冲区,必须是 ArrayBuffer 实例 */ - arrayBuffer: ArrayBuffer - /** 文件描述符。fd 通过 [FileSystemManager.open](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.open.html) 或 [FileSystemManager.openSync](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.openSync.html) 接口获得 */ - fd: string - /** 要从文件中读取的字节数,默认0 */ - length?: number - /** 缓冲区中的写入偏移量,默认0 */ - offset?: number - /** 文件读取的起始位置,如不传或传 null,则会从当前文件指针的位置读取。如果 position 是正整数,则文件指针位置会保持不变并从 position 读取文件。 */ - position?: number - } - interface ReadZipEntryOption { - /** 要读取的压缩包内的文件列表(当传入"all" 时表示读取压缩包内所有文件) */ - entries: EntryItem[] | 'all' - /** 要读取的压缩包的路径 (本地路径) */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ReadZipEntryCompleteCallback - /** 统一指定读取文件的字符编码,只在 entries 值为"all"时有效。如果 entries 值为"all"且不传 encoding,则以 ArrayBuffer 格式读取文件的二进制内容 - * - * 可选值: - * - 'ascii': ; - * - 'base64': ; - * - 'binary': ; - * - 'hex': ; - * - 'ucs2': 以小端序读取; - * - 'ucs-2': 以小端序读取; - * - 'utf16le': 以小端序读取; - * - 'utf-16le': 以小端序读取; - * - 'utf-8': ; - * - 'utf8': ; - * - 'latin1': ; */ - encoding?: - | 'ascii' - | 'base64' - | 'binary' - | 'hex' - | 'ucs2' - | 'ucs-2' - | 'utf16le' - | 'utf-16le' - | 'utf-8' - | 'utf8' - | 'latin1' - /** 接口调用失败的回调函数 */ - fail?: ReadZipEntryFailCallback - /** 接口调用成功的回调函数 */ - success?: ReadZipEntrySuccessCallback - } - interface ReadZipEntrySuccessCallbackResult { - /** 文件读取结果。res.entries 是一个对象,key是文件路径,value是一个对象 FileItem ,表示该文件的读取结果。每个 FileItem 包含 data (文件内容) 和 errMsg (错误信息) 属性。 */ - entries: EntriesResult - errMsg: string - } - interface ReaddirOption { - /** 要读取的目录路径 (本地路径) */ - dirPath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ReaddirCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ReaddirFailCallback - /** 接口调用成功的回调函数 */ - success?: ReaddirSuccessCallback - } - interface ReaddirSuccessCallbackResult { - /** 指定目录下的文件名数组。 */ - files: string[] - errMsg: string - } - interface ReconnectCastingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ReconnectCastingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ReconnectCastingFailCallback - /** 接口调用成功的回调函数 */ - success?: ReconnectCastingSuccessCallback - } - interface RecorderManagerStartOption { - /** 需要基础库: `2.1.0` - * - * 指定录音的音频输入源,可通过 [wx.getAvailableAudioSources()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.getAvailableAudioSources.html) 获取当前可用的音频源 - * - * 可选值: - * - 'auto': 自动设置,默认使用手机麦克风,插上耳麦后自动切换使用耳机麦克风,所有平台适用; - * - 'buildInMic': 手机麦克风,仅限 iOS; - * - 'headsetMic': 有线耳机麦克风,仅限 iOS; - * - 'mic': 麦克风(没插耳麦时是手机麦克风,插耳麦时是耳机麦克风),仅限 Android; - * - 'camcorder': 同 mic,适用于录制音视频内容,仅限 Android; - * - 'voice_communication': 同 mic,适用于实时沟通,仅限 Android; - * - 'voice_recognition': 同 mic,适用于语音识别,仅限 Android; */ - audioSource?: - | 'auto' - | 'buildInMic' - | 'headsetMic' - | 'mic' - | 'camcorder' - | 'voice_communication' - | 'voice_recognition' - /** 录音的时长,单位 ms,最大值 600000(10 分钟) */ - duration?: number - /** 编码码率,有效值见下表格 */ - encodeBitRate?: number - /** 音频格式 - * - * 可选值: - * - 'mp3': mp3 格式; - * - 'aac': aac 格式; - * - 'wav': wav 格式; - * - 'PCM': pcm 格式; */ - format?: 'mp3' | 'aac' | 'wav' | 'PCM' - /** 指定帧大小,单位 KB。传入 frameSize 后,每录制指定帧大小的内容后,会回调录制的文件内容,不指定则不会回调。暂仅支持 mp3、pcm 格式。 */ - frameSize?: number - /** 录音通道数 - * - * 可选值: - * - 1: 1 个通道; - * - 2: 2 个通道; */ - numberOfChannels?: 1 | 2 - /** 采样率(pc不支持) - * - * 可选值: - * - 8000: 8000 采样率; - * - 11025: 11025 采样率; - * - 12000: 12000 采样率; - * - 16000: 16000 采样率; - * - 22050: 22050 采样率; - * - 24000: 24000 采样率; - * - 32000: 32000 采样率; - * - 44100: 44100 采样率; - * - 48000: 48000 采样率; */ - sampleRate?: - | 8000 - | 11025 - | 12000 - | 16000 - | 22050 - | 24000 - | 32000 - | 44100 - | 48000 - } - interface RedirectToOption { - /** 需要跳转的应用内非 tabBar 的页面的路径 (代码包路径), 路径后可以带参数。参数与路径之间使用 `?` 分隔,参数键与参数值用 `=` 相连,不同参数用 `&` 分隔;如 'path?key=value&key2=value2' */ - url: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RedirectToCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RedirectToFailCallback - /** 接口调用成功的回调函数 */ - success?: RedirectToSuccessCallback - } - interface RedoOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RedoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RedoFailCallback - /** 接口调用成功的回调函数 */ - success?: RedoSuccessCallback - } - interface RefCallbackResult { - /** 节点对应的 Ref 对象 */ - ref: IAnyObject - } - /** 来源信息。从另一个小程序、公众号或 App 进入小程序时返回。否则返回 `{}`。(参见后文注意) */ - interface ReferrerInfo { - /** 来源小程序、公众号或 App 的 appId */ - appId: string - /** 来源小程序传过来的数据,scene=1037或1038时支持 */ - extraData: IAnyObject - } - /** 参照区域的边界 */ - interface RelativeRectResult { - /** 下边界 */ - bottom: number - /** 左边界 */ - left: number - /** 右边界 */ - right: number - /** 上边界 */ - top: number - } - interface RemoveArcOption { - /** 圆弧 id */ - id: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RemoveArcCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RemoveArcFailCallback - /** 接口调用成功的回调函数 */ - success?: RemoveArcSuccessCallback - } - interface RemoveCustomLayerOption { - /** 个性化图层id */ - layerId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RemoveCustomLayerCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RemoveCustomLayerFailCallback - /** 接口调用成功的回调函数 */ - success?: RemoveCustomLayerSuccessCallback - } - interface RemoveFormatOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RemoveFormatCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RemoveFormatFailCallback - /** 接口调用成功的回调函数 */ - success?: RemoveFormatSuccessCallback - } - interface RemoveGroundOverlayOption { - /** 图片图层 id */ - id: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RemoveGroundOverlayCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RemoveGroundOverlayFailCallback - /** 接口调用成功的回调函数 */ - success?: RemoveGroundOverlaySuccessCallback - } - interface RemoveMarkersOption { - /** marker 的 id 集合。 */ - markerIds: any[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RemoveMarkersCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RemoveMarkersFailCallback - /** 接口调用成功的回调函数 */ - success?: RemoveMarkersSuccessCallback - } - interface RemoveSavedFileOption { - /** 需要删除的文件路径 (本地路径) */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RemoveSavedFileCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RemoveSavedFileFailCallback - /** 接口调用成功的回调函数 */ - success?: RemoveSavedFileSuccessCallback - } - interface RemoveServiceOption { - /** service 的 UUID */ - serviceId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RemoveServiceCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RemoveServiceFailCallback - /** 接口调用成功的回调函数 */ - success?: RemoveServiceSuccessCallback - } - interface RemoveStorageOption { - /** 本地缓存中指定的 key */ - key: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RemoveStorageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RemoveStorageFailCallback - /** 接口调用成功的回调函数 */ - success?: RemoveStorageSuccessCallback - } - interface RemoveTabBarBadgeOption { - /** tabBar 的哪一项,从左边算起 */ - index: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RemoveTabBarBadgeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RemoveTabBarBadgeFailCallback - /** 接口调用成功的回调函数 */ - success?: RemoveTabBarBadgeSuccessCallback - } - interface RemoveVisualLayerOption { - /** 可视化图层id */ - layerId: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RemoveVisualLayerCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RemoveVisualLayerFailCallback - /** 接口调用成功的回调函数 */ - success?: RemoveVisualLayerSuccessCallback - } - interface RenameOption { - /** 新文件路径,支持本地路径 */ - newPath: string - /** 源文件路径,支持本地路径 */ - oldPath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RenameCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RenameFailCallback - /** 接口调用成功的回调函数 */ - success?: RenameSuccessCallback - } - /** Canvas 绘图上下文。 - * - * **** - * - * - 通过 Canvas.getContext('2d') 接口可以获取 CanvasRenderingContext2D 对象,实现了 [HTML Canvas 2D Context](https://www.w3.org/TR/2dcontext/) 定义的属性、方法。 - * - 通过 Canvas.getContext('webgl') 或 OffscreenCanvas.getContext('webgl') 接口可以获取 WebGLRenderingContext 对象,实现了 [WebGL 1.0](https://www.khronos.org/registry/webgl/specs/latest/1.0/) 定义的所有属性、方法、常量。 - * - CanvasRenderingContext2D 的 drawImage 方法 2.10.0 起支持传入通过 [SelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html) 获取的 video 对象,2.29.0 起支持传入开启了自定义渲染的 [LivePusherContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.html) 对象。 - * - * **示例代码** - * - * video 画到 2D Canvas 示例 - * [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/tJTak7mU7sfX) */ - interface RenderingContext {} - interface RequestCommonPaymentFailCallbackErr { - /** 错误信息 */ - errMsg: string - /** 错误码 */ - errno: number - } - interface RequestCommonPaymentOption { - /** 支付的类型 - * - * 可选值: - * - 'retail_pay_goods': B2b支付; */ - mode: 'retail_pay_goods' - /** 支付签名, 详见[《签名详解》](https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/virtual-payment.html) */ - paySig: string - /** 具体支付参数见signData, 该参数需以string形式传递, 例如signData: '{"mchid":"1234567890","out_trade_no":"test1244","description":"测试测试","amount":{"order_amount":1,"currency":"CNY"},"attach":"test_attach","env":1}' */ - signData: RequestCommonPaymentSignData - /** 用户态签名, 详见[《签名详解》](https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/virtual-payment.html) */ - signature: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequestCommonPaymentCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RequestCommonPaymentFailCallback - /** 接口调用成功的回调函数 */ - success?: RequestCommonPaymentSuccessCallback - } - /** 具体支付参数见signData, 该参数需以string形式传递, 例如signData: '{"mchid":"1234567890","out_trade_no":"test1244","description":"测试测试","amount":{"order_amount":1,"currency":"CNY"},"attach":"test_attach","env":1}' */ - interface RequestCommonPaymentSignData { - /** 订单金额信息。 */ - amount: Amount - /** 商品描述。示例值:Image形象店-深圳腾大-QQ公仔 */ - description: string - /** 下单环境。示例值:0 - * - * 可选值: - * - 0: 生产环境/现网环境; - * - 1: 沙箱环境/测试环境; */ - env: 0 | 1 - /** 由微信支付生成并下发的商户号。示例值:1230000109 */ - mchid: string - /** 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一,长度限制为[6,32]。示例值:1217752501201407033233368018 */ - out_trade_no: string - /** 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用,实际情况下只有支付完成状态才会返回该字段。示例值:test_attach */ - attach?: string - /** 配送方式。示例值:2 - * - * 可选值: - * - 1: 同城配送; - * - 2: 快递配送; - * - 3: 门店自提; - * - 4: 无需配送与提货; */ - delivery_type?: 1 | 2 | 3 | 4 - /** 订单详细商品信息列表。 */ - product_info?: ProductInfo - } - interface RequestCommonPaymentSuccessCallbackResult { - /** 调用成功信息 */ - errMsg: string - } - interface RequestDeviceVoIPOption { - /** 设备名称,将显示在授权弹窗内(长度不超过13)。授权框中「设备名字」= 「deviceName」 + 「modelId 对应设备型号」。 */ - deviceName: string - /** 需要基础库: `2.30.4` - * - * 设备组的唯一标识 id 。isGroup 为 true 时只需要传该参数,isGroup 为 false 时不需要传该参数,但需要传 sn、snTicket、modelId、deviceName 。 */ - groupId: string - /** 设备型号 id。通过微信公众平台注册设备获得。 */ - modelId: string - /** 设备唯一序列号。由厂商分配,长度不能超过128字节。字符只接受数字,大小写字母,下划线(_)和连字符(-)。 */ - sn: string - /** [设备票据](https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/hardware-device/getSnTicket.html),5分钟内有效。 */ - snTicket: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequestDeviceVoIPCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RequestDeviceVoIPFailCallback - /** 需要基础库: `2.30.4` - * - * 是否为授权设备组,默认 false 。 */ - isGroup?: boolean - /** 接口调用成功的回调函数 */ - success?: RequestDeviceVoIPSuccessCallback - } - /** 需要基础库: `3.0.0` - * - * 网络请求过程中的一些异常信息,例如httpdns重试等 */ - interface RequestException { - /** 本次请求底层失败信息,所有失败信息均符合Errno错误码 */ - reasons: ExceptionReason[] - /** 本次请求底层重试次数 */ - retryCount: number - } - interface RequestFailCallbackErr { - /** 错误信息 */ - errMsg: string - /** 需要基础库: `2.24.0` - * - * errno 错误码,错误码的详细说明参考 [Errno错误码](https://developers.weixin.qq.com/miniprogram/dev/framework/usability/PublicErrno.html) */ - errno: number - } - interface RequestMerchantTransferOption { - /** 商户号 */ - mchId: string - /** 商家转账付款单跳转收款页 pkg 信息,商家转账付款单受理成功时返回给商户 */ - package: string - /** 商户 appId,普通模式下必填,服务商模式下,appId 和 subAppId 二选一填写 */ - appId?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequestMerchantTransferCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RequestMerchantTransferFailCallback - /** 收款用户 openId, 对应传入的商户 appId 下,某用户的 openId */ - openId?: string - /** 子商户 appId,服务商模式下,appId 和 subAppId 二选一填写 */ - subAppId?: string - /** 子商户号,服务商模式下必填 */ - subMchId?: string - /** 接口调用成功的回调函数 */ - success?: RequestMerchantTransferSuccessCallback - } - interface RequestOption< - T extends string | IAnyObject | ArrayBuffer = - | string - | IAnyObject - | ArrayBuffer - > { - /** 开发者服务器接口地址 */ - url: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequestCompleteCallback - /** 请求的参数 */ - data?: string | IAnyObject | ArrayBuffer - /** 返回的数据格式 - * - * 可选值: - * - 'json': 返回的数据为 JSON,返回后会对返回的数据进行一次 JSON.parse; - * - '其他': 不对返回的内容进行 JSON.parse; */ - dataType?: 'json' | '其他' - /** 需要基础库: `2.10.4` - * - * 开启 Http 缓存 */ - enableCache?: boolean - /** 需要基础库: `2.20.2` - * - * 开启 transfer-encoding chunked。 */ - enableChunked?: boolean - /** 需要基础库: `2.10.4` - * - * 开启 http2 */ - enableHttp2?: boolean - /** 需要基础库: `2.19.1` - * - * 是否开启 HttpDNS 服务。如开启,需要同时填入 httpDNSServiceId 。 HttpDNS 用法详见 [移动解析HttpDNS](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/HTTPDNS.html) */ - enableHttpDNS?: boolean - /** 是否开启 profile,默认开启。开启后可在接口回调的 res.profile 中查看性能调试信息。 */ - enableProfile?: boolean - /** 需要基础库: `2.10.4` - * - * 开启 Quic 协议(gQUIC Q43) */ - enableQuic?: boolean - /** 接口调用失败的回调函数 */ - fail?: RequestFailCallback - /** 需要基础库: `2.21.0` - * - * 强制使用蜂窝网络发送请求 */ - forceCellularNetwork?: boolean - /** 设置请求的 header,header 中不能设置 Referer。 - * - * `content-type` 默认为 `application/json` */ - header?: IAnyObject - /** 需要基础库: `2.19.1` - * - * HttpDNS 服务商 Id。 HttpDNS 用法详见 [移动解析HttpDNS](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/HTTPDNS.html) */ - httpDNSServiceId?: string - /** HTTP 请求方法 - * - * 可选值: - * - 'OPTIONS': HTTP 请求 OPTIONS; - * - 'GET': HTTP 请求 GET; - * - 'HEAD': HTTP 请求 HEAD; - * - 'POST': HTTP 请求 POST; - * - 'PUT': HTTP 请求 PUT; - * - 'DELETE': HTTP 请求 DELETE; - * - 'TRACE': HTTP 请求 TRACE; - * - 'CONNECT': HTTP 请求 CONNECT; */ - method?: - | 'OPTIONS' - | 'GET' - | 'HEAD' - | 'POST' - | 'PUT' - | 'DELETE' - | 'TRACE' - | 'CONNECT' - /** 需要基础库: `3.2.2` - * - * 重定向拦截策略。(目前安卓、iOS、开发者工具已支持,PC端将在后续支持) - * - * 可选值: - * - 'follow': 不拦截重定向,即客户端自动处理重定向; - * - 'manual': 拦截重定向。开启后,当 http 状态码为 3xx 时客户端不再自动重定向,而是触发 onHeadersReceived 回调,并结束本次 request 请求。可通过 onHeadersReceived 回调中的 header.Location 获取重定向的 url; */ - redirect?: 'follow' | 'manual' - /** 需要基础库: `1.7.0` - * - * 响应的数据类型 - * - * 可选值: - * - 'text': 响应的数据为文本; - * - 'arraybuffer': 响应的数据为 ArrayBuffer; */ - responseType?: 'text' | 'arraybuffer' - /** 接口调用成功的回调函数 */ - success?: RequestSuccessCallback - /** 需要基础库: `2.10.0` - * - * 超时时间,单位为毫秒。默认值为 60000 */ - timeout?: number - /** 需要基础库: `3.3.3` - * - * 使用高性能模式,暂仅支持 Android,默认关闭。该模式下有更优的网络性能表现,更多信息请查看下方说明。 */ - useHighPerformanceMode?: boolean - } - interface RequestOrderPaymentOption { - /** 随机字符串,长度为32个字符以下 */ - nonceStr: string - /** 统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*** */ - package: string - /** 签名,具体见微信支付文档 */ - paySign: string - /** 时间戳,从 1970 年 1 月 1 日 00:00:00 至今的秒数,即当前的时间 */ - timeStamp: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequestOrderPaymentCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RequestOrderPaymentFailCallback - /** 签名算法,应与后台下单时的值一致 - * - * 可选值: - * - 'MD5': 仅在 v2 版本接口适用; - * - 'HMAC-SHA256': 仅在 v2 版本接口适用; - * - 'RSA': 仅在 v3 版本接口适用; */ - signType?: 'MD5' | 'HMAC-SHA256' | 'RSA' - /** 接口调用成功的回调函数 */ - success?: RequestOrderPaymentSuccessCallback - } - interface RequestPaymentOption { - /** 随机字符串,长度为32个字符以下 */ - nonceStr: string - /** 统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*** */ - package: string - /** 签名,具体见微信支付文档 */ - paySign: string - /** 时间戳,从 1970 年 1 月 1 日 00:00:00 至今的秒数,即当前的时间 */ - timeStamp: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequestPaymentCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RequestPaymentFailCallback - /** 签名算法,应与后台下单时的值一致 - * - * 可选值: - * - 'MD5': 仅在 v2 版本接口适用; - * - 'HMAC-SHA256': 仅在 v2 版本接口适用; - * - 'RSA': 仅在 v3 版本接口适用; */ - signType?: 'MD5' | 'HMAC-SHA256' | 'RSA' - /** 接口调用成功的回调函数 */ - success?: RequestPaymentSuccessCallback - } - interface RequestPictureInPictureOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequestPictureInPictureCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RequestPictureInPictureFailCallback - /** 接口调用成功的回调函数 */ - success?: RequestPictureInPictureSuccessCallback - } - interface RequestPluginPaymentOption { - /** 需要显示在页面中的金额,单位为分 */ - fee: number - /** 任意数据,传递给功能页中的响应函数 */ - paymentArgs: IAnyObject - /** 插件版本 - * - * 可选值: - * - 'develop': 开发版; - * - 'trial': 体验版; - * - 'release': 正式版; */ - version: 'develop' | 'trial' | 'release' - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequestPluginPaymentCompleteCallback - /** 需要显示在页面中的货币符号的代码 */ - currencyType?: string - /** 接口调用失败的回调函数 */ - fail?: RequestPluginPaymentFailCallback - /** 接口调用成功的回调函数 */ - success?: RequestPluginPaymentSuccessCallback - } - /** 需要基础库: `2.10.4` - * - * 网络请求过程中一些调试信息,[查看详细说明](https://developers.weixin.qq.com/miniprogram/dev/framework/performance/network.html) */ - interface RequestProfile { - /** SSL建立完成的时间,如果不是安全连接,则值为 0 */ - SSLconnectionEnd: number - /** SSL建立连接的时间,如果不是安全连接,则值为 0 */ - SSLconnectionStart: number - /** HTTP(TCP) 完成建立连接的时间(完成握手),如果是持久连接,则与 fetchStart 值相等。注意如果在传输层发生了错误且重新建立连接,则这里显示的是新建立的连接完成的时间。注意这里握手结束,包括安全连接建立完成、SOCKS 授权通过 */ - connectEnd: number - /** HTTP(TCP) 开始建立连接的时间,如果是持久连接,则与 fetchStart 值相等。注意如果在传输层发生了错误且重新建立连接,则这里显示的是新建立的连接开始的时间 */ - connectStart: number - /** DNS 域名查询完成的时间,如果使用了本地缓存(即无 DNS 查询)或持久连接,则与 fetchStart 值相等 */ - domainLookUpEnd: number - /** DNS 域名查询开始的时间,如果使用了本地缓存(即无 DNS 查询)或持久连接,则与 fetchStart 值相等 */ - domainLookUpStart: number - /** 评估当前网络下载的kbps */ - downstreamThroughputKbpsEstimate: number - /** 评估的网络状态 unknown, offline, slow 2g, 2g, 3g, 4g, last/0, 1, 2, 3, 4, 5, 6 */ - estimate_nettype: number - /** 组件准备好使用 HTTP 请求抓取资源的时间,这发生在检查本地缓存之前 */ - fetchStart: number - /** 协议层根据多个请求评估当前网络的 rtt(仅供参考) */ - httpRttEstimate: number - /** 当前请求的IP */ - peerIP: string - /** 当前请求的端口 */ - port: number - /** 使用协议类型,有效值:http1.1, h2, quic, unknown */ - protocol: string - /** 收到字节数 */ - receivedBytedCount: number - /** 最后一个 HTTP 重定向完成时的时间。有跳转且是同域名内部的重定向才算,否则值为 0 */ - redirectEnd: number - /** 第一个 HTTP 重定向发生时的时间。有跳转且是同域名内的重定向才算,否则值为 0 */ - redirectStart: number - /** HTTP请求读取真实文档结束的时间 */ - requestEnd: number - /** HTTP请求读取真实文档开始的时间(完成建立连接),包括从本地读取缓存。连接错误重连时,这里显示的也是新建立连接的时间 */ - requestStart: number - /** HTTP 响应全部接收完成的时间(获取到最后一个字节),包括从本地读取缓存 */ - responseEnd: number - /** HTTP 开始接收响应的时间(获取到第一个字节),包括从本地读取缓存 */ - responseStart: number - /** 当次请求连接过程中实时 rtt */ - rtt: number - /** 发送的字节数 */ - sendBytesCount: number - /** 是否复用连接 */ - socketReused: boolean - /** 当前网络的实际下载kbps */ - throughputKbps: number - /** 传输层根据多个请求评估的当前网络的 rtt(仅供参考) */ - transportRttEstimate: number - /** 是否走到了高性能模式。基础库 v3.3.4 起支持。 */ - usingHighPerformanceMode: boolean - } - interface RequestSubscribeDeviceMessageFailCallbackResult { - /** 接口调用失败错误码,有可能为空 */ - errCode: number - /** 接口调用失败错误信息 */ - errMsg: string - } - interface RequestSubscribeDeviceMessageOption { - /** 设备型号 id 。通过微信公众平台注册设备获得。 */ - modelId: string - /** 设备唯一序列号。由厂商分配,长度不能超过128字节。字符只接受数字,大小写字母,下划线(_)和连字符(-)。 */ - sn: string - /** 设备票据,5分钟内有效。 */ - snTicket: string - /** 需要订阅的消息模板的 id 的集合,一次调用最多可订阅3条消息 */ - tmplIds: any[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequestSubscribeDeviceMessageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RequestSubscribeDeviceMessageFailCallback - /** 接口调用成功的回调函数 */ - success?: RequestSubscribeDeviceMessageSuccessCallback - } - interface RequestSubscribeDeviceMessageSuccessCallbackResult { - /** [TEMPLATE_ID]是动态的键,即模板id,值包括'accept'、'reject'、'ban'、'filter'、'acceptWithAudio'。'accept'表示用户同意订阅该条id对应的模板消息,'reject'表示用户拒绝订阅该条id对应的模板消息,'ban'表示已被后台封禁,'acceptWithAudio' 表示用户接收订阅消息并开启了语音提醒,'filter'表示该模板因为模板标题同名被后台过滤。例如 { errMsg: "requestSubscribeDeviceMessage:ok", zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: "accept"} 表示用户同意订阅zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE这条消息 */ - [TEMPLATE_ID: string]: string - /** 接口调用成功时errMsg值为'requestSubscribeDeviceMessage:ok' */ - errMsg: string - } - interface RequestSubscribeMessageFailCallbackResult { - /** 接口调用失败错误码 */ - errCode: number - /** 接口调用失败错误信息 */ - errMsg: string - } - interface RequestSubscribeMessageOption { - /** 需要订阅的消息模板的id的集合,一次调用最多可订阅3条消息(注意:iOS客户端7.0.6版本、Android客户端7.0.7版本之后的一次性订阅/长期订阅才支持多个模板消息,iOS客户端7.0.5版本、Android客户端7.0.6版本之前的一次订阅只支持一个模板消息)消息模板id在[微信公众平台(mp.weixin.qq.com)-功能-订阅消息]中配置。每个tmplId对应的模板标题需要不相同,否则会被过滤。 */ - tmplIds: any[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequestSubscribeMessageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RequestSubscribeMessageFailCallback - /** 接口调用成功的回调函数 */ - success?: RequestSubscribeMessageSuccessCallback - } - interface RequestSubscribeMessageSuccessCallbackResult { - /** [TEMPLATE_ID]是动态的键,即模板id,值包括'accept'、'reject'、'ban'、'filter'。'accept'表示用户同意订阅该条id对应的模板消息,'reject'表示用户拒绝订阅该条id对应的模板消息,'ban'表示已被后台封禁,'filter'表示该模板因为模板标题同名被后台过滤。例如 { errMsg: "requestSubscribeMessage:ok", zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: "accept"} 表示用户同意订阅zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE这条消息 */ - [TEMPLATE_ID: string]: string - /** 接口调用成功时errMsg值为'requestSubscribeMessage:ok' */ - errMsg: string - } - interface RequestSuccessCallbackResult< - T extends string | IAnyObject | ArrayBuffer = - | string - | IAnyObject - | ArrayBuffer - > { - /** 需要基础库: `2.10.0` - * - * 开发者服务器返回的 cookies,格式为字符串数组 */ - cookies: string[] - /** 开发者服务器返回的数据 */ - data: T - /** 需要基础库: `3.0.0` - * - * 网络请求过程中的一些异常信息,例如httpdns重试等 */ - exception: RequestException - /** 需要基础库: `1.2.0` - * - * 开发者服务器返回的 HTTP Response Header */ - header: IAnyObject - /** 需要基础库: `2.10.4` - * - * 网络请求过程中一些调试信息,[查看详细说明](https://developers.weixin.qq.com/miniprogram/dev/framework/performance/network.html) */ - profile: RequestProfile - /** 开发者服务器返回的 HTTP 状态码 */ - statusCode: number - /** 需要基础库: `3.4.10` - * - * 最终请求是否使用了HttpDNS(仅当enableHttpDNS传true时返回此字段) */ - useHttpDNS: boolean - errMsg: string - } - interface RequestTaskOnHeadersReceivedListenerResult { - /** 开发者服务器返回的 cookies,格式为字符串数组 */ - cookies: string[] - /** 开发者服务器返回的 HTTP Response Header */ - header: IAnyObject - /** 开发者服务器返回的 HTTP 状态码 (目前开发者工具上不会返回 statusCode 字段,可用真机查看该字段,后续将会支持) */ - statusCode: number - } - interface RequestVirtualPaymentFailCallbackErr { - /** 错误码 */ - errCode: number - /** 错误信息 */ - errMsg: string - } - interface RequestVirtualPaymentOption { - /** 支付的类型, 不同的支付类型有各自额外要传的附加参数 - * - * 可选值: - * - 'short_series_goods': 道具直购; - * - 'short_series_coin': 代币充值; */ - mode: 'short_series_goods' | 'short_series_coin' - /** 支付签名, 详见[《签名详解》](https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/virtual-payment.html) */ - paySig: string - /** 具体支付参数见signData, 该参数需以string形式传递, 例如signData: '{"offerId":"123","buyQuantity":1,"env":0,"currencyType":"CNY","productId":"testproductId","goodsPrice":10,"outTradeNo":"xxxxxx","attach":"testdata"}' */ - signData: SignData - /** 用户态签名, 详见[《签名详解》](https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/virtual-payment.html) */ - signature: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequestVirtualPaymentCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RequestVirtualPaymentFailCallback - /** 接口调用成功的回调函数 */ - success?: RequestVirtualPaymentSuccessCallback - } - interface RequirePrivacyAuthorizeOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RequirePrivacyAuthorizeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RequirePrivacyAuthorizeFailCallback - /** 接口调用成功的回调函数 */ - success?: RequirePrivacyAuthorizeSuccessCallback - } - interface ReserveChannelsLiveOption { - /** 预告 id,通过 getChannelsLiveNoticeInfo 接口获取 */ - noticeId: string - } - interface RestartMiniProgramOption { - /** 打开的页面路径,path 中 ? 后面的部分会成为 query */ - path: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RestartMiniProgramCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RestartMiniProgramFailCallback - /** 接口调用成功的回调函数 */ - success?: RestartMiniProgramSuccessCallback - } - interface ResumeBGMOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ResumeBGMCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ResumeBGMFailCallback - /** 接口调用成功的回调函数 */ - success?: ResumeBGMSuccessCallback - } - interface ResumeOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ResumeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ResumeFailCallback - /** 接口调用成功的回调函数 */ - success?: ResumeSuccessCallback - } - interface RewardedVideoAdOnCloseListenerResult { - /** 需要基础库: `2.1.0` - * - * 视频是否是在用户完整观看的情况下被关闭的 */ - isEnded: boolean - } - interface RewardedVideoAdOnErrorListenerResult { - /** 需要基础库: `2.2.2` - * - * 错误码 - * - * 可选值: - * - 1000: 后端接口调用失败; - * - 1001: 参数错误; - * - 1002: 广告单元无效; - * - 1003: 内部错误; - * - 1004: 无合适的广告; - * - 1005: 广告组件审核中; - * - 1006: 广告组件被驳回; - * - 1007: 广告组件被封禁; - * - 1008: 广告单元已关闭; */ - errCode: 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 - /** 错误信息 */ - errMsg: string - } - interface RmdirOption { - /** 要删除的目录路径 (本地路径) */ - dirPath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: RmdirCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: RmdirFailCallback - /** 需要基础库: `2.3.0` - * - * 是否递归删除目录。如果为 true,则删除该目录和该目录下的所有子目录以及文件。 */ - recursive?: boolean - /** 接口调用成功的回调函数 */ - success?: RmdirSuccessCallback - } - interface RunOCROption { - /** 待识别图像的像素点数据,每四项表示一个像素点的 RGBA */ - frameBuffer: ArrayBuffer - /** 图像高度 */ - height: number - /** 图像宽度 */ - width: number - } - interface SafeArea { - /** 安全区域右下角纵坐标 */ - bottom: number - /** 安全区域的高度,单位逻辑像素 */ - height: number - /** 安全区域左上角横坐标 */ - left: number - /** 安全区域右下角横坐标 */ - right: number - /** 安全区域左上角纵坐标 */ - top: number - /** 安全区域的宽度,单位逻辑像素 */ - width: number - } - interface SaveFileOption { - /** 临时存储文件路径 (本地路径) */ - tempFilePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SaveFileCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SaveFileFailCallback - /** 要存储的文件路径 (本地路径) */ - filePath?: string - /** 接口调用成功的回调函数 */ - success?: SaveFileSuccessCallback - } - interface SaveFileSuccessCallbackResult { - /** 存储后的文件路径 (本地路径) */ - savedFilePath: string - errMsg: string - } - interface SaveFileToDiskOption { - /** 待保存文件路径 */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SaveFileToDiskCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SaveFileToDiskFailCallback - /** 接口调用成功的回调函数 */ - success?: SaveFileToDiskSuccessCallback - } - interface SaveImageToPhotosAlbumOption { - /** 图片文件路径,可以是临时文件路径或永久文件路径 (本地路径) ,不支持网络路径 */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SaveImageToPhotosAlbumCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SaveImageToPhotosAlbumFailCallback - /** 接口调用成功的回调函数 */ - success?: SaveImageToPhotosAlbumSuccessCallback - } - interface SaveVideoToPhotosAlbumOption { - /** 视频文件路径,可以是临时文件路径也可以是永久文件路径 (本地路径) */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SaveVideoToPhotosAlbumCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SaveVideoToPhotosAlbumFailCallback - /** 接口调用成功的回调函数 */ - success?: SaveVideoToPhotosAlbumSuccessCallback - } - interface ScanCodeOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ScanCodeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ScanCodeFailCallback - /** 需要基础库: `1.2.0` - * - * 是否只能从相机扫码,不允许从相册选择图片 */ - onlyFromCamera?: boolean - /** 需要基础库: `1.7.0` - * - * 扫码类型 - * - * 可选值: - * - 'barCode': 一维码; - * - 'qrCode': 二维码; - * - 'datamatrix': Data Matrix 码; - * - 'pdf417': PDF417 条码; */ - scanType?: Array<'barCode' | 'qrCode' | 'datamatrix' | 'pdf417'> - /** 接口调用成功的回调函数 */ - success?: ScanCodeSuccessCallback - } - interface ScanCodeSuccessCallbackResult { - /** 所扫码的字符集 */ - charSet: string - /** 当所扫的码为当前小程序二维码时,会返回此字段,内容为二维码携带的 path */ - path: string - /** 原始数据,base64编码 */ - rawData: string - /** 所扫码的内容 */ - result: string - /** 所扫码的类型 - * - * 可选值: - * - 'QR_CODE': 二维码; - * - 'AZTEC': 一维码; - * - 'CODABAR': 一维码; - * - 'CODE_39': 一维码; - * - 'CODE_93': 一维码; - * - 'CODE_128': 一维码; - * - 'DATA_MATRIX': 二维码; - * - 'EAN_8': 一维码; - * - 'EAN_13': 一维码; - * - 'ITF': 一维码; - * - 'MAXICODE': 一维码; - * - 'PDF_417': 二维码; - * - 'RSS_14': 一维码; - * - 'RSS_EXPANDED': 一维码; - * - 'UPC_A': 一维码; - * - 'UPC_E': 一维码; - * - 'UPC_EAN_EXTENSION': 一维码; - * - 'WX_CODE': 二维码; - * - 'CODE_25': 一维码; */ - scanType: - | 'QR_CODE' - | 'AZTEC' - | 'CODABAR' - | 'CODE_39' - | 'CODE_93' - | 'CODE_128' - | 'DATA_MATRIX' - | 'EAN_8' - | 'EAN_13' - | 'ITF' - | 'MAXICODE' - | 'PDF_417' - | 'RSS_14' - | 'RSS_EXPANDED' - | 'UPC_A' - | 'UPC_E' - | 'UPC_EAN_EXTENSION' - | 'WX_CODE' - | 'CODE_25' - errMsg: string - } - interface ScrollOffsetCallbackResult { - /** 节点的 dataset */ - dataset: IAnyObject - /** 节点的 ID */ - id: string - /** 节点的水平滚动位置 */ - scrollLeft: number - /** 节点的竖直滚动位置 */ - scrollTop: number - } - /** 需要基础库: `2.14.4` -* -* 增强 ScrollView 实例,可通过 [wx.createSelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/wx.createSelectorQuery.html) 的 [NodesRef.node](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.node.html) 方法获取。 仅在 scroll-view 组件开启 enhanced 属性后生效。 -* -* **示例代码** -* -* ```js -wx.createSelectorQuery() - .select('#scrollview') - .node() - .exec((res) => { - const scrollView = res[0].node; - scrollView.scrollEnabled = false; - }) -``` */ - interface ScrollViewContext { - /** 设置滚动边界弹性 (仅在 iOS 下生效) */ - bounces: boolean - /** 取消滚动惯性 (仅在 iOS 下生效) */ - decelerationDisabled: boolean - /** 设置滚动减速速率 (仅在 iOS 下生效) */ - fastDeceleration: boolean - /** 分页滑动开关 */ - pagingEnabled: boolean - /** 滚动开关 */ - scrollEnabled: boolean - /** 设置是否显示滚动条 */ - showScrollbar: boolean - /** [ScrollViewContext.closeRefresh()](https://developers.weixin.qq.com/miniprogram/dev/api/ui/scroll/ScrollViewContext.closeRefresh.html) - * - * 需要基础库: `3.0.0` - * - * 在插件中使用:支持 - * - * 关闭下拉刷新。 */ - closeRefresh(): void - /** [ScrollViewContext.closeTwoLevel(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/scroll/ScrollViewContext.closeTwoLevel.html) - * - * 需要基础库: `3.0.0` - * - * 在插件中使用:支持 - * - * 关闭下拉二级。 */ - closeTwoLevel(option: TriggerRefreshOption): void - /** [ScrollViewContext.scrollIntoView(string selector, object ScrollIntoViewOptions)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/scroll/ScrollViewContext.scrollIntoView.html) - * - * 需要基础库: `2.14.4` - * - * 在插件中使用:支持 - * - * 滚动至指定位置 */ - scrollIntoView( - /** 元素选择器 */ - selector: string, - /** 需要基础库: `3.1.0` - * - * 配置项,仅 Skyine 模式支持 */ - ScrollIntoViewOptions: IAnyObject - ): void - /** [ScrollViewContext.scrollTo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/scroll/ScrollViewContext.scrollTo.html) - * - * 需要基础库: `2.14.4` - * - * 在插件中使用:支持 - * - * 滚动至指定位置 */ - scrollTo(option: ScrollViewContextScrollToOption): void - /** [ScrollViewContext.triggerRefresh(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/scroll/ScrollViewContext.triggerRefresh.html) - * - * 需要基础库: `3.0.0` - * - * 在插件中使用:支持 - * - * 触发下拉刷新。 */ - triggerRefresh(option: TriggerRefreshOption): void - /** [ScrollViewContext.triggerTwoLevel(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/scroll/ScrollViewContext.triggerTwoLevel.html) - * - * 需要基础库: `3.0.0` - * - * 在插件中使用:支持 - * - * 触发下拉二级。 */ - triggerTwoLevel(option: TriggerRefreshOption): void - } - interface ScrollViewContextScrollToOption { - /** 是否启用滚动动画 */ - animated?: boolean - /** 滚动动画时长 (仅在 iOS 下生效) */ - duration?: number - /** 左边界距离 */ - left?: number - /** 顶部距离 */ - top?: number - /** 初始速度 (仅在 iOS 下生效) */ - velocity?: number - } - interface SeekBackgroundAudioOption { - /** 音乐位置,单位:秒 */ - position: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SeekBackgroundAudioCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SeekBackgroundAudioFailCallback - /** 接口调用成功的回调函数 */ - success?: SeekBackgroundAudioSuccessCallback - } - interface SendHCEMessageOption { - /** 二进制数据 */ - data: ArrayBuffer - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SendHCEMessageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SendHCEMessageFailCallback - /** 接口调用成功的回调函数 */ - success?: SendHCEMessageSuccessCallback - } - interface SendMessageOption { - /** SEI消息 */ - msg: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SendMessageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SendMessageFailCallback - /** 接口调用成功的回调函数 */ - success?: SendMessageSuccessCallback - } - interface SendSmsOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SendSmsCompleteCallback - /** 预填到发送短信面板的内容 */ - content?: string - /** 接口调用失败的回调函数 */ - fail?: SendSmsFailCallback - /** 预填到发送短信面板的手机号 */ - phoneNumber?: string - /** 接口调用成功的回调函数 */ - success?: SendSmsSuccessCallback - } - interface SendSocketMessageOption { - /** 需要发送的内容 */ - data: string | ArrayBuffer - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SendSocketMessageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SendSocketMessageFailCallback - /** 接口调用成功的回调函数 */ - success?: SendSocketMessageSuccessCallback - } - interface SetBGMVolumeOption { - /** 音量大小,范围是 0-1 */ - volume: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetBGMVolumeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetBGMVolumeFailCallback - /** 接口调用成功的回调函数 */ - success?: SetBGMVolumeSuccessCallback - } - interface SetBLEMTUFailCallbackResult { - /** 最终协商的 MTU 值。如果协商失败则无此参数。安卓客户端 8.0.9 开始支持。 */ - mtu: number - } - interface SetBLEMTUOption { - /** 蓝牙设备 id */ - deviceId: string - /** 最大传输单元。设置范围为 (22,512) 区间内,单位 bytes */ - mtu: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetBLEMTUCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetBLEMTUFailCallback - /** 接口调用成功的回调函数 */ - success?: SetBLEMTUSuccessCallback - } - interface SetBLEMTUSuccessCallbackResult { - /** 最终协商的 MTU 值,与传入参数一致。安卓客户端 8.0.9 开始支持。 */ - mtu: number - errMsg: string - } - interface SetBackgroundColorOption { - /** 窗口的背景色,必须为十六进制颜色值 */ - backgroundColor?: string - /** 底部窗口的背景色,必须为十六进制颜色值,仅 iOS 支持 */ - backgroundColorBottom?: string - /** 顶部窗口的背景色,必须为十六进制颜色值,仅 iOS 支持 */ - backgroundColorTop?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetBackgroundColorCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetBackgroundColorFailCallback - /** 接口调用成功的回调函数 */ - success?: SetBackgroundColorSuccessCallback - } - interface SetBackgroundFetchTokenOption { - /** 自定义的登录态 */ - token: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetBackgroundFetchTokenCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetBackgroundFetchTokenFailCallback - /** 接口调用成功的回调函数 */ - success?: SetBackgroundFetchTokenSuccessCallback - } - interface SetBackgroundTextStyleOption { - /** 下拉背景字体、loading 图的样式。 - * - * 可选值: - * - 'dark': dark 样式; - * - 'light': light 样式; */ - textStyle: 'dark' | 'light' - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetBackgroundTextStyleCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetBackgroundTextStyleFailCallback - /** 接口调用成功的回调函数 */ - success?: SetBackgroundTextStyleSuccessCallback - } - interface SetBoundaryOption { - /** 东北角经纬度 */ - northeast: MapPostion - /** 西南角经纬度 */ - southwest: MapPostion - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetBoundaryCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetBoundaryFailCallback - /** 接口调用成功的回调函数 */ - success?: SetBoundarySuccessCallback - } - interface SetCenterOffsetOption { - /** 偏移量,两位数组 */ - offset: number[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetCenterOffsetCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetCenterOffsetFailCallback - /** 接口调用成功的回调函数 */ - success?: SetCenterOffsetSuccessCallback - } - interface SetClipboardDataOption { - /** 剪贴板的内容 */ - data: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetClipboardDataCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetClipboardDataFailCallback - /** 接口调用成功的回调函数 */ - success?: SetClipboardDataSuccessCallback - } - interface SetContentsOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetContentsCompleteCallback - /** 表示内容的delta对象 */ - delta?: IAnyObject - /** 接口调用失败的回调函数 */ - fail?: SetContentsFailCallback - /** 带标签的HTML内容 */ - html?: string - /** 接口调用成功的回调函数 */ - success?: SetContentsSuccessCallback - } - interface SetEnable1v1ChatOption { - /** 是否开启 */ - enable: boolean - /** 窗口背景色(音频通话背景以及小窗模式背景) - * - * 可选值: - * - 0: #262930; - * - 1: #FA5151; - * - 2: #FA9D3B; - * - 3: #3D7257; - * - 4: #1485EE; - * - 5: #6467F0; */ - backgroundType?: 0 | 1 | 2 | 3 | 4 | 5 - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetEnable1v1ChatCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetEnable1v1ChatFailCallback - /** 小窗样式 */ - minWindowType?: number - /** 接口调用成功的回调函数 */ - success?: SetEnable1v1ChatSuccessCallback - } - interface SetEnableDebugOption { - /** 是否打开调试 */ - enableDebug: boolean - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetEnableDebugCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetEnableDebugFailCallback - /** 接口调用成功的回调函数 */ - success?: SetEnableDebugSuccessCallback - } - interface SetInnerAudioOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetInnerAudioOptionCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetInnerAudioOptionFailCallback - /** 是否与其他音频混播,设置为 true 之后,不会终止其他应用或微信内的音乐 */ - mixWithOther?: boolean - /** (仅在 iOS 生效)是否遵循静音开关,设置为 false 之后,即使是在静音模式下,也能播放声音 */ - obeyMuteSwitch?: boolean - /** true 代表用扬声器播放,false 代表听筒播放,默认值为 true。 */ - speakerOn?: boolean - /** 接口调用成功的回调函数 */ - success?: SetInnerAudioOptionSuccessCallback - } - interface SetKeepScreenOnOption { - /** 是否保持屏幕常亮 */ - keepScreenOn: boolean - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetKeepScreenOnCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetKeepScreenOnFailCallback - /** 接口调用成功的回调函数 */ - success?: SetKeepScreenOnSuccessCallback - } - interface SetLocMarkerIconOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetLocMarkerIconCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetLocMarkerIconFailCallback - /** 图标路径,支持网络路径、本地路径、代码包路径 */ - iconPath?: string - /** 接口调用成功的回调函数 */ - success?: SetLocMarkerIconSuccessCallback - } - interface SetMICVolumeOption { - /** 音量大小,范围是 0.0-1.0 */ - volume: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetMICVolumeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetMICVolumeFailCallback - /** 接口调用成功的回调函数 */ - success?: SetMICVolumeSuccessCallback - } - interface SetNavigationBarColorOption { - /** 背景颜色值,有效值为十六进制颜色 */ - backgroundColor: string - /** 前景颜色值,包括按钮、标题、状态栏的颜色,仅支持 #ffffff 和 #000000 */ - frontColor: string - /** 动画效果 */ - animation?: AnimationOption - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetNavigationBarColorCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetNavigationBarColorFailCallback - /** 接口调用成功的回调函数 */ - success?: SetNavigationBarColorSuccessCallback - } - interface SetNavigationBarTitleOption { - /** 页面标题 */ - title: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetNavigationBarTitleCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetNavigationBarTitleFailCallback - /** 接口调用成功的回调函数 */ - success?: SetNavigationBarTitleSuccessCallback - } - interface SetScreenBrightnessOption { - /** 屏幕亮度值,范围 0 ~ 1,0 最暗,1 最亮。在安卓端支持传入特殊值 -1,表示屏幕亮度跟随系统变化 */ - value: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetScreenBrightnessCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetScreenBrightnessFailCallback - /** 接口调用成功的回调函数 */ - success?: SetScreenBrightnessSuccessCallback - } - interface SetStorageOption { - /** 需要存储的内容。只支持原生类型、Date、及能够通过`JSON.stringify`序列化的对象。 */ - data: T - /** 本地缓存中指定的 key */ - key: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetStorageCompleteCallback - /** 需要基础库: `2.21.3` - * - * 是否开启加密存储。只有异步的 setStorage 接口支持开启加密存储。开启后,将会对 data 使用 AES128 加密,接口回调耗时将会增加。若开启加密存储,setStorage 和 getStorage 需要同时声明 encrypt 的值为 true。此外,由于加密后的数据会比原始数据膨胀1.4倍,因此开启 encrypt 的情况下,单个 key 允许存储的最大数据长度为 0.7MB,所有数据存储上限为 7.1MB */ - encrypt?: boolean - /** 接口调用失败的回调函数 */ - fail?: SetStorageFailCallback - /** 接口调用成功的回调函数 */ - success?: SetStorageSuccessCallback - } - interface SetTabBarBadgeOption { - /** tabBar 的哪一项,从左边算起 */ - index: number - /** 显示的文本,超过 4 个字符则显示成 ... */ - text: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetTabBarBadgeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetTabBarBadgeFailCallback - /** 接口调用成功的回调函数 */ - success?: SetTabBarBadgeSuccessCallback - } - interface SetTabBarItemOption { - /** tabBar 的哪一项,从左边算起 */ - index: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetTabBarItemCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetTabBarItemFailCallback - /** 图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px,当 postion 为 top 时,此参数无效 */ - iconPath?: string - /** 选中时的图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px ,当 postion 为 top 时,此参数无效 */ - selectedIconPath?: string - /** 接口调用成功的回调函数 */ - success?: SetTabBarItemSuccessCallback - /** tab 上的按钮文字 */ - text?: string - } - interface SetTabBarStyleOption { - /** tab 的背景色,HexColor */ - backgroundColor?: string - /** tabBar上边框的颜色, 仅支持 black/white */ - borderStyle?: string - /** tab 上的文字默认颜色,HexColor */ - color?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetTabBarStyleCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetTabBarStyleFailCallback - /** tab 上的文字选中时的颜色,HexColor */ - selectedColor?: string - /** 接口调用成功的回调函数 */ - success?: SetTabBarStyleSuccessCallback - } - interface SetTimeoutOption { - /** 设置超时时间 (ms) */ - timeout: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetTimeoutCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetTimeoutFailCallback - /** 接口调用成功的回调函数 */ - success?: SetTimeoutSuccessCallback - } - interface SetTopBarTextOption { - /** 置顶栏文字 */ - text: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetTopBarTextCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetTopBarTextFailCallback - /** 接口调用成功的回调函数 */ - success?: SetTopBarTextSuccessCallback - } - interface SetVisualEffectOnCaptureOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetVisualEffectOnCaptureCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetVisualEffectOnCaptureFailCallback - /** 接口调用成功的回调函数 */ - success?: SetVisualEffectOnCaptureSuccessCallback - /** 截屏/录屏时的表现,仅支持 none / hidden,传入 hidden 则表示在截屏/录屏时隐藏屏幕 */ - visualEffect?: string - } - interface SetWifiListOption { - /** 提供预设的 Wi-Fi 信息列表 */ - wifiList: WifiData[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetWifiListCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetWifiListFailCallback - /** 接口调用成功的回调函数 */ - success?: SetWifiListSuccessCallback - } - interface SetWindowSizeOption { - /** 窗口高度,以像素为单位 */ - height: number - /** 窗口宽度,以像素为单位 */ - width: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SetWindowSizeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SetWindowSizeFailCallback - /** 接口调用成功的回调函数 */ - success?: SetWindowSizeSuccessCallback - } - interface SetZoomSuccessCallbackResult { - /** 实际设置的缩放级别。由于系统限制,某些机型可能无法设置成指定值,会改用最接近的可设值。 */ - zoom: number - errMsg: string - } - interface ShareFileMessageOption { - /** 要分享的文件地址,必须为本地路径或临时路径 */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShareFileMessageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ShareFileMessageFailCallback - /** 自定义文件名,若留空则使用filePath中的文件名 */ - fileName?: string - /** 接口调用成功的回调函数 */ - success?: ShareFileMessageSuccessCallback - } - interface ShareToWeRunOption { - /** 运动数据列表 */ - recordList: WxaSportRecord[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShareToWeRunCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ShareToWeRunFailCallback - /** 接口调用成功的回调函数 */ - success?: ShareToWeRunSuccessCallback - } - interface ShareVideoMessageOption { - /** 要分享的视频地址,必须为本地路径或临时路径 */ - videoPath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShareVideoMessageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ShareVideoMessageFailCallback - /** 接口调用成功的回调函数 */ - success?: ShareVideoMessageSuccessCallback - /** 缩略图路径,若留空则使用视频首帧 */ - thumbPath?: string - } - /** 需要基础库: `3.2.1` - * - * 鞋部检测配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/shoe.html)。 */ - interface ShoeTrack { - /** 需要基础库: `3.2.1` - * - * 鞋部检测模式 - * - * 可选值: - * - 1: 通过摄像头实时检测; */ - mode: 1 - } - interface ShowActionSheetOption { - /** 按钮的文字数组,数组长度最大为 6 */ - itemList: string[] - /** 需要基础库: `2.14.0` - * - * 警示文案 */ - alertText?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShowActionSheetCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ShowActionSheetFailCallback - /** 按钮的文字颜色 */ - itemColor?: string - /** 接口调用成功的回调函数 */ - success?: ShowActionSheetSuccessCallback - } - interface ShowActionSheetSuccessCallbackResult { - /** 用户点击的按钮序号,从上到下的顺序,从0开始 */ - tapIndex: number - errMsg: string - } - interface ShowLoadingOption { - /** 提示的内容 */ - title: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShowLoadingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ShowLoadingFailCallback - /** 是否显示透明蒙层,防止触摸穿透 */ - mask?: boolean - /** 接口调用成功的回调函数 */ - success?: ShowLoadingSuccessCallback - } - interface ShowModalOption { - /** 取消按钮的文字颜色,必须是 16 进制格式的颜色字符串 */ - cancelColor?: string - /** 取消按钮的文字,最多 4 个字符 */ - cancelText?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShowModalCompleteCallback - /** 确认按钮的文字颜色,必须是 16 进制格式的颜色字符串 */ - confirmColor?: string - /** 确认按钮的文字,最多 4 个字符 */ - confirmText?: string - /** 提示的内容 */ - content?: string - /** 需要基础库: `2.17.1` - * - * 是否显示输入框 */ - editable?: boolean - /** 接口调用失败的回调函数 */ - fail?: ShowModalFailCallback - /** 需要基础库: `2.17.1` - * - * 显示输入框时的提示文本 */ - placeholderText?: string - /** 是否显示取消按钮 */ - showCancel?: boolean - /** 接口调用成功的回调函数 */ - success?: ShowModalSuccessCallback - /** 提示的标题 */ - title?: string - } - interface ShowModalSuccessCallbackResult { - /** 需要基础库: `1.1.0` - * - * 为 true 时,表示用户点击了取消(用于 Android 系统区分点击蒙层关闭还是点击取消按钮关闭) */ - cancel: boolean - /** 为 true 时,表示用户点击了确定按钮 */ - confirm: boolean - /** editable 为 true 时,用户输入的文本 */ - content: string - errMsg: string - } - interface ShowNavigationBarLoadingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShowNavigationBarLoadingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ShowNavigationBarLoadingFailCallback - /** 接口调用成功的回调函数 */ - success?: ShowNavigationBarLoadingSuccessCallback - } - interface ShowRedPackageOption { - /** 封面地址 */ - url: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShowRedPackageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ShowRedPackageFailCallback - /** 接口调用成功的回调函数 */ - success?: ShowRedPackageSuccessCallback - } - interface ShowShareImageMenuOption { - /** 要分享的图片地址,必须为本地路径或临时路径 */ - path: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShowShareImageMenuCompleteCallback - /** 需要基础库: `3.2.0` - * - * 从消息小程序入口打开小程序的路径,如果当前页面允许分享给朋友,则默认为当前页面路径,否则默认为小程序首页 */ - entrancePath?: string - /** 接口调用失败的回调函数 */ - fail?: ShowShareImageMenuFailCallback - /** 需要基础库: `3.2.0` - * - * 分享的图片消息是否要带小程序入口 (仅部分小程序类目可用) */ - needShowEntrance?: boolean - /** 需要基础库: `3.2.0` - * - * 分享样式,小程序可选 v2 */ - style?: string - /** 接口调用成功的回调函数 */ - success?: ShowShareImageMenuSuccessCallback - } - interface ShowShareMenuOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShowShareMenuCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ShowShareMenuFailCallback - /** 需要基础库: `2.11.3` - * - * 本接口为 Beta 版本,暂只在 Android 平台支持。需要显示的转发按钮名称列表,默认['shareAppMessage']。按钮名称合法值包含 "shareAppMessage"、"shareTimeline" 两种 */ - menus?: string[] - /** 接口调用成功的回调函数 */ - success?: ShowShareMenuSuccessCallback - /** 是否使用带 shareTicket 的转发[详情](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html) */ - withShareTicket?: boolean - } - interface ShowTabBarOption { - /** 是否需要动画效果 */ - animation?: boolean - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShowTabBarCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ShowTabBarFailCallback - /** 接口调用成功的回调函数 */ - success?: ShowTabBarSuccessCallback - } - interface ShowTabBarRedDotOption { - /** tabBar 的哪一项,从左边算起 */ - index: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShowTabBarRedDotCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ShowTabBarRedDotFailCallback - /** 接口调用成功的回调函数 */ - success?: ShowTabBarRedDotSuccessCallback - } - interface ShowToastOption { - /** 提示的内容 */ - title: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ShowToastCompleteCallback - /** 提示的延迟时间 */ - duration?: number - /** 接口调用失败的回调函数 */ - fail?: ShowToastFailCallback - /** 图标 - * - * 可选值: - * - 'success': 显示成功图标,此时 title 文本最多显示 7 个汉字长度; - * - 'error': 显示失败图标,此时 title 文本最多显示 7 个汉字长度; - * - 'loading': 显示加载图标,此时 title 文本最多显示 7 个汉字长度; - * - 'none': 不显示图标,此时 title 文本最多可显示两行,[1.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)及以上版本支持; */ - icon?: 'success' | 'error' | 'loading' | 'none' - /** 需要基础库: `1.1.0` - * - * 自定义图标的本地路径,image 的优先级高于 icon */ - image?: string - /** 是否显示透明蒙层,防止触摸穿透 */ - mask?: boolean - /** 接口调用成功的回调函数 */ - success?: ShowToastSuccessCallback - } - /** 具体支付参数见signData, 该参数需以string形式传递, 例如signData: '{"offerId":"123","buyQuantity":1,"env":0,"currencyType":"CNY","productId":"testproductId","goodsPrice":10,"outTradeNo":"xxxxxx","attach":"testdata"}' */ - interface SignData { - /** 透传数据, 发货通知时会透传给开发者 */ - attach: string - /** 购买数量 */ - buyQuantity: number - /** 币种 - * - * 可选值: - * - 'CNY': 人民币; */ - currencyType: 'CNY' - /** 在米大师侧申请的应用 id, mp-支付基础配置中的offerid */ - offerId: string - /** 业务订单号, 每个订单号只能使用一次, 重复使用会失败(极端情况不保证唯一, 不建议业务强依赖唯一性). 要求8-32个字符内, 只能是数字、大小写字母、符号 _-|*@组成, 不能以下划线(_)开头 */ - outTradeNo: string - /** 环境配置, 0 米大师正式环境, 1 米大师沙箱环境, 默认为 0 */ - env?: number - /** 道具单价(分), **该字段仅mode=short_series_goods时需要必填**, 用来校验价格与后台道具价格是否一致, 避免用户在业务商城页看到的价格与实际价格不一致导致投诉 */ - goodsPrice?: number - /** 道具ID, **该字段仅mode=short_series_goods时需要必填** */ - productId?: string - } - interface Size { - /** 变化后的窗口高度,单位 px */ - windowHeight: number - /** 变化后的窗口宽度,单位 px */ - windowWidth: number - } - /** 当前运行环境对于 [Skyline 渲染引擎](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html) 的支持情况 */ - interface SkylineInfo { - /** 当前运行环境是否支持 [Skyline 渲染引擎](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html) */ - isSupported: boolean - /** 当前运行环境 [Skyline 渲染引擎](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html) 的版本号,形如 `0.9.7` */ - version: string - /** 当前运行环境不支持 [Skyline 渲染引擎](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html) 的原因,仅在 `isSupported` 为 `false` 时出现 - * - * 可选值: - * - 'client not supported': 当前微信客户端不支持 [Skyline 渲染引擎](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html),可以尝试通过升级微信客户端解决; - * - 'baselib not supported': 当前基础库不支持 [Skyline 渲染引擎](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html),基础库会自动更新到当前客户端所能支持的最新的版本,基础库不支持时也可以尝试通过升级微信客户端解决; - * - 'a-b test not enabled': 命中了 _We 分析_ 平台上的 AB 实验关闭的情况。详细可以查看 [Skyline 起步 > 配置 We 分析 AB 实验]((skyline/migration#%E9%85%8D%E7%BD%AE-We-%E5%88%86%E6%9E%90-AB-%E5%AE%9E%E9%AA%8C)) 一节; - * - 'SwitchRender option set to webview': 本地调试的快捷切换入口被设置为了强制使用 Webview. 详情可以查看 [Skyline 起步 > 快捷切换入口](#) 一节; */ - reason?: - | 'client not supported' - | 'baselib not supported' - | 'a-b test not enabled' - | 'SwitchRender option set to webview' - } - /** Snapshot 实例,可通过 [SelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html) 获取。 - * - * [Snapshot](https://developers.weixin.qq.com/miniprogram/dev/api/skyline/Snapshot.html) 通过 `id` 跟一个 [snapshot](https://developers.weixin.qq.com/miniprogram/dev/component/snapshot.html) 组件绑定,操作对应的 [snapshot](https://developers.weixin.qq.com/miniprogram/dev/component/snapshot.html) 组件。 - * - * **示例代码** - * - * [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/jdkplEm17hJP) */ - interface Snapshot { - /** 画布高度 */ - height: number - /** 画布宽度 */ - width: number - /** [Snapshot.takeSnapshot(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/skyline/Snapshot.takeSnapshot.html) - * - * 需要基础库: `3.0.0` - * - * 在插件中使用:支持 - * - * 对 snapshot 组件子树进行截图 */ - takeSnapshot(option: TakeSnapshotOption): void - } - /** 需要基础库: `2.10.4` - * - * 网络请求过程中一些调试信息 */ - interface SocketProfile { - /** 完成建立连接的时间(完成握手),如果是持久连接,则与 fetchStart 值相等。注意如果在传输层发生了错误且重新建立连接,则这里显示的是新建立的连接完成的时间。注意这里握手结束,包括安全连接建立完成、SOCKS 授权通过 */ - connectEnd: number - /** 开始建立连接的时间,如果是持久连接,则与 fetchStart 值相等。注意如果在传输层发生了错误且重新建立连接,则这里显示的是新建立的连接开始的时间 */ - connectStart: number - /** 上层请求到返回的耗时 */ - cost: number - /** DNS 域名查询完成的时间,如果使用了本地缓存(即无 DNS 查询)或持久连接,则与 fetchStart 值相等 */ - domainLookUpEnd: number - /** DNS 域名查询开始的时间,如果使用了本地缓存(即无 DNS 查询)或持久连接,则与 fetchStart 值相等 */ - domainLookUpStart: number - /** 组件准备好使用 SOCKET 建立请求的时间,这发生在检查本地缓存之前 */ - fetchStart: number - /** 握手耗时 */ - handshakeCost: number - /** 单次连接的耗时,包括 connect ,tls */ - rtt: number - } - interface SocketTaskCloseOption { - /** 一个数字值表示关闭连接的状态号,表示连接被关闭的原因。 */ - code?: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SocketTaskCloseCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SocketTaskCloseFailCallback - /** 一个可读的字符串,表示连接被关闭的原因。这个字符串必须是不长于 123 字节的 UTF-8 文本(不是字符)。 */ - reason?: string - /** 接口调用成功的回调函数 */ - success?: SocketTaskCloseSuccessCallback - } - interface SocketTaskOnCloseListenerResult { - /** 一个数字值表示关闭连接的状态号,表示连接被关闭的原因。 */ - code: number - /** 一个可读的字符串,表示连接被关闭的原因。 */ - reason: string - } - interface SocketTaskOnMessageListenerResult { - /** 服务器返回的消息 */ - data: string | ArrayBuffer - } - interface SocketTaskSendOption { - /** 需要发送的内容 */ - data: string | ArrayBuffer - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SendCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SendFailCallback - /** 接口调用成功的回调函数 */ - success?: SendSuccessCallback - } - /** 动画配置 */ - interface SpringOption { - /** 阻尼系数 */ - damping?: number - /** 重量系数,值越大移动越慢 */ - mass?: number - /** 动画是否可以在指定值上反弹 */ - overshootClamping?: boolean - /** 弹簧静止时的位移 */ - restDisplacementThreshold?: number - /** 弹簧静止的速度 */ - restSpeedThreshold?: number - /** 弹性系数 */ - stiffness?: number - /** 速度 */ - velocity?: number - } - interface StartAccelerometerOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartAccelerometerCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartAccelerometerFailCallback - /** 需要基础库: `2.1.0` - * - * 监听加速度数据回调函数的执行频率 - * - * 可选值: - * - 'game': 适用于更新游戏的回调频率,在 20ms/次 左右; - * - 'ui': 适用于更新 UI 的回调频率,在 60ms/次 左右; - * - 'normal': 普通的回调频率,在 200ms/次 左右; */ - interval?: 'game' | 'ui' | 'normal' - /** 接口调用成功的回调函数 */ - success?: StartAccelerometerSuccessCallback - } - interface StartAdvertisingObject { - /** 广播自定义参数 */ - advertiseRequest: AdvertiseReqObj - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartAdvertisingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartAdvertisingFailCallback - /** 广播功率 - * - * 可选值: - * - 'low': 功率低; - * - 'medium': 功率适中; - * - 'high': 功率高; */ - powerLevel?: 'low' | 'medium' | 'high' - /** 接口调用成功的回调函数 */ - success?: StartAdvertisingSuccessCallback - } - interface StartBeaconDiscoveryOption { - /** Beacon 设备广播的 UUID 列表 */ - uuids: string[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartBeaconDiscoveryCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartBeaconDiscoveryFailCallback - /** 是否校验蓝牙开关,仅在 iOS 下有效。iOS 11 起,控制面板里关掉蓝牙,还是能继续使用 Beacon 服务。 */ - ignoreBluetoothAvailable?: boolean - /** 接口调用成功的回调函数 */ - success?: StartBeaconDiscoverySuccessCallback - } - interface StartBluetoothDevicesDiscoveryOption { - /** 是否允许重复上报同一设备。如果允许重复上报,则 [wx.onBlueToothDeviceFound](#) 方法会多次上报同一设备,但是 RSSI 值会有不同。 */ - allowDuplicatesKey?: boolean - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartBluetoothDevicesDiscoveryCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartBluetoothDevicesDiscoveryFailCallback - /** 上报设备的间隔,单位 ms。0 表示找到新设备立即上报,其他数值根据传入的间隔上报。 */ - interval?: number - /** 扫描模式,越高扫描越快,也越耗电。仅安卓微信客户端 7.0.12 及以上支持。 - * - * 可选值: - * - 'low': 低; - * - 'medium': 中; - * - 'high': 高; */ - powerLevel?: 'low' | 'medium' | 'high' - /** 要搜索的蓝牙设备主服务的 UUID 列表(支持 16/32/128 位 UUID)。某些蓝牙设备会广播自己的主 service 的 UUID。如果设置此参数,则只搜索广播包有对应 UUID 的主服务的蓝牙设备。建议通过该参数过滤掉周边不需要处理的其他蓝牙设备。 */ - services?: string[] - /** 接口调用成功的回调函数 */ - success?: StartBluetoothDevicesDiscoverySuccessCallback - } - interface StartCastingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartCastingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartCastingFailCallback - /** 接口调用成功的回调函数 */ - success?: StartCastingSuccessCallback - } - interface StartCompassOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartCompassCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartCompassFailCallback - /** 接口调用成功的回调函数 */ - success?: StartCompassSuccessCallback - } - interface StartDeviceMotionListeningOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartDeviceMotionListeningCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartDeviceMotionListeningFailCallback - /** 监听设备方向的变化回调函数的执行频率 - * - * 可选值: - * - 'game': 适用于更新游戏的回调频率,在 20ms/次 左右; - * - 'ui': 适用于更新 UI 的回调频率,在 60ms/次 左右; - * - 'normal': 普通的回调频率,在 200ms/次 左右; */ - interval?: 'game' | 'ui' | 'normal' - /** 接口调用成功的回调函数 */ - success?: StartDeviceMotionListeningSuccessCallback - } - interface StartDiscoveryOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartDiscoveryCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartDiscoveryFailCallback - /** 接口调用成功的回调函数 */ - success?: StartDiscoverySuccessCallback - } - interface StartGyroscopeOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartGyroscopeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartGyroscopeFailCallback - /** 监听陀螺仪数据回调函数的执行频率 - * - * 可选值: - * - 'game': 适用于更新游戏的回调频率,在 20ms/次 左右; - * - 'ui': 适用于更新 UI 的回调频率,在 60ms/次 左右; - * - 'normal': 普通的回调频率,在 200ms/次 左右; */ - interval?: 'game' | 'ui' | 'normal' - /** 接口调用成功的回调函数 */ - success?: StartGyroscopeSuccessCallback - } - interface StartHCEOption { - /** 需要注册到系统的 AID 列表 */ - aid_list: string[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartHCECompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartHCEFailCallback - /** 接口调用成功的回调函数 */ - success?: StartHCESuccessCallback - } - interface StartLocalServiceDiscoveryFailCallbackResult { - /** 错误信息 - * - * 可选值: - * - 'invalid param': serviceType 为空; - * - 'scan task already exist': 在当前 startLocalServiceDiscovery 发起的搜索未停止的情况下,再次调用 startLocalServiceDiscovery; */ - errMsg: string - } - interface StartLocalServiceDiscoveryOption { - /** 要搜索的服务类型 */ - serviceType: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartLocalServiceDiscoveryCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartLocalServiceDiscoveryFailCallback - /** 接口调用成功的回调函数 */ - success?: StartLocalServiceDiscoverySuccessCallback - } - interface StartLocationUpdateBackgroundOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartLocationUpdateBackgroundCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartLocationUpdateBackgroundFailCallback - /** 接口调用成功的回调函数 */ - success?: StartLocationUpdateBackgroundSuccessCallback - /** wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标 */ - type?: string - } - interface StartLocationUpdateOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartLocationUpdateCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartLocationUpdateFailCallback - /** 接口调用成功的回调函数 */ - success?: StartLocationUpdateSuccessCallback - /** wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标 */ - type?: string - } - interface StartPreviewOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartPreviewCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartPreviewFailCallback - /** 接口调用成功的回调函数 */ - success?: StartPreviewSuccessCallback - } - interface StartPullDownRefreshOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartPullDownRefreshCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartPullDownRefreshFailCallback - /** 接口调用成功的回调函数 */ - success?: StartPullDownRefreshSuccessCallback - } - interface StartRecordSuccessCallbackResult { - /** 录音文件的临时路径 (本地路径) */ - tempFilePath: string - errMsg: string - } - interface StartRecordTimeoutCallbackResult { - /** 封面图片文件的临时路径 (本地路径) */ - tempThumbPath: string - /** 视频的文件的临时路径 (本地路径) */ - tempVideoPath: string - } - interface StartSoterAuthenticationOption { - /** 挑战因子。挑战因子为调用者为此次生物鉴权准备的用于签名的字符串关键识别信息,将作为 `resultJSON` 的一部分,供调用者识别本次请求。例如:如果场景为请求用户对某订单进行授权确认,则可以将订单号填入此参数。 */ - challenge: string - /** 请求使用的可接受的生物认证方式 - * - * 可选值: - * - 'fingerPrint': 指纹识别; - * - 'facial': 人脸识别; - * - 'speech': 声纹识别(暂未支持); */ - requestAuthModes: Array<'fingerPrint' | 'facial' | 'speech'> - /** 验证描述,即识别过程中显示在界面上的对话框提示内容 */ - authContent?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartSoterAuthenticationCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartSoterAuthenticationFailCallback - /** 接口调用成功的回调函数 */ - success?: StartSoterAuthenticationSuccessCallback - } - interface StartSoterAuthenticationSuccessCallbackResult { - /** 生物认证方式 */ - authMode: string - /** 错误码 */ - errCode: number - /** 错误信息 */ - errMsg: string - /** 在设备安全区域(TEE)内获得的本机安全信息(如TEE名称版本号等以及防重放参数)以及本次认证信息(仅Android支持,本次认证的指纹ID)。具体说明见下文 */ - resultJSON: string - /** 用SOTER安全密钥对 `resultJSON` 的签名(SHA256 with RSA/PSS, saltlen=20) */ - resultJSONSignature: string - } - interface StartWifiOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartWifiCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartWifiFailCallback - /** 接口调用成功的回调函数 */ - success?: StartWifiSuccessCallback - } - interface StatOption { - /** 文件/目录路径 (本地路径) */ - path: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StatCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StatFailCallback - /** 需要基础库: `2.3.0` - * - * 是否递归获取目录下的每个文件的 Stats 信息 */ - recursive?: boolean - /** 接口调用成功的回调函数 */ - success?: StatSuccessCallback - } - interface StatSuccessCallbackResult { - /** [Stats](https://developers.weixin.qq.com/miniprogram/dev/api/file/Stats.html)|Array.<[FileStats](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileStats.html)> - * - * 当 recursive 为 false 时,res.stats 是一个 Stats 对象。当 recursive 为 true 且 path 是一个目录的路径时,res.stats 是一个 Array,数组的每一项是一个对象,每个对象包含 path 和 stats。 */ - stats: Stats | FileStats[] - errMsg: string - } - /** 描述文件状态的对象 */ - interface Stats { - /** 文件最近一次被存取或被执行的时间,UNIX 时间戳,对应 POSIX stat.st_atime */ - lastAccessedTime: number - /** 文件最后一次被修改的时间,UNIX 时间戳,对应 POSIX stat.st_mtime */ - lastModifiedTime: number - /** 文件的类型和存取的权限,对应 POSIX stat.st_mode */ - mode: number - /** 文件大小,单位:B,对应 POSIX stat.st_size */ - size: number - /** [boolean Stats.isDirectory()](https://developers.weixin.qq.com/miniprogram/dev/api/file/Stats.isDirectory.html) - * - * 在插件中使用:需要基础库 `2.19.2` - * - * 判断当前文件是否一个目录 */ - isDirectory(): boolean - /** [boolean Stats.isFile()](https://developers.weixin.qq.com/miniprogram/dev/api/file/Stats.isFile.html) - * - * 在插件中使用:需要基础库 `2.19.2` - * - * 判断当前文件是否一个普通文件 */ - isFile(): boolean - } - interface StepOption { - /** 动画延迟时间,单位 ms */ - delay?: number - /** 动画持续时间,单位 ms */ - duration?: number - /** 动画的效果 - * - * 可选值: - * - 'linear': 动画从头到尾的速度是相同的; - * - 'ease': 动画以低速开始,然后加快,在结束前变慢; - * - 'ease-in': 动画以低速开始; - * - 'ease-in-out': 动画以低速开始和结束; - * - 'ease-out': 动画以低速结束; - * - 'step-start': 动画第一帧就跳至结束状态直到结束; - * - 'step-end': 动画一直保持开始状态,最后一帧跳到结束状态; */ - timingFunction?: - | 'linear' - | 'ease' - | 'ease-in' - | 'ease-in-out' - | 'ease-out' - | 'step-start' - | 'step-end' - transformOrigin?: string - } - /** 贴纸类型 */ - interface Sticker { - /** 贴纸帧数 */ - len: number - /** 贴纸资源路径。资源必须为一个资源文件夹路径或一个压缩包路径,文件夹或压缩包内的贴纸资源必须按照 `{title}_{index}.{ext}` 格式命名。其中 `{title}` 为贴纸名称;`{index}` 为帧序号,从0开始;`{ext}` 为拓展名。 */ - path: string - /** 贴纸名称 */ - title: string - /** 贴纸触发动作 - * - * 可选值: - * - -1: 循环播放; - * - 10: 张嘴; - * - 11: 噘嘴/kiss; - * - 12: 眨/闭左眼; - * - 13: 眨/闭右眼; - * - 14: 眨/闭眼; - * - 15: 挑眉毛; - * - 16: 左右摇头; - * - 17: 上下点头; - * - 100: 比心; - * - 101: 张开手掌; - * - 102: 剪刀手/比耶/胜利; - * - 103: 握拳; - * - 104: 数字1; - * - 105: 我爱你; - * - 106: 点赞; - * - 107: OK; - * - 108: Rock&Roll; - * - 109: 数字6; - * - 110: 数字8; - * - 111: 暂不支持(留空); - * - 112: 双手抱拳/恭喜发财; */ - active?: - | -1 - | 10 - | 11 - | 12 - | 13 - | 14 - | 15 - | 16 - | 17 - | 100 - | 101 - | 102 - | 103 - | 104 - | 105 - | 106 - | 107 - | 108 - | 109 - | 110 - | 111 - | 112 - /** 贴纸ID */ - id?: string - /** 贴纸资源 md5 */ - md5?: string - /** 贴纸位置,格式为 [x1,y1,x2,y2] 。当 `type` 为 `'2D'` 或 `'front'` 时必填。仅 2D 贴纸和前景贴纸有效 */ - pos?: string[] - /** 背景贴纸展示位置。仅背景贴纸有效 - * - * 可选值: - * - 0: 背景贴纸; - * - 1: 只在人像区域显示的贴纸; */ - segtype?: 0 | 1 - } - interface StopAccelerometerOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopAccelerometerCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopAccelerometerFailCallback - /** 接口调用成功的回调函数 */ - success?: StopAccelerometerSuccessCallback - } - interface StopAdvertisingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopAdvertisingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopAdvertisingFailCallback - /** 接口调用成功的回调函数 */ - success?: StopAdvertisingSuccessCallback - } - interface StopBGMOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopBGMCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopBGMFailCallback - /** 接口调用成功的回调函数 */ - success?: StopBGMSuccessCallback - } - interface StopBackgroundAudioOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopBackgroundAudioCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopBackgroundAudioFailCallback - /** 接口调用成功的回调函数 */ - success?: StopBackgroundAudioSuccessCallback - } - interface StopBeaconDiscoveryOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopBeaconDiscoveryCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopBeaconDiscoveryFailCallback - /** 接口调用成功的回调函数 */ - success?: StopBeaconDiscoverySuccessCallback - } - interface StopBluetoothDevicesDiscoveryOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopBluetoothDevicesDiscoveryCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopBluetoothDevicesDiscoveryFailCallback - /** 接口调用成功的回调函数 */ - success?: StopBluetoothDevicesDiscoverySuccessCallback - } - interface StopCompassOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopCompassCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopCompassFailCallback - /** 接口调用成功的回调函数 */ - success?: StopCompassSuccessCallback - } - interface StopDeviceMotionListeningOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopDeviceMotionListeningCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopDeviceMotionListeningFailCallback - /** 接口调用成功的回调函数 */ - success?: StopDeviceMotionListeningSuccessCallback - } - interface StopDiscoveryOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopDiscoveryCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopDiscoveryFailCallback - /** 接口调用成功的回调函数 */ - success?: StopDiscoverySuccessCallback - } - interface StopFaceDetectOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopFaceDetectCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopFaceDetectFailCallback - /** 接口调用成功的回调函数 */ - success?: StopFaceDetectSuccessCallback - } - interface StopGyroscopeOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopGyroscopeCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopGyroscopeFailCallback - /** 接口调用成功的回调函数 */ - success?: StopGyroscopeSuccessCallback - } - interface StopHCEOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopHCECompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopHCEFailCallback - /** 接口调用成功的回调函数 */ - success?: StopHCESuccessCallback - } - interface StopLocalServiceDiscoveryFailCallbackResult { - /** 错误信息 - * - * 可选值: - * - 'task not found': 在当前没有处在搜索服务中的情况下调用 stopLocalServiceDiscovery; */ - errMsg: string - } - interface StopLocalServiceDiscoveryOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopLocalServiceDiscoveryCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopLocalServiceDiscoveryFailCallback - /** 接口调用成功的回调函数 */ - success?: StopLocalServiceDiscoverySuccessCallback - } - interface StopLocationUpdateOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopLocationUpdateCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopLocationUpdateFailCallback - /** 接口调用成功的回调函数 */ - success?: StopLocationUpdateSuccessCallback - } - interface StopOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopFailCallback - /** 接口调用成功的回调函数 */ - success?: StopSuccessCallback - } - interface StopPreviewOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopPreviewCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopPreviewFailCallback - /** 接口调用成功的回调函数 */ - success?: StopPreviewSuccessCallback - } - interface StopPullDownRefreshOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopPullDownRefreshCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopPullDownRefreshFailCallback - /** 接口调用成功的回调函数 */ - success?: StopPullDownRefreshSuccessCallback - } - interface StopRecordSuccessCallbackResult { - /** 封面图片文件的临时路径 (本地路径) */ - tempThumbPath: string - /** 视频的文件的临时路径 (本地路径) */ - tempVideoPath: string - errMsg: string - } - interface StopVoiceOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopVoiceCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopVoiceFailCallback - /** 接口调用成功的回调函数 */ - success?: StopVoiceSuccessCallback - } - interface StopWifiOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopWifiCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopWifiFailCallback - /** 接口调用成功的回调函数 */ - success?: StopWifiSuccessCallback - } - interface SubscribeVoIPVideoMembersOption { - /** 订阅的成员列表 */ - openIdList: string[] - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SubscribeVoIPVideoMembersCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SubscribeVoIPVideoMembersFailCallback - /** 接口调用成功的回调函数 */ - success?: SubscribeVoIPVideoMembersSuccessCallback - } - /** 订阅消息设置 -* -* **示例代码** -* -* ```javascript -wx.getSetting({ - withSubscriptions: true, - success (res) { - console.log(res.authSetting) - // res.authSetting = { - // "scope.userInfo": true, - // "scope.userLocation": true - // } - console.log(res.subscriptionsSetting) - // res.subscriptionsSetting = { - // mainSwitch: true, // 订阅消息总开关 - // itemSettings: { // 每一项开关 - // SYS_MSG_TYPE_INTERACTIVE: 'accept', // 小游戏系统订阅消息 - // SYS_MSG_TYPE_RANK: 'accept' - // zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: 'reject', // 普通一次性订阅消息 - // ke_OZC_66gZxALLcsuI7ilCJSP2OJ2vWo2ooUPpkWrw: 'ban', - // } - // } - } -}) -``` */ - interface SubscriptionsSetting { - /** 订阅消息总开关,true为开启,false为关闭 */ - mainSwitch: boolean - /** 每一项订阅消息的订阅状态。itemSettings对象的键为**一次性订阅消息的模板id**或**系统订阅消息的类型**,值为'accept'、'reject'、'ban'中的其中一种。'accept'表示用户同意订阅这条消息,'reject'表示用户拒绝订阅这条消息,'ban'表示已被后台封禁。一次性订阅消息使用方法详见 [wx.requestSubscribeMessage](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html),永久订阅消息(仅小游戏可用)使用方法详见[wx.requestSubscribeSystemMessage](https://developers.weixin.qq.com/minigame/dev/api/open-api/subscribe-message/wx.requestSubscribeSystemMessage.html) - * ## 注意事项 - * - itemSettings 只返回用户勾选过订阅面板中的“总是保持以上选择,不再询问”的订阅消息。 */ - itemSettings?: IAnyObject - } - interface SwitchCameraOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SwitchCameraCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SwitchCameraFailCallback - /** 接口调用成功的回调函数 */ - success?: SwitchCameraSuccessCallback - } - interface SwitchCastingOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SwitchCastingCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SwitchCastingFailCallback - /** 接口调用成功的回调函数 */ - success?: SwitchCastingSuccessCallback - } - interface SwitchTabOption { - /** 需要跳转的 tabBar 页面的路径 (代码包路径)(需在 app.json 的 [tabBar](https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html#tabbar) 字段定义的页面),路径后不能带参数。 */ - url: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: SwitchTabCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: SwitchTabFailCallback - /** 接口调用成功的回调函数 */ - success?: SwitchTabSuccessCallback - } - interface SystemInfo { - /** 需要基础库: `1.1.0` - * - * 客户端基础库版本 */ - SDKVersion: string - /** 需要基础库: `2.6.0` - * - * 允许微信使用相册的开关(仅 iOS 有效) */ - albumAuthorized: boolean - /** 需要基础库: `1.8.0` - * - * 设备性能等级(仅 Android)。取值为:-2 或 0(该设备无法运行小游戏),-1(性能未知),>=1(设备性能值,该值越高,设备性能越好)
注意:性能等级当前仅反馈真机机型,暂不支持 IDE 模拟器机型 */ - benchmarkLevel: number - /** 需要基础库: `2.6.0` - * - * 蓝牙的系统开关 */ - bluetoothEnabled: boolean - /** 需要基础库: `1.5.0` - * - * 设备品牌 */ - brand: string - /** 需要基础库: `2.6.0` - * - * 允许微信使用摄像头的开关 */ - cameraAuthorized: boolean - /** 设备方向(注意:IOS客户端横屏游戏获取deviceOrientation可能不准,建议以屏幕宽高为准) - * - * 可选值: - * - 'portrait': 竖屏; - * - 'landscape': 横屏; */ - deviceOrientation: 'portrait' | 'landscape' - /** 需要基础库: `2.15.0` - * - * 是否已打开调试。可通过右上角菜单或 [wx.setEnableDebug](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/wx.setEnableDebug.html) 打开调试。 */ - enableDebug: boolean - /** 需要基础库: `1.5.0` - * - * 用户字体大小(单位px)。以微信客户端「我-设置-通用-字体大小」中的设置为准 */ - fontSizeSetting: number - /** 需要基础库: `2.12.3` - * - * 当前小程序运行的宿主环境 */ - host: SystemInfoHost - /** 微信设置的语言 */ - language: string - /** 需要基础库: `2.6.0` - * - * 允许微信使用定位的开关 */ - locationAuthorized: boolean - /** 需要基础库: `2.6.0` - * - * 地理位置的系统开关 */ - locationEnabled: boolean - /** `true` 表示模糊定位,`false` 表示精确定位,仅 iOS 支持 */ - locationReducedAccuracy: boolean - /** 需要基础库: `2.6.0` - * - * 允许微信使用麦克风的开关 */ - microphoneAuthorized: boolean - /** 设备型号。新机型刚推出一段时间会显示unknown,微信会尽快进行适配。 */ - model: string - /** 需要基础库: `2.6.0` - * - * 允许微信通知带有提醒的开关(仅 iOS 有效) */ - notificationAlertAuthorized: boolean - /** 需要基础库: `2.6.0` - * - * 允许微信通知的开关 */ - notificationAuthorized: boolean - /** 需要基础库: `2.6.0` - * - * 允许微信通知带有标记的开关(仅 iOS 有效) */ - notificationBadgeAuthorized: boolean - /** 需要基础库: `2.6.0` - * - * 允许微信通知带有声音的开关(仅 iOS 有效) */ - notificationSoundAuthorized: boolean - /** 需要基础库: `2.19.3` - * - * 允许微信使用日历的开关 */ - phoneCalendarAuthorized: boolean - /** 设备像素比 */ - pixelRatio: number - /** 客户端平台 - * - * 可选值: - * - 'ios': iOS微信(包含 iPhone、iPad); - * - 'android': Android微信; - * - 'windows': Windows微信; - * - 'mac': macOS微信; - * - 'devtools': 微信开发者工具; */ - platform: 'ios' | 'android' | 'windows' | 'mac' | 'devtools' - /** 需要基础库: `2.7.0` - * - * 在竖屏正方向下的安全区域。部分机型没有安全区域概念,也不会返回 safeArea 字段,开发者需自行兼容。 */ - safeArea: SafeArea - /** 需要基础库: `1.1.0` - * - * 屏幕高度,单位px */ - screenHeight: number - /** 需要基础库: `1.1.0` - * - * 屏幕宽度,单位px */ - screenWidth: number - /** 需要基础库: `1.9.0` - * - * 状态栏的高度,单位px */ - statusBarHeight: number - /** 操作系统及版本 */ - system: string - /** 微信版本号 */ - version: string - /** 需要基础库: `2.6.0` - * - * Wi-Fi 的系统开关 */ - wifiEnabled: boolean - /** 可使用窗口高度,单位px */ - windowHeight: number - /** 可使用窗口宽度,单位px */ - windowWidth: number - /** 需要基础库: `2.11.0` - * - * 系统当前主题,取值为`light`或`dark`,全局配置`"darkmode":true`时才能获取,否则为 undefined (不支持小游戏) - * - * 可选值: - * - 'dark': 深色主题; - * - 'light': 浅色主题; */ - theme?: 'dark' | 'light' - } - /** 需要基础库: `2.12.3` - * - * 当前小程序运行的宿主环境 */ - interface SystemInfoHost { - /** 宿主 app 对应的 appId */ - appId: string - } - interface SystemSetting { - /** 蓝牙的系统开关 */ - bluetoothEnabled: boolean - /** 设备方向(注意:IOS客户端横屏游戏获取deviceOrientation可能不准,建议以屏幕宽高为准) - * - * 可选值: - * - 'portrait': 竖屏; - * - 'landscape': 横屏; */ - deviceOrientation: 'portrait' | 'landscape' - /** 地理位置的系统开关 */ - locationEnabled: boolean - /** Wi-Fi 的系统开关 */ - wifiEnabled: boolean - } - /** 需要基础库: `3.4.0` - * - * 异常信息 */ - interface TCPExceptionReason { - /** 错误原因 */ - errMsg: string - /** 错误码 */ - errno: string - } - interface TCPSocketConnectOption { - /** 套接字要连接的地址 */ - address: string - /** 套接字要连接的端口 */ - port: number - /** 需要基础库: `3.4.0` - * - * 是否开启 HttpDNS 服务。如开启,需要同时填入 httpDNSServiceId 。 HttpDNS 用法详见 [移动解析HttpDNS](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/HTTPDNS.html) */ - enableHttpDNS?: boolean - /** 需要基础库: `3.4.0` - * - * HttpDNS 服务商 Id。 HttpDNS 用法详见 [移动解析HttpDNS](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/HTTPDNS.html) */ - httpDNSServiceId?: string - /** 套接字要连接的超时时间,默认为 2s */ - timeout?: number - } - interface TCPSocketOnMessageListenerResult { - /** 接收端地址信息 */ - localInfo: OnMessageListenerResultLocalInfo - /** 收到的消息 */ - message: ArrayBuffer - /** 发送端地址信息 */ - remoteInfo: TCPSocketOnMessageListenerResultRemoteInfo - } - /** 发送端地址信息 */ - interface TCPSocketOnMessageListenerResultRemoteInfo { - /** 发送消息的 socket 的地址 */ - address: string - /** 使用的协议族,为 IPv4 或者 IPv6 */ - family: string - /** 端口号 */ - port: number - } - interface TakePhotoOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: TakePhotoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: TakePhotoFailCallback - /** 成像质量 - * - * 可选值: - * - 'high': 高质量; - * - 'normal': 普通质量; - * - 'low': 低质量; - * - 'original': 原图; */ - quality?: 'high' | 'normal' | 'low' | 'original' - /** 需要基础库: `2.22.0` - * - * 是否开启镜像 */ - selfieMirror?: boolean - /** 接口调用成功的回调函数 */ - success?: TakePhotoSuccessCallback - } - interface TakePhotoSuccessCallbackResult { - /** 照片文件的临时路径 (本地路径),安卓是jpg图片格式,ios是png */ - tempImagePath: string - errMsg: string - } - interface TakeSnapshotOption { - /** 截图文件格式,'rgba' 或 'png',默认值为 'png' */ - format: string - /** 截图导出类型,'file' 保存到临时文件目录或 'arraybuffer' 返回图片二进制数据,默认值为 'file' */ - type: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: TakeSnapshotCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: TakeSnapshotFailCallback - /** 接口调用成功的回调函数 */ - success?: TakeSnapshotSuccessCallback - } - interface TakeSnapshotSuccessCallbackResult { - /** 截图对应的二进制数据,当 type 为 arraybuffer 该字段生效 */ - data: ArrayBuffer - /** 截图保存的临时文件路径,当 type 为 file 该字段生效 */ - tempFilePath: string - errMsg: string - } - /** 标签类型枚举 */ - interface TechType { - /** 对应IsoDep实例,实例支持ISO-DEP (ISO 14443-4)标准的读写 */ - isoDep: string - /** 对应MifareClassic实例,实例支持MIFARE Classic标签的读写 */ - mifareClassic: string - /** 对应MifareUltralight实例,实例支持MIFARE Ultralight标签的读写 */ - mifareUltralight: string - /** 对应Ndef实例,实例支持对NDEF格式的NFC标签上的NDEF数据的读写 */ - ndef: string - /** 对应NfcA实例,实例支持NFC-A (ISO 14443-3A)标准的读写 */ - nfcA: string - /** 对应NfcB实例,实例支持NFC-B (ISO 14443-3B)标准的读写 */ - nfcB: string - /** 对应NfcF实例,实例支持NFC-F (JIS 6319-4)标准的读写 */ - nfcF: string - /** 对应NfcV实例,实例支持NFC-V (ISO 15693)标准的读写 */ - nfcV: string - } - /** 需要基础库: `2.30.0` -* -* 在插件中使用:需要基础库 `2.30.0` -* -* Tensor -* -* **** -* -* ```js -session.run({ - input1: { - type: 'float32', - data: new Float32Array(3 * 224 * 224).buffer, - shape: [1, 3, 224, 224] // NCHW 顺序 - }, - input2: { - type: 'uint8', - data: new Uint8Array(224 * 224).buffer, - shape: [1, 1, 224, 224] - }, -}).then(res => { - console.log(res.output0) - // output0 结构如下: - // { - // type: 'uint8', - // data: new Uint8Array(224 * 224).buffer, - // shape: [1, 1, 224, 224] - // } -}) -``` */ - interface Tensor { - /** Tensor 值,一段 ArrayBuffer */ - data: ArrayBuffer - /** Tensor shape (Tensor 形状,例如 `[1, 3, 224, 224]` 即表示一个4唯Tensor,每个维度的长度分别为1, 3, 224, 224) */ - shape: number[] - /** ArrayBuffer 值的类型,合法值有 `uint8`, `int8`, `uint32`, `int32`, `float32` */ - type: string - } - /** 需要基础库: `2.30.0` -* -* 在插件中使用:需要基础库 `2.30.0` -* -* Tensors 是 key-value 形式的对象,对象的 key 会作为 input/output name,对象的 value 则是 Tensor。 Tensor 结构如下。 -* -* **** -* -* ```js -session.run({ - input1: { - type: 'float32', - data: new Float32Array(3 * 224 * 224).buffer, - shape: [1, 3, 224, 224] // NCHW 顺序 - }, - input2: { - type: 'uint8', - data: new Uint8Array(224 * 224).buffer, - shape: [1, 1, 224, 224] - }, -}).then(res => { - console.log(res.output0) - // output0 结构如下: - // { - // type: 'uint8', - // data: new Uint8Array(224 * 224).buffer, - // shape: [1, 1, 224, 224] - // } -}) -``` */ - interface Tensors { - /** [Tensor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/Tensor.html) - * - * Tensor,每个 Tensor 包含 shape、data、type 字段。 */ - key: Tensor - } - interface TextMetrics { - /** 文本的宽度 */ - width: number - } - /** 动画配置 */ - interface TimingOption { - /** 动画时长 */ - duration?: number - /** 动画曲线,参考 [Easing](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/animation/worklet.Easing.html) 模块。 */ - easing?: (...args: any[]) => any - } - interface ToScreenLocationOption { - /** 纬度 */ - latitude: number - /** 经度 */ - longitude: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ToScreenLocationCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ToScreenLocationFailCallback - /** 接口调用成功的回调函数 */ - success?: ToScreenLocationSuccessCallback - } - interface ToScreenLocationSuccessCallbackResult { - /** x 坐标值 */ - x: number - /** y 坐标值 */ - y: number - errMsg: string - } - interface ToggleTorchOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: ToggleTorchCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: ToggleTorchFailCallback - /** 接口调用成功的回调函数 */ - success?: ToggleTorchSuccessCallback - } - /** 跟踪能力配置,目前不同的跟踪能力之间是互斥的,默认使用平面跟踪能力。需要注意目前 track 中不同的跟踪配置存在互斥关系(比如 marker 跟踪配置和 OSD 跟踪配置不能同时存在),请按需配置。 */ - interface Track { - /** 平面跟踪配置 */ - plane: PlaneTrack - /** 需要基础库: `3.3.0` - * - * 身份证检测配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/idcard.html)。 */ - IDCard?: IDCardTrack - /** 需要基础库: `2.27.0` - * - * OCR检测配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/ocr.html)。 */ - OCR?: OCRTrack - /** 需要基础库: `2.24.5` - * - * OSD 跟踪配置 */ - OSD?: boolean - /** 需要基础库: `2.28.0` - * - * 人体检测配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/body.html)。 */ - body?: BodyTrack - /** 需要基础库: `3.0.0` - * - * 深度识别配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/depth.html)。 */ - depth?: DepthTrack - /** 需要基础库: `2.25.0` - * - * 人脸检测配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/face.html)。安卓微信8.0.25开始支持,iOS微信8.0.24开始支持。 */ - face?: FaceTrack - /** 需要基础库: `2.28.0` - * - * 手势检测配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/hand.html)。 */ - hand?: HandTrack - /** 需要基础库: `2.24.5` - * - * marker 跟踪配置,基础库(3.0.0)开始允许同时支持v2的水平面检测能力 */ - marker?: boolean - /** 需要基础库: `3.2.1` - * - * 鞋部检测配置。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/shoe.html)。 */ - shoe?: ShoeTrack - /** 需要基础库: `2.28.0` - * - * 提供基础AR功能,输出相机旋转的3个自由度的位姿,利用手机陀螺仪传感器,实现快速稳定的AR定位能力,适用于简单AR场景。 */ - threeDof?: boolean - } - interface TransceiveOption { - /** 需要传递的二进制数据 */ - data: ArrayBuffer - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: TransceiveCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: TransceiveFailCallback - /** 接口调用成功的回调函数 */ - success?: TransceiveSuccessCallback - } - interface TransceiveSuccessCallbackResult { - data: ArrayBuffer - errMsg: string - } - interface TranslateMarkerOption { - /** 移动过程中是否自动旋转 marker */ - autoRotate: boolean - /** 指定 marker 移动到的目标点 */ - destination: DestinationOption - /** 指定 marker */ - markerId: number - /** marker 的旋转角度 */ - rotate: number - /** 动画结束回调函数 */ - animationEnd?: (...args: any[]) => any - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: TranslateMarkerCompleteCallback - /** 动画持续时长,平移与旋转分别计算 */ - duration?: number - /** 接口调用失败的回调函数 */ - fail?: TranslateMarkerFailCallback - /** 需要基础库: `2.13.0` - * - * 平移和旋转同时进行 */ - moveWithRotate?: boolean - /** 接口调用成功的回调函数 */ - success?: TranslateMarkerSuccessCallback - } - interface TriggerRefreshOption { - /** 动画时长 */ - duration?: number - /** [动画曲线](#) */ - easingFunction?: string - } - interface TruncateOption { - /** 要截断的文件路径 (本地路径) */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: TruncateCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: TruncateFailCallback - /** 截断位置,默认0。如果 length 小于文件长度(字节),则只有前面 length 个字节会保留在文件中,其余内容会被删除;如果 length 大于文件长度,则会对其进行扩展,并且扩展部分将填充空字节('\0') */ - length?: number - /** 接口调用成功的回调函数 */ - success?: TruncateSuccessCallback - } - interface TruncateSyncOption { - /** 要截断的文件路径 (本地路径) */ - filePath: string - /** 截断位置,默认0。如果 length 小于文件长度(字节),则只有前面 length 个字节会保留在文件中,其余内容会被删除;如果 length 大于文件长度,则会对其进行扩展,并且扩展部分将填充空字节('\0') */ - length?: number - } - interface UDPSocketConnectOption { - /** 要发消息的地址 */ - address: string - /** 要发送消息的端口号 */ - port: number - } - interface UDPSocketOnMessageListenerResult { - /** 接收端地址信息,2.18.0 起支持 */ - localInfo: OnMessageListenerResultLocalInfo - /** 收到的消息。消息长度需要小于4096。 */ - message: ArrayBuffer - /** 发送端地址信息 */ - remoteInfo: UDPSocketOnMessageListenerResultRemoteInfo - } - /** 发送端地址信息 */ - interface UDPSocketOnMessageListenerResultRemoteInfo { - /** 发送消息的 socket 的地址 */ - address: string - /** 使用的协议族,为 IPv4 或者 IPv6 */ - family: string - /** 端口号 */ - port: number - /** message 的大小,单位:字节 */ - size: number - } - interface UDPSocketSendOption { - /** 要发消息的地址。在基础库 <= 2.9.3 版本必须是和本机同网段的 IP 地址,或安全域名列表内的域名地址;之后版本可以是任意 IP 和域名 */ - address: string - /** 要发送的数据 */ - message: string | ArrayBuffer - /** 要发送消息的端口号 */ - port: number - /** 发送数据的长度,仅当 message 为 ArrayBuffer 类型时有效 */ - length?: number - /** 发送数据的偏移量,仅当 message 为 ArrayBuffer 类型时有效 */ - offset?: number - /** 向指定地址发消息时,是否要开启广播,基础库 2.24.0 开始支持 */ - setBroadcast?: boolean - } - interface UndoOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: UndoCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: UndoFailCallback - /** 接口调用成功的回调函数 */ - success?: UndoSuccessCallback - } - interface UnlinkOption { - /** 要删除的文件路径 (本地路径) */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: UnlinkCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: UnlinkFailCallback - /** 接口调用成功的回调函数 */ - success?: UnlinkSuccessCallback - } - interface UnzipOption { - /** 目标目录路径, 支持本地路径 */ - targetPath: string - /** 源文件路径,支持本地路径, 只可以是 zip 压缩文件 */ - zipFilePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: UnzipCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: UnzipFailCallback - /** 接口调用成功的回调函数 */ - success?: UnzipSuccessCallback - } - /** 参数列表 */ - interface UpdatableMessageFrontEndParameter { - /** 参数名 */ - name: string - /** 参数值 */ - value: string - } - /** 需要基础库: `2.4.0` - * - * 动态消息的模板信息 */ - interface UpdatableMessageFrontEndTemplateInfo { - /** 参数列表 */ - parameterList: UpdatableMessageFrontEndParameter[] - /** 模板ID */ - templateId: string - } - interface Update3DModeOption { - /** 是否开启三维识别 */ - open3d: boolean - } - interface UpdateGroundOverlayOption { - /** 图片覆盖的经纬度范围 */ - bounds: MapBounds - /** 图片图层 id */ - id: string - /** 图片路径,支持网络图片、临时路径、代码包路径 */ - src: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: UpdateGroundOverlayCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: UpdateGroundOverlayFailCallback - /** 图层透明度 */ - opacity?: number - /** 接口调用成功的回调函数 */ - success?: UpdateGroundOverlaySuccessCallback - /** 是否可见 */ - visible?: boolean - /** 图层绘制顺序 */ - zIndex?: number - } - interface UpdateMaskModeOption { - /** 设置是否开启试鞋,返回腿部遮挡纹理 */ - useMask: boolean - } - interface UpdateShareMenuOption { - /** 需要基础库: `2.4.0` - * - * 动态消息的 activityId。通过 [updatableMessage.createActivityId](#) 接口获取 */ - activityId?: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: UpdateShareMenuCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: UpdateShareMenuFailCallback - /** 需要基础库: `2.13.0` - * - * 是否是私密消息。详见 [小程序私密消息](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share/private-message.html) */ - isPrivateMessage?: boolean - /** 需要基础库: `2.4.0` - * - * 是否是动态消息,详见[动态消息](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share/updatable-message.html) */ - isUpdatableMessage?: boolean - /** 接口调用成功的回调函数 */ - success?: UpdateShareMenuSuccessCallback - /** 需要基础库: `2.4.0` - * - * 动态消息的模板信息 */ - templateInfo?: UpdatableMessageFrontEndTemplateInfo - /** 需要基础库: `2.11.0` - * - * 群待办消息的id,通过toDoActivityId可以把多个群待办消息聚合为同一个。通过 [updatableMessage.createActivityId](#) 接口获取。详见[群待办消息](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html) */ - toDoActivityId?: string - /** 是否使用带 shareTicket 的转发[详情](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html) */ - withShareTicket?: boolean - } - interface UpdateVoIPChatMuteConfigOption { - /** 静音设置 */ - muteConfig: MuteConfig - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: UpdateVoIPChatMuteConfigCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: UpdateVoIPChatMuteConfigFailCallback - /** 接口调用成功的回调函数 */ - success?: UpdateVoIPChatMuteConfigSuccessCallback - } - interface UpdateWeChatAppOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: UpdateWeChatAppCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: UpdateWeChatAppFailCallback - /** 接口调用成功的回调函数 */ - success?: UpdateWeChatAppSuccessCallback - } - interface UploadFileOption { - /** 要上传文件资源的路径 (本地路径) */ - filePath: string - /** 文件对应的 key,开发者在服务端可以通过这个 key 获取文件的二进制内容 */ - name: string - /** 开发者服务器地址 */ - url: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: UploadFileCompleteCallback - /** 需要基础库: `2.10.4` - * - * 是否开启 http2 */ - enableHttp2?: boolean - /** 是否开启 profile,默认开启。开启后可在接口回调的 res.profile 中查看性能调试信息。目前仅 iOS 端支持。 */ - enableProfile?: boolean - /** 接口调用失败的回调函数 */ - fail?: UploadFileFailCallback - /** HTTP 请求中其他额外的 form data */ - formData?: IAnyObject - /** HTTP 请求 Header,Header 中不能设置 Referer */ - header?: IAnyObject - /** 接口调用成功的回调函数 */ - success?: UploadFileSuccessCallback - /** 需要基础库: `2.10.0` - * - * 超时时间,单位为毫秒 */ - timeout?: number - /** 需要基础库: `3.4.1` - * - * 使用高性能模式,暂仅支持 Android,默认关闭。该模式下有更优的网络性能表现。 */ - useHighPerformanceMode?: boolean - } - interface UploadFileSuccessCallbackResult { - /** 开发者服务器返回的数据 */ - data: string - /** 开发者服务器返回的 HTTP 状态码 */ - statusCode: number - errMsg: string - } - interface UploadTaskOnProgressUpdateListenerResult { - /** 上传进度百分比 */ - progress: number - /** 预期需要上传的数据总长度,单位 Bytes */ - totalBytesExpectedToSend: number - /** 已经上传的数据长度,单位 Bytes */ - totalBytesSent: number - } - /** @warning **用户头像昵称获取规则已调整,参考 [用户信息接口调整说明](https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801)、[小程序用户头像昵称获取规则调整公告](https://developers.weixin.qq.com/community/develop/doc/00022c683e8a80b29bed2142b56c01)** - * - * 用户信息 */ - interface UserInfo { - /** 用户头像图片的 URL。URL 最后一个数值代表正方形头像大小(有 0、46、64、96、132 数值可选,0 代表 640x640 的正方形头像,46 表示 46x46 的正方形头像,剩余数值以此类推。默认132),用户没有头像时该项为空。若用户更换头像,原有头像 URL 将失效。 */ - avatarUrl: string - /** 用户所在城市。不再返回,参考 [相关公告](https://developers.weixin.qq.com/community/develop/doc/00028edbe3c58081e7cc834705b801) */ - city: string - /** 用户所在国家。不再返回,参考 [相关公告](https://developers.weixin.qq.com/community/develop/doc/00028edbe3c58081e7cc834705b801) */ - country: string - /** 用户性别。不再返回,参考 [相关公告](https://developers.weixin.qq.com/community/develop/doc/00028edbe3c58081e7cc834705b801) - * - * 可选值: - * - 0: 未知; - * - 1: 男性; - * - 2: 女性; */ - gender: 0 | 1 | 2 - /** 显示 country,province,city 所用的语言。强制返回 “zh_CN”,参考 [相关公告](https://developers.weixin.qq.com/community/develop/doc/00028edbe3c58081e7cc834705b801) - * - * 可选值: - * - 'en': 英文; - * - 'zh_CN': 简体中文; - * - 'zh_TW': 繁体中文; */ - language: 'en' | 'zh_CN' | 'zh_TW' - /** 用户昵称 */ - nickName: string - /** 用户所在省份。不再返回,参考 [相关公告](https://developers.weixin.qq.com/community/develop/doc/00028edbe3c58081e7cc834705b801) */ - province: string - } - /** 需要基础库: `2.28.0` - * - * 人体 anchor - * - * **示例代码** - * - * [静态图像body检测能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/photo-body-detect) - * - * [实时摄像头body检测能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/body-detect) */ - interface VKBodyAnchor { - /** 关键点的置信度 */ - confidence: number[] - /** 识别序号 */ - detectId: number - /** 唯一标识 */ - id: number - /** 相对视窗的位置信息,取值范围为 [0, 1],0 为左/上边缘,1 为右/下边缘 */ - origin: VKOrigin - /** 关键点 */ - points: VKOrigin[] - /** 总体置信值 */ - score: number - /** 相对视窗的尺寸,取值范围为 [0, 1],0 为左/上边缘,1 为右/下边缘 */ - size: VKSize - /** 类型 - * - * 可选值: - * - 5: 人体; */ - type: 5 - } - /** 需要基础库: `2.20.0` - * - * 相机对象 */ - interface VKCamera { - /** 需要基础库: `2.22.0` - * - * 相机内参,只有 v2 版本支持 */ - intrinsics: Float32Array - /** 相机原始的Pose矩阵 */ - transform: Float32Array - /** 视图矩阵 */ - viewMatrix: Float32Array - /** [Float32Array VKCamera.getProjectionMatrix(number near, number far)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKCamera.getProjectionMatrix.html) - * - * 需要基础库: `2.20.0` - * - * 在插件中使用:需要基础库 `2.20.0` - * - * 获取投影矩阵 */ - getProjectionMatrix( - /** 近视点 */ - near: number, - /** 远视点 */ - far: number - ): Float32Array - } - interface VKConfig { - /** 跟踪能力配置,目前不同的跟踪能力之间是互斥的,默认使用平面跟踪能力。需要注意目前 track 中不同的跟踪配置存在互斥关系(比如 marker 跟踪配置和 OSD 跟踪配置不能同时存在),请按需配置。 */ - track: Track - /** 需要基础库: `2.23.0` - * - * 绑定的 WebGLRenderingContext 对象 */ - gl?: WebGLRenderingContext - /** 需要基础库: `2.22.0` - * - * vision kit 版本。 - * - * 可选值: - * - 'v1': v1适用于用户在平面场景下,例如桌面,地面,泛平面场景,放置虚拟物体,不提供真实世界距离。用户放置物体时,手机相机倾斜向下对着目标平面点击即可,具有广泛的机型支持; - * - 'v2': v2提供真实物理距离的 ar 定位功能,提供平面识别功能,用户在平面范围点击放置虚拟物体的功能,具有[有限的机型支持](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/plane.html#%E9%99%84%E5%BD%95)。iOS 设备在基础库 2.22.0 开始支持v2。安卓设备在基础库 2.25.1 开始支持v2,另外,安卓v2不支持竖直平面。**使用v2算法需要初始化,移动手机进行左右平移初始化效果最佳。**; */ - version?: 'v1' | 'v2' - } - /** 需要基础库: `2.33.0` - * - * depth anchor - * - * **示例代码** - * - * [深度估计能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/depth-detect) */ - interface VKDepthAnchor { - /** 包含深度信息的数组 */ - depthArray: number[] - /** 唯一标识 */ - id: number - /** 相对视窗的尺寸,取值范围为 [0, 1],0 为左/上边缘,1 为右/下边缘 */ - size: VKSize - /** 类型 - * - * 可选值: - * - 8: DEPTH; */ - type: 8 - } - /** 需要基础库: `2.25.0` - * - * 人脸 anchor - * - * **示例代码** - * - * [静态图像人脸检测能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/photo-face-detect) - * - * [实时摄像头人脸检测能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/face-detect) */ - interface VKFaceAnchor { - /** 人脸角度信息 */ - angle: number[] - /** 关键点的置信度 */ - confidence: number[] - /** 识别序号 */ - detectId: number - /** 唯一标识 */ - id: number - /** 相对视窗的位置信息,取值范围为 [0, 1],0 为左/上边缘,1 为右/下边缘 */ - origin: VKOrigin - /** 人脸 106 个关键点的坐标 */ - points: VKPoint[] - /** 相对视窗的尺寸,取值范围为 [0, 1],0 为左/上边缘,1 为右/下边缘 */ - size: VKSize - /** 类型 - * - * 可选值: - * - 3: 人脸; */ - type: 3 - } - /** 需要基础库: `2.20.0` - * - * vision kit 会话对象。 */ - interface VKFrame { - /** [VKCamera](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKCamera.html) - * - * 相机对象 */ - camera: VKCamera - /** 生成时间,单位:纳秒(ns) */ - timestamp: number - /** [ArrayBuffer VKFrame.getCameraBuffer(number width, number height)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKFrame.getCameraBuffer.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 获取当前帧 rgba buffer。iOS 端微信在 v8.0.20 开始支持,安卓端微信在 v8.0.30 开始支持。按 aspect-fill 规则裁剪,此接口要求在创建 VKSession 对象时必须传入 gl 参数。此接口仅建议拿来做帧分析使用,上屏请使用 getCameraTexture 来代替。 */ - getCameraBuffer( - /** 宽度,受系统限制,必须是 16 的整数倍 */ - width: number, - /** 高度 */ - height: number - ): ArrayBuffer - /** [ArrayBuffer VKFrame.getCameraJpgBuffer(number width, number height, number quality)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKFrame.getCameraJpgBuffer.html) - * - * 需要基础库: `3.0.0` - * - * 在插件中使用:不支持 - * - * 获取当前帧的 jpg 信息Buffer。安卓微信 8.0.49 开始支持,iOS微信 8.0.49 开始支持。 */ - getCameraJpgBuffer( - /** 宽度 */ - width: number, - /** 高度 */ - height: number, - /** 获取纹理质量,(0 - 100) */ - quality: number - ): ArrayBuffer - /** [Float32Array VKFrame.getDisplayTransform()](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKFrame.getDisplayTransform.html) - * - * 需要基础库: `2.20.0` - * - * 在插件中使用:需要基础库 `2.20.0` - * - * 获取纹理调整矩阵。默认获取到的纹理是未经裁剪调整的纹理,此矩阵可用于在着色器中根据帧对象尺寸对纹理进行裁剪。 */ - getDisplayTransform(): Float32Array - /** [Object VKFrame.getCameraTexture(WebGLRenderingContext gl)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKFrame.getCameraTexture.html) - * - * 需要基础库: `2.20.0` - * - * 在插件中使用:需要基础库 `2.20.0` - * - * 获取当前帧纹理,目前只支持 YUV 纹理。 */ - getCameraTexture( - /** 画布 */ - gl: WebGLRenderingContext - ): YUVTextureRes - /** [Object VKFrame.getDepthBuffer()](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKFrame.getDepthBuffer.html) - * - * 需要基础库: `3.0.0` - * - * 在插件中使用:不支持 - * - * 获取每帧的深度图信息Buffer。安卓微信 8.0.38 开始支持,iOS微信 8.0.39 开始支持。 */ - getDepthBuffer(): DepthBufferRes - /** [Object VKFrame.getLegSegmentBuffer()](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKFrame.getLegSegmentBuffer.html) - * - * 需要基础库: `3.2.1` - * - * 在插件中使用:不支持 - * - * 获取每帧的腿部分割信息Buffer,安卓微信 8.0.43,iOS微信 8.0.43 开始支持。 */ - getLegSegmentBuffer(): LegSegmentBufferRes - } - /** 需要基础库: `2.28.0` - * - * 手势 anchor - * - * **示例代码** - * - * [静态图像hand检测能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/photo-hand-detect) - * - * [实时摄像头hand检测能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/hand-detect) */ - interface VKHandAnchor { - /** 关键点的置信度 */ - confidence: number[] - /** 识别序号 */ - detectId: number - /** 手势分类, 返回整数-1到18, -1表示无效手势 - * - * 可选值: - * - 0: 单手比心; - * - 1: 布(数字5); - * - 2: 剪刀(数字2); - * - 3: 握拳; - * - 4: 数字1; - * - 5: 热爱; - * - 6: 点赞; - * - 7: 数字3; - * - 8: 摇滚; - * - 9: 数字6; - * - 10: 数字8; - * - 11: 双手抱拳(恭喜发财); - * - 12: 数字4; - * - 13: 比ok; - * - 14: 不喜欢(踩); - * - 15: 双手比心; - * - 16: 祈祷(双手合十); - * - 17: 双手抱拳; - * - 18: 无手势动作; - * - -1: 无效手势; */ - gesture: - | 0 - | 1 - | 2 - | 3 - | 4 - | 5 - | 6 - | 7 - | 8 - | 9 - | 10 - | 11 - | 12 - | 13 - | 14 - | 15 - | 16 - | 17 - | 18 - | -1 - /** 唯一标识 */ - id: number - /** 相对视窗的位置信息,取值范围为 [0, 1],0 为左/上边缘,1 为右/下边缘 */ - origin: VKOrigin - /** 关键点 */ - points: VKOrigin[] - /** 总体置信值 */ - score: number - /** 相对视窗的尺寸,取值范围为 [0, 1],0 为左/上边缘,1 为右/下边缘 */ - size: VKSize - /** 类型 - * - * 可选值: - * - 7: 手势; */ - type: 7 - } - interface VKMarker { - /** marker id */ - markerId: number - /** 图片路径 */ - path: string - } - /** 需要基础库: `2.24.5` - * - * marker anchor - * - * **示例代码** - * - * [2D Marker能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/2dmarker-ar) */ - interface VKMarkerAnchor { - /** 唯一标识 */ - id: number - /** marker id */ - markerId: number - /** 图片路径 */ - path: string - /** 包含位置、旋转、放缩信息的矩阵,以列为主序 */ - transform: Float32Array - /** 类型 - * - * 可选值: - * - 1: marker; */ - type: 1 - } - /** 需要基础库: `2.27.0` - * - * OCR anchor - * - * **示例代码** - * - * [静态图像OCR检测能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/photo-ocr-detect) - * - * [实时摄像头OCR检测能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/ocr-detect) */ - interface VKOCRAnchor { - /** 唯一标识 */ - id: number - /** 识别的文字结果 */ - text: string - /** 类型 - * - * 可选值: - * - 6: OCR; */ - type: 6 - } - /** 需要基础库: `2.24.5` - * - * OSD anchor - * - * **示例代码** - * - * [单样本检测(OSD)能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/osd-ar) */ - interface VKOSDAnchor { - /** 唯一标识 */ - id: number - /** marker id */ - markerId: number - /** 相对视窗的位置信息,取值范围为 [0, 1],0 为左/上边缘,1 为右/下边缘 */ - origin: VKOrigin - /** 图片路径 */ - path: string - /** 相对视窗的尺寸,取值范围为 [0, 1],0 为左/上边缘,1 为右/下边缘 */ - size: VKSize - /** 类型 - * - * 可选值: - * - 2: OSD; */ - type: 2 - } - interface VKOrigin { - /** 横坐标 */ - x: number - /** 纵坐标 */ - y: number - } - /** 需要基础库: `2.22.0` - * - * 平面 anchor,只有 v2 版本支持 - * - * **示例代码** - * - * v1 版本:[水平面AR能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/plane-ar) - * v2 版本:[水平面AR能力v2使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/plane-ar-v2) */ - interface VKPlaneAnchor { - /** 方向 */ - alignment: number - /** 唯一标识 */ - id: number - /** 尺寸 */ - size: VKSize - /** 包含位置、旋转、放缩信息的矩阵,以列为主序 */ - transform: Float32Array - /** 类型 - * - * 可选值: - * - 0: 平面; */ - type: 0 - } - /** 人脸 106 个关键点的坐标 */ - interface VKPoint { - /** 横坐标 */ - x: number - /** 纵坐标 */ - y: number - } - /** 需要基础库: `2.20.0` - * - * vision kit 会话对象。 */ - interface VKSession { - /** 相机尺寸 */ - cameraSize: VKSize - /** 会话配置 */ - config: VKConfig - /** 会话状态 - * - * 可选值: - * - 0: 不可用; - * - 1: 运行中; - * - 2: 暂停中; - * - 3: 初始化中; */ - state: 0 | 1 | 2 | 3 - /** [Array.<Object> VKSession.getAllMarker()](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.getAllMarker.html) - * - * 需要基础库: `2.24.5` - * - * 在插件中使用:需要基础库 `2.24.5` - * - * 获取所有 marker,要求调 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 时传入的 track.marker 为 true */ - getAllMarker(): VKMarker[] - /** [Array.<Object> VKSession.getAllOSDMarker()](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.getAllOSDMarker.html) - * - * 需要基础库: `2.24.5` - * - * 在插件中使用:需要基础库 `2.24.5` - * - * 获取所有 OSD marker,要求调 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 时传入的 track.OSD 为 true */ - getAllOSDMarker(): VKMarker[] - /** [Array.<Object> VKSession.hitTest(number x, number y, Object reset)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.hitTest.html) - * - * 需要基础库: `2.20.0` - * - * 在插件中使用:需要基础库 `2.20.0` - * - * 触摸检测,v1 版本只支持单平面(即 hitTest 生成一次平面后,后续 hitTest 均不会再生成平面,而是以之前生成的平面为基础进行检测)。如果需要重新识别其他平面,可以在调用此方法时将 reset 参数置为 true。 */ - hitTest( - /** 相对视窗的横坐标,取值范围为 [0, 1],0 为左边缘,1 为右边缘 */ - x: number, - /** 相对视窗的纵坐标,取值范围为 [0, 1],0 为上边缘,1 为下边缘 */ - y: number, - /** 是否需要重新识别其他平面,v2 版本不再需要此参数 */ - reset: IAnyObject - ): HitTestRes[] - /** [VKSession.cancelAnimationFrame(number requestID)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.cancelAnimationFrame.html) - * - * 需要基础库: `2.20.0` - * - * 在插件中使用:需要基础库 `2.20.0` - * - * 取消由 requestAnimationFrame 添加到计划中的动画帧请求。 */ - cancelAnimationFrame(requestID: number): void - /** [VKSession.destroy()](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.destroy.html) - * - * 需要基础库: `2.20.0` - * - * 在插件中使用:需要基础库 `2.20.0` - * - * 销毁会话。 */ - destroy(): void - /** [VKSession.detectBody(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.detectBody.html) - * - * 需要基础库: `2.28.0` - * - * 在插件中使用:需要基础库 `2.28.0` - * - * 静态图像人体关键点检测。当 wx.createVKSession 参数传入 {track: {body: {mode: 2} } } 时可用。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/body.html)。 */ - detectBody(option: DetectBodyOption): void - /** [VKSession.detectDepth(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.detectDepth.html) - * - * 需要基础库: `2.33.0` - * - * 在插件中使用:需要基础库 `2.33.0` - * - * 深度识别。当 wx.createVKSession 参数传入 {track: {depth: {mode: 2} } } 时可用。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/depth.html)。 */ - detectDepth(option: DetectDepthOption): void - /** [VKSession.detectFace(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.detectFace.html) - * - * 需要基础库: `2.25.0` - * - * 在插件中使用:需要基础库 `2.25.0` - * - * 静态图像人脸关键点检测。当 wx.createVKSession 参数传入 {track: {face: {mode: 2} } } 时可用。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/face.html)。安卓微信8.0.25开始支持,iOS微信8.0.24开始支持。 - * - * **** - * - * ### 特别说明 - * 若小程序人脸识别功能涉及采集、存储用户生物特征(如人脸照片或视频、身份证和手持身份证、身份证照和免冠照等),此类型服务需使用[微信原生人脸识别接口](https://developers.weixin.qq.com/community/develop/doc/000442d352c1202bd498ecb105c00d?highline=%E4%BA%BA%E8%84%B8%E6%A0%B8%E8%BA%AB)。 */ - detectFace(option: DetectFaceOption): void - /** [VKSession.detectHand(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.detectHand.html) - * - * 需要基础库: `2.28.0` - * - * 在插件中使用:需要基础库 `2.28.0` - * - * 静态图像手势关键点检测。当 wx.createVKSession 参数传入 {track: {hand: {mode: 2} } } 时可用。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/hand.html)。 */ - detectHand(option: DetectHandOption): void - /** [VKSession.off(string eventName, function fn)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.off.html) - * - * 需要基础库: `2.20.0` - * - * 在插件中使用:需要基础库 `2.20.0` - * - * 取消监听会话事件。 */ - off( - /** 事件名称 */ - eventName: string, - /** 事件监听函数 */ - fn: (...args: any[]) => any - ): void - /** [VKSession.on(string eventName, function fn)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.on.html) - * - * 需要基础库: `2.20.0` - * - * 在插件中使用:需要基础库 `2.20.0` - * - * 监听会话事件。 */ - on( - /** 事件名称 - * - * 参数 eventName 可选值: - * - 'resize': 相机尺寸变化事件,回调参数为相机尺寸; - * - 'addAnchors': 增加 anchor 事件,回调参数为 [VKPlaneAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKPlaneAnchor.html)/[VKMarkerAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKMarkerAnchor.html)/[VKOSDAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKOSDAnchor.html) 列表(只有v2版本支持); - * - 'updateAnchors': 更新 anchor 事件,回调参数为 [VKPlaneAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKPlaneAnchor.html)/[VKMarkerAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKMarkerAnchor.html)/[VKOSDAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKOSDAnchor.html) 列表(只有v2版本支持) 或 [VKFaceAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKFaceAnchor.html)/[VKOCRAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKOCRAnchor.html)/[VKHandAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKHandAnchor.html)/[VKBodyAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKBodyAnchor.html)列表(v1、v2都支持); - * - 'removeAnchors': 删除 anchor 事件,回调参数为 [VKPlaneAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKPlaneAnchor.html)/[VKMarkerAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKMarkerAnchor.html)/[VKOSDAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKOSDAnchor.html) 列表(只有v2版本支持) 或 [VKFaceAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKFaceAnchor.html)/[VKOCRAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKOCRAnchor.html)/[VKHandAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKHandAnchor.html)/[VKBodyAnchor](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKBodyAnchor.html) 列表(v1、v2都支持); */ - eventName: - | 'resize' - | 'addAnchors' - | 'updateAnchors' - | 'removeAnchors', - /** 事件监听函数 */ - fn: (...args: any[]) => any - ): void - /** [VKSession.removeMarker(number markerId)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.removeMarker.html) - * - * 需要基础库: `2.24.5` - * - * 在插件中使用:需要基础库 `2.24.5` - * - * 删除一个 marker,要求调 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 时传入的 track.marker 为 true */ - removeMarker( - /** marker id */ - markerId: number - ): void - /** [VKSession.removeOSDMarker(number markerId)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.removeOSDMarker.html) - * - * 需要基础库: `2.24.5` - * - * 在插件中使用:需要基础库 `2.24.5` - * - * 删除一个 OSD marker,要求调 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 时传入的 track.OSD 为 true */ - removeOSDMarker( - /** marker id */ - markerId: number - ): void - /** [VKSession.runOCR(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.runOCR.html) - * - * 需要基础库: `2.27.0` - * - * 在插件中使用:需要基础库 `2.27.0` - * - * 静态图像OCR检测。当 wx.createVKSession 参数传入 {track: {OCR: {mode: 2} } } 时可用。用法详情[指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/ocr.html)。 */ - runOCR(option: RunOCROption): void - /** [VKSession.setDepthOccRange(number threshold)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.setDepthOccRange.html) - * - * 需要基础库: `3.0.0` - * - * 在插件中使用:需要基础库 `3.0.0` - * - * 更新 深度遮挡 Occ范围,要求调 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 时传入 {track: {depth: {mode: 2} } } */ - setDepthOccRange( - /** 阈值 */ - threshold: number - ): void - /** [VKSession.start(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.start.html) - * - * 需要基础库: `2.20.0` - * - * 在插件中使用:需要基础库 `2.20.0` - * - * 开启会话。 */ - start( - /** 开启会话回调 */ - callback: VKSessionStartCallback - ): void - /** [VKSession.stop()](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.stop.html) - * - * 需要基础库: `2.20.0` - * - * 在插件中使用:需要基础库 `2.20.0` - * - * 停止会话。 */ - stop(): void - /** [VKSession.update3DMode(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.update3DMode.html) - * - * 需要基础库: `2.30.2` - * - * 在插件中使用:需要基础库 `2.30.2` - * - * 更新三维识别相关配置,要求调 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 时使用 face / hand / body。 */ - update3DMode(option: Update3DModeOption): void - /** [VKSession.updateMaskMode(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.updateMaskMode.html) - * - * 需要基础库: `3.2.1` - * - * 在插件中使用:需要基础库 `3.2.1` - * - * 设置裁剪相关配置,要求调 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 时使用 shoe。 */ - updateMaskMode(option: UpdateMaskModeOption): void - /** [VKSession.updateOSDThreshold(number threshold)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.updateOSDThreshold.html) - * - * 需要基础库: `2.24.5` - * - * 在插件中使用:需要基础库 `2.24.5` - * - * 更新 OSD 识别精确度,要求调 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 时传入的 track.OSD 为 true */ - updateOSDThreshold( - /** 阈值 */ - threshold: number - ): void - /** [[VKFrame](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKFrame.html) VKSession.getVKFrame(number width, number height)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.getVKFrame.html) - * - * 需要基础库: `2.20.0` - * - * 在插件中使用:需要基础库 `2.20.0` - * - * 获取帧对象,每调用一次都会触发一次帧分析过程。目前 VKSession 相机的最大帧数是 30 fps,因此调用 getVKFrame 的频率也可以限制在 30 fps,以减少渲染开销。 */ - getVKFrame( - /** 宽度 */ - width: number, - /** 高度 */ - height: number - ): VKFrame - /** [number VKSession.addMarker(string path)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.addMarker.html) - * - * 需要基础库: `2.24.5` - * - * 在插件中使用:需要基础库 `2.24.5` - * - * 添加一个 marker,要求调 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 时传入的 track.marker 为 true - * - * **使用提示** - * - * 注意事项: - * 1. 使用 addMarker 接口之前,需要在 createVKSession 的时候声明开启 marker 跟踪。即 wx.createVKSession({ track: { marker: true } }) - * 2. 可以添加多个 marker 图片,但不能重复添加相同的 marker 图片。 - * 3. 在v2模式下同时支持水平面检测与marker检测,同时可输出多个2d/3d marker位姿(需要基础库版本不低于 [2.33.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - * - * ### 2Dmarker - * 对传入的图片有如下要求: - * 1. 格式:jpg/png 格式三通道彩图或者 1 通道灰度图 - * 2. 分辨率:尺寸在 480x480 ~ 1920x1920 之间,建议为 1080 分辨率 - * 3. 宽高比:在 1:1 ~ 16:9 之间,要求尽量方正,避免狭长的图片 - * 4. 质量:目标图像为平面模型,需要占画面主体,避免大面积留白,建议用扫描件 - * - * 示例: - * - * image.png - * - * 建议: - * - * 1. 图片具有丰富的细节 - * 2. 避免重复单一的纹理,例如: - * - * image.png - *
- * image.png - *
- * image.png - *
- * - * 3. 避免使用柔和平滑边缘的纹理及大量渐变图像,例如: - * - * image.png - * - * 4. 避免模糊,建议采用高清、高对比度图像作为识别对象 - * 5. 建议图像有均匀的特征(角点)分布,正确示例: - * - * image.png - * - * 避免角点较少、中间大量空白、没有特征及角点的图像,错误示例: - * - * image.png - * - * ### 3Dmarker - * 现小程序demo支持通过上传视频, 生成对应模型的3dmarker识别文件,后缀名为.map - * - * 对传入的视频有如下要求: - * 1.视频长宽比为16:9或4:3; 短边大于480px - * 2.目标物体易于和背景物体区分出来,同时目标物体放置与背景物体一定距离,放置底面与物体易于区分,底面可以放置一张白纸,例如: - * - * image.png - * - * 3.目标物体最好为刚体,本身不会发生较大形变, 容易变形的物体不适合用作识别对象 - * 4.视频匀速移动,避免模糊,对目标识别面环绕物体拍摄,需要保证相机有足够的平移移动 - * 5.marker物体要求与2d图像要求类似,具有丰富细节,避免重复单一纹理,不反光,无高光 - * 6.拍摄视频中特征纹理丰富,如果marker本身问题较弱,可以在背景中适当添加纹理物体 - * 服务耗时:当前版本30s视频耗时约20分钟,请静待算法返回模型 - * - * 建议: - * - * 1.视频格式:视频帧率30fps,分辨率建议1080p - * 2.视频时长:视频建议时长在20s~30s,超过30s会被截断,时长过短会导致marker效果欠佳 */ - addMarker( - /** 图片路径,目前只支持本地用户图片 */ - path: string - ): number - /** [number VKSession.addOSDMarker(string path)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.addOSDMarker.html) - * - * 需要基础库: `2.24.5` - * - * 在插件中使用:需要基础库 `2.24.5` - * - * 添加一个 OSD marker(one-shot detection marker),要求调 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 时传入的 track.OSD 为 true - * - * **使用提示** - * - * 注意事项: - * 1. 使用 addOSDMarker 接口之前,需要在 createVKSession 的时候声明开启 OSD 跟踪。即 wx.createVKSession({ track: { OSD: true } }) - * 2. 可以添加多个 OSDMarker 图片,但不能重复添加相同的 OSDMarker 图片。 - * - * 对传入的图片有如下要求: - * 1. 格式:jpg 格式彩色图片 - * 2. 分辨率:尺寸不低于 240x240 - * 3. 宽高比:在 1:1 ~ 16:9 之间,要求尽量方正,避免狭长的图片 - * 4. 质量:目标物体需要占画面主体,避免大面积留白,避免大面积文字,不能含其他物体。 - * - * 示例: - * - * image.png - *
- * image.png - *
- * image.png - *
- * - * 建议: - * - * 1. 具有丰富的细节,避免纯色且形状特点不鲜明的物体,例如: - * - * image.png - * - * 2. 避免模糊,最好采用高清图片 */ - addOSDMarker( - /** 图片路径,目前只支持本地用户图片 */ - path: string - ): number - /** [number VKSession.requestAnimationFrame(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.requestAnimationFrame.html) - * - * 需要基础库: `2.20.0` - * - * 在插件中使用:需要基础库 `2.20.0` - * - * 在下次进行重绘时执行。 */ - requestAnimationFrame( - /** 执行的 callback */ - callback: (...args: any[]) => any - ): number - } - interface VKSize { - /** 高度 */ - height: number - /** 宽度 */ - width: number - } - interface VibrateLongOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: VibrateLongCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: VibrateLongFailCallback - /** 接口调用成功的回调函数 */ - success?: VibrateLongSuccessCallback - } - interface VibrateShortFailCallbackResult { - /** 错误信息 - * - * 可选值: - * - 'style is not support': 当前设备不支持设置震动等级; */ - errMsg: string - } - interface VibrateShortOption { - /** 需要基础库: `2.13.0` - * - * 震动强度类型,有效值为:heavy、medium、light */ - type: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: VibrateShortCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: VibrateShortFailCallback - /** 接口调用成功的回调函数 */ - success?: VibrateShortSuccessCallback - } - interface VideoContextRequestFullScreenOption { - /** 需要基础库: `1.7.0` - * - * 设置全屏时视频的方向,不指定则根据宽高比自动判断。 - * - * 可选值: - * - 0: 正常竖向; - * - 90: 屏幕逆时针90度; - * - -90: 屏幕顺时针90度; */ - direction?: 0 | 90 | -90 - } - interface VideoDecoderStartOption { - /** 需要解码的视频源文件。基础库 2.13.0 以下的版本只支持本地路径。 2.13.0 开始支持 http:// 和 https:// 协议的远程路径。 */ - source: string - /** 需要基础库: `2.15.0` - * - * 是否不需要音频轨道 */ - abortAudio?: boolean - /** 需要基础库: `2.15.0` - * - * 是否不需要视频轨道 */ - abortVideo?: boolean - /** 解码模式。0:按 pts 解码;1:以最快速度解码 */ - mode?: number - } - interface VoIP1v1ChatUser { - /** 昵称 */ - nickname: string - /** 小程序内 openid */ - openid: string - /** 头像 */ - headImage?: string - } - /** 需要基础库: `2.19.0` -* -* WebAudioContext 实例,通过[wx.createWebAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createWebAudioContext.html) 接口获取该实例。 -* -* **示例代码** -* -* ```js -// 监听状态 -const audioCtx = wx.createWebAudioContext() -audioCtx.onstatechange = () => { - console.log(ctx.state) -} -setTimeout(audioCtx.suspend, 1000) -setTimeout(audioCtx.resume, 2000) -``` */ - interface WebAudioContext { - /** 获取当前上下文的时间戳。 */ - currentTime: number - /** [WebAudioContextNode](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContextNode.html) - * - * 当前上下文的最终目标节点,一般是音频渲染设备。 */ - destination: WebAudioContextNode - /** [AudioListener](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioListener.html) - * - * 空间音频监听器。 */ - listener: AudioListener - /** 可写属性,开发者可以对该属性设置一个监听函数,当WebAudio状态改变的时候,会触发开发者设置的监听函数。 */ - onstatechange: (...args: any[]) => any - /** 采样率,通常在8000-96000之间,通常44100hz的采样率最为常见。 */ - sampleRate: number - /** 当前WebAudio上下文的状态。可能的值如下:suspended(暂停)、running(正在运行)、closed(已关闭)。需要注意的是,不要在 audioContext close后再访问state属性 */ - state: string - /** [AnalyserNode WebAudioContext.createAnalyser()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createAnalyser.html) - * - * 需要基础库: `2.22.0` - * - * 在插件中使用:不支持 - * - * 创建一个 AnalyserNode 。可以用来获取音频时间和频率数据,以及实现数据可视化。 */ - createAnalyser(): AnalyserNode - /** [BiquadFilterNode WebAudioContext.createBiquadFilter()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createBiquadFilter.html) - * - * 在插件中使用:不支持 - * - * 创建一个BiquadFilterNode */ - createBiquadFilter(): BiquadFilterNode - /** [ChannelMergerNode WebAudioContext.createChannelMerger(number numberOfInputs)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createChannelMerger.html) - * - * 在插件中使用:不支持 - * - * 创建一个ChannelMergerNode */ - createChannelMerger( - /** 输出流中需要保持的输入流的个数 */ - numberOfInputs: number - ): ChannelMergerNode - /** [ChannelSplitterNode WebAudioContext.createChannelSplitter(number numberOfOutputs)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createChannelSplitter.html) - * - * 在插件中使用:不支持 - * - * 创建一个ChannelSplitterNode */ - createChannelSplitter( - /** 要分别输出的输入音频流中的通道数 */ - numberOfOutputs: number - ): ChannelSplitterNode - /** [ConstantSourceNode WebAudioContext.createConstantSource()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createConstantSource.html) - * - * 在插件中使用:不支持 - * - * 创建一个ConstantSourceNode */ - createConstantSource(): ConstantSourceNode - /** [DelayNode WebAudioContext.createDelay(number maxDelayTime)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createDelay.html) - * - * 在插件中使用:不支持 - * - * 创建一个DelayNode */ - createDelay( - /** 最大延迟时间 */ - maxDelayTime: number - ): DelayNode - /** [DynamicsCompressorNode WebAudioContext.createDynamicsCompressor()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createDynamicsCompressor.html) - * - * 在插件中使用:不支持 - * - * 创建一个DynamicsCompressorNode */ - createDynamicsCompressor(): DynamicsCompressorNode - /** [GainNode WebAudioContext.createGain()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createGain.html) - * - * 在插件中使用:不支持 - * - * 创建一个GainNode */ - createGain(): GainNode - /** [IIRFilterNode WebAudioContext.createIIRFilter(Array.<number> feedforward, Array.<number> feedback)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createIIRFilter.html) - * - * 在插件中使用:不支持 - * - * 创建一个IIRFilterNode */ - createIIRFilter( - /** 一个浮点值数组,指定IIR滤波器传递函数的前馈(分子)系数。 */ - feedforward: number[], - /** 一个浮点值数组,指定IIR滤波器传递函数的反馈(分母)系数。 */ - feedback: number[] - ): IIRFilterNode - /** [OscillatorNode WebAudioContext.createOscillator()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createOscillator.html) - * - * 在插件中使用:不支持 - * - * 创建一个OscillatorNode */ - createOscillator(): OscillatorNode - /** [PannerNode WebAudioContext.createPanner()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createPanner.html) - * - * 在插件中使用:不支持 - * - * 创建一个PannerNode */ - createPanner(): PannerNode - /** [PeriodicWaveNode WebAudioContext.createPeriodicWave(Float32Array real, Float32Array imag, object constraints)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createPeriodicWave.html) -* -* 在插件中使用:不支持 -* -* 创建一个PeriodicWaveNode -* -* **注意** -* -* `real`和`imag`数组必须拥有一样的长度,否则抛出错误 -* ```js -const real = new Float32Array(2) -const imag = new Float32Array(2) -real[0] = 0 -imag[0] = 0 -real[1] = 1 -imag[1] = 0 - -const waveNode = audioContext.createPeriodicWave(real, imag, {disableNormalization: true}) -``` */ - createPeriodicWave( - /** 一系列余弦术语(传统上的A项) */ - real: Float32Array, - /** 一系列正弦项(传统上的B项) */ - imag: Float32Array, - /** 一个字典对象,用于指定是否禁用规范化(默认启用规范化) */ - constraints: Constraints - ): PeriodicWaveNode - /** [Promise WebAudioContext.close()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.close.html) -* -* 在插件中使用:不支持 -* -* 关闭WebAudioContext -* -* **注意事项** -* -* 同步关闭对应的WebAudio上下文。close后会立即释放当前上下文的资源,不要在close后再次访问state属性。 -* ```js -const audioCtx = wx.createWebAudioContext() -audioCtx.close().then(() => { - console.log(audioCtx.state) // bad case:不应该在close后再访问state -}) -``` */ - close(): Promise - /** [Promise WebAudioContext.resume()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.resume.html) - * - * 在插件中使用:不支持 - * - * 同步恢复已经被暂停的WebAudioContext上下文 */ - resume(): Promise - /** [Promise WebAudioContext.suspend()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.suspend.html) - * - * 在插件中使用:不支持 - * - * 同步暂停WebAudioContext上下文 */ - suspend(): Promise - /** [ScriptProcessorNode WebAudioContext.createScriptProcessor(number bufferSize, number numberOfInputChannels, number numberOfOutputChannels)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createScriptProcessor.html) - * - * 在插件中使用:不支持 - * - * 创建一个ScriptProcessorNode */ - createScriptProcessor( - /** 缓冲区大小,以样本帧为单位 */ - bufferSize: number, - /** 用于指定输入node的声道的数量 */ - numberOfInputChannels: number, - /** 用于指定输出node的声道的数量 */ - numberOfOutputChannels: number - ): ScriptProcessorNode - /** [WaveShaperNode WebAudioContext.createWaveShaper()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createWaveShaper.html) - * - * 在插件中使用:不支持 - * - * 创建一个WaveShaperNode */ - createWaveShaper(): WaveShaperNode - /** [[AudioBuffer](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioBuffer.html) WebAudioContext.createBuffer(number numOfChannels, number length, number sampleRate)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createBuffer.html) - * - * 在插件中使用:不支持 - * - * 创建一个AudioBuffer,代表着一段驻留在内存中的短音频 */ - createBuffer( - /** 定义了 buffer 中包含的声频通道数量的整数 */ - numOfChannels: number, - /** 代表 buffer 中的样本帧数的整数 */ - length: number, - /** 线性音频样本的采样率,即每一秒包含的关键帧的个数 */ - sampleRate: number - ): AudioBuffer - /** [[AudioBuffer](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioBuffer.html) WebAudioContext.decodeAudioData(ArrayBuffer audioData, function successCallback, function errorCallback)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.decodeAudioData.html) - * - * 在插件中使用:不支持 - * - * 异步解码一段资源为AudioBuffer。 */ - decodeAudioData( - /** 一个包含音频文件数据的 ArrayBuffer */ - audioData: ArrayBuffer, - /** 在音频数据解码成功时被调用,参数为解码后的AudioBuffer */ - successCallback: (...args: any[]) => any, - /** 在音频数据解码失败时被调用 */ - errorCallback: (...args: any[]) => any - ): AudioBuffer - /** [[BufferSourceNode](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/BufferSourceNode.html) WebAudioContext.createBufferSource()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.createBufferSource.html) - * - * 在插件中使用:不支持 - * - * 创建一个BufferSourceNode实例,通过AudioBuffer对象来播放音频数据。 */ - createBufferSource(): BufferSourceNode - } - /** 一类音频处理模块,不同的Node具备不同的功能,如GainNode(音量调整)等。一个WebAudioContextNode可以通过上下文来创建。 - * 目前已经支持以下Node: - * IIRFilterNode - * WaveShaperNode - * ConstantSourceNode - * ChannelMergerNode - * OscillatorNode - * GainNode - * BiquadFilterNode - * PeriodicWaveNode - * BufferSourceNode - * ChannelSplitterNode - * ChannelMergerNode - * DelayNode - * DynamicsCompressorNode - * ScriptProcessorNode - * PannerNode - * AnalyserNode */ - interface WebAudioContextNode {} - /** 提供预设的 Wi-Fi 信息列表 */ - interface WifiData { - /** Wi-Fi 的 BSSID */ - BSSID?: string - /** Wi-Fi 的 SSID */ - SSID?: string - /** Wi-Fi 设备密码 */ - password?: string - } - /** Wifi 信息 - * - * **注意** - * - * - 安卓 wx.connectWifi / wx.getConnectedWifi 若设置了 partialInfo:true ,或者调用了 wx.onWifiConnectedWithPartialInfo 事件。将会返回只包含 SSID 属性的 WifiInfo 对象。 - * - iOS wx.getConnectedWifi 若设置了 partialInfo:true ,将会返回只包含 SSID、BSSID 属性的 WifiInfo 对象,且需要用户开启微信定位权限才能正确返回结果。 - * - 在某些情况下,可能 Wi-Fi 已经连接成功,但会因为获取不到完整的 WifiInfo 对象报错。具体错误信息为 errCode: 12010, errMsg: can't gain current wifi 或 no wifi is connected 。如果开发者不需要完整的 WifiInfo 对象,则可以通过采取上述策略解决报错问题。 */ - interface WifiInfo { - /** Wi-Fi 的 BSSID */ - BSSID: string - /** Wi-Fi 的 SSID */ - SSID: string - /** 需要基础库: `2.12.0` - * - * Wi-Fi 频段单位 MHz */ - frequency: number - /** Wi-Fi 是否安全 */ - secure: boolean - /** Wi-Fi 信号强度, 安卓取值 0 ~ 100 ,iOS 取值 0 ~ 1 ,值越大强度越大 */ - signalStrength: number - } - interface WindowInfo { - /** 设备像素比 */ - pixelRatio: number - /** 在竖屏正方向下的安全区域。部分机型没有安全区域概念,也不会返回 safeArea 字段,开发者需自行兼容。 */ - safeArea: SafeArea - /** 屏幕高度,单位px */ - screenHeight: number - /** 窗口上边缘的y值 */ - screenTop: number - /** 屏幕宽度,单位px */ - screenWidth: number - /** 状态栏的高度,单位px */ - statusBarHeight: number - /** 可使用窗口高度,单位px */ - windowHeight: number - /** 可使用窗口宽度,单位px */ - windowWidth: number - } - /** Worker 实例,主线程中可通过 [wx.createWorker](https://developers.weixin.qq.com/miniprogram/dev/api/worker/wx.createWorker.html) 接口获取,worker 线程中可通过全局变量 `worker` 获取。 -* -* **示例代码** -* -* 运行以下代码需先进行基础配置,详细请查阅 [小程序多线程](https://developers.weixin.qq.com/miniprogram/dev/framework/workers.html) | [小游戏多线程](https://developers.weixin.qq.com/minigame/dev/guide/base-ability/worker.html) 文档了解基础知识和配置方法。 -* -* ```js -const worker = wx.createWorker('workers/request/index.js') // 文件名指定 worker 的入口文件路径,绝对路径 - -worker.onMessage(function (res) { - console.log(res) -}) -// 监听worker被系统回收事件 -worker.onProcessKilled(function () { - console.log('worker has been killed') - // 重新创建一个worker - // wx.createWorker() -}) - -worker.postMessage({ - msg: 'hello worker' -}) - -worker.terminate() -``` */ - interface Worker { - /** worker内的环境变量 */ - env: WorkerEnv - /** [ArrayBuffer Worker.getCameraFrameData()](https://developers.weixin.qq.com/miniprogram/dev/api/worker/Worker.getCameraFrameData.html) -* -* 需要基础库: `2.25.1` -* -* 在插件中使用:不支持 -* -* 获取摄像头当前帧图像,返回ArrayBuffer数据。仅限在 worker 线程中使用。 -* -* **示例代码** -* -* ```js -// app.js -const worker = wx.createWorker('workers/index.js', { - useExperimentalWorker: true -}) - -const cameraContext = wx.createCameraContext() -const cameraFrameListener = cameraContext.onCameraFrame(function() {}) -cameraFrameListener.start({ - worker: worker -}) -``` -* -* ```js -// workers/index.js -const data = worker.getCameraFrameData() -console.log(data) -``` */ - getCameraFrameData(): ArrayBuffer - /** [Worker.onMessage(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/worker/Worker.onMessage.html) - * - * 在插件中使用:不支持 - * - * 监听主线程/Worker 线程向当前线程发送的消息的事件。 */ - onMessage( - /** 主线程/Worker 线程向当前线程发送的消息的事件的监听函数 */ - listener: WorkerOnMessageCallback - ): void - /** [Worker.onProcessKilled(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/worker/Worker.onProcessKilled.html) - * - * 在插件中使用:不支持 - * - * 监听 worker线程被系统回收事件(开启 useExperimentalWorker 后,当iOS系统资源紧张时,ExperimentalWorker 线程存在被系统回收的可能,开发者可监听此事件并重新创建一个worker)。仅限在主线程 worker 对象上调用。 */ - onProcessKilled( - /** worker线程被系统回收事件的监听函数 */ - listener: OnProcessKilledCallback - ): void - /** [Worker.postMessage(Object message)](https://developers.weixin.qq.com/miniprogram/dev/api/worker/Worker.postMessage.html) -* -* 在插件中使用:不支持 -* -* 向主线程/Worker 线程发送的消息。 -* -* **示例代码** -* -* worker 线程中 -* ```js -worker.postMessage({ - msg: 'hello from worker' -}) -``` -* -* 主线程中 -* ```js -const worker = wx.createWorker('workers/request/index.js') - -worker.postMessage({ - msg: 'hello from main' -}) -``` -* -* **提醒** -* -* 在基础库版本2.20.2之前,postMessage仅支持传递可序列化的key-value对象。 -* 在基础库2.20.2之后,postMessage支持传递任意类型的数据。 */ - postMessage( - /** 需要发送的消息。 */ - message: IAnyObject - ): void - /** [Worker.terminate()](https://developers.weixin.qq.com/miniprogram/dev/api/worker/Worker.terminate.html) - * - * 在插件中使用:不支持 - * - * 结束当前 Worker 线程。仅限在主线程 worker 对象上调用。 */ - terminate(): void - /** [Worker.testOnProcessKilled()](https://developers.weixin.qq.com/miniprogram/dev/api/worker/Worker.testOnProcessKilled.html) -* -* 需要基础库: `2.27.1` -* -* 在插件中使用:不支持 -* -* 用于模拟 iOS ExperimentalWorker 线程被系统回收事件,以便于调试。接口仅在 worker 线程内可用。参考 [Worker.onProcessKilled](https://developers.weixin.qq.com/miniprogram/dev/api/worker/Worker.onProcessKilled.html) -* -* **示例代码** -* -* ```js -// game.js -const worker = wx.createWorker('workers/index.js', { - useExperimentalWorker: true -}) - -// 监听 ExperimentalWorker 被系统回收事件 -worker.onProcessKilled(function () { - console.log('worker has been killed') - // 重新创建一个worker - // wx.createWorker() -}) -``` -* -* ```js -// workers/index.js -setTimeout(() => { - // 模拟 ExperimentalWorker 线程被系统回收事件 - worker.testOnProcessKilled() -}, 2000) -``` */ - testOnProcessKilled(): void - } - /** worker内的环境变量 */ - interface WorkerEnv { - /** 文件系统中的用户目录路径 (本地路径) */ - USER_DATA_PATH: string - } - interface WorkerOnMessageListenerResult { - /** 主线程/Worker 线程向当前线程发送的消息 */ - message: IAnyObject - } - /** Easing 模块实现了常见的动画缓动函数(动画效果参考 https://easings.net/ ),可从 [wx.worklet](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/wx.worklet.html) 对象中读取。 -* -* **** -* -* ## 示例代码 -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/f94TCOmg7JFH) -* -* ### 预置动画函数 -* -* * [Easing.bounce](#Easing.bounce) 反弹动画 -* * [Easing.ease](#Easing.ease) 惯性动画 -* * [Easing.elastic](#Easing.elastic) 弹性动画 -* -* ### 标准缓动函数 -* -* * [Easing.linear](#Easing.linear) 线性 -* * [Easing.quad](#Easing.quad) 二次方 -* * [Easing.cubic](#Easing.cubic) 三次方 -* * [Easing.poly](#Easing.poly) 实现其它幂函数 -* -* ### 其它数学函数 -* -* * [Easing.bezier](#Easing.bezier) 三次贝塞尔曲线 -* * [Easing.circle](#Easing.circle) 圆形曲线 -* * [Easing.sin](#Easing.sin) 正弦函数 -* * [Easing.exp](#Easing.exp) 指数函数 -* -* ### 缓动方式 -* -* 以上效果均有三种缓动方式 -* -* * [Easing.in](#in) 正向执行缓动函数 -* * [Easing.out](#out) 反向执行缓动函数 -* * [Easing.inOut](#inout) 前半程正向,后半程反向 -* 以 `sin` 函数为例,其中 `Easing.in(Easing.sin)` 和直接使用 `Easing.sin` 效果相同。 -* -* 1. `Easing.in(Easing.sin)` 动画效果参考 https://easings.net/#easeInSine -* 2. `Easing.out(Easing.sin)` 动画效果参考 https://easings.net/#easeOutSine -* 3. `Easing.inOut(Easing.sin)` 动画效果参考 https://easings.net/#easeInOutSine -* -* ### Easing.bounce -* -* 简单的反弹效果,[动画效果参考](https://easings.net/#easeInBounce) -* -* ```js -Easing.bounce(t) -``` -* -* ### Easing.ease -* -* 简单的惯性动画,[动画效果参考](https://cubic-bezier.com/#.42,0,1,1) -* -* ```js -Easing.ease(t) -``` -* -* ### Easing.elastic -* -* 简单的弹性动画,类似弹簧来回摆动,高阶函数。默认弹性为 1,会稍微超出一次。弹性为 0 时 不会过冲。[动画效果参考](https://easings.net/#easeInElastic) -* -* ```js -Easing.elastic(bounciness = 1) -``` -* -* ### Easing.linear -* -* 线性函数,f(t) = t,[动画效果参考](https://cubic-bezier.com/#0,0,1,1) -* -* ```js -Easing.linear(t) -``` -* ### Easing.quad -* -* 二次方函数,f(t) = t * t,[动画效果参考](https://easings.net/#easeInQuad) -* -* ```js -Easing.quad(t) -``` -* -* ### Easing.cubic -* -* 立方函数,f(t) = t * t * t,[动画效果参考](https://easings.net/#easeInCubic) -* -* ```js -Easing.cubic(t) -``` -* -* ### Easing.poly -* -* 高阶函数,返回幂函数 -* -* poly(4): [动画效果参考](https://easings.net/#easeInQuart) -* -* poly(5): [动画效果参考](https://easings.net/#easeInQuint) -* -* ```js -Easing.poly(n) -``` -* -* ### Easing.bezier -* -* 三次贝塞尔曲线,效果同 css `transition-timing-function` -* -* 调试参数可借助 [可视化工具](https://cubic-bezier.com/) -* -* ```js -Easing.bezier(x1, y1, x2, y2) -``` -* -* ### Easing.circle -* -* 圆形曲线,[动画效果参考](https://easings.net/#easeInCirc) -* -* ```js -Easing.circle(t) -``` -* -* ### Easing.sin -* -* 正弦函数,[动画效果参考](https://easings.net/#easeInSine) -* -* ```js -Easing.sin(t) -``` -* -* ### Easing.exp -* -* 指数函数,[动画效果参考](https://easings.net/#easeInExpo) -* -* ```js -Easing.exp(t) -``` -* -* ### Easing.in -* -* 正向运行 `easing function`,高阶函数。 -* -* ```js -Easing.in(easing) -``` -* -* ### Easing.out -* -* 反向运行 `easing function`,高阶函数。 -* -* ```js -Easing.out(easing) -``` -* -* ### Easing.inOut -* -* 前半程正向,后半程反向,高阶函数。 -* -* ```js -Easing.inOut(easing) -``` */ - interface WorkletEasing {} - /** 需要基础库: `3.3.0` - * - * `ScrollView` 实例,可在 `worklet` 函数内操作 `scroll-view` 组件。 */ - interface WorkletScrollViewContext {} - interface WorkletScrollViewContextScrollToOption { - /** 是否启用滚动动画 */ - animated?: boolean - /** 滚动动画时长 */ - duration?: number - /** 动画曲线 */ - easingFunction?: string - /** 左边界距离 */ - left?: number - /** 顶部距离 */ - top?: number - } - interface WriteBLECharacteristicValueOption { - /** 蓝牙特征的 UUID */ - characteristicId: string - /** 蓝牙设备 id */ - deviceId: string - /** 蓝牙特征对应服务的 UUID */ - serviceId: string - /** 蓝牙设备特征对应的二进制值 */ - value: ArrayBuffer - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: WriteBLECharacteristicValueCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: WriteBLECharacteristicValueFailCallback - /** 接口调用成功的回调函数 */ - success?: WriteBLECharacteristicValueSuccessCallback - /** 蓝牙特征值的写模式设置,有两种模式,iOS 优先 write,安卓优先 writeNoResponse 。(基础库 2.22.0 开始支持) - * - * 可选值: - * - 'write': 强制回复写,不支持时报错; - * - 'writeNoResponse': 强制无回复写,不支持时报错; */ - writeType?: 'write' | 'writeNoResponse' - } - interface WriteCharacteristicValueObject { - /** 蓝牙特征的 UUID */ - characteristicId: string - /** 是否需要通知主机 value 已更新 */ - needNotify: boolean - /** 蓝牙特征对应服务的 UUID */ - serviceId: string - /** characteristic 对应的二进制值 */ - value: ArrayBuffer - /** 可选,处理回包时使用 */ - callbackId?: number - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: WriteCharacteristicValueCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: WriteCharacteristicValueFailCallback - /** 接口调用成功的回调函数 */ - success?: WriteCharacteristicValueSuccessCallback - } - interface WriteFileOption { - /** 要写入的文本或二进制数据 */ - data: string | ArrayBuffer - /** 要写入的文件路径 (本地路径) */ - filePath: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: WriteFileCompleteCallback - /** 指定写入文件的字符编码 - * - * 可选值: - * - 'ascii': ; - * - 'base64': (注意,选择 base64 编码,data 只需要传 base64 内容本身,不要传 Data URI 前缀,否则会报 fail base64 encode error 错误。例如,传 aGVsbG8= 而不是传 data:image/png;base64,aGVsbG8= ); - * - 'binary': ; - * - 'hex': ; - * - 'ucs2': 以小端序读取; - * - 'ucs-2': 以小端序读取; - * - 'utf16le': 以小端序读取; - * - 'utf-16le': 以小端序读取; - * - 'utf-8': ; - * - 'utf8': ; - * - 'latin1': ; */ - encoding?: - | 'ascii' - | 'base64' - | 'binary' - | 'hex' - | 'ucs2' - | 'ucs-2' - | 'utf16le' - | 'utf-16le' - | 'utf-8' - | 'utf8' - | 'latin1' - /** 接口调用失败的回调函数 */ - fail?: WriteFileFailCallback - /** 接口调用成功的回调函数 */ - success?: WriteFileSuccessCallback - } - interface WriteNdefMessageOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: WriteNdefMessageCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: WriteNdefMessageFailCallback - /** 二进制对象数组, 需要指明 id, type 以及 payload (均为 ArrayBuffer 类型) */ - records?: any[] - /** 接口调用成功的回调函数 */ - success?: WriteNdefMessageSuccessCallback - /** text 数组 */ - texts?: any[] - /** uri 数组 */ - uris?: any[] - } - interface WriteOption { - /** 写入的内容,类型为 String 或 ArrayBuffer */ - data: string | ArrayBuffer - /** 文件描述符。fd 通过 [FileSystemManager.open](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.open.html) 或 [FileSystemManager.openSync](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.openSync.html) 接口获得 */ - fd: string - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: WriteCompleteCallback - /** 只在 data 类型是 String 时有效,指定写入文件的字符编码,默认为 utf8 - * - * 可选值: - * - 'ascii': ; - * - 'base64': ; - * - 'binary': ; - * - 'hex': ; - * - 'ucs2': 以小端序读取; - * - 'ucs-2': 以小端序读取; - * - 'utf16le': 以小端序读取; - * - 'utf-16le': 以小端序读取; - * - 'utf-8': ; - * - 'utf8': ; - * - 'latin1': ; */ - encoding?: - | 'ascii' - | 'base64' - | 'binary' - | 'hex' - | 'ucs2' - | 'ucs-2' - | 'utf16le' - | 'utf-16le' - | 'utf-8' - | 'utf8' - | 'latin1' - /** 接口调用失败的回调函数 */ - fail?: WriteFailCallback - /** 只在 data 类型是 ArrayBuffer 时有效,指定要写入的字节数,默认为 ArrayBuffer 从0开始偏移 offset 个字节后剩余的字节数 */ - length?: number - /** 只在 data 类型是 ArrayBuffer 时有效,决定 ArrayBuffer 中要被写入的部位,即 ArrayBuffer 中的索引,默认0 */ - offset?: number - /** 指定文件开头的偏移量,即数据要被写入的位置。当 position 不传或者传入非 Number 类型的值时,数据会被写入当前指针所在位置。 */ - position?: number - /** 接口调用成功的回调函数 */ - success?: WriteSuccessCallback - } - /** 文件写入结果。 通过 [FileSystemManager.writeSync](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.writeSync.html) 接口返回 */ - interface WriteResult { - /** 实际被写入到文件中的字节数(注意,被写入的字节数不一定与被写入的字符串字符数相同) */ - bytesWritten: number - } - interface WriteSuccessCallbackResult { - /** 实际被写入到文件中的字节数(注意,被写入的字节数不一定与被写入的字符串字符数相同) */ - bytesWritten: number - errMsg: string - } - interface WriteSyncOption { - /** 写入的内容,类型为 String 或 ArrayBuffer */ - data: string | ArrayBuffer - /** 文件描述符。fd 通过 [FileSystemManager.open](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.open.html) 或 [FileSystemManager.openSync](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.openSync.html) 接口获得 */ - fd: string - /** 只在 data 类型是 String 时有效,指定写入文件的字符编码,默认为 utf8 - * - * 可选值: - * - 'ascii': ; - * - 'base64': ; - * - 'binary': ; - * - 'hex': ; - * - 'ucs2': 以小端序读取; - * - 'ucs-2': 以小端序读取; - * - 'utf16le': 以小端序读取; - * - 'utf-16le': 以小端序读取; - * - 'utf-8': ; - * - 'utf8': ; - * - 'latin1': ; */ - encoding?: - | 'ascii' - | 'base64' - | 'binary' - | 'hex' - | 'ucs2' - | 'ucs-2' - | 'utf16le' - | 'utf-16le' - | 'utf-8' - | 'utf8' - | 'latin1' - /** 只在 data 类型是 ArrayBuffer 时有效,指定要写入的字节数,默认为 ArrayBuffer 从0开始偏移 offset 个字节后剩余的字节数 */ - length?: number - /** 只在 data 类型是 ArrayBuffer 时有效,决定 ArrayBuffer 中要被写入的部位,即 ArrayBuffer 中的索引,默认0 */ - offset?: number - /** 指定文件开头的偏移量,即数据要被写入的位置。当 position 不传或者传入非 Number 类型的值时,数据会被写入当前指针所在位置。 */ - position?: number - } - interface WxStartRecordOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StartRecordCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StartRecordFailCallback - /** 接口调用成功的回调函数 */ - success?: WxStartRecordSuccessCallback - } - interface WxStopRecordOption { - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - complete?: StopRecordCompleteCallback - /** 接口调用失败的回调函数 */ - fail?: StopRecordFailCallback - /** 接口调用成功的回调函数 */ - success?: WxStopRecordSuccessCallback - } - /** 运动数据列表 */ - interface WxaSportRecord { - /** 消耗卡路里 */ - calorie: number - /** 运动距离 */ - distance: number - /** 运动时长 */ - time: number - /** 运动项目id */ - typeId: number - } - /** 帧纹理对象 */ - interface YUVTextureRes { - /** UV 分量纹理 */ - uvTexture: WebGLTexture - /** Y 分量纹理 */ - yTexture: WebGLTexture - } - /** 文件路径 */ - interface ZipFileItem { - /** 文件内容 */ - data: string | ArrayBuffer - /** 错误信息 */ - errMsg: string - } - interface Animation { - /** [Object Animation.export()](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.export.html) - * - * 在插件中使用:支持 - * - * 导出动画队列。**export 方法每次调用后会清掉之前的动画操作。** */ - export(): AnimationExportResult - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.backgroundColor(string value)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.backgroundColor.html) - * - * 在插件中使用:支持 - * - * 设置背景色 */ - backgroundColor( - /** 颜色值 */ - value: string - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.bottom(number|string value)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.bottom.html) - * - * 在插件中使用:支持 - * - * 设置 bottom 值 */ - bottom( - /** 长度值,如果传入 number 则默认使用 px,可传入其他自定义单位的长度值 */ - value: number | string - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.height(number|string value)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.height.html) - * - * 在插件中使用:支持 - * - * 设置高度 */ - height( - /** 长度值,如果传入 number 则默认使用 px,可传入其他自定义单位的长度值 */ - value: number | string - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.left(number|string value)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.left.html) - * - * 在插件中使用:支持 - * - * 设置 left 值 */ - left( - /** 长度值,如果传入 number 则默认使用 px,可传入其他自定义单位的长度值 */ - value: number | string - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.matrix()](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.matrix.html) - * - * 在插件中使用:支持 - * - * 同 [transform-function matrix](https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix) */ - matrix(): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.matrix3d()](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.matrix3d.html) - * - * 在插件中使用:支持 - * - * 同 [transform-function matrix3d](https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d) */ - matrix3d(): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.opacity(number value)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.opacity.html) - * - * 在插件中使用:支持 - * - * 设置透明度 */ - opacity( - /** 透明度,范围 0-1 */ - value: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.right(number|string value)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.right.html) - * - * 在插件中使用:支持 - * - * 设置 right 值 */ - right( - /** 长度值,如果传入 number 则默认使用 px,可传入其他自定义单位的长度值 */ - value: number | string - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.rotate(number angle)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.rotate.html) - * - * 在插件中使用:支持 - * - * 从原点顺时针旋转一个角度 */ - rotate( - /** 旋转的角度。范围 [-180, 180] */ - angle: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.rotate3d(number x, number y, number z, number angle)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.rotate3d.html) - * - * 在插件中使用:支持 - * - * 从 固定 轴顺时针旋转一个角度 */ - rotate3d( - /** 旋转轴的 x 坐标 */ - x: number, - /** 旋转轴的 y 坐标 */ - y: number, - /** 旋转轴的 z 坐标 */ - z: number, - /** 旋转的角度。范围 [-180, 180] */ - angle: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.rotateX(number angle)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.rotateX.html) - * - * 在插件中使用:支持 - * - * 从 X 轴顺时针旋转一个角度 */ - rotateX( - /** 旋转的角度。范围 [-180, 180] */ - angle: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.rotateY(number angle)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.rotateY.html) - * - * 在插件中使用:支持 - * - * 从 Y 轴顺时针旋转一个角度 */ - rotateY( - /** 旋转的角度。范围 [-180, 180] */ - angle: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.rotateZ(number angle)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.rotateZ.html) - * - * 在插件中使用:支持 - * - * 从 Z 轴顺时针旋转一个角度 */ - rotateZ( - /** 旋转的角度。范围 [-180, 180] */ - angle: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.scale(number sx, number sy)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.scale.html) - * - * 在插件中使用:支持 - * - * 缩放 */ - scale( - /** 当仅有 sx 参数时,表示在 X 轴、Y 轴同时缩放sx倍数 */ - sx: number, - /** 在 Y 轴缩放 sy 倍数 */ - sy?: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.scale3d(number sx, number sy, number sz)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.scale3d.html) - * - * 在插件中使用:支持 - * - * 缩放 */ - scale3d( - /** x 轴的缩放倍数 */ - sx: number, - /** y 轴的缩放倍数 */ - sy: number, - /** z 轴的缩放倍数 */ - sz: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.scaleX(number scale)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.scaleX.html) - * - * 在插件中使用:支持 - * - * 缩放 X 轴 */ - scaleX( - /** X 轴的缩放倍数 */ - scale: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.scaleY(number scale)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.scaleY.html) - * - * 在插件中使用:支持 - * - * 缩放 Y 轴 */ - scaleY( - /** Y 轴的缩放倍数 */ - scale: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.scaleZ(number scale)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.scaleZ.html) - * - * 在插件中使用:支持 - * - * 缩放 Z 轴 */ - scaleZ( - /** Z 轴的缩放倍数 */ - scale: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.skew(number ax, number ay)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.skew.html) - * - * 在插件中使用:支持 - * - * 对 X、Y 轴坐标进行倾斜 */ - skew( - /** 对 X 轴坐标倾斜的角度,范围 [-180, 180] */ - ax: number, - /** 对 Y 轴坐标倾斜的角度,范围 [-180, 180] */ - ay: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.skewX(number angle)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.skewX.html) - * - * 在插件中使用:支持 - * - * 对 X 轴坐标进行倾斜 */ - skewX( - /** 倾斜的角度,范围 [-180, 180] */ - angle: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.skewY(number angle)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.skewY.html) - * - * 在插件中使用:支持 - * - * 对 Y 轴坐标进行倾斜 */ - skewY( - /** 倾斜的角度,范围 [-180, 180] */ - angle: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.step(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.step.html) - * - * 在插件中使用:支持 - * - * 表示一组动画完成。可以在一组动画中调用任意多个动画方法,一组动画中的所有动画会同时开始,一组动画完成后才会进行下一组动画。 */ - step(option?: StepOption): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.top(number|string value)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.top.html) - * - * 在插件中使用:支持 - * - * 设置 top 值 */ - top( - /** 长度值,如果传入 number 则默认使用 px,可传入其他自定义单位的长度值 */ - value: number | string - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.translate(number tx, number ty)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.translate.html) - * - * 在插件中使用:支持 - * - * 平移变换 */ - translate( - /** 当仅有该参数时表示在 X 轴偏移 tx,单位 px */ - tx?: number, - /** 在 Y 轴平移的距离,单位为 px */ - ty?: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.translate3d(number tx, number ty, number tz)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.translate3d.html) - * - * 在插件中使用:支持 - * - * 对 xyz 坐标进行平移变换 */ - translate3d( - /** 在 X 轴平移的距离,单位为 px */ - tx?: number, - /** 在 Y 轴平移的距离,单位为 px */ - ty?: number, - /** 在 Z 轴平移的距离,单位为 px */ - tz?: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.translateX(number translation)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.translateX.html) - * - * 在插件中使用:支持 - * - * 对 X 轴平移 */ - translateX( - /** 在 X 轴平移的距离,单位为 px */ - translation: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.translateY(number translation)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.translateY.html) - * - * 在插件中使用:支持 - * - * 对 Y 轴平移 */ - translateY( - /** 在 Y 轴平移的距离,单位为 px */ - translation: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.translateZ(number translation)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.translateZ.html) - * - * 在插件中使用:支持 - * - * 对 Z 轴平移 */ - translateZ( - /** 在 Z 轴平移的距离,单位为 px */ - translation: number - ): Animation - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) Animation.width(number|string value)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.width.html) - * - * 在插件中使用:支持 - * - * 设置宽度 */ - width( - /** 长度值,如果传入 number 则默认使用 px,可传入其他自定义单位的长度值 */ - value: number | string - ): Animation - } - interface AudioContext { - /** [AudioContext.pause()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioContext.pause.html) - * - * 在插件中使用:支持 - * @deprecated 基础库版本 [1.6.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.createInnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createInnerAudioContext.html) 替换 - * - * 暂停音频。 */ - pause(): void - /** [AudioContext.play()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioContext.play.html) - * - * 在插件中使用:支持 - * @deprecated 基础库版本 [1.6.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.createInnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createInnerAudioContext.html) 替换 - * - * 播放音频。 */ - play(): void - /** [AudioContext.seek(number position)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioContext.seek.html) - * - * 在插件中使用:支持 - * @deprecated 基础库版本 [1.6.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.createInnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createInnerAudioContext.html) 替换 - * - * 跳转到指定位置。 */ - seek( - /** 跳转位置,单位 s */ - position: number - ): void - /** [AudioContext.setSrc(string src)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioContext.setSrc.html) - * - * 在插件中使用:支持 - * @deprecated 基础库版本 [1.6.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.createInnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createInnerAudioContext.html) 替换 - * - * 设置音频地址 */ - setSrc( - /** 音频地址 */ - src: string - ): void - } - interface BLEPeripheralServer { - /** [BLEPeripheralServer.addService(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.addService.html) - * - * 需要基础库: `2.10.3` - * - * 在插件中使用:不支持 - * - * 添加服务。 */ - addService(option: AddServiceOption): void - /** [BLEPeripheralServer.close(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.close.html) - * - * 需要基础库: `2.10.3` - * - * 在插件中使用:不支持 - * - * 关闭当前服务端。 */ - close(option?: BLEPeripheralServerCloseOption): void - /** [BLEPeripheralServer.offCharacteristicReadRequest(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.offCharacteristicReadRequest.html) -* -* 需要基础库: `2.10.3` -* -* 在插件中使用:不支持 -* -* 移除已连接的设备请求读当前外围设备的特征值事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -BLEPeripheralServer.onCharacteristicReadRequest(listener) -BLEPeripheralServer.offCharacteristicReadRequest(listener) // 需传入与监听时同一个的函数对象 -``` */ - offCharacteristicReadRequest( - /** onCharacteristicReadRequest 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffCharacteristicReadRequestCallback - ): void - /** [BLEPeripheralServer.offCharacteristicSubscribed(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.offCharacteristicSubscribed.html) -* -* 需要基础库: `2.13.0` -* -* 在插件中使用:不支持 -* -* 移除特征订阅事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -BLEPeripheralServer.onCharacteristicSubscribed(listener) -BLEPeripheralServer.offCharacteristicSubscribed(listener) // 需传入与监听时同一个的函数对象 -``` */ - offCharacteristicSubscribed( - /** onCharacteristicSubscribed 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffCharacteristicSubscribedCallback - ): void - /** [BLEPeripheralServer.offCharacteristicUnsubscribed(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.offCharacteristicUnsubscribed.html) -* -* 需要基础库: `2.13.0` -* -* 在插件中使用:不支持 -* -* 移除取消特征订阅事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -BLEPeripheralServer.onCharacteristicUnsubscribed(listener) -BLEPeripheralServer.offCharacteristicUnsubscribed(listener) // 需传入与监听时同一个的函数对象 -``` */ - offCharacteristicUnsubscribed( - /** onCharacteristicUnsubscribed 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffCharacteristicUnsubscribedCallback - ): void - /** [BLEPeripheralServer.offCharacteristicWriteRequest(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.offCharacteristicWriteRequest.html) -* -* 需要基础库: `2.10.3` -* -* 在插件中使用:不支持 -* -* 移除已连接的设备请求写当前外围设备的特征值事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -BLEPeripheralServer.onCharacteristicWriteRequest(listener) -BLEPeripheralServer.offCharacteristicWriteRequest(listener) // 需传入与监听时同一个的函数对象 -``` */ - offCharacteristicWriteRequest( - /** onCharacteristicWriteRequest 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffCharacteristicWriteRequestCallback - ): void - /** [BLEPeripheralServer.onCharacteristicReadRequest(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.onCharacteristicReadRequest.html) - * - * 需要基础库: `2.10.3` - * - * 在插件中使用:不支持 - * - * 监听已连接的设备请求读当前外围设备的特征值事件。收到该消息后需要立刻调用 [writeCharacteristicValue](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.writeCharacteristicValue.html) 写回数据,否则主机不会收到响应。 */ - onCharacteristicReadRequest( - /** 已连接的设备请求读当前外围设备的特征值事件的监听函数 */ - listener: OnCharacteristicReadRequestCallback - ): void - /** [BLEPeripheralServer.onCharacteristicSubscribed(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.onCharacteristicSubscribed.html) - * - * 需要基础库: `2.13.0` - * - * 在插件中使用:不支持 - * - * 监听特征订阅事件,仅 iOS 支持。 */ - onCharacteristicSubscribed( - /** 特征订阅事件的监听函数 */ - listener: OnCharacteristicSubscribedCallback - ): void - /** [BLEPeripheralServer.onCharacteristicUnsubscribed(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.onCharacteristicUnsubscribed.html) - * - * 需要基础库: `2.13.0` - * - * 在插件中使用:不支持 - * - * 监听取消特征订阅事件,仅 iOS 支持。 */ - onCharacteristicUnsubscribed( - /** 取消特征订阅事件的监听函数 */ - listener: OnCharacteristicUnsubscribedCallback - ): void - /** [BLEPeripheralServer.onCharacteristicWriteRequest(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.onCharacteristicWriteRequest.html) - * - * 需要基础库: `2.10.3` - * - * 在插件中使用:不支持 - * - * 监听已连接的设备请求写当前外围设备的特征值事件。收到该消息后需要立刻调用 [writeCharacteristicValue](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.writeCharacteristicValue.html) 写回数据,否则主机不会收到响应。 */ - onCharacteristicWriteRequest( - /** 已连接的设备请求写当前外围设备的特征值事件的监听函数 */ - listener: OnCharacteristicWriteRequestCallback - ): void - /** [BLEPeripheralServer.removeService(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.removeService.html) - * - * 需要基础库: `2.10.3` - * - * 在插件中使用:不支持 - * - * 移除服务。 */ - removeService(option: RemoveServiceOption): void - /** [BLEPeripheralServer.startAdvertising(Object Object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.startAdvertising.html) - * - * 需要基础库: `2.10.3` - * - * 在插件中使用:不支持 - * - * 开始广播本地创建的外围设备。 - * - * **注意** - * - * - Android 8.0.9 开始,支持直接使用 16/32/128 位 UUID; - * - Android 8.0.9 以下版本只支持 128 位 UUID,使用 16/32 位的 UUID 时需要进行补位(系统会自动识别是否属于预分配区间),可以参考[蓝牙指南](https://developers.weixin.qq.com/miniprogram/dev/framework/device/ble.html); - * - iOS 必须直接使用 16 位的 UUID,不能补位到 128 位,否则系统组包时仍会按照 128 位传输。iOS 暂不支持 32 位 UUID。 - * - iOS 同时只能发起一个广播,安卓支持同时发起多个广播。 - * - 传 beacon 参数时,不能同时传入 deviceName,serviceUuids,manufacturerData 参数。 */ - startAdvertising(Object: StartAdvertisingObject): void - /** [BLEPeripheralServer.stopAdvertising(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.stopAdvertising.html) - * - * 需要基础库: `2.10.3` - * - * 在插件中使用:不支持 - * - * 停止广播。 */ - stopAdvertising(option?: StopAdvertisingOption): void - /** [BLEPeripheralServer.writeCharacteristicValue(Object Object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.writeCharacteristicValue.html) - * - * 需要基础库: `2.10.3` - * - * 在插件中使用:不支持 - * - * 往指定特征写入二进制数据值,并通知已连接的主机,从机的特征值已发生变化,该接口会处理是走回包还是走订阅。 */ - writeCharacteristicValue(Object: WriteCharacteristicValueObject): void - } - interface BackgroundAudioError { - /** 错误信息 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 10001 | | 系统错误 | - * | 10002 | | 网络错误 | - * | 10003 | | 文件错误,请检查是否responseheader是否缺少Content-Length | - * | 10004 | | 格式错误 | - * | -1 | | 未知错误 | */ errMsg: string - /** 错误码 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 10001 | | 系统错误 | - * | 10002 | | 网络错误 | - * | 10003 | | 文件错误,请检查是否responseheader是否缺少Content-Length | - * | 10004 | | 格式错误 | - * | -1 | | 未知错误 | */ errCode: number - } - interface BeaconError { - /** 错误信息 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 0 | ok | 正常 | - * | 11000 | unsupport | 系统或设备不支持 | - * | 11001 | bluetooth service unavailable | 蓝牙服务不可用 | - * | 11002 | location service unavailable | 位置服务不可用 | - * | 11003 | already start | 已经开始搜索 | - * | 11004 | not startBeaconDiscovery | 还未开始搜索 | - * | 11005 | system error | 系统错误 | - * | 11006 | invalid data | 参数不正确 | */ errMsg: string - /** 错误码 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 0 | ok | 正常 | - * | 11000 | unsupport | 系统或设备不支持 | - * | 11001 | bluetooth service unavailable | 蓝牙服务不可用 | - * | 11002 | location service unavailable | 位置服务不可用 | - * | 11003 | already start | 已经开始搜索 | - * | 11004 | not startBeaconDiscovery | 还未开始搜索 | - * | 11005 | system error | 系统错误 | - * | 11006 | invalid data | 参数不正确 | */ errCode: number - } - interface BluetoothError { - /** 错误信息 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 0 | ok | 正常 | - * | -1 | already connect | 已连接 | - * | 10000 | not init | 未初始化蓝牙适配器 | - * | 10001 | not available | 当前蓝牙适配器不可用 | - * | 10002 | no device | 没有找到指定设备 | - * | 10003 | connection fail | 连接失败 | - * | 10004 | no service | 没有找到指定服务 | - * | 10005 | no characteristic | 没有找到指定特征 | - * | 10006 | no connection | 当前连接已断开 | - * | 10007 | property not support | 当前特征不支持此操作 | - * | 10008 | system error | 其余所有系统上报的异常 | - * | 10009 | system not support | Android 系统特有,系统版本低于 4.3 不支持 BLE | - * | 10012 | operate time out | 连接超时 | - * | 10013 | invalid_data | 连接 deviceId 为空或者是格式不正确 | */ errMsg: string - /** 错误码 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 0 | ok | 正常 | - * | -1 | already connect | 已连接 | - * | 10000 | not init | 未初始化蓝牙适配器 | - * | 10001 | not available | 当前蓝牙适配器不可用 | - * | 10002 | no device | 没有找到指定设备 | - * | 10003 | connection fail | 连接失败 | - * | 10004 | no service | 没有找到指定服务 | - * | 10005 | no characteristic | 没有找到指定特征 | - * | 10006 | no connection | 当前连接已断开 | - * | 10007 | property not support | 当前特征不支持此操作 | - * | 10008 | system error | 其余所有系统上报的异常 | - * | 10009 | system not support | Android 系统特有,系统版本低于 4.3 不支持 BLE | - * | 10012 | operate time out | 连接超时 | - * | 10013 | invalid_data | 连接 deviceId 为空或者是格式不正确 | */ errCode: number - } - interface CameraContext { - /** [CameraContext.setZoom(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/CameraContext.setZoom.html) - * - * 需要基础库: `2.10.0` - * - * 在插件中使用:支持 - * - * 设置缩放级别 */ - setZoom(option: CameraContextSetZoomOption): void - /** [CameraContext.startRecord(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/CameraContext.startRecord.html) - * - * 在插件中使用:支持 - * - * 开始录像 */ - startRecord(option: CameraContextStartRecordOption): void - /** [CameraContext.stopRecord(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/CameraContext.stopRecord.html) - * - * 在插件中使用:支持 - * - * 结束录像 */ - stopRecord(option: CameraContextStopRecordOption): void - /** [CameraContext.takePhoto(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/CameraContext.takePhoto.html) - * - * 在插件中使用:支持 - * - * 拍摄照片 */ - takePhoto(option: TakePhotoOption): void - /** [[CameraFrameListener](https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/CameraFrameListener.html) CameraContext.onCameraFrame(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/CameraContext.onCameraFrame.html) -* -* 需要基础库: `2.7.0` -* -* 在插件中使用:不支持 -* -* 获取 Camera 实时帧数据 -* -* **** -* -* 注: 使用该接口需同时在 [camera](https://developers.weixin.qq.com/miniprogram/dev/component/camera.html) 组件属性中指定 frame-size。 -* -* **示例代码** -* -* ```js -const context = wx.createCameraContext() -const listener = context.onCameraFrame((frame) => { - console.log(frame.data instanceof ArrayBuffer, frame.width, frame.height) -}) -listener.start() -``` */ - onCameraFrame( - /** 回调函数 */ - callback: OnCameraFrameCallback - ): CameraFrameListener - } - interface CameraFrameListener { - /** [CameraFrameListener.start(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/CameraFrameListener.start.html) - * - * 在插件中使用:不支持 - * - * 开始监听帧数据 */ - start(option?: CameraFrameListenerStartOption): void - /** [CameraFrameListener.stop(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/CameraFrameListener.stop.html) - * - * 在插件中使用:不支持 - * - * 停止监听帧数据 */ - stop(option?: StopOption): void - } - interface CanvasGradient { - /** [CanvasGradient.addColorStop(number stop, string color)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasGradient.addColorStop.html) -* -* 在插件中使用:不支持 -* @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [RenderingContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/RenderingContext.html) 替换 -* -* @warning **CanvasContext 是旧版的接口,新版 [Canvas 2D](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 接口与 Web 一致** -* -* 添加颜色的渐变点。小于最小 stop 的部分会按最小 stop 的 color 来渲染,大于最大 stop 的部分会按最大 stop 的 color 来渲染 -* -* **示例代码** -* -* ```js -const ctx = wx.createCanvasContext('myCanvas') - -// Create circular gradient -const grd = ctx.createLinearGradient(30, 10, 120, 10) -grd.addColorStop(0, 'red') -grd.addColorStop(0.16, 'orange') -grd.addColorStop(0.33, 'yellow') -grd.addColorStop(0.5, 'green') -grd.addColorStop(0.66, 'cyan') -grd.addColorStop(0.83, 'blue') -grd.addColorStop(1, 'purple') - -// Fill with gradient -ctx.setFillStyle(grd) -ctx.fillRect(10, 10, 150, 80) -ctx.draw() -``` -* ![](@program/dev/image/canvas/color-stop.png) */ - addColorStop( - /** 表示渐变中开始与结束之间的位置,范围 0-1。 */ - stop: number, - /** 渐变点的颜色。 */ - color: string - ): void - } - interface CommonPaymentError { - /** 错误信息 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 1000 | | 系统错误 | - * | 1022 | | 参数json格式非法 | - * | 702001 | | 参数错误,具体原因见errMsg | - * | 702002 | | 用户态签名错误 | - * | 702003 | | 支付签名错误 | - * | 702004 | | mode不合法 | - * | 702005 | | out_trade_no重复,请更换新单号重试 | - * | 702006 | | 二级商户进件未完成 | - * | 702007 | | 用户未授权给品牌 | - * | 702008 | | 正式版小程序只能用生产环境下单 | */ errMsg: string - /** 错误码 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 1000 | | 系统错误 | - * | 1022 | | 参数json格式非法 | - * | 702001 | | 参数错误,具体原因见errMsg | - * | 702002 | | 用户态签名错误 | - * | 702003 | | 支付签名错误 | - * | 702004 | | mode不合法 | - * | 702005 | | out_trade_no重复,请更换新单号重试 | - * | 702006 | | 二级商户进件未完成 | - * | 702007 | | 用户未授权给品牌 | - * | 702008 | | 正式版小程序只能用生产环境下单 | */ errCode: number - } - interface Console { - /** [console.debug()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/console.debug.html) - * - * 在插件中使用:不支持 - * - * 向调试面板中打印 debug 日志 */ - debug( - /** 日志内容,可以有任意多个。 */ - ...args: any[] - ): void - /** [console.error()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/console.error.html) - * - * 在插件中使用:不支持 - * - * 向调试面板中打印 error 日志 */ - error( - /** 日志内容,可以有任意多个。 */ - ...args: any[] - ): void - /** [console.group(string label)](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/console.group.html) - * - * 在插件中使用:不支持 - * - * 在调试面板中创建一个新的分组。随后输出的内容都会被添加一个缩进,表示该内容属于当前分组。调用 [console.groupEnd](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/console.groupEnd.html)之后分组结束。 - * - * **注意** - * - * 仅在工具中有效,在 vConsole 中为空函数实现。 */ - group( - /** 分组标记,可选。 */ - label?: string - ): void - /** [console.groupEnd()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/console.groupEnd.html) - * - * 在插件中使用:不支持 - * - * 结束由 [console.group](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/console.group.html) 创建的分组 - * - * **注意** - * - * 仅在工具中有效,在 vConsole 中为空函数实现。 */ - groupEnd(): void - /** [console.info()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/console.info.html) - * - * 在插件中使用:不支持 - * - * 向调试面板中打印 info 日志 */ - info( - /** 日志内容,可以有任意多个。 */ - ...args: any[] - ): void - /** [console.log()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/console.log.html) - * - * 在插件中使用:不支持 - * - * 向调试面板中打印 log 日志 */ - log( - /** 日志内容,可以有任意多个。 */ - ...args: any[] - ): void - /** [console.warn()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/console.warn.html) - * - * 在插件中使用:不支持 - * - * 向调试面板中打印 warn 日志 */ - warn( - /** 日志内容,可以有任意多个。 */ - ...args: any[] - ): void - } - interface DownloadTask { - /** [DownloadTask.abort()](https://developers.weixin.qq.com/miniprogram/dev/api/network/download/DownloadTask.abort.html) - * - * 需要基础库: `1.4.0` - * - * 在插件中使用:支持 - * - * 中断下载任务 */ - abort(): void - /** [DownloadTask.offHeadersReceived(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/download/DownloadTask.offHeadersReceived.html) -* -* 需要基础库: `2.1.0` -* -* 在插件中使用:支持 -* -* 移除 HTTP Response Header 事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -DownloadTask.onHeadersReceived(listener) -DownloadTask.offHeadersReceived(listener) // 需传入与监听时同一个的函数对象 -``` */ - offHeadersReceived( - /** onHeadersReceived 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: DownloadTaskOffHeadersReceivedCallback - ): void - /** [DownloadTask.offProgressUpdate(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/download/DownloadTask.offProgressUpdate.html) -* -* 需要基础库: `2.1.0` -* -* 在插件中使用:支持 -* -* 移除下载进度变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -DownloadTask.onProgressUpdate(listener) -DownloadTask.offProgressUpdate(listener) // 需传入与监听时同一个的函数对象 -``` */ - offProgressUpdate( - /** onProgressUpdate 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: DownloadTaskOffProgressUpdateCallback - ): void - /** [DownloadTask.onHeadersReceived(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/download/DownloadTask.onHeadersReceived.html) - * - * 需要基础库: `2.1.0` - * - * 在插件中使用:支持 - * - * 监听 HTTP Response Header 事件。会比请求完成事件更早 */ - onHeadersReceived( - /** HTTP Response Header 事件的监听函数 */ - listener: DownloadTaskOnHeadersReceivedCallback - ): void - /** [DownloadTask.onProgressUpdate(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/download/DownloadTask.onProgressUpdate.html) - * - * 需要基础库: `1.4.0` - * - * 在插件中使用:支持 - * - * 监听下载进度变化事件 */ - onProgressUpdate( - /** 下载进度变化事件的监听函数 */ - listener: DownloadTaskOnProgressUpdateCallback - ): void - } - interface DraggableSheetContext { - /** [DraggableSheetContext.scrollTo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/skyline/DraggableSheetContext.scrollTo.html) -* -* 需要基础库: `3.2.0` -* -* 在插件中使用:支持 -* -* 滚动到指定位置。`size` 取值 `[0, 1]`,`size = 1` 时表示撑满 `draggable-sheet` 组件。`size` 和 `pixels` 同时传入时,仅 size 生效。 -* -* **示例代码** -* -* ```javascript -Page({ - onReady() { - this.createSelectorQuery() - .select(".sheet") - .node() - .exec(res => { - const sheetContext = res[0].node - sheetContext.scrollTo({ - size: 0.7, - animated: true, - duration: 300, - easingFunction: 'ease' - }) - }, -}) -``` */ - scrollTo(option: DraggableSheetContextScrollToOption): void - } - interface EditorContext { - /** [EditorContext.blur(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.blur.html) - * - * 需要基础库: `2.8.3` - * - * 在插件中使用:支持 - * - * 编辑器失焦,同时收起键盘。 */ - blur(option?: BlurOption): void - /** [EditorContext.clear(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.clear.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 清空编辑器内容 */ - clear(option?: ClearOption): void - /** [EditorContext.format(string name, string value)](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.format.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 修改样式 - * - * **** - * - * ## 支持设置的样式列表 - * | name | value | verson | - * | --------------------------------------------------------- | ------------------------------- | ------ | - * | bold | | 2.7.0 | - * | italic | | 2.7.0 | - * | underline | | 2.7.0 | - * | strike | | 2.7.0 | - * | ins | | 2.7.0 | - * | script | sub / super | 2.7.0 | - * | header | H1 / H2 / h3 / H4 / h5 / H6 | 2.7.0 | - * | align | left / center / right / justify | 2.7.0 | - * | direction | rtl | 2.7.0 | - * | indent | -1 / +1 | 2.7.0 | - * | list | ordered / bullet / check | 2.7.0 | - * | color | hex color | 2.7.0 | - * | backgroundColor | hex color | 2.7.0 | - * | margin/marginTop/marginBottom/marginLeft/marginRight | css style | 2.7.0 | - * | padding/paddingTop/paddingBottom/paddingLeft/paddingRight | css style | 2.7.0 | - * | font/fontSize/fontStyle/fontVariant/fontWeight/fontFamily | css style | 2.7.0 | - * | lineHeight | css style | 2.7.0 | - * | letterSpacing | css style | 2.7.0 | - * | textDecoration | css style | 2.7.0 | - * | textIndent | css style | 2.8.0 | - * | wordWrap | css style | 2.10.2 | - * | wordBreak | css style | 2.10.2 | - * | whiteSpace | css style | 2.10.2 | - * - * 对已经应用样式的选区设置会取消样式。css style 表示 css 中规定的允许值。 */ - format( - /** 属性 */ - name: string, - /** 值 */ - value?: string - ): void - /** [EditorContext.getContents(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.getContents.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 获取编辑器内容 */ - getContents(option?: GetContentsOption): void - /** [EditorContext.getSelectionText(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.getSelectionText.html) - * - * 需要基础库: `2.10.2` - * - * 在插件中使用:支持 - * - * 获取编辑器已选区域内的纯文本内容。当编辑器失焦或未选中一段区间时,返回内容为空。 */ - getSelectionText(option?: GetSelectionTextOption): void - /** [EditorContext.insertDivider(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.insertDivider.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 插入分割线 */ - insertDivider(option?: InsertDividerOption): void - /** [EditorContext.insertImage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.insertImage.html) -* -* 需要基础库: `2.7.0` -* -* 在插件中使用:支持 -* -* 插入图片。 -* -* 地址为临时文件时,获取的编辑器html格式内容中 标签增加属性 data-local,delta 格式内容中图片 attributes 属性增加 data-local 字段,该值为传入的临时文件地址。 -* -* 开发者可选择在提交阶段上传图片到服务器,获取到网络地址后进行替换。替换时对于html内容应替换掉 的 src 值,对于 delta 内容应替换掉 `insert { image: abc }` 值。 -* -* **示例代码** -* -* ```javascript -this.editorCtx.insertImage({ - src: 'xx', - width: '100px', - height: '50px', - extClass: className -}) -``` */ - insertImage(option: InsertImageOption): void - /** [EditorContext.insertText(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.insertText.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 覆盖当前选区,设置一段文本 */ - insertText(option: InsertTextOption): void - /** [EditorContext.redo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.redo.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 恢复 */ - redo(option?: RedoOption): void - /** [EditorContext.removeFormat(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.removeFormat.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 清除当前选区的样式 */ - removeFormat(option?: RemoveFormatOption): void - /** [EditorContext.scrollIntoView()](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.scrollIntoView.html) - * - * 需要基础库: `2.8.3` - * - * 在插件中使用:支持 - * - * 使得编辑器光标处滚动到窗口可视区域内。 */ - scrollIntoView(): void - /** [EditorContext.setContents(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.setContents.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 初始化编辑器内容,html和delta同时存在时仅delta生效 */ - setContents(option: SetContentsOption): void - /** [EditorContext.undo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.undo.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 撤销 */ - undo(option?: UndoOption): void - } - interface EntryList { - /** [Array.<[PerformanceEntry](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/PerformanceEntry.html)> EntryList.getEntries()](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/EntryList.getEntries.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 该方法返回当前列表中的所有性能数据 */ - getEntries(): PerformanceEntry[] - /** [Array.<[PerformanceEntry](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/PerformanceEntry.html)> EntryList.getEntriesByName(string name, string entryType)](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/EntryList.getEntriesByName.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 获取当前列表中所有名称为 [name] 且类型为 [entryType] 的性能数据 */ - getEntriesByName( - name: string, - entryType?: string - ): PerformanceEntry[] - /** [Array.<[PerformanceEntry](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/PerformanceEntry.html)> EntryList.getEntriesByType(string entryType)](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/EntryList.getEntriesByType.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 获取当前列表中所有类型为 [entryType] 的性能数据 */ - getEntriesByType(entryType: string): PerformanceEntry[] - } - interface EventChannel { - /** [EventChannel.emit(string eventName, any args)](https://developers.weixin.qq.com/miniprogram/dev/api/route/EventChannel.emit.html) - * - * 需要基础库: `2.7.3` - * - * 在插件中使用:支持 - * - * 触发一个事件 */ - emit( - /** 事件名称 */ - eventName: string, - /** 事件参数 */ - ...args: any - ): void - /** [EventChannel.off(string eventName, function fn)](https://developers.weixin.qq.com/miniprogram/dev/api/route/EventChannel.off.html) - * - * 需要基础库: `2.7.3` - * - * 在插件中使用:支持 - * - * 取消监听一个事件。给出第二个参数时,只取消给出的监听函数,否则取消所有监听函数 */ - off( - /** 事件名称 */ - eventName: string, - /** 事件监听函数 */ - fn: EventCallback - ): void - /** [EventChannel.on(string eventName, function fn)](https://developers.weixin.qq.com/miniprogram/dev/api/route/EventChannel.on.html) - * - * 需要基础库: `2.7.3` - * - * 在插件中使用:支持 - * - * 持续监听一个事件 */ - on( - /** 事件名称 */ - eventName: string, - /** 事件监听函数 */ - fn: EventCallback - ): void - /** [EventChannel.once(string eventName, function fn)](https://developers.weixin.qq.com/miniprogram/dev/api/route/EventChannel.once.html) - * - * 需要基础库: `2.7.3` - * - * 在插件中使用:支持 - * - * 监听一个事件一次,触发后失效 */ - once( - /** 事件名称 */ - eventName: string, - /** 事件监听函数 */ - fn: EventCallback - ): void - } - interface FileError { - /** 错误信息 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 1300001 | operation not permitted | 操作不被允许(例如,filePath 预期传入一个文件而实际传入一个目录) | - * | 1300002 | no such file or directory ${path} | 文件/目录不存在,或者目标文件路径的上层目录不存在 | - * | 1300005 | Input/output error | 输入输出流不可用 | - * | 1300009 | bad file descriptor | 无效的文件描述符 | - * | 1300013 | permission denied | 权限错误,文件是只读或只写 | - * | 1300014 | Path permission denied | 传入的路径没有权限 | - * | 1300020 | not a directory | dirPath 指定路径不是目录,常见于指定的写入路径的上级路径为一个文件的情况 | - * | 1300021 | Is a directory | 指定路径是一个目录 | - * | 1300022 | Invalid argument | 无效参数,可以检查length或offset是否越界 | - * | 1300036 | File name too long | 文件名过长 | - * | 1300066 | directory not empty | 目录不为空 | - * | 1300201 | system error | 系统接口调用失败 | - * | 1300202 | the maximum size of the file storage limit is exceeded | 存储空间不足,或文件大小超出上限(上限100M) | - * | 1300203 | base64 encode error | 字符编码转换失败(例如 base64 格式错误) | - * | 1300300 | sdcard not mounted | android sdcard 挂载失败 | - * | 1300301 | unable to open as fileType | 无法以fileType打开文件 | - * | 1301000 | permission denied, cannot access file path | 目标路径无访问权限(usr目录) | - * | 1301002 | data to write is empty | 写入数据为空 | - * | 1301003 | illegal operation on a directory | 不可对目录进行此操作(例如,指定的 filePath 是一个已经存在的目录) | - * | 1301004 | illegal operation on a package directory | 不可对代码包目录进行此操作 | - * | 1301005 | file already exists ${dirPath} | 已有同名文件或目录 | - * | 1301006 | value of length is out of range | 传入的 length 不合法 | - * | 1301007 | value of offset is out of range | 传入的 offset 不合法 | - * | 1301009 | value of position is out of range | position值越界 | - * | 1301100 | store directory is empty | store目录为空 | - * | 1301102 | unzip open file fail | 压缩文件打开失败 | - * | 1301103 | unzip entry fail | 解压单个文件失败 | - * | 1301104 | unzip fail | 解压失败 | - * | 1301111 | brotli decompress fail | brotli解压失败(例如,指定的 compressionAlgorithm 与文件实际压缩格式不符) | - * | 1301112 | tempFilePath file not exist | 指定的 tempFilePath 找不到文件 | - * | 1302001 | fail permission denied | 指定的 fd 路径没有读权限/没有写权限 | - * | 1302002 | excced max concurrent fd limit | fd数量已达上限 | - * | 1302003 | invalid flag | 无效的flag | - * | 1302004 | permission denied when open using flag | 无法使用flag标志打开文件 | - * | 1302005 | array buffer does not exist | 未传入arrayBuffer | - * | 1302100 | array buffer is readonly | arrayBuffer只读 | */ errMsg: string - /** 错误码 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 1300001 | operation not permitted | 操作不被允许(例如,filePath 预期传入一个文件而实际传入一个目录) | - * | 1300002 | no such file or directory ${path} | 文件/目录不存在,或者目标文件路径的上层目录不存在 | - * | 1300005 | Input/output error | 输入输出流不可用 | - * | 1300009 | bad file descriptor | 无效的文件描述符 | - * | 1300013 | permission denied | 权限错误,文件是只读或只写 | - * | 1300014 | Path permission denied | 传入的路径没有权限 | - * | 1300020 | not a directory | dirPath 指定路径不是目录,常见于指定的写入路径的上级路径为一个文件的情况 | - * | 1300021 | Is a directory | 指定路径是一个目录 | - * | 1300022 | Invalid argument | 无效参数,可以检查length或offset是否越界 | - * | 1300036 | File name too long | 文件名过长 | - * | 1300066 | directory not empty | 目录不为空 | - * | 1300201 | system error | 系统接口调用失败 | - * | 1300202 | the maximum size of the file storage limit is exceeded | 存储空间不足,或文件大小超出上限(上限100M) | - * | 1300203 | base64 encode error | 字符编码转换失败(例如 base64 格式错误) | - * | 1300300 | sdcard not mounted | android sdcard 挂载失败 | - * | 1300301 | unable to open as fileType | 无法以fileType打开文件 | - * | 1301000 | permission denied, cannot access file path | 目标路径无访问权限(usr目录) | - * | 1301002 | data to write is empty | 写入数据为空 | - * | 1301003 | illegal operation on a directory | 不可对目录进行此操作(例如,指定的 filePath 是一个已经存在的目录) | - * | 1301004 | illegal operation on a package directory | 不可对代码包目录进行此操作 | - * | 1301005 | file already exists ${dirPath} | 已有同名文件或目录 | - * | 1301006 | value of length is out of range | 传入的 length 不合法 | - * | 1301007 | value of offset is out of range | 传入的 offset 不合法 | - * | 1301009 | value of position is out of range | position值越界 | - * | 1301100 | store directory is empty | store目录为空 | - * | 1301102 | unzip open file fail | 压缩文件打开失败 | - * | 1301103 | unzip entry fail | 解压单个文件失败 | - * | 1301104 | unzip fail | 解压失败 | - * | 1301111 | brotli decompress fail | brotli解压失败(例如,指定的 compressionAlgorithm 与文件实际压缩格式不符) | - * | 1301112 | tempFilePath file not exist | 指定的 tempFilePath 找不到文件 | - * | 1302001 | fail permission denied | 指定的 fd 路径没有读权限/没有写权限 | - * | 1302002 | excced max concurrent fd limit | fd数量已达上限 | - * | 1302003 | invalid flag | 无效的flag | - * | 1302004 | permission denied when open using flag | 无法使用flag标志打开文件 | - * | 1302005 | array buffer does not exist | 未传入arrayBuffer | - * | 1302100 | array buffer is readonly | arrayBuffer只读 | */ errCode: number - } - interface FileSystemManager { - /** [Array.<string> FileSystemManager.readdirSync(string dirPath)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readdirSync.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* [FileSystemManager.readdir](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readdir.html) 的同步版本 -* -* **注意事项 -* - readdir接口无法访问文件系统根路径(wxfile://)。 -* 示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.readdir({ - dirPath: `${wx.env.USER_DATA_PATH}/example`, - success(res) { - console.log(res.files) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - const res = fs.readdirSync(`${wx.env.USER_DATA_PATH}/example`) - console.log(res) -} catch(e) { - console.error(e) -} -``` */ - readdirSync( - /** 要读取的目录路径 (本地路径) */ - dirPath: string - ): string[] - /** [ArrayBuffer FileSystemManager.readCompressedFileSync(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readCompressedFileSync.html) -* -* 需要基础库: `2.21.1` -* -* 在插件中使用:不支持 -* -* 同步读取指定压缩类型的本地文件内容 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() - -// 异步接口 -fs.readCompressedFile({ - filePath: '${wx.env.USER_DATA_PATH}/hello.br', - compressionAlgorithm: 'br', - success(res) { - console.log(res.data) - }, - fail(res) { - console.log('readCompressedFile fail', res) - } -}) - -// 同步接口 -try { - const data = fs.readCompressedFileSync({ - filePath: '${wx.env.USER_DATA_PATH}/hello.br', - compressionAlgorithm: 'br', - }) - console.log(data) -} catch (err) { - console.log(err) -} -``` */ - readCompressedFileSync( - option: ReadCompressedFileSyncOption - ): ArrayBuffer - /** [FileSystemManager.access(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.access.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 判断文件/目录是否存在 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -// 判断文件/目录是否存在 -fs.access({ - path: `${wx.env.USER_DATA_PATH}/hello.txt`, - success(res) { - // 文件存在 - console.log(res) - }, - fail(res) { - // 文件不存在或其他错误 - console.error(res) - } -}) - -// 同步接口 -try { - fs.accessSync(`${wx.env.USER_DATA_PATH}/hello.txt`) -} catch(e) { - console.error(e) -} -``` */ - access(option: AccessOption): void - /** [FileSystemManager.accessSync(string path)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.accessSync.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* [FileSystemManager.access](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.access.html) 的同步版本 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -// 判断文件/目录是否存在 -fs.access({ - path: `${wx.env.USER_DATA_PATH}/hello.txt`, - success(res) { - // 文件存在 - console.log(res) - }, - fail(res) { - // 文件不存在或其他错误 - console.error(res) - } -}) - -// 同步接口 -try { - fs.accessSync(`${wx.env.USER_DATA_PATH}/hello.txt`) -} catch(e) { - console.error(e) -} -``` */ - accessSync( - /** 要判断是否存在的文件/目录路径 (本地路径) */ - path: string - ): void - /** [FileSystemManager.appendFile(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.appendFile.html) -* -* 需要基础库: `2.1.0` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 在文件结尾追加内容 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() - -fs.appendFile({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - data: 'some text', - encoding: 'utf8', - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - fs.appendFileSync(`${wx.env.USER_DATA_PATH}/hello.txt`, 'some text', 'utf8') -} catch(e) { - console.error(e) -} -``` */ - appendFile(option: AppendFileOption): void - /** [FileSystemManager.appendFileSync(string filePath, string|ArrayBuffer data, string encoding)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.appendFileSync.html) -* -* 需要基础库: `2.1.0` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* [FileSystemManager.appendFile](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.appendFile.html) 的同步版本 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() - -fs.appendFile({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - data: 'some text', - encoding: 'utf8', - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - fs.appendFileSync(`${wx.env.USER_DATA_PATH}/hello.txt`, 'some text', 'utf8') -} catch(e) { - console.error(e) -} -``` */ - appendFileSync( - /** 要追加内容的文件路径 (本地路径) */ - filePath: string, - /** 要追加的文本或二进制数据 */ - data: string | ArrayBuffer, - /** 指定写入文件的字符编码 - * - * 参数 encoding 可选值: - * - 'ascii': ; - * - 'base64': ; - * - 'binary': ; - * - 'hex': ; - * - 'ucs2': 以小端序读取; - * - 'ucs-2': 以小端序读取; - * - 'utf16le': 以小端序读取; - * - 'utf-16le': 以小端序读取; - * - 'utf-8': ; - * - 'utf8': ; - * - 'latin1': ; */ - encoding?: - | 'ascii' - | 'base64' - | 'binary' - | 'hex' - | 'ucs2' - | 'ucs-2' - | 'utf16le' - | 'utf-16le' - | 'utf-8' - | 'utf8' - | 'latin1' - ): void - /** [FileSystemManager.close(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.close.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 关闭文件 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -// 打开文件 -fs.open({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - flag: 'a+', - success(res) { - // 关闭文件 - fs.close({ - fd: res.fd - }) - } -}) -``` */ - close(option: FileSystemManagerCloseOption): void - /** [FileSystemManager.copyFile(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.copyFile.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 复制文件 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.copyFile({ - srcPath: `${wx.env.USER_DATA_PATH}/hello.txt`, - destPath: `${wx.env.USER_DATA_PATH}/hello_copy.txt` - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - fs.copyFileSync( - `${wx.env.USER_DATA_PATH}/hello.txt`, - `${wx.env.USER_DATA_PATH}/hello_copy.txt` - ) -} catch(e) { - console.error(e) -} -``` */ - copyFile(option: CopyFileOption): void - /** [FileSystemManager.copyFileSync(string srcPath, string destPath)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.copyFileSync.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* [FileSystemManager.copyFile](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.copyFile.html) 的同步版本 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.copyFile({ - srcPath: `${wx.env.USER_DATA_PATH}/hello.txt`, - destPath: `${wx.env.USER_DATA_PATH}/hello_copy.txt` - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - fs.copyFileSync( - `${wx.env.USER_DATA_PATH}/hello.txt`, - `${wx.env.USER_DATA_PATH}/hello_copy.txt` - ) -} catch(e) { - console.error(e) -} -``` */ - copyFileSync( - /** 源文件路径,支持本地路径 */ - srcPath: string, - /** 目标文件路径,支持本地路径 */ - destPath: string - ): void - /** [FileSystemManager.fstat(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.fstat.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 获取文件的状态信息 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -// 打开文件 -fs.open({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - flag: 'a+', - success(res) { - // 获取文件的状态信息 - fs.fstat({ - fd: res.fd, - success(res) { - console.log(res.stats) - } - }) - } -}) -``` */ - fstat(option: FstatOption): void - /** [FileSystemManager.ftruncate(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.ftruncate.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 对文件内容进行截断操作 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -// 打开文件 -fs.open({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - flag: 'a+', - success(res) { - // 对文件内容进行截断操作 - fs.ftruncate({ - fd: res.fd, - length: 10, // 从第10个字节开始截断文件 - success(res) { - console.log(res) - } - }) - } -}) -``` */ - ftruncate(option: FtruncateOption): void - /** [FileSystemManager.getFileInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.getFileInfo.html) - * - * 在插件中使用:不支持 - * - * 获取该小程序下的 本地临时文件 或 本地缓存文件 信息 */ - getFileInfo(option: GetFileInfoOption): void - /** [FileSystemManager.getSavedFileList(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.getSavedFileList.html) - * - * 在插件中使用:不支持 - * - * 获取该小程序下已保存的本地缓存文件列表 */ - getSavedFileList(option?: GetSavedFileListOption): void - /** [FileSystemManager.mkdir(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.mkdir.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 创建目录 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.mkdir({ - dirPath: `${wx.env.USER_DATA_PATH}/example`, - recursive: false, - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - fs.mkdirSync(`${wx.env.USER_DATA_PATH}/example`, false) -} catch(e) { - console.error(e) -} -``` */ - mkdir(option: MkdirOption): void - /** [FileSystemManager.mkdirSync(string dirPath, boolean recursive)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.mkdirSync.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* [FileSystemManager.mkdir](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.mkdir.html) 的同步版本 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.mkdir({ - dirPath: `${wx.env.USER_DATA_PATH}/example`, - recursive: false, - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - fs.mkdirSync(`${wx.env.USER_DATA_PATH}/example`, false) -} catch(e) { - console.error(e) -} -``` */ - mkdirSync( - /** 创建的目录路径 (本地路径) */ - dirPath: string, - /** 需要基础库: `2.3.0` - * - * 是否在递归创建该目录的上级目录后再创建该目录。如果对应的上级目录已经存在,则不创建该上级目录。如 dirPath 为 a/b/c/d 且 recursive 为 true,将创建 a 目录,再在 a 目录下创建 b 目录,以此类推直至创建 a/b/c 目录下的 d 目录。 */ - recursive?: boolean - ): void - /** [FileSystemManager.open(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.open.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 打开文件,返回文件描述符 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.open({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - flag: 'a+', - success(res) { - console.log(res.fd) - } -}) -``` */ - open(option: OpenOption): void - /** [FileSystemManager.read(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.read.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 读文件 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -const ab = new ArrayBuffer(1024) -// 打开文件 -fs.open({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - flag: 'a+', - success(res) { - // 读取文件到 ArrayBuffer 中 - fs.read({ - fd: res.fd, - arrayBuffer: ab, - length: 10, - success(res) { - console.log(res) - } - }) - } -}) -``` -* ## 注意事项 -* - 小游戏 iOS 高性能模式(iOSHighPerformance)暂不支持 FileSystemManager.read 接口,请使用 FileSystemManager.readFile 接口代替 */ - read(option: ReadOption): void - /** [FileSystemManager.readCompressedFile(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readCompressedFile.html) -* -* 需要基础库: `2.21.1` -* -* 在插件中使用:不支持 -* -* 读取指定压缩类型的本地文件内容 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() - -// 异步接口 -fs.readCompressedFile({ - filePath: '${wx.env.USER_DATA_PATH}/hello.br', - compressionAlgorithm: 'br', - success(res) { - console.log(res.data) - }, - fail(res) { - console.log('readCompressedFile fail', res) - } -}) - -// 同步接口 -const data = fs.readCompressedFileSync({ - filePath: '${wx.env.USER_DATA_PATH}/hello.br', - compressionAlgorithm: 'br', -}) -console.log(data) -``` */ - readCompressedFile(option: ReadCompressedFileOption): void - /** [FileSystemManager.readFile(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readFile.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 读取本地文件内容。单个文件大小上限为100M。 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.readFile({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - encoding: 'utf8', - position: 0, - success(res) { - console.log(res.data) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - const res = fs.readFileSync(`${wx.env.USER_DATA_PATH}/hello.txt`, 'utf8', 0) - console.log(res) -} catch(e) { - console.error(e) -} -``` */ - readFile(option: ReadFileOption): void - /** [FileSystemManager.readZipEntry(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readZipEntry.html) -* -* 需要基础库: `2.17.3` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 读取压缩包内的文件 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -// 读取zip内某个或多个文件 -fs.readZipEntry({ - filePath: 'wxfile://from/to.zip', - entries: [{ - path: 'some_folder/my_file.txt', // zip内文件路径 - encoding: 'utf-8', // 指定读取文件的字符编码,如果不传 encoding,则以 ArrayBuffer 格式读取文件的二进制内容 - position: 0, // 从文件指定位置开始读,如果不指定,则从文件头开始读。读取的范围应该是左闭右开区间 [position, position+length)。有效范围:[0, fileLength - 1]。单位:byte - length: 10000, // 指定文件的长度,如果不指定,则读到文件末尾。有效范围:[1, fileLength]。单位:byte - }, { - path: 'other_folder/orther_file.txt', // zip内文件路径 - }], - success(res) { - console.log(res.entries) - // res.entries === { - // 'some_folder/my_file.txt': { - // errMsg: 'readZipEntry:ok', - // data: 'xxxxxx' - // }, - // 'other_folder/orther_file.txt': { - // data: (ArrayBuffer) - // } - // } - }, - fail(res) { - console.log(res.errMsg) - }, -}) - -// 读取zip内所有文件。允许指定统一的encoding。position、length则不再允许指定,分别默认为0和文件长度 -fs.readZipEntry({ - filePath: 'wxfile://from/to.zip', - entries: 'all' - encoding: 'utf-8', // 统一指定读取文件的字符编码,如果不传 encoding,则以 ArrayBuffer 格式读取文件的二进制内容 - success(res) { - console.log(res.entries) - // res.entries === { - // 'some_folder/my_file.txt': { - // errMsg: 'readZipEntry:ok', - // data: 'xxxxxx' - // }, - // 'other_folder/orther_file.txt': { - // errMsg: 'readZipEntry:ok', - // data: 'xxxxxx' - // } - // } - }, - fail(res) { - console.log(res.errMsg) - }, -}) -``` */ - readZipEntry(option: ReadZipEntryOption): void - /** [FileSystemManager.readdir(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readdir.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 读取目录内文件列表 -* -* **注意事项 -* - readdir接口无法访问文件系统根路径(wxfile://)。 -* 示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.readdir({ - dirPath: `${wx.env.USER_DATA_PATH}/example`, - success(res) { - console.log(res.files) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - const res = fs.readdirSync(`${wx.env.USER_DATA_PATH}/example`) - console.log(res) -} catch(e) { - console.error(e) -} -``` */ - readdir(option: ReaddirOption): void - /** [FileSystemManager.removeSavedFile(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.removeSavedFile.html) - * - * 在插件中使用:不支持 - * - * 删除该小程序下已保存的本地缓存文件 */ - removeSavedFile(option: RemoveSavedFileOption): void - /** [FileSystemManager.rename(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.rename.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 重命名文件。可以把文件从 oldPath 移动到 newPath -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.rename({ - oldPath: `${wx.env.USER_DATA_PATH}/hello.txt`, - newPath: `${wx.env.USER_DATA_PATH}/hello_new.txt`, - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - const res = fs.renameSync( - `${wx.env.USER_DATA_PATH}/hello.txt`, - `${wx.env.USER_DATA_PATH}/hello_new.txt` - ) - console.log(res) -} catch(e) { - console.error(e) -} -``` */ - rename(option: RenameOption): void - /** [FileSystemManager.renameSync(string oldPath, string newPath)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.renameSync.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* [FileSystemManager.rename](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.rename.html) 的同步版本 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.rename({ - oldPath: `${wx.env.USER_DATA_PATH}/hello.txt`, - newPath: `${wx.env.USER_DATA_PATH}/hello_new.txt`, - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - const res = fs.renameSync( - `${wx.env.USER_DATA_PATH}/hello.txt`, - `${wx.env.USER_DATA_PATH}/hello_new.txt` - ) - console.log(res) -} catch(e) { - console.error(e) -} -``` */ - renameSync( - /** 源文件路径,支持本地路径 */ - oldPath: string, - /** 新文件路径,支持本地路径 */ - newPath: string - ): void - /** [FileSystemManager.rmdir(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.rmdir.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 删除目录 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.rmdir({ - dirPath: `${wx.env.USER_DATA_PATH}/example`, - recursive: false, - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - const res = fs.rmdirSync(`${wx.env.USER_DATA_PATH}/example`, false) - console.log(res) -} catch(e) { - console.error(e) -} -``` */ - rmdir(option: RmdirOption): void - /** [FileSystemManager.rmdirSync(string dirPath, boolean recursive)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.rmdirSync.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* [FileSystemManager.rmdir](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.rmdir.html) 的同步版本 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.rmdir({ - dirPath: `${wx.env.USER_DATA_PATH}/example`, - recursive: false, - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - const res = fs.rmdirSync(`${wx.env.USER_DATA_PATH}/example`, false) - console.log(res) -} catch(e) { - console.error(e) -} -``` */ - rmdirSync( - /** 要删除的目录路径 (本地路径) */ - dirPath: string, - /** 需要基础库: `2.3.0` - * - * 是否递归删除目录。如果为 true,则删除该目录和该目录下的所有子目录以及文件。 */ - recursive?: boolean - ): void - /** [FileSystemManager.saveFile(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.saveFile.html) - * - * 在插件中使用:不支持 - * - * 保存临时文件到本地。此接口会移动临时文件,因此调用成功后,tempFilePath 将不可用。 */ - saveFile(option: SaveFileOption): void - /** [FileSystemManager.stat(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.stat.html) - * - * 在插件中使用:需要基础库 `2.19.2` - * - * 获取文件 Stats 对象 */ - stat(option: StatOption): void - /** [FileSystemManager.truncate(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.truncate.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 对文件内容进行截断操作 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.truncate({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - length: 10, // 从第10个字节开始截断 - success(res) { - console.log(res) - } -}) -``` */ - truncate(option: TruncateOption): void - /** [FileSystemManager.unlink(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.unlink.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 删除文件 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.unlink({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - const res = fs.unlinkSync(`${wx.env.USER_DATA_PATH}/hello.txt`) - console.log(res) -} catch(e) { - console.error(e) -} -``` */ - unlink(option: UnlinkOption): void - /** [FileSystemManager.unlinkSync(string filePath)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.unlinkSync.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* [FileSystemManager.unlink](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.unlink.html) 的同步版本 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.unlink({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - const res = fs.unlinkSync(`${wx.env.USER_DATA_PATH}/hello.txt`) - console.log(res) -} catch(e) { - console.error(e) -} -``` */ - unlinkSync( - /** 要删除的文件路径 (本地路径) */ - filePath: string - ): void - /** [FileSystemManager.unzip(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.unzip.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 解压文件 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.unzip({ - zipFilePath: `${wx.env.USER_DATA_PATH}/example.zip`, - targetPath: '${wx.env.USER_DATA_PATH}/example', - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) -``` */ - unzip(option: UnzipOption): void - /** [FileSystemManager.write(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.write.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 写入文件 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -// 打开文件 -fs.open({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - flag: 'a+', - success(res) { - // 写入文件 - fs.write({ - fd: res.fd, - data: 'some text', - success(res) { - console.log(res.bytesWritten) - } - }) - } -}) -``` */ - write(option: WriteOption): void - /** [FileSystemManager.writeFile(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.writeFile.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 写文件 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.writeFile({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - data: 'some text or arrayBuffer', - encoding: 'utf8', - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - const res = fs.writeFileSync( - `${wx.env.USER_DATA_PATH}/hello.txt`, - 'some text or arrayBuffer', - 'utf8' - ) - console.log(res) -} catch(e) { - console.error(e) -} -``` */ - writeFile(option: WriteFileOption): void - /** [FileSystemManager.writeFileSync(string filePath, string|ArrayBuffer data, string encoding)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.writeFileSync.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* [FileSystemManager.writeFile](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.writeFile.html) 的同步版本 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.writeFile({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - data: 'some text or arrayBuffer', - encoding: 'utf8', - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - const res = fs.writeFileSync( - `${wx.env.USER_DATA_PATH}/hello.txt`, - 'some text or arrayBuffer', - 'utf8' - ) - console.log(res) -} catch(e) { - console.error(e) -} -``` */ - writeFileSync( - /** 要写入的文件路径 (本地路径) */ - filePath: string, - /** 要写入的文本或二进制数据 */ - data: string | ArrayBuffer, - /** 指定写入文件的字符编码 - * - * 参数 encoding 可选值: - * - 'ascii': ; - * - 'base64': (注意,选择 base64 编码,data 只需要传 base64 内容本身,不要传 Data URI 前缀,否则会报 fail base64 encode error 错误。例如,传 aGVsbG8= 而不是传 data:image/png;base64,aGVsbG8= ); - * - 'binary': ; - * - 'hex': ; - * - 'ucs2': 以小端序读取; - * - 'ucs-2': 以小端序读取; - * - 'utf16le': 以小端序读取; - * - 'utf-16le': 以小端序读取; - * - 'utf-8': ; - * - 'utf8': ; - * - 'latin1': ; */ - encoding?: - | 'ascii' - | 'base64' - | 'binary' - | 'hex' - | 'ucs2' - | 'ucs-2' - | 'utf16le' - | 'utf-16le' - | 'utf-8' - | 'utf8' - | 'latin1' - ): void - /** [[ReadResult](https://developers.weixin.qq.com/miniprogram/dev/api/file/ReadResult.html) FileSystemManager.readSync(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readSync.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 读文件 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -const ab = new ArrayBuffer(1024) -const fd = fs.openSync({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - flag: 'a+' -}) -const res = fs.readSync({ - fd: fd, - arrayBuffer: ab, - length: 10 -}) -console.log(res) -``` -* ## 注意事项 -* - 小游戏 iOS 高性能模式(iOSHighPerformance)暂不支持 FileSystemManager.readSync 接口,请使用 FileSystemManager.readFileSync 接口代替 */ - readSync(option: ReadSyncOption): ReadResult - /** [[Stats](https://developers.weixin.qq.com/miniprogram/dev/api/file/Stats.html) FileSystemManager.fstatSync(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.fstatSync.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 同步获取文件的状态信息 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -const fd = fs.openSync({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - flag: 'a+' -}) -const stats = fs.fstatSync({fd: fd}) -console.log(stats) -``` */ - fstatSync(option: FstatSyncOption): Stats - /** [[Stats](https://developers.weixin.qq.com/miniprogram/dev/api/file/Stats.html)|Array.<[FileStats](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileStats.html)> FileSystemManager.statSync(string path, boolean recursive)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.statSync.html) - * - * 在插件中使用:需要基础库 `2.19.2` - * - * [FileSystemManager.stat](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.stat.html) 的同步版本 */ - statSync( - /** 文件/目录路径 (本地路径) */ - path: string, - /** 需要基础库: `2.3.0` - * - * 是否递归获取目录下的每个文件的 Stats 信息 */ - recursive?: boolean - ): Stats | FileStats[] - /** [[WriteResult](https://developers.weixin.qq.com/miniprogram/dev/api/file/WriteResult.html) FileSystemManager.writeSync(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.writeSync.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 同步写入文件 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -const fd = fs.openSync({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - flag: 'a+' -}) -const res = fs.writeSync({ - fd: fd, - data: 'some text' -}) -console.log(res.bytesWritten) -``` */ - writeSync(option: WriteSyncOption): WriteResult - /** [string FileSystemManager.openSync(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.openSync.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 同步打开文件,返回文件描述符 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -const fd = fs.openSync({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - flag: 'a+' -}) -console.log(fd) -``` */ - openSync(option: OpenSyncOption): string - /** [string FileSystemManager.saveFileSync(string tempFilePath, string filePath)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.saveFileSync.html) - * - * 在插件中使用:不支持 - * - * [FileSystemManager.saveFile](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.saveFile.html) 的同步版本 */ - saveFileSync( - /** 临时存储文件路径 (本地路径) */ - tempFilePath: string, - /** 要存储的文件路径 (本地路径) */ - filePath?: string - ): string - /** [string|ArrayBuffer FileSystemManager.readFileSync(string filePath, string encoding, number position, number length)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readFileSync.html) -* -* 在插件中使用:需要基础库 `2.19.2` -* -* [FileSystemManager.readFile](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readFile.html) 的同步版本 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.readFile({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - encoding: 'utf8', - position: 0, - success(res) { - console.log(res.data) - }, - fail(res) { - console.error(res) - } -}) - -// 同步接口 -try { - const res = fs.readFileSync(`${wx.env.USER_DATA_PATH}/hello.txt`, 'utf8', 0) - console.log(res) -} catch(e) { - console.error(e) -} -``` */ - readFileSync( - /** 要读取的文件的路径 (本地路径) */ - filePath: string, - /** 指定读取文件的字符编码,如果不传 encoding,则以 ArrayBuffer 格式读取文件的二进制内容 - * - * 参数 encoding 可选值: - * - 'ascii': ; - * - 'base64': ; - * - 'binary': ; - * - 'hex': ; - * - 'ucs2': 以小端序读取; - * - 'ucs-2': 以小端序读取; - * - 'utf16le': 以小端序读取; - * - 'utf-16le': 以小端序读取; - * - 'utf-8': ; - * - 'utf8': ; - * - 'latin1': ; */ - encoding?: - | 'ascii' - | 'base64' - | 'binary' - | 'hex' - | 'ucs2' - | 'ucs-2' - | 'utf16le' - | 'utf-16le' - | 'utf-8' - | 'utf8' - | 'latin1', - /** 需要基础库: `2.10.0` - * - * 从文件指定位置开始读,如果不指定,则从文件头开始读。读取的范围应该是左闭右开区间 [position, position+length)。有效范围:[0, fileLength - 1]。单位:byte */ - position?: number, - /** 需要基础库: `2.10.0` - * - * 指定文件的长度,如果不指定,则读到文件末尾。有效范围:[1, fileLength]。单位:byte */ - length?: number - ): string | ArrayBuffer - /** [undefined FileSystemManager.closeSync(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.closeSync.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 同步关闭文件 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -const fd = fs.openSync({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - flag: 'a+' -}) - -// 关闭文件 -fs.closeSync({fd: fd}) -``` */ - closeSync(option: CloseSyncOption): undefined - /** [undefined FileSystemManager.ftruncateSync(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.ftruncateSync.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 对文件内容进行截断操作 -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -const fd = fs.openSync({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - flag: 'a+' -}) -fs.ftruncateSync({ - fd: fd, - length: 10 // 从第10个字节开始截断文件 -}) -``` */ - ftruncateSync(option: FtruncateSyncOption): undefined - /** [undefined FileSystemManager.truncateSync(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.truncateSync.html) -* -* 需要基础库: `2.16.1` -* -* 在插件中使用:需要基础库 `2.19.2` -* -* 对文件内容进行截断操作 (truncate 的同步版本) -* -* **示例代码** -* -* ```js -const fs = wx.getFileSystemManager() -fs.truncateSync({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - length: 10, // 从第10个字节开始截断 -}) -``` */ - truncateSync(option: TruncateSyncOption): undefined - } - interface GetGroupEnterInfoError { - /** 错误信息 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 40097 | | 场景错误 | - * | 65206 | | 用户已不在该群内 | */ errMsg: string - /** 错误码 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 40097 | | 场景错误 | - * | 65206 | | 用户已不在该群内 | */ errCode: number - } - interface InferenceSession { - /** [InferenceSession.destroy()](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/InferenceSession.destroy.html) -* -* 需要基础库: `2.30.0` -* -* 在插件中使用:需要基础库 `2.30.0` -* -* 销毁 InferenceSession 实例 -* -* **示例代码** -* -* ```js -// 销毁会话 -session.destroy() -``` */ - destroy(): void - /** [InferenceSession.offError(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/InferenceSession.offError.html) - * - * 需要基础库: `2.30.0` - * - * 在插件中使用:需要基础库 `2.30.0` - * - * 取消监听模型加载失败事件 */ - offError( - /** 模型加载失败回调函数。传入指定回调函数则只取消指定回调,不传则取消所有回调 */ - callback: (...args: any[]) => any - ): void - /** [InferenceSession.offLoad(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/InferenceSession.offLoad.html) - * - * 需要基础库: `2.30.0` - * - * 在插件中使用:需要基础库 `2.30.0` - * - * 取消监听模型加载完成事件 */ - offLoad( - /** 模型加载完成回调函数。传入指定回调函数则只取消指定回调,不传则取消所有回调 */ - callback: (...args: any[]) => any - ): void - /** [InferenceSession.onError(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/InferenceSession.onError.html) -* -* 需要基础库: `2.30.0` -* -* 在插件中使用:需要基础库 `2.30.0` -* -* 监听模型加载失败事件 -* -* **示例代码** -* -* ```js -// 创建会话,加载模型 -const session = wx.createInferenceSession({ - model: `${wx.env.USER_DATA_PATH}/MNIST.onnx`, - precisionLevel: 4, - typicalShape:{input1:[1, 3, 224, 224], input2:[1, 1, 224, 224]}, //除非使用动态轴,一般不用显式指定 - allowNPU: false, - allowQuantize: false -}) - -// 监听error事件 -session.onError(err => { - console.error(err) -}) -``` */ - onError( - /** 模型加载失败回调函数 */ - callback: (...args: any[]) => any - ): void - /** [InferenceSession.onLoad(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/InferenceSession.onLoad.html) -* -* 需要基础库: `2.30.0` -* -* 在插件中使用:需要基础库 `2.30.0` -* -* 监听模型加载完成事件 -* -* **示例代码** -* -* ```js -// 创建会话,加载模型 -const session = wx.createInferenceSession({ - model: `${wx.env.USER_DATA_PATH}/MNIST.onnx`, - precisionLevel: 4, - typicalShape:{input1:[1, 3, 224, 224], input2:[1, 1, 224, 224]}, //除非使用动态轴,一般不用显式指定 - allowNPU: false, - allowQuantize: false -}) - -// 监听模型加载完成事件 -session.onLoad(() => { - // 运行推理 - // 其中input1, input2, output0 必须与使用的onnx模型中实际的输入输出名字完全一致,不可随意填写。 - // 模型输入输出信息可以通过Netron 打开onnx模型看到 - session.run({ - input1: { - type: 'float32', - data: new Float32Array(3 * 224 * 224).buffer, - shape: [1, 3, 224, 224] // NCHW 顺序 - }, - // 多个input的添加方法,假设第二个input需要数据类型为uint8 - input2: { - type: 'uint8', - data: new Uint8Array(224 * 224).buffer, - shape: [1, 1, 224, 224] - }, - }).then(res => { - console.log(res.output0) - }) -}) -``` */ - onLoad( - /** 模型加载完成回调函数 */ - callback: (...args: any[]) => any - ): void - /** [Promise<[Tensors](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/Tensors.html)> InferenceSession.run([Tensors](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/Tensors.html) tensors)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/InferenceSession.run.html) -* -* 需要基础库: `2.30.0` -* -* 在插件中使用:需要基础库 `2.30.0` -* -* 运行推断。需要在 session.onLoad 回调后使用。接口参数为 Tensors 对象,返回 Promise。一个 InferenceSession 被创建完成后可以重复多次调用 InferenceSession.run(), 直到调用 session.destroy() 进行销毁。 -* -* **示例代码** -* -* ```js -// 创建会话,加载模型 -const session = wx.createInferenceSession({ - model: `${wx.env.USER_DATA_PATH}/MNIST.onnx`, - precisionLevel: 4, - typicalShape:{input1:[1, 3, 224, 224], input2:[1, 1, 224, 224]}, //除非使用动态轴,一般不用显式指定 - allowNPU: false, - allowQuantize: false -}) - -// 监听模型加载完成事件 -session.onLoad(() => { - // 运行推理 - // 其中input1, input2, output0 必须与使用的onnx模型中实际的输入输出名字完全一致,不可随意填写。 - // 模型输入输出信息可以通过Netron 打开onnx模型看到 - session.run({ - input1: { - type: 'float32', - data: new Float32Array(3 * 224 * 224).buffer, - shape: [1, 3, 224, 224] // NCHW 顺序 - }, - // 多个input的添加方法,假设第二个input需要数据类型为uint8 - input2: { - type: 'uint8', - data: new Uint8Array(224 * 224).buffer, - shape: [1, 1, 224, 224] - }, - }).then(res => { - console.log(res.output0) - }) -}) -``` */ - run( - /** [Tensors](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/Tensors.html) - * - * key-value 形式的对象,对象的 key 会作为 input name,对象的 value 则是 Tensor。 Tensor 结构如下。 */ - tensors: Tensors - ): Promise<Tensors> - } - interface IntersectionObserver { - /** [IntersectionObserver.disconnect()](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/IntersectionObserver.disconnect.html) - * - * 在插件中使用:支持 - * - * 停止监听。回调函数将不再触发 */ - disconnect(): void - /** [IntersectionObserver.observe(string targetSelector, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/IntersectionObserver.observe.html) - * - * 在插件中使用:支持 - * - * 指定目标节点并开始监听相交状态变化情况 */ - observe( - /** 选择器 */ - targetSelector: string, - /** 监听相交状态变化的回调函数 */ - callback: IntersectionObserverObserveCallback - ): void - /** [[IntersectionObserver](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/IntersectionObserver.html) IntersectionObserver.relativeTo(string selector, Object margins)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/IntersectionObserver.relativeTo.html) - * - * 在插件中使用:支持 - * - * 使用选择器指定一个节点,作为参照区域之一。 */ - relativeTo( - /** 选择器 */ - selector: string, - /** 用来扩展(或收缩)参照节点布局区域的边界 */ - margins?: Margins - ): IntersectionObserver - /** [[IntersectionObserver](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/IntersectionObserver.html) IntersectionObserver.relativeToViewport(Object margins)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/IntersectionObserver.relativeToViewport.html) -* -* 在插件中使用:支持 -* -* 指定页面显示区域作为参照区域之一 -* -* **示例代码** -* -* 下面的示例代码中,如果目标节点(用选择器 .target-class 指定)进入显示区域以下 100px 时,就会触发回调函数。 -* ```javascript -Page({ - onLoad: function(){ - wx.createIntersectionObserver().relativeToViewport({bottom: 100}).observe('.target-class', (res) => { - res.intersectionRatio // 相交区域占目标节点的布局区域的比例 - res.intersectionRect // 相交区域 - res.intersectionRect.left // 相交区域的左边界坐标 - res.intersectionRect.top // 相交区域的上边界坐标 - res.intersectionRect.width // 相交区域的宽度 - res.intersectionRect.height // 相交区域的高度 - }) - } -}) -``` */ - relativeToViewport( - /** 用来扩展(或收缩)参照节点布局区域的边界 */ - margins?: Margins - ): IntersectionObserver - } - interface InterstitialAd { - /** [InterstitialAd.destroy()](https://developers.weixin.qq.com/miniprogram/dev/api/ad/InterstitialAd.destroy.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:不支持 - * - * 销毁插屏广告实例。 */ - destroy(): void - /** [InterstitialAd.offClose(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/InterstitialAd.offClose.html) -* -* 在插件中使用:不支持 -* -* 移除插屏广告关闭事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InterstitialAd.onClose(listener) -InterstitialAd.offClose(listener) // 需传入与监听时同一个的函数对象 -``` */ - offClose( - /** onClose 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: UDPSocketOffCloseCallback - ): void - /** [InterstitialAd.offError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/InterstitialAd.offError.html) -* -* 在插件中使用:不支持 -* -* 移除插屏错误事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InterstitialAd.onError(listener) -InterstitialAd.offError(listener) // 需传入与监听时同一个的函数对象 -``` */ - offError( - /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: InterstitialAdOffErrorCallback - ): void - /** [InterstitialAd.offLoad(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/InterstitialAd.offLoad.html) -* -* 在插件中使用:不支持 -* -* 移除插屏广告加载事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -InterstitialAd.onLoad(listener) -InterstitialAd.offLoad(listener) // 需传入与监听时同一个的函数对象 -``` */ - offLoad( - /** onLoad 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffLoadCallback - ): void - /** [InterstitialAd.onClose(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/InterstitialAd.onClose.html) - * - * 在插件中使用:不支持 - * - * 监听插屏广告关闭事件。 */ - onClose( - /** 插屏广告关闭事件的监听函数 */ - listener: UDPSocketOnCloseCallback - ): void - /** [InterstitialAd.onError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/InterstitialAd.onError.html) - * - * 在插件中使用:不支持 - * - * 监听插屏错误事件。 - * - * **错误码信息与解决方案表** - * - * 错误码是通过onError获取到的错误信息。调试期间,可以通过异常返回来捕获信息。 - * 在小程序发布上线之后,如果遇到异常问题,可以在[“运维中心“](https://mp.weixin.qq.com/)里面搜寻错误日志,还可以针对异常返回加上适当的监控信息。 - * - * | 代码 | 异常情况 | 理由 | 解决方案 | - * | ------ | -------------- | --------------- | -------------------------- | - * | 1000 | 后端错误调用失败 | 该项错误不是开发者的异常情况 | 一般情况下忽略一段时间即可恢复。 | - * | 1001 | 参数错误 | 使用方法错误 | 可以前往developers.weixin.qq.com确认具体教程(小程序和小游戏分别有各自的教程,可以在顶部选项中,“设计”一栏的右侧进行切换。| - * | 1002 | 广告单元无效 | 可能是拼写错误、或者误用了其他APP的广告ID | 请重新前往mp.weixin.qq.com确认广告位ID。 | - * | 1003 | 内部错误 | 该项错误不是开发者的异常情况 | 一般情况下忽略一段时间即可恢复。| - * | 1004 | 无适合的广告 | 广告不是每一次都会出现,这次没有出现可能是由于该用户不适合浏览广告 | 属于正常情况,且开发者需要针对这种情况做形态上的兼容。 | - * | 1005 | 广告组件审核中 | 你的广告正在被审核,无法展现广告 | 请前往mp.weixin.qq.com确认审核状态,且开发者需要针对这种情况做形态上的兼容。| - * | 1006 | 广告组件被驳回 | 你的广告审核失败,无法展现广告 | 请前往mp.weixin.qq.com确认审核状态,且开发者需要针对这种情况做形态上的兼容。| - * | 1007 | 广告组件被封禁 | 你的广告能力已经被封禁,封禁期间无法展现广告 | 请前往mp.weixin.qq.com确认小程序广告封禁状态。 | - * | 1008 | 广告单元已关闭 | 该广告位的广告能力已经被关闭 | 请前往mp.weixin.qq.com重新打开对应广告位的展现。| */ - onError( - /** 插屏错误事件的监听函数 */ - listener: InterstitialAdOnErrorCallback - ): void - /** [InterstitialAd.onLoad(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/InterstitialAd.onLoad.html) - * - * 在插件中使用:不支持 - * - * 监听插屏广告加载事件。 */ - onLoad( - /** 插屏广告加载事件的监听函数 */ - listener: OnLoadCallback - ): void - /** [Promise InterstitialAd.load()](https://developers.weixin.qq.com/miniprogram/dev/api/ad/InterstitialAd.load.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:不支持 - * - * 加载插屏广告。 */ - load(): Promise<any> - /** [Promise InterstitialAd.show()](https://developers.weixin.qq.com/miniprogram/dev/api/ad/InterstitialAd.show.html) - * - * 在插件中使用:不支持 - * - * 显示插屏广告。 - * - * **错误码信息表** - * - * 如果插屏广告显示失败,InterstitialAd.show() 方法会返回一个rejected Promise,开发者可以获取到错误码及对应的错误信息。 - * - * | 代码 | 异常情况 | 理由 | - * | ------ | -------------- | -------------------------- | - * | 2001 | 触发频率限制 | 小程序启动一定时间内不允许展示插屏广告 | - * | 2002 | 触发频率限制 | 距离小程序插屏广告或者激励视频广告上次播放时间间隔不足,不允许展示插屏广告 | - * | 2003 | 触发频率限制 | 当前正在播放激励视频广告或者插屏广告,不允许再次展示插屏广告 | - * | 2004 | 广告渲染失败 | 该项错误不是开发者的异常情况,或因小程序页面切换导致广告渲染失败 | - * | 2005 | 广告调用异常 | 插屏广告实例不允许跨页面调用 | */ - show(): Promise<any> - } - interface IsoDep { - /** [IsoDep.close(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/IsoDep.close.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 断开连接 */ - close(option?: NdefCloseOption): void - /** [IsoDep.connect(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/IsoDep.connect.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 连接 NFC 标签 */ - connect(option?: NdefConnectOption): void - /** [IsoDep.getHistoricalBytes(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/IsoDep.getHistoricalBytes.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取复位信息 */ - getHistoricalBytes(option?: GetHistoricalBytesOption): void - /** [IsoDep.getMaxTransceiveLength(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/IsoDep.getMaxTransceiveLength.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取最大传输长度 */ - getMaxTransceiveLength(option?: GetMaxTransceiveLengthOption): void - /** [IsoDep.isConnected(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/IsoDep.isConnected.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * @warning **该接口已废弃,连接状态开发者自行维护即可** - * - * 检查是否已连接 */ - isConnected(option?: IsConnectedOption): void - /** [IsoDep.setTimeout(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/IsoDep.setTimeout.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 设置超时时间 */ - setTimeout(option: SetTimeoutOption): void - /** [IsoDep.transceive(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/IsoDep.transceive.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 发送数据 */ - transceive(option: TransceiveOption): void - } - interface Join1v1ChatError { - /** 错误信息 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | -20000 | not open 1v1 Chat | 未开通双人通话 | - * | -20001 | device not support | 当前设备不支持 | - * | -20002 | on call | 正在通话中 | - * | -20003 | occupied by other miniprogram | 其它小程序正在通话中 | - * | -30000 | system error | 内部系统错误 | - * | -30001 | wechat has no camera authorization | 微信缺失相机权限 | - * | -30002 | wechat has no record authorization | 微信缺失录音权限 | - * | -30003 | miniprogram has no record authorization | 小程序缺失录音权限 | - * | -30004 | miniprogram has no camera authorization | 小程序缺失相机权限 | - * | -1 | | 当前已在房间内 | - * | -2 | | 录音设备被占用,可能是当前正在使用微信内语音通话或系统通话 | - * | -3 | | 加入会话期间退出(可能是用户主动退出,或者退后台、来电等原因),因此加入失败 | - * | -1000 | | 系统错误 | */ errMsg: string - /** 错误码 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | -20000 | not open 1v1 Chat | 未开通双人通话 | - * | -20001 | device not support | 当前设备不支持 | - * | -20002 | on call | 正在通话中 | - * | -20003 | occupied by other miniprogram | 其它小程序正在通话中 | - * | -30000 | system error | 内部系统错误 | - * | -30001 | wechat has no camera authorization | 微信缺失相机权限 | - * | -30002 | wechat has no record authorization | 微信缺失录音权限 | - * | -30003 | miniprogram has no record authorization | 小程序缺失录音权限 | - * | -30004 | miniprogram has no camera authorization | 小程序缺失相机权限 | - * | -1 | | 当前已在房间内 | - * | -2 | | 录音设备被占用,可能是当前正在使用微信内语音通话或系统通话 | - * | -3 | | 加入会话期间退出(可能是用户主动退出,或者退后台、来电等原因),因此加入失败 | - * | -1000 | | 系统错误 | */ errCode: number - } - interface JoinVoIPChatError { - /** 错误信息 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | -1 | 当前已在房间内 | | - * | -2 | 录音设备被占用,可能是当前正在使用微信内语音通话或系统通话 | | - * | -3 | 加入会话期间退出(可能是用户主动退出,或者退后台、来电等原因),因此加入失败 | | - * | -1000 | 系统错误 | | */ errMsg: string - /** 错误码 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | -1 | 当前已在房间内 | | - * | -2 | 录音设备被占用,可能是当前正在使用微信内语音通话或系统通话 | | - * | -3 | 加入会话期间退出(可能是用户主动退出,或者退后台、来电等原因),因此加入失败 | | - * | -1000 | 系统错误 | | */ errCode: number - } - interface LivePlayerContext { - /** [LivePlayerContext.exitCasting(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.exitCasting.html) - * - * 需要基础库: `2.32.0` - * - * 在插件中使用:支持 - * - * 退出投屏。仅支持在 tap 事件回调内调用。 */ - exitCasting(option?: ExitCastingOption): void - /** [LivePlayerContext.exitFullScreen(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.exitFullScreen.html) - * - * 在插件中使用:支持 - * - * 退出全屏 */ - exitFullScreen(option?: ExitFullScreenOption): void - /** [LivePlayerContext.exitPictureInPicture(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.exitPictureInPicture.html) - * - * 在插件中使用:支持 - * - * 退出小窗,该方法可在任意页面调用 */ - exitPictureInPicture(option?: ExitPictureInPictureOption): void - /** [LivePlayerContext.mute(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.mute.html) - * - * 在插件中使用:支持 - * - * 静音 */ - mute(option?: MuteOption): void - /** [LivePlayerContext.pause(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.pause.html) - * - * 需要基础库: `1.9.90` - * - * 在插件中使用:支持 - * - * 暂停 */ - pause(option?: PauseOption): void - /** [LivePlayerContext.play(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.play.html) - * - * 在插件中使用:支持 - * - * 播放 */ - play(option?: PlayOption): void - /** [LivePlayerContext.reconnectCasting(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.reconnectCasting.html) - * - * 需要基础库: `2.32.0` - * - * 在插件中使用:支持 - * - * 重连投屏设备。仅支持在 tap 事件回调内调用。 */ - reconnectCasting(option?: ReconnectCastingOption): void - /** [LivePlayerContext.requestFullScreen(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.requestFullScreen.html) - * - * 在插件中使用:支持 - * - * 进入全屏 */ - requestFullScreen( - option: LivePlayerContextRequestFullScreenOption - ): void - /** [LivePlayerContext.requestPictureInPicture(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.requestPictureInPicture.html) - * - * 需要基础库: `2.15.0` - * - * 在插件中使用:支持 - * - * 进入小窗 */ - requestPictureInPicture(option?: RequestPictureInPictureOption): void - /** [LivePlayerContext.resume(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.resume.html) - * - * 需要基础库: `1.9.90` - * - * 在插件中使用:支持 - * - * 恢复 */ - resume(option?: ResumeOption): void - /** [LivePlayerContext.snapshot(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.snapshot.html) - * - * 需要基础库: `2.7.1` - * - * 在插件中使用:支持 - * - * 截图 */ - snapshot(option: LivePlayerContextSnapshotOption): void - /** [LivePlayerContext.startCasting(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.startCasting.html) - * - * 需要基础库: `2.32.0` - * - * 在插件中使用:支持 - * - * 开始投屏, 拉起半屏搜索设备。仅支持在 tap 事件回调内调用。 */ - startCasting(option?: StartCastingOption): void - /** [LivePlayerContext.stop(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.stop.html) - * - * 在插件中使用:支持 - * - * 停止 */ - stop(option?: StopOption): void - /** [LivePlayerContext.switchCasting(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.switchCasting.html) - * - * 需要基础库: `2.32.0` - * - * 在插件中使用:支持 - * - * 切换投屏设备。仅支持在 tap 事件回调内调用。 */ - switchCasting(option?: SwitchCastingOption): void - } - interface LivePusherContext { - /** [LivePusherContext.applyBlusherStickMakeup(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.applyBlusherStickMakeup.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:不支持 - * - * 添加腮红美妆特效 */ - applyBlusherStickMakeup(option: ApplyBlusherStickMakeupOption): void - /** [LivePusherContext.applyEyeBrowMakeup(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.applyEyeBrowMakeup.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:不支持 - * - * 添加眉毛美妆特效 */ - applyEyeBrowMakeup(option: ApplyEyeBrowMakeupOption): void - /** [LivePusherContext.applyEyeShadowMakeup(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.applyEyeShadowMakeup.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:不支持 - * - * 添加眼影美妆特效 */ - applyEyeShadowMakeup(option: ApplyEyeShadowMakeupOption): void - /** [LivePusherContext.applyFaceContourMakeup(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.applyFaceContourMakeup.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:不支持 - * - * 添加修容美妆特效 */ - applyFaceContourMakeup(option: ApplyFaceContourMakeupOption): void - /** [LivePusherContext.applyFilter(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.applyFilter.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:不支持 - * - * 添加滤镜效果 */ - applyFilter(option: ApplyFilterOption): void - /** [LivePusherContext.applyLipStickMakeup(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.applyLipStickMakeup.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:不支持 - * - * 添加口红美妆特效 */ - applyLipStickMakeup(option: ApplyLipStickMakeupOption): void - /** [LivePusherContext.applySticker(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.applySticker.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:不支持 - * - * 添加贴纸特效 */ - applySticker(option: ApplyStickerOption): void - /** [LivePusherContext.clearFilters(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.clearFilters.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:不支持 - * - * 清除所有滤镜效果 */ - clearFilters(option?: ClearFiltersOption): void - /** [LivePusherContext.clearMakeups(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.clearMakeups.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:不支持 - * - * 清除所有美妆特效 */ - clearMakeups(option?: ClearMakeupsOption): void - /** [LivePusherContext.clearStickers(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.clearStickers.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:不支持 - * - * 清除所有贴纸特效 */ - clearStickers(option?: ClearStickersOption): void - /** [LivePusherContext.createOffscreenCanvas(object options)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.createOffscreenCanvas.html) - * - * 需要基础库: `2.29.0` - * - * 在插件中使用:支持 - * - * 创建一个能够承接 LivePusher 采集纹理的离屏 Canvas,客户端 8.0.31 版本开始支持。 */ - createOffscreenCanvas( - /** 同[wx.createOffscreenCanvas](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.createOffscreenCanvas.html) */ - options: IAnyObject - ): void - /** [LivePusherContext.exitPictureInPicture(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.exitPictureInPicture.html) - * - * 需要基础库: `2.25.0` - * - * 在插件中使用:支持 - * - * 退出小窗,该方法可在任意页面调用 */ - exitPictureInPicture(option?: ExitPictureInPictureOption): void - /** [LivePusherContext.getMaxZoom(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.getMaxZoom.html) - * - * 需要基础库: `2.31.0` - * - * 在插件中使用:支持 - * - * 获取最大缩放级别 */ - getMaxZoom(option?: GetMaxZoomOption): void - /** [LivePusherContext.onCustomRendererEvent(string event, function|function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.onCustomRendererEvent.html) - * - * 需要基础库: `2.29.0` - * - * 在插件中使用:支持 - * - * 开启自定义渲染时,开发者通过此方法订阅相关事件,客户端 8.0.31 版本开始支持。 */ - onCustomRendererEvent( - /** 事件类型,后订阅的监听器会取消之前的监听器 - * - * 参数 event 可选值: - * - 'frame': 采集到视频帧后触发; - * - 'update': 推流尺寸变更时触发; */ - event: 'frame' | 'update', - /** 自定义渲染事件处理回调函数 */ - callback: CustomRendererFrameEventCallback - ): void - /** [LivePusherContext.pause(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.pause.html) - * - * 在插件中使用:支持 - * - * 暂停推流 */ - pause(option?: PauseOption): void - /** [LivePusherContext.pauseBGM(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.pauseBGM.html) - * - * 需要基础库: `2.4.0` - * - * 在插件中使用:支持 - * - * 暂停背景音 */ - pauseBGM(option?: PauseBGMOption): void - /** [LivePusherContext.playBGM(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.playBGM.html) - * - * 需要基础库: `2.4.0` - * - * 在插件中使用:支持 - * - * 播放背景音 */ - playBGM(option: PlayBGMOption): void - /** [LivePusherContext.resume(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.resume.html) - * - * 在插件中使用:支持 - * - * 恢复推流 */ - resume(option?: ResumeOption): void - /** [LivePusherContext.resumeBGM(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.resumeBGM.html) - * - * 需要基础库: `2.4.0` - * - * 在插件中使用:支持 - * - * 恢复背景音 */ - resumeBGM(option?: ResumeBGMOption): void - /** [LivePusherContext.sendMessage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.sendMessage.html) - * - * 需要基础库: `2.10.0` - * - * 在插件中使用:支持 - * - * 发送SEI消息 */ - sendMessage(option: SendMessageOption): void - /** [LivePusherContext.setBGMVolume(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.setBGMVolume.html) - * - * 需要基础库: `2.4.0` - * - * 在插件中使用:支持 - * - * 设置背景音音量 */ - setBGMVolume(option: SetBGMVolumeOption): void - /** [LivePusherContext.setMICVolume(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.setMICVolume.html) - * - * 需要基础库: `2.10.0` - * - * 在插件中使用:支持 - * - * 设置麦克风音量 */ - setMICVolume(option: SetMICVolumeOption): void - /** [LivePusherContext.setZoom(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.setZoom.html) - * - * 需要基础库: `2.31.0` - * - * 在插件中使用:支持 - * - * 设置缩放级别 */ - setZoom(option: LivePusherContextSetZoomOption): void - /** [LivePusherContext.snapshot(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.snapshot.html) - * - * 需要基础库: `1.9.90` - * - * 在插件中使用:支持 - * - * 快照 */ - snapshot(option: LivePusherContextSnapshotOption): void - /** [LivePusherContext.start(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.start.html) - * - * 在插件中使用:支持 - * - * 开始推流,同时开启摄像头预览 */ - start(option?: LivePusherContextStartOption): void - /** [LivePusherContext.startPreview(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.startPreview.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 开启摄像头预览 */ - startPreview(option?: StartPreviewOption): void - /** [LivePusherContext.stop(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.stop.html) - * - * 在插件中使用:支持 - * - * 停止推流,同时停止摄像头预览 */ - stop(option?: StopOption): void - /** [LivePusherContext.stopBGM(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.stopBGM.html) - * - * 需要基础库: `2.4.0` - * - * 在插件中使用:支持 - * - * 停止背景音 */ - stopBGM(option?: StopBGMOption): void - /** [LivePusherContext.stopPreview(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.stopPreview.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:支持 - * - * 关闭摄像头预览 */ - stopPreview(option?: StopPreviewOption): void - /** [LivePusherContext.switchCamera(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.switchCamera.html) - * - * 在插件中使用:支持 - * - * 切换前后摄像头 */ - switchCamera(option?: SwitchCameraOption): void - /** [LivePusherContext.toggleTorch(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.toggleTorch.html) - * - * 需要基础库: `2.1.0` - * - * 在插件中使用:支持 - * - * 切换手电筒 */ - toggleTorch(option?: ToggleTorchOption): void - } - interface LogManager { - /** [LogManager.debug()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/LogManager.debug.html) - * - * 在插件中使用:不支持 - * - * 写 debug 日志 */ - debug( - /** 日志内容,可以有任意多个。每次调用的参数的总大小不超过100Kb */ - ...args: any[] - ): void - /** [LogManager.info()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/LogManager.info.html) - * - * 在插件中使用:不支持 - * - * 写 info 日志 */ - info( - /** 日志内容,可以有任意多个。每次调用的参数的总大小不超过100Kb */ - ...args: any[] - ): void - /** [LogManager.log()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/LogManager.log.html) - * - * 在插件中使用:不支持 - * - * 写 log 日志 */ - log( - /** 日志内容,可以有任意多个。每次调用的参数的总大小不超过100Kb */ - ...args: any[] - ): void - /** [LogManager.warn()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/LogManager.warn.html) - * - * 在插件中使用:不支持 - * - * 写 warn 日志 */ - warn( - /** 日志内容,可以有任意多个。每次调用的参数的总大小不超过100Kb */ - ...args: any[] - ): void - } - interface MapContext { - /** [MapContext.addArc(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addArc.html) - * - * 需要基础库: `2.22.0` - * - * 在插件中使用:支持 - * - * 添加弧线,途经点与夹角必须设置一个。途经点必须在起终点有效坐标范围内,否则不能生成正确的弧线,同时设置夹角角度时,以夹角角度为准。夹角定义为起点到终点,与起点外切线逆时针旋转的角度。工具侧暂未支持。 */ - addArc(option: AddArcOption): void - /** [MapContext.addCustomLayer(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addCustomLayer.html) - * - * 需要基础库: `2.12.0` - * - * 在插件中使用:支持 - * - * 添加个性化图层。图层创建[参考文档](https://lbs.qq.com/dev/console/customLayer/create) */ - addCustomLayer(option: AddCustomLayerOption): void - /** [MapContext.addGroundOverlay(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addGroundOverlay.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:支持 - * - * 创建自定义图片图层,图片会随着地图缩放而缩放。 */ - addGroundOverlay(option: AddGroundOverlayOption): void - /** [MapContext.addMarkers(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addMarkers.html) - * - * 需要基础库: `2.13.0` - * - * 在插件中使用:支持 - * - * 添加 marker。 */ - addMarkers(option: AddMarkersOption): void - /** [MapContext.addVisualLayer(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addVisualLayer.html) - * - * 需要基础库: `2.20.1` - * - * 在插件中使用:支持 - * - * 添加可视化图层。需要刷新时,interval 可设置的最小值为 15 s。 */ - addVisualLayer(option: AddVisualLayerOption): void - /** [MapContext.eraseLines(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.eraseLines.html) - * - * 需要基础库: `2.5.0` - * - * 在插件中使用:支持 - * - * 擦除或置灰已添加到地图中的线段。 */ - eraseLines(option: EraseLinesOption): void - /** [MapContext.executeVisualLayerCommand(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.executeVisualLayerCommand.html) - * - * 需要基础库: `2.26.0` - * - * 在插件中使用:支持 - * - * 执行可视化图层指令,结合 `MapContext.on('visualLayerEvent')` 监听事件使用。 */ - executeVisualLayerCommand(option: ExecuteVisualLayerCommandOption): void - /** [MapContext.fromScreenLocation(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.fromScreenLocation.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:支持 - * - * 获取屏幕上的点对应的经纬度,坐标原点为地图左上角。 */ - fromScreenLocation(option: FromScreenLocationOption): void - /** [MapContext.getCenterLocation(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.getCenterLocation.html) - * - * 在插件中使用:支持 - * - * 获取当前地图中心的经纬度。返回的是 gcj02 坐标系,可以用于 [wx.openLocation()](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.openLocation.html) */ - getCenterLocation(option: GetCenterLocationOption): void - /** [MapContext.getRegion(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.getRegion.html) - * - * 需要基础库: `1.4.0` - * - * 在插件中使用:支持 - * - * 获取当前地图的视野范围 */ - getRegion(option?: GetRegionOption): void - /** [MapContext.getRotate(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.getRotate.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:支持 - * - * 获取当前地图的旋转角 */ - getRotate(option?: GetRotateOption): void - /** [MapContext.getScale(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.getScale.html) - * - * 需要基础库: `1.4.0` - * - * 在插件中使用:支持 - * - * 获取当前地图的缩放级别 */ - getScale(option?: GetScaleOption): void - /** [MapContext.getSkew(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.getSkew.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:支持 - * - * 获取当前地图的倾斜角 */ - getSkew(option?: GetSkewOption): void - /** [MapContext.includePoints(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.includePoints.html) - * - * 需要基础库: `1.2.0` - * - * 在插件中使用:支持 - * - * 缩放视野展示所有经纬度 */ - includePoints(option: IncludePointsOption): void - /** [MapContext.initMarkerCluster(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.initMarkerCluster.html) - * - * 需要基础库: `2.13.0` - * - * 在插件中使用:支持 - * - * 初始化点聚合的配置,未调用时采用默认配置。 */ - initMarkerCluster(option: InitMarkerClusterOption): void - /** [MapContext.moveAlong(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.moveAlong.html) - * - * 需要基础库: `2.13.0` - * - * 在插件中使用:支持 - * - * 沿指定路径移动 `marker`,用于轨迹回放等场景。动画完成时触发回调事件,若动画进行中,对同一 `marker` 再次调用 `moveAlong` 方法,前一次的动画将被打断。 */ - moveAlong(option: MoveAlongOption): void - /** [MapContext.moveToLocation(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.moveToLocation.html) - * - * 需要基础库: `1.2.0` - * - * 在插件中使用:支持 - * - * 将地图中心移置当前定位点,此时需设置地图组件 show-location 为true。[2.8.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起支持将地图中心移动到指定位置。 */ - moveToLocation(option?: MoveToLocationOption): void - /** [MapContext.on(string event, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.on.html) -* -* 需要基础库: `2.13.0` -* -* 在插件中使用:支持 -* -* 监听地图事件。 -* -* ### visualLayerEvent -* -* 可视化图层 visualLayer 统一回调出口,[2.26.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起支持。 -* -* #### 返回参数 -* -* | 参数 | 类型 | 说明 | -* | --------- | ------ | -------- | -* | layerId | String | 图层 id | -* | eventType | String | 事件类型 | -* | eventInfo | String | 事件信息 | -* -* ### markerClusterCreate -* -* 缩放或拖动导致新的聚合簇产生时触发,仅返回新创建的聚合簇信息。 -* -* #### 返回参数 -* -* | 参数 | 类型 | 说明 | -* | -------- | -------------------- | ---------- | -* | clusters | `Array<ClusterInfo>` | 聚合簇数据 | -* -* ### markerClusterClick -* -* 聚合簇的点击事件。 -* -* #### 返回参数 -* -* | 参数 | 类型 | 说明 | -* | --------- | ------------- | --------- | -* | cluster | ClusterInfo | 聚合簇 | -* -* #### ClusterInfo 结构 -* -* | 参数 | 类型 | 说明 | -* | --------- | --------------- | -------------------------- | -* | clusterId | Number | 聚合簇的 id | -* | center | LatLng | 聚合簇的坐标 | -* | markerIds | `Array<Number>` | 该聚合簇内的点标记数据数组 | -* -* ### markerCollisionStatusChange -* -* marker 参与碰撞后隐藏时的回调,[3.4.3](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起支持。 -* -* #### 返回参数 -* -* | 参数 | 类型 | 说明 | -* | --------- | ------ | -------- | -* | show | `Array<Number>` | 碰撞时隐藏后又显示的 `markerIds` | -* | hide | `Array<Number>` | 碰撞时被隐藏的 `markerIds` | -* -* **示例代码** -* -* ```js - MapContext.on('visualLayerEvent', (res) => {}) - MapContext.on('markerClusterCreate', (res) => {}) - MapContext.on('markerClusterClick', (res) => {}) - MapContext.on('markerCollisionStatusChange', (res) => {}) -``` */ - on( - /** 事件名 - * - * 参数 event 可选值: - * - 'markerClusterCreate': ; - * - 'markerClusterClick': ; - * - 'visualLayerEvent': ; - * - 'markerCollisionStatusChange': ; */ - event: - | 'markerClusterCreate' - | 'markerClusterClick' - | 'visualLayerEvent' - | 'markerCollisionStatusChange', - /** 事件的回调函数 */ - callback: (...args: any[]) => any - ): void - /** [MapContext.openMapApp(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.openMapApp.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:支持 - * - * 拉起地图APP选择导航。 */ - openMapApp(option: OpenMapAppOption): void - /** [MapContext.removeArc(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.removeArc.html) - * - * 需要基础库: `2.22.0` - * - * 在插件中使用:支持 - * - * 删除弧线。工具侧暂未支持。 */ - removeArc(option: RemoveArcOption): void - /** [MapContext.removeCustomLayer(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.removeCustomLayer.html) - * - * 需要基础库: `2.12.0` - * - * 在插件中使用:支持 - * - * 移除个性化图层。 */ - removeCustomLayer(option: RemoveCustomLayerOption): void - /** [MapContext.removeGroundOverlay(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.removeGroundOverlay.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:支持 - * - * 移除自定义图片图层。 */ - removeGroundOverlay(option: RemoveGroundOverlayOption): void - /** [MapContext.removeMarkers(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.removeMarkers.html) - * - * 需要基础库: `2.13.0` - * - * 在插件中使用:支持 - * - * 移除 marker。 */ - removeMarkers(option: RemoveMarkersOption): void - /** [MapContext.removeVisualLayer(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.removeVisualLayer.html) - * - * 需要基础库: `2.20.1` - * - * 在插件中使用:支持 - * - * 移除可视化图层。 */ - removeVisualLayer(option: RemoveVisualLayerOption): void - /** [MapContext.setBoundary(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.setBoundary.html) - * - * 需要基础库: `2.22.0` - * - * 在插件中使用:支持 - * - * 限制地图的显示范围。此接口同时会限制地图的最小缩放整数级别。 */ - setBoundary(option: SetBoundaryOption): void - /** [MapContext.setCenterOffset(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.setCenterOffset.html) - * - * 需要基础库: `2.10.0` - * - * 在插件中使用:支持 - * - * 设置地图中心点偏移,向后向下为增长,屏幕比例范围(0.25~0.75),默认偏移为[0.5, 0.5] */ - setCenterOffset(option: SetCenterOffsetOption): void - /** [MapContext.setLocMarkerIcon(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.setLocMarkerIcon.html) - * - * 需要基础库: `2.16.0` - * - * 在插件中使用:支持 - * - * 设置定位点图标,支持网络路径、本地路径、代码包路径 */ - setLocMarkerIcon(option: SetLocMarkerIconOption): void - /** [MapContext.toScreenLocation(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.toScreenLocation.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:支持 - * - * 获取经纬度对应的屏幕坐标,坐标原点为地图左上角。 */ - toScreenLocation(option: ToScreenLocationOption): void - /** [MapContext.translateMarker(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.translateMarker.html) - * - * 需要基础库: `1.2.0` - * - * 在插件中使用:支持 - * - * 平移marker,带动画。 */ - translateMarker(option: TranslateMarkerOption): void - /** [MapContext.updateGroundOverlay(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.updateGroundOverlay.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:支持 - * - * 更新自定义图片图层。 */ - updateGroundOverlay(option: UpdateGroundOverlayOption): void - } - interface MediaContainer { - /** [MediaContainer.addTrack([MediaTrack](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/MediaTrack.html) track)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/MediaContainer.addTrack.html) - * - * 需要基础库: `2.9.0` - * - * 在插件中使用:支持 - * - * 将音频或视频轨道添加到容器 */ - addTrack( - /** [MediaTrack](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/MediaTrack.html) - * - * 要添加的音频或视频轨道 */ - track: MediaTrack - ): void - /** [MediaContainer.destroy()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/MediaContainer.destroy.html) - * - * 需要基础库: `2.9.0` - * - * 在插件中使用:支持 - * - * 将容器销毁,释放资源 */ - destroy(): void - /** [MediaContainer.export()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/MediaContainer.export.html) - * - * 需要基础库: `2.9.0` - * - * 在插件中使用:支持 - * - * 将容器内的轨道合并并导出视频文件 */ - export(): void - /** [MediaContainer.extractDataSource(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/MediaContainer.extractDataSource.html) - * - * 需要基础库: `2.9.0` - * - * 在插件中使用:支持 - * - * 将传入的视频源分离轨道。不会自动将轨道添加到待合成的容器里。 */ - extractDataSource(option: ExtractDataSourceOption): void - /** [MediaContainer.removeTrack([MediaTrack](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/MediaTrack.html) track)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/MediaContainer.removeTrack.html) - * - * 需要基础库: `2.9.0` - * - * 在插件中使用:支持 - * - * 将音频或视频轨道从容器中移除 */ - removeTrack( - /** [MediaTrack](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/MediaTrack.html) - * - * 要移除的音频或视频轨道 */ - track: MediaTrack - ): void - } - interface MediaQueryObserver { - /** [MediaQueryObserver.disconnect()](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/MediaQueryObserver.disconnect.html) - * - * 在插件中使用:支持 - * - * 停止监听。回调函数将不再触发 */ - disconnect(): void - /** [MediaQueryObserver.observe(Object descriptor, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/MediaQueryObserver.observe.html) - * - * 在插件中使用:支持 - * - * 开始监听页面 media query 变化情况 */ - observe( - /** media query 描述符 */ - descriptor: ObserveDescriptor, - /** 监听 media query 状态变化的回调函数 */ - callback: MediaQueryObserverObserveCallback - ): void - } - interface MediaRecorder { - /** [MediaRecorder.off(string eventName, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/media/media-recorder/MediaRecorder.off.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 取消监听录制事件。当对应事件触发时,该回调函数不再执行。 */ - off( - /** 事件名 */ - eventName: string, - /** 事件触发时执行的回调函数 */ - callback: (...args: any[]) => any - ): void - /** [MediaRecorder.on(string eventName, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/media/media-recorder/MediaRecorder.on.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 注册监听录制事件的回调函数。当对应事件触发时,回调函数会被执行。 */ - on( - /** 事件名 - * - * 参数 eventName 可选值: - * - 'start': 录制开始事件。; - * - 'stop': 录制结束事件。返回 {tempFilePath, duration, fileSize}; - * - 'pause': 录制暂停事件。; - * - 'resume': 录制继续事件。; - * - 'timeupdate': 录制时间更新事件。; */ - eventName: 'start' | 'stop' | 'pause' | 'resume' | 'timeupdate', - /** 事件触发时执行的回调函数 */ - callback: (...args: any[]) => any - ): void - /** [Promise MediaRecorder.destroy()](https://developers.weixin.qq.com/miniprogram/dev/api/media/media-recorder/MediaRecorder.destroy.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 销毁录制器 */ - destroy(): Promise<any> - /** [Promise MediaRecorder.pause()](https://developers.weixin.qq.com/miniprogram/dev/api/media/media-recorder/MediaRecorder.pause.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 暂停录制 */ - pause(): Promise<any> - /** [Promise MediaRecorder.requestFrame(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/media/media-recorder/MediaRecorder.requestFrame.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 请求下一帧录制,在 callback 里完成一帧渲染后开始录制当前帧 */ - requestFrame(callback: (...args: any[]) => any): Promise<any> - /** [Promise MediaRecorder.resume()](https://developers.weixin.qq.com/miniprogram/dev/api/media/media-recorder/MediaRecorder.resume.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 恢复录制 */ - resume(): Promise<any> - /** [Promise MediaRecorder.start()](https://developers.weixin.qq.com/miniprogram/dev/api/media/media-recorder/MediaRecorder.start.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 开始录制 */ - start(): Promise<any> - /** [Promise MediaRecorder.stop()](https://developers.weixin.qq.com/miniprogram/dev/api/media/media-recorder/MediaRecorder.stop.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 结束录制 */ - stop(): Promise<any> - } - interface MifareClassic { - /** [MifareClassic.close(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareClassic.close.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 断开连接 */ - close(option?: NdefCloseOption): void - /** [MifareClassic.connect(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareClassic.connect.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 连接 NFC 标签 */ - connect(option?: NdefConnectOption): void - /** [MifareClassic.getMaxTransceiveLength(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareClassic.getMaxTransceiveLength.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取最大传输长度 */ - getMaxTransceiveLength(option?: GetMaxTransceiveLengthOption): void - /** [MifareClassic.isConnected(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareClassic.isConnected.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * @warning **该接口已废弃,连接状态开发者自行维护即可** - * - * 检查是否已连接 */ - isConnected(option?: IsConnectedOption): void - /** [MifareClassic.setTimeout(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareClassic.setTimeout.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 设置超时时间 */ - setTimeout(option: SetTimeoutOption): void - /** [MifareClassic.transceive(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareClassic.transceive.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 发送数据 */ - transceive(option: TransceiveOption): void - } - interface MifareUltralight { - /** [MifareUltralight.close(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareUltralight.close.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 断开连接 */ - close(option?: NdefCloseOption): void - /** [MifareUltralight.connect(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareUltralight.connect.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 连接 NFC 标签 */ - connect(option?: NdefConnectOption): void - /** [MifareUltralight.getMaxTransceiveLength(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareUltralight.getMaxTransceiveLength.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取最大传输长度 */ - getMaxTransceiveLength(option?: GetMaxTransceiveLengthOption): void - /** [MifareUltralight.isConnected(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareUltralight.isConnected.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * @warning **该接口已废弃,连接状态开发者自行维护即可** - * - * 检查是否已连接 */ - isConnected(option?: IsConnectedOption): void - /** [MifareUltralight.setTimeout(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareUltralight.setTimeout.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 设置超时时间 */ - setTimeout(option: SetTimeoutOption): void - /** [MifareUltralight.transceive(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/MifareUltralight.transceive.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 发送数据 */ - transceive(option: TransceiveOption): void - } - interface NFCError { - /** 错误信息 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 0 | ok | 正常 | - * | 13000 | | 当前设备不支持NFC | - * | 13001 | | 当前设备支持NFC,但系统NFC开关未开启 | - * | 13002 | | 当前设备支持NFC,但不支持HCE | - * | 13003 | | AID列表参数格式错误 | - * | 13004 | | 未设置微信为默认NFC支付应用 | - * | 13005 | | 返回的指令不合法 | - * | 13006 | | 注册AID失败 | */ errMsg: string - /** 错误码 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 0 | ok | 正常 | - * | 13000 | | 当前设备不支持NFC | - * | 13001 | | 当前设备支持NFC,但系统NFC开关未开启 | - * | 13002 | | 当前设备支持NFC,但不支持HCE | - * | 13003 | | AID列表参数格式错误 | - * | 13004 | | 未设置微信为默认NFC支付应用 | - * | 13005 | | 返回的指令不合法 | - * | 13006 | | 注册AID失败 | */ errCode: number - } - interface Ndef { - /** [Ndef.close(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/Ndef.close.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 断开连接 */ - close(option?: NdefCloseOption): void - /** [Ndef.connect(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/Ndef.connect.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 连接 NFC 标签 */ - connect(option?: NdefConnectOption): void - /** [Ndef.isConnected(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/Ndef.isConnected.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * @warning **该接口已废弃,连接状态开发者自行维护即可** - * - * 检查是否已连接 */ - isConnected(option?: IsConnectedOption): void - /** [Ndef.offNdefMessage(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/Ndef.offNdefMessage.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 取消监听 Ndef 消息 */ - offNdefMessage(callback: (...args: any[]) => any): void - /** [Ndef.onNdefMessage(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/Ndef.onNdefMessage.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 监听 Ndef 消息 */ - onNdefMessage(callback: (...args: any[]) => any): void - /** [Ndef.setTimeout(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/Ndef.setTimeout.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 设置超时时间 */ - setTimeout(option: SetTimeoutOption): void - /** [Ndef.writeNdefMessage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/Ndef.writeNdefMessage.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 重写 Ndef 标签内容 */ - writeNdefMessage(option: WriteNdefMessageOption): void - } - interface NfcA { - /** [NfcA.close(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcA.close.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 断开连接 */ - close(option?: NdefCloseOption): void - /** [NfcA.connect(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcA.connect.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 连接 NFC 标签 */ - connect(option?: NdefConnectOption): void - /** [NfcA.getAtqa(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcA.getAtqa.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取ATQA信息 */ - getAtqa(option?: GetAtqaOption): void - /** [NfcA.getMaxTransceiveLength(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcA.getMaxTransceiveLength.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取最大传输长度 */ - getMaxTransceiveLength(option?: GetMaxTransceiveLengthOption): void - /** [NfcA.getSak(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcA.getSak.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取SAK信息 */ - getSak(option?: GetSakOption): void - /** [NfcA.isConnected(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcA.isConnected.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * @warning **该接口已废弃,连接状态开发者自行维护即可** - * - * 检查是否已连接 */ - isConnected(option?: IsConnectedOption): void - /** [NfcA.setTimeout(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcA.setTimeout.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 设置超时时间 */ - setTimeout(option: SetTimeoutOption): void - /** [NfcA.transceive(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcA.transceive.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 发送数据 */ - transceive(option: TransceiveOption): void - } - interface NfcB { - /** [NfcB.close(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcB.close.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 断开连接 */ - close(option?: NdefCloseOption): void - /** [NfcB.connect(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcB.connect.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 连接 NFC 标签 */ - connect(option?: NdefConnectOption): void - /** [NfcB.getMaxTransceiveLength(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcB.getMaxTransceiveLength.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取最大传输长度 */ - getMaxTransceiveLength(option?: GetMaxTransceiveLengthOption): void - /** [NfcB.isConnected(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcB.isConnected.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * @warning **该接口已废弃,连接状态开发者自行维护即可** - * - * 检查是否已连接 */ - isConnected(option?: IsConnectedOption): void - /** [NfcB.setTimeout(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcB.setTimeout.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 设置超时时间 */ - setTimeout(option: SetTimeoutOption): void - /** [NfcB.transceive(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcB.transceive.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 发送数据 */ - transceive(option: TransceiveOption): void - } - interface NfcF { - /** [NfcF.close(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcF.close.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 断开连接 */ - close(option?: NdefCloseOption): void - /** [NfcF.connect(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcF.connect.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 连接 NFC 标签 */ - connect(option?: NdefConnectOption): void - /** [NfcF.getMaxTransceiveLength(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcF.getMaxTransceiveLength.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取最大传输长度 */ - getMaxTransceiveLength(option?: GetMaxTransceiveLengthOption): void - /** [NfcF.isConnected(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcF.isConnected.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * @warning **该接口已废弃,连接状态开发者自行维护即可** - * - * 检查是否已连接 */ - isConnected(option?: IsConnectedOption): void - /** [NfcF.setTimeout(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcF.setTimeout.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 设置超时时间 */ - setTimeout(option: SetTimeoutOption): void - /** [NfcF.transceive(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcF.transceive.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 发送数据 */ - transceive(option: TransceiveOption): void - } - interface NfcV { - /** [NfcV.close(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcV.close.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 断开连接 */ - close(option?: NdefCloseOption): void - /** [NfcV.connect(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcV.connect.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 连接 NFC 标签 */ - connect(option?: NdefConnectOption): void - /** [NfcV.getMaxTransceiveLength(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcV.getMaxTransceiveLength.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 获取最大传输长度 */ - getMaxTransceiveLength(option?: GetMaxTransceiveLengthOption): void - /** [NfcV.isConnected(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcV.isConnected.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * @warning **该接口已废弃,连接状态开发者自行维护即可** - * - * 检查是否已连接 */ - isConnected(option?: IsConnectedOption): void - /** [NfcV.setTimeout(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcV.setTimeout.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 设置超时时间 */ - setTimeout(option: SetTimeoutOption): void - /** [NfcV.transceive(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NfcV.transceive.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:支持 - * - * 发送数据 */ - transceive(option: TransceiveOption): void - } - interface Nfcrwerror { - /** 错误信息 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 13000 | 设备不支持NFC | | - * | 13001 | 系统NFC开关未打开 | | - * | 13010 | 未知错误 | | - * | 13019 | user is not authorized | 用户未授权 | - * | 13011 | invalid parameter | 参数无效 | - * | 13012 | parse NdefMessage failed | 将参数解析为NdefMessage失败 | - * | 13021 | NFC discovery already started | 已经开始NFC扫描 | - * | 13018 | NFC discovery has not started | 尝试在未开始NFC扫描时停止NFC扫描 | - * | 13022 | Tech already connected | 标签已经连接 | - * | 13023 | Tech has not connected | 尝试在未连接标签时断开连接 | - * | 13013 | NFC tag has not been discovered | 未扫描到NFC标签 | - * | 13014 | invalid tech | 无效的标签技术 | - * | 13015 | unavailable tech | 从标签上获取对应技术失败 | - * | 13024 | function not support | 当前标签技术不支持该功能 | - * | 13017 | system internal error | 相关读写操作失败 | - * | 13016 | connect fail | 连接失败 | */ errMsg: string - /** 错误码 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 13000 | 设备不支持NFC | | - * | 13001 | 系统NFC开关未打开 | | - * | 13010 | 未知错误 | | - * | 13019 | user is not authorized | 用户未授权 | - * | 13011 | invalid parameter | 参数无效 | - * | 13012 | parse NdefMessage failed | 将参数解析为NdefMessage失败 | - * | 13021 | NFC discovery already started | 已经开始NFC扫描 | - * | 13018 | NFC discovery has not started | 尝试在未开始NFC扫描时停止NFC扫描 | - * | 13022 | Tech already connected | 标签已经连接 | - * | 13023 | Tech has not connected | 尝试在未连接标签时断开连接 | - * | 13013 | NFC tag has not been discovered | 未扫描到NFC标签 | - * | 13014 | invalid tech | 无效的标签技术 | - * | 13015 | unavailable tech | 从标签上获取对应技术失败 | - * | 13024 | function not support | 当前标签技术不支持该功能 | - * | 13017 | system internal error | 相关读写操作失败 | - * | 13016 | connect fail | 连接失败 | */ errCode: number - } - interface NodesRef { - /** [[SelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html) NodesRef.boundingClientRect(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.boundingClientRect.html) -* -* 在插件中使用:支持 -* -* 添加节点的布局位置的查询请求。相对于显示区域,以像素为单位。其功能类似于 DOM 的 `getBoundingClientRect`。返回 `NodesRef` 对应的 `SelectorQuery`。 -* -* **示例代码** -* -* ```js -Page({ - getRect () { - wx.createSelectorQuery().select('#the-id').boundingClientRect(function(rect){ - rect.id // 节点的ID - rect.dataset // 节点的dataset - rect.left // 节点的左边界坐标 - rect.right // 节点的右边界坐标 - rect.top // 节点的上边界坐标 - rect.bottom // 节点的下边界坐标 - rect.width // 节点的宽度 - rect.height // 节点的高度 - }).exec() - }, - getAllRects () { - wx.createSelectorQuery().selectAll('.a-class').boundingClientRect(function(rects){ - rects.forEach(function(rect){ - rect.id // 节点的ID - rect.dataset // 节点的dataset - rect.left // 节点的左边界坐标 - rect.right // 节点的右边界坐标 - rect.top // 节点的上边界坐标 - rect.bottom // 节点的下边界坐标 - rect.width // 节点的宽度 - rect.height // 节点的高度 - }) - }).exec() - } -}) -``` */ - boundingClientRect( - /** 回调函数,在执行 `SelectorQuery.exec` 方法后,节点信息会在 `callback` 中返回。 */ - callback?: BoundingClientRectCallback - ): SelectorQuery - /** [[SelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html) NodesRef.context(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.context.html) -* -* 需要基础库: `2.4.2` -* -* 在插件中使用:支持 -* -* 添加节点的 Context 对象查询请求。目前支持 [VideoContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.html)、[CanvasContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html)、[LivePlayerContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.html)、[EditorContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/editor/EditorContext.html)和 [MapContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.html) 的获取。 -* -* **示例代码** -* -* ```js -Page({ - getContext () { - wx.createSelectorQuery().select('.the-video-class').context(function(res){ - console.log(res.context) // 节点对应的 Context 对象。如:选中的节点是 <video> 组件,那么此处即返回 VideoContext 对象 - }).exec() - } -}) -``` */ - context( - /** 回调函数,在执行 `SelectorQuery.exec` 方法后,返回节点信息。 */ - callback?: ContextCallback - ): SelectorQuery - /** [[SelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html) NodesRef.fields(Object fields, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.fields.html) -* -* 在插件中使用:支持 -* -* 获取节点的相关信息。需要获取的字段在fields中指定。返回值是 `nodesRef` 对应的 `selectorQuery` -* -* **注意** -* -* computedStyle 的优先级高于 size,当同时在 computedStyle 里指定了 width/height 和传入了 size: true,则优先返回 computedStyle 获取到的 width/height。 -* -* **示例代码** -* -* ```js -Page({ - getFields () { - wx.createSelectorQuery().select('#the-id').fields({ - dataset: true, - size: true, - scrollOffset: true, - properties: ['scrollX', 'scrollY'], - computedStyle: ['margin', 'backgroundColor'], - context: true, - }, function (res) { - res.dataset // 节点的dataset - res.width // 节点的宽度 - res.height // 节点的高度 - res.scrollLeft // 节点的水平滚动位置 - res.scrollTop // 节点的竖直滚动位置 - res.scrollX // 节点 scroll-x 属性的当前值 - res.scrollY // 节点 scroll-y 属性的当前值 - // 此处返回指定要返回的样式名 - res.margin - res.backgroundColor - res.context // 节点对应的 Context 对象 - res.ref // 节点对应的 Ref 对象 - }).exec() - } -}) -``` */ - fields( - fields: Fields, - /** 回调函数 */ - callback?: FieldsCallback - ): SelectorQuery - /** [[SelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html) NodesRef.node(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.node.html) -* -* 需要基础库: `2.7.0` -* -* 在插件中使用:支持 -* -* 获取 Node 节点实例。目前支持 [Canvas](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.html) 和 [ScrollViewContext](https://developers.weixin.qq.com/miniprogram/dev/api/ui/scroll/ScrollViewContext.html) 的获取。 -* -* **示例代码** -* -* ```js -Page({ - getNode() { - wx.createSelectorQuery().select('.canvas').node(function(res){ - console.log(res.node) // 节点对应的 Canvas 实例。 - }).exec() - } -}) -``` */ - node( - /** 回调函数,在执行 `SelectorQuery.exec` 方法后,返回节点信息。 */ - callback?: NodeCallback - ): SelectorQuery - /** [[SelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html) NodesRef.ref(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.ref.html) -* -* 需要基础库: `3.3.0` -* -* 在插件中使用:支持 -* -* 获取 `Node` 节点的 Ref 对象,可用于 `worklet` 函数内操作节点。仅 `Skyline` 下支持,`Node` 必须是非 `virtual` 类型。 -* -* **示例代码** -* -* ```js -Page({ - getNode() { - this.createSelectorQuery().select('.scrollable').ref(function(res){ - console.log(res.ref) // 节点对应的 Ref 对象 - }).exec() - } -}) -``` */ - ref( - /** 回调函数,在执行 `SelectorQuery.exec` 方法后,返回节点 Ref 对象。 */ - callback?: RefCallback - ): SelectorQuery - /** [[SelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html) NodesRef.scrollOffset(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.scrollOffset.html) -* -* 在插件中使用:支持 -* -* 添加节点的滚动位置查询请求。以像素为单位。节点必须是 `scroll-view` 或者 `viewport`,返回 `NodesRef` 对应的 `SelectorQuery`。 -* -* **示例代码** -* -* ```js -Page({ - getScrollOffset () { - wx.createSelectorQuery().selectViewport().scrollOffset(function(res){ - res.id // 节点的ID - res.dataset // 节点的dataset - res.scrollLeft // 节点的水平滚动位置 - res.scrollTop // 节点的竖直滚动位置 - }).exec() - } -}) -``` */ - scrollOffset( - /** 回调函数,在执行 `SelectorQuery.exec` 方法后,节点信息会在 `callback` 中返回。 */ - callback?: ScrollOffsetCallback - ): SelectorQuery - } - interface Path2D { - /** [Path2D.addPath([Path2D](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.html) path)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.addPath.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 添加路径到当前路径。 */ - addPath( - /** [Path2D](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.html) - * - * 添加的 Path2D 路径。 */ - path: Path2D - ): void - /** [Path2D.arc(number x, number y, number radius, number startAngle, number endAngle, boolean counterclockwise)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.arc.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 添加一段圆弧路径。 */ - arc( - /** 圆心横坐标。 */ - x: number, - /** 圆心纵坐标。 */ - y: number, - /** 圆形半径,必须为正数。 */ - radius: number, - /** 圆弧开始角度。 */ - startAngle: number, - /** 圆弧结束角度。 */ - endAngle: number, - /** 是否逆时针绘制。如果传 true, 则会从 endAngle 开始绘制到 startAngle。 */ - counterclockwise?: boolean - ): void - /** [Path2D.arcTo(number x1, number y1, number x2, number y2, number radius)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.arcTo.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 通过给定控制点添加一段圆弧路径。 */ - arcTo( - /** 第一个控制点横坐标。 */ - x1: number, - /** 第一个控制点纵坐标。 */ - y1: number, - /** 第二个控制点横坐标。 */ - x2: number, - /** 第二个控制点纵坐标。 */ - y2: number, - /** 圆形半径,必须为非负数。 */ - radius: number - ): void - /** [Path2D.bezierCurveTo(number cp1x, number cp1y, number cp2x, number cp2y, number x, number y)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.bezierCurveTo.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 添加三次贝塞尔曲线路径。 */ - bezierCurveTo( - /** 第一个控制点横坐标。 */ - cp1x: number, - /** 第一个控制点纵坐标。 */ - cp1y: number, - /** 第二个控制点横坐标。 */ - cp2x: number, - /** 第二个控制点纵坐标。 */ - cp2y: number, - /** 结束点横坐标。 */ - x: number, - /** 结束点纵坐标。 */ - y: number - ): void - /** [Path2D.closePath()](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.closePath.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 闭合路径到起点。 */ - closePath(): void - /** [Path2D.ellipse(number x, number y, number radiusX, number radiusY, number rotation, number startAngle, number endAngle, boolean counterclockwise)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.ellipse.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 添加椭圆弧路径 */ - ellipse( - /** 椭圆圆心横坐标。 */ - x: number, - /** 椭圆圆心纵坐标。 */ - y: number, - /** 椭圆长轴半径,必须为非负数。 */ - radiusX: number, - /** 椭圆短轴半径,必须为非负数。 */ - radiusY: number, - /** 椭圆旋转角度。 */ - rotation: number, - /** 圆弧开始角度。 */ - startAngle: number, - /** 圆弧结束角度。 */ - endAngle: number, - /** 是否逆时针绘制。如果传 true, 则会从 endAngle 开始绘制到 startAngle。 */ - counterclockwise?: boolean - ): void - /** [Path2D.lineTo(number x, number y)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.lineTo.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 添加直线路径 */ - lineTo( - /** 结束点横坐标。 */ - x: number, - /** 结束点纵坐标。 */ - y: number - ): void - /** [Path2D.moveTo(number x, number y)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.moveTo.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 移动路径开始点 */ - moveTo( - /** 横坐标。 */ - x: number, - /** 纵坐标。 */ - y: number - ): void - /** [Path2D.quadraticCurveTo(number cpx, number cpy, number x, number y)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.quadraticCurveTo.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 添加二次贝塞尔曲线路径。 */ - quadraticCurveTo( - /** 控制点横坐标。 */ - cpx: number, - /** 控制点纵坐标。 */ - cpy: number, - /** 结束点横坐标。 */ - x: number, - /** 结束点纵坐标。 */ - y: number - ): void - /** [Path2D.rect(number x, number y, number width, number height)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Path2D.rect.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 添加方形路径。 */ - rect( - /** 开始点横坐标。 */ - x: number, - /** 开始点纵坐标。 */ - y: number, - /** 方形宽度,正数向右,负数向左。 */ - width: number, - /** 方形高度,正数向下,负数向上。 */ - height: number - ): void - } - interface Performance { - /** [Array.<[PerformanceEntry](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/PerformanceEntry.html)> Performance.getEntries()](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/Performance.getEntries.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 该方法返回当前缓冲区中的所有性能数据 */ - getEntries(): PerformanceEntry[] - /** [Array.<[PerformanceEntry](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/PerformanceEntry.html)> Performance.getEntriesByName(string name, string entryType)](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/Performance.getEntriesByName.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 获取当前缓冲区中所有名称为 [name] 且类型为 [entryType] 的性能数据 */ - getEntriesByName( - /** 名称 */ - name: string, - /** 类型 */ - entryType?: string - ): PerformanceEntry[] - /** [Array.<[PerformanceEntry](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/PerformanceEntry.html)> Performance.getEntriesByType(string entryType)](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/Performance.getEntriesByType.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 获取当前缓冲区中所有类型为 [entryType] 的性能数据 */ - getEntriesByType( - /** 类型 */ - entryType: string - ): PerformanceEntry[] - /** [Performance.setBufferSize(number size)](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/Performance.setBufferSize.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 设置缓冲区大小,默认缓冲 30 条性能数据 */ - setBufferSize(size: number): void - /** [[PerformanceObserver](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/PerformanceObserver.html) Performance.createObserver(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/Performance.createObserver.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 创建全局性能事件监听器 */ - createObserver( - /** 回调函数 */ - callback: (...args: any[]) => any - ): PerformanceObserver - } - interface PreDownloadSubpackageTask { - /** [PreDownloadSubpackageTask.onProgressUpdate(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/subpackage/PreDownloadSubpackageTask.onProgressUpdate.html) - * - * 需要基础库: `2.27.3` - * - * 在插件中使用:不支持 - * - * 监听分包加载进度变化事件 */ - onProgressUpdate( - /** 分包加载进度变化事件的监听函数 */ - listener: PreDownloadSubpackageTaskOnProgressUpdateCallback - ): void - } - interface RealtimeLogManager { - /** [Object RealtimeLogManager.getCurrentState()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeLogManager.getCurrentState.html) - * - * 需要基础库: `2.19.4` - * - * 在插件中使用:不支持 - * - * 实时日志会将一定时间间隔内缓存的日志聚合上报,如果该时间内缓存的内容超出限制,则会被丢弃。此方法可以获取当前缓存剩余空间。 - * - * > 注意:基础库内部在对日志进行上报时会补充一些结构化数据,如果遇到上报溢出的情况也会补充警告日志,所以此方法获取到的当前占用信息会比预期的大一些。 */ - getCurrentState(): CurrentState - /** [RealtimeLogManager.addFilterMsg(string msg)](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeLogManager.addFilterMsg.html) - * - * 需要基础库: `2.8.1` - * - * 在插件中使用:不支持 - * - * 添加过滤关键字,暂不支持在插件使用 */ - addFilterMsg( - /** 是setFilterMsg的添加接口。用于设置多个过滤关键字。 */ - msg: string - ): void - /** [RealtimeLogManager.error()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeLogManager.error.html) - * - * 需要基础库: `2.7.1` - * - * 在插件中使用:不支持 - * - * 写 error 日志,暂不支持在插件使用 */ - error( - /** 日志内容,可以有任意多个。每次调用的参数的总大小不超过5Kb */ - ...args: any[] - ): void - /** [RealtimeLogManager.in(Page pageInstance)](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeLogManager.in.html) - * - * 需要基础库: `2.9.1` - * - * 在插件中使用:不支持 - * - * 设置实时日志page参数所在的页面,暂不支持在插件使用 */ - in( - /** page实例 */ - pageInstance: Page.TrivialInstance - ): void - /** [RealtimeLogManager.info()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeLogManager.info.html) - * - * 需要基础库: `2.7.1` - * - * 在插件中使用:不支持 - * - * 写 info 日志,暂不支持在插件使用 */ - info( - /** 日志内容,可以有任意多个。每次调用的参数的总大小不超过5Kb */ - ...args: any[] - ): void - /** [RealtimeLogManager.setFilterMsg(string msg)](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeLogManager.setFilterMsg.html) - * - * 需要基础库: `2.7.3` - * - * 在插件中使用:不支持 - * - * 设置过滤关键字,暂不支持在插件使用 */ - setFilterMsg( - /** 过滤关键字,最多不超过1Kb,可以在小程序管理后台根据设置的内容搜索得到对应的日志。 */ - msg: string - ): void - /** [RealtimeLogManager.warn()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeLogManager.warn.html) - * - * 需要基础库: `2.7.1` - * - * 在插件中使用:不支持 - * - * 写 warn 日志,暂不支持在插件使用 */ - warn( - /** 日志内容,可以有任意多个。每次调用的参数的总大小不超过5Kb */ - ...args: any[] - ): void - /** [[RealtimeTagLogManager](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeTagLogManager.html) RealtimeLogManager.tag(string tagName)](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeLogManager.tag.html) - * - * 需要基础库: `2.16.0` - * - * 在插件中使用:需要基础库 `2.16.0` - * - * 获取给定标签的日志管理器实例,目前只支持在插件使用 */ - tag( - /** 标签名 */ - tagName: string - ): RealtimeTagLogManager - } - interface RealtimeTagLogManager { - /** [RealtimeTagLogManager.addFilterMsg(string msg)](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeTagLogManager.addFilterMsg.html) - * - * 需要基础库: `2.16.0` - * - * 在插件中使用:需要基础库 `2.16.0` - * - * 添加过滤关键字 */ - addFilterMsg( - /** 是setFilterMsg的添加接口。用于设置多个过滤关键字。 */ - msg: string - ): void - /** [RealtimeTagLogManager.error(string key, Object|Array.<any>|number|string value)](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeTagLogManager.error.html) - * - * 需要基础库: `2.16.0` - * - * 在插件中使用:需要基础库 `2.16.0` - * - * 写 error 日志 */ - error( - /** 日志的 key */ - key: string, - /** 日志的值,每次调用的参数的总大小不超过5Kb */ - value: IAnyObject | any[] | number | string - ): void - /** [RealtimeTagLogManager.info(string key, Object|Array.<any>|number|string value)](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeTagLogManager.info.html) - * - * 需要基础库: `2.16.0` - * - * 在插件中使用:需要基础库 `2.16.0` - * - * 写 info 日志 */ - info( - /** 日志的 key */ - key: string, - /** 日志的值,每次调用的参数的总大小不超过5Kb */ - value: IAnyObject | any[] | number | string - ): void - /** [RealtimeTagLogManager.setFilterMsg(string msg)](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeTagLogManager.setFilterMsg.html) - * - * 需要基础库: `2.16.0` - * - * 在插件中使用:需要基础库 `2.16.0` - * - * 设置过滤关键字 */ - setFilterMsg( - /** 过滤关键字,最多不超过1Kb,可以在小程序管理后台根据设置的内容搜索得到对应的日志。 */ - msg: string - ): void - /** [RealtimeTagLogManager.warn(string key, Object|Array.<any>|number|string value)](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeTagLogManager.warn.html) - * - * 需要基础库: `2.16.0` - * - * 在插件中使用:需要基础库 `2.16.0` - * - * 写 warn 日志 */ - warn( - /** 日志的 key */ - key: string, - /** 日志的值,每次调用的参数的总大小不超过5Kb */ - value: IAnyObject | any[] | number | string - ): void - } - interface RecorderManager { - /** [RecorderManager.onError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.onError.html) - * - * 在插件中使用:支持 - * - * 监听录音错误事件 */ - onError( - /** 录音错误事件的监听函数 */ - listener: UDPSocketOnErrorCallback - ): void - /** [RecorderManager.onFrameRecorded(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.onFrameRecorded.html) - * - * 在插件中使用:支持 - * - * 监听已录制完指定帧大小的文件事件。如果设置了 frameSize,则会回调此事件。 */ - onFrameRecorded( - /** 已录制完指定帧大小的文件事件的监听函数 */ - listener: OnFrameRecordedCallback - ): void - /** [RecorderManager.onInterruptionBegin(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.onInterruptionBegin.html) - * - * 需要基础库: `2.3.0` - * - * 在插件中使用:支持 - * - * 监听录音因为受到系统占用而被中断开始事件。以下场景会触发此事件:微信语音聊天、微信视频聊天。此事件触发后,录音会被暂停。pause 事件在此事件后触发 */ - onInterruptionBegin( - /** 录音因为受到系统占用而被中断开始事件的监听函数 */ - listener: OnInterruptionBeginCallback - ): void - /** [RecorderManager.onInterruptionEnd(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.onInterruptionEnd.html) - * - * 需要基础库: `2.3.0` - * - * 在插件中使用:支持 - * - * 监听录音中断结束事件。在收到 interruptionBegin 事件之后,小程序内所有录音会暂停,收到此事件之后才可再次录音成功。 */ - onInterruptionEnd( - /** 录音中断结束事件的监听函数 */ - listener: OnInterruptionEndCallback - ): void - /** [RecorderManager.onPause(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.onPause.html) - * - * 在插件中使用:支持 - * - * 监听录音暂停事件 */ - onPause( - /** 录音暂停事件的监听函数 */ - listener: OnPauseCallback - ): void - /** [RecorderManager.onResume(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.onResume.html) - * - * 在插件中使用:支持 - * - * 监听录音继续事件 */ - onResume( - /** 录音继续事件的监听函数 */ - listener: OnResumeCallback - ): void - /** [RecorderManager.onStart(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.onStart.html) - * - * 在插件中使用:支持 - * - * 监听录音开始事件 */ - onStart( - /** 录音开始事件的监听函数 */ - listener: OnStartCallback - ): void - /** [RecorderManager.onStop(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.onStop.html) - * - * 在插件中使用:支持 - * - * 监听录音结束事件 */ - onStop( - /** 录音结束事件的监听函数 */ - listener: RecorderManagerOnStopCallback - ): void - /** [RecorderManager.pause()](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.pause.html) - * - * 在插件中使用:支持 - * - * 暂停录音 */ - pause(): void - /** [RecorderManager.resume()](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.resume.html) - * - * 在插件中使用:支持 - * - * 继续录音 */ - resume(): void - /** [RecorderManager.start(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.start.html) - * - * 在插件中使用:支持 - * - * 开始录音 - * - * **采样率与编码码率限制** - * - * 每种采样率有对应的编码码率范围有效值,设置不合法的采样率或编码码率会导致录音失败,具体对应关系如下表。 - * - * | 采样率 | 编码码率 | - * | ------ | -------------- | - * | 8000 | 16000 ~ 48000 | - * | 11025 | 16000 ~ 48000 | - * | 12000 | 24000 ~ 64000 | - * | 16000 | 24000 ~ 96000 | - * | 22050 | 32000 ~ 128000 | - * | 24000 | 32000 ~ 128000 | - * | 32000 | 48000 ~ 192000 | - * | 44100 | 64000 ~ 320000 | - * | 48000 | 64000 ~ 320000 | */ - start(option: RecorderManagerStartOption): void - /** [RecorderManager.stop()](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.stop.html) - * - * 在插件中使用:支持 - * - * 停止录音 */ - stop(): void - } - interface RequestTask { - /** [RequestTask.abort()](https://developers.weixin.qq.com/miniprogram/dev/api/network/request/RequestTask.abort.html) - * - * 需要基础库: `1.4.0` - * - * 在插件中使用:支持 - * - * 中断请求任务 */ - abort(): void - /** [RequestTask.offChunkReceived(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/request/RequestTask.offChunkReceived.html) -* -* 需要基础库: `2.20.1` -* -* 在插件中使用:支持 -* -* 移除 Transfer-Encoding Chunk Received 事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -RequestTask.onChunkReceived(listener) -RequestTask.offChunkReceived(listener) // 需传入与监听时同一个的函数对象 -``` */ - offChunkReceived( - /** onChunkReceived 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffChunkReceivedCallback - ): void - /** [RequestTask.offHeadersReceived(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/request/RequestTask.offHeadersReceived.html) -* -* 需要基础库: `2.1.0` -* -* 在插件中使用:支持 -* -* 移除 HTTP Response Header 事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -RequestTask.onHeadersReceived(listener) -RequestTask.offHeadersReceived(listener) // 需传入与监听时同一个的函数对象 -``` */ - offHeadersReceived( - /** onHeadersReceived 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: RequestTaskOffHeadersReceivedCallback - ): void - /** [RequestTask.onChunkReceived(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/request/RequestTask.onChunkReceived.html) - * - * 需要基础库: `2.20.1` - * - * 在插件中使用:支持 - * - * 监听 Transfer-Encoding Chunk Received 事件。当接收到新的chunk时触发。 */ - onChunkReceived( - /** Transfer-Encoding Chunk Received 事件的监听函数 */ - listener: OnChunkReceivedCallback - ): void - /** [RequestTask.onHeadersReceived(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/request/RequestTask.onHeadersReceived.html) - * - * 需要基础库: `2.1.0` - * - * 在插件中使用:支持 - * - * 监听 HTTP Response Header 事件。会比请求完成事件更早 */ - onHeadersReceived( - /** HTTP Response Header 事件的监听函数 */ - listener: RequestTaskOnHeadersReceivedCallback - ): void - } - interface RewardedVideoAd { - /** [Promise RewardedVideoAd.load()](https://developers.weixin.qq.com/miniprogram/dev/api/ad/RewardedVideoAd.load.html) - * - * 在插件中使用:不支持 - * - * 加载激励视频广告。 */ - load(): Promise<any> - /** [Promise RewardedVideoAd.show()](https://developers.weixin.qq.com/miniprogram/dev/api/ad/RewardedVideoAd.show.html) - * - * 在插件中使用:不支持 - * - * 显示激励视频广告。激励视频广告将从屏幕下方推入。 */ - show(): Promise<any> - /** [RewardedVideoAd.destroy()](https://developers.weixin.qq.com/miniprogram/dev/api/ad/RewardedVideoAd.destroy.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:不支持 - * - * 销毁激励视频广告实例。 */ - destroy(): void - /** [RewardedVideoAd.offClose(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/RewardedVideoAd.offClose.html) -* -* 在插件中使用:不支持 -* -* 移除用户点击 `关闭广告` 按钮的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -RewardedVideoAd.onClose(listener) -RewardedVideoAd.offClose(listener) // 需传入与监听时同一个的函数对象 -``` */ - offClose( - /** onClose 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: RewardedVideoAdOffCloseCallback - ): void - /** [RewardedVideoAd.offError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/RewardedVideoAd.offError.html) -* -* 在插件中使用:不支持 -* -* 移除激励视频错误事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -RewardedVideoAd.onError(listener) -RewardedVideoAd.offError(listener) // 需传入与监听时同一个的函数对象 -``` */ - offError( - /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: RewardedVideoAdOffErrorCallback - ): void - /** [RewardedVideoAd.offLoad(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/RewardedVideoAd.offLoad.html) -* -* 在插件中使用:不支持 -* -* 移除激励视频广告加载事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -RewardedVideoAd.onLoad(listener) -RewardedVideoAd.offLoad(listener) // 需传入与监听时同一个的函数对象 -``` */ - offLoad( - /** onLoad 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffLoadCallback - ): void - /** [RewardedVideoAd.onClose(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/RewardedVideoAd.onClose.html) - * - * 在插件中使用:不支持 - * - * 监听用户点击 `关闭广告` 按钮的事件。 */ - onClose( - /** 用户点击 `关闭广告` 按钮的事件的监听函数 */ - listener: RewardedVideoAdOnCloseCallback - ): void - /** [RewardedVideoAd.onError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/RewardedVideoAd.onError.html) - * - * 在插件中使用:不支持 - * - * 监听激励视频错误事件。 - * - * **错误码信息与解决方案表** - * - * 错误码是通过onError获取到的错误信息。调试期间,可以通过异常返回来捕获信息。 - * 在小程序发布上线之后,如果遇到异常问题,可以在[“运维中心“](https://mp.weixin.qq.com/)里面搜寻错误日志,还可以针对异常返回加上适当的监控信息。 - * - * | 代码 | 异常情况 | 理由 | 解决方案 | - * | ------ | -------------- | --------------- | -------------------------- | - * | 1000 | 后端错误调用失败 | 该项错误不是开发者的异常情况 | 一般情况下忽略一段时间即可恢复。 | - * | 1001 | 参数错误 | 使用方法错误 | 可以前往developers.weixin.qq.com确认具体教程(小程序和小游戏分别有各自的教程,可以在顶部选项中,“设计”一栏的右侧进行切换。| - * | 1002 | 广告单元无效 | 可能是拼写错误、或者误用了其他APP的广告ID | 请重新前往mp.weixin.qq.com确认广告位ID。 | - * | 1003 | 内部错误 | 该项错误不是开发者的异常情况 | 一般情况下忽略一段时间即可恢复。| - * | 1004 | 无适合的广告 | 广告不是每一次都会出现,这次没有出现可能是由于该用户不适合浏览广告 | 属于正常情况,且开发者需要针对这种情况做形态上的兼容。 | - * | 1005 | 广告组件审核中 | 你的广告正在被审核,无法展现广告 | 请前往mp.weixin.qq.com确认审核状态,且开发者需要针对这种情况做形态上的兼容。| - * | 1006 | 广告组件被驳回 | 你的广告审核失败,无法展现广告 | 请前往mp.weixin.qq.com确认审核状态,且开发者需要针对这种情况做形态上的兼容。| - * | 1007 | 广告组件被封禁 | 你的广告能力已经被封禁,封禁期间无法展现广告 | 请前往mp.weixin.qq.com确认小程序广告封禁状态。 | - * | 1008 | 广告单元已关闭 | 该广告位的广告能力已经被关闭 | 请前往mp.weixin.qq.com重新打开对应广告位的展现。| */ - onError( - /** 激励视频错误事件的监听函数 */ - listener: RewardedVideoAdOnErrorCallback - ): void - /** [RewardedVideoAd.onLoad(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/RewardedVideoAd.onLoad.html) - * - * 在插件中使用:不支持 - * - * 监听激励视频广告加载事件。 */ - onLoad( - /** 激励视频广告加载事件的监听函数 */ - listener: OnLoadCallback - ): void - } - interface Router { - /** [router.addRouteBuilder(string routeType, function routeBuilder)](https://developers.weixin.qq.com/miniprogram/dev/api/route/router/base/router.addRouteBuilder.html) -* -* 在插件中使用:不支持 -* -* 添加自定义路由配置 -* -* **自定义路由示例** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/y1IbQpmA7wGZ) -* -* ```js -// 定义自定义效果,从右侧推入 -const slideRouteBuilder = (customRouteContext) => { - const { primaryAnimation } = customRouteContext - const handlePrimaryAnimation = () => { - 'worklet' - const transX = windowWidth * (1 - primaryAnimation.value) - return { - transform: `translateX(${transX}px)`, - } - } - return { - handlePrimaryAnimation - } -} - -wx.router.addRouteBuilder('slide', slideRouteBuilder) - -// 使用自定义路由 -wx.navigateTo({ - url: 'xxx', - routeType: 'slide' -}) -``` */ - addRouteBuilder( - /** 路由类型 */ - routeType: string, - /** [路由动画定义函数](#) */ - routeBuilder: CustomRouteBuilder - ): void - /** [router.getRouteContext(Object this)](https://developers.weixin.qq.com/miniprogram/dev/api/route/router/base/router.getRouteContext.html) - * - * 在插件中使用:不支持 - * - * 获取页面对应的自定义路由上下文对象 */ - getRouteContext( - /** 页面/自定义组件实例 */ - component: Component.TrivialInstance | Page.TrivialInstance - ): void - /** [router.removeRouteBuilder(string routeType)](https://developers.weixin.qq.com/miniprogram/dev/api/route/router/base/router.removeRouteBuilder.html) - * - * 在插件中使用:不支持 - * - * 移除自定义路由配置 */ - removeRouteBuilder( - /** 路由类型 */ - routeType: string - ): void - } - interface SelectorQuery { - /** [[NodesRef](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.html) SelectorQuery.exec(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.exec.html) - * - * 在插件中使用:支持 - * - * 执行所有的请求。请求结果按请求次序构成数组,在callback的第一个参数中返回。 */ - exec( - /** 回调函数 */ - callback?: (...args: any[]) => any - ): NodesRef - /** [[NodesRef](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.html) SelectorQuery.select(string selector)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.select.html) - * - * 在插件中使用:支持 - * - * 在当前页面下选择第一个匹配选择器 `selector` 的节点。返回一个 `NodesRef` 对象实例,可以用于获取节点信息。 - * - * **selector 语法** - * - * selector类似于 CSS 的选择器,但仅支持下列语法。 - * - * - ID选择器:#the-id - * - class选择器(可以连续指定多个):.a-class.another-class - * - 子元素选择器:.the-parent > .the-child - * - 后代选择器:.the-ancestor .the-descendant - * - 跨自定义组件的后代选择器:.the-ancestor >>> .the-descendant - * - 多选择器的并集:#a-node, .some-other-nodes */ - select( - /** 选择器 */ - selector: string - ): NodesRef - /** [[NodesRef](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.html) SelectorQuery.selectAll(string selector)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.selectAll.html) - * - * 在插件中使用:支持 - * - * 在当前页面下选择匹配选择器 selector 的所有节点。 - * - * **selector 语法** - * - * selector类似于 CSS 的选择器,但仅支持下列语法。 - * - * - ID选择器:#the-id - * - class选择器(可以连续指定多个):.a-class.another-class - * - 子元素选择器:.the-parent > .the-child - * - 后代选择器:.the-ancestor .the-descendant - * - 跨自定义组件的后代选择器:.the-ancestor >>> .the-descendant - * - 多选择器的并集:#a-node, .some-other-nodes */ - selectAll( - /** 选择器 */ - selector: string - ): NodesRef - /** [[NodesRef](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.html) SelectorQuery.selectViewport()](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.selectViewport.html) - * - * 在插件中使用:支持 - * - * 选择显示区域。可用于获取显示区域的尺寸、滚动位置等信息。 */ - selectViewport(): NodesRef - /** [[SelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html) SelectorQuery.in(Component component)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.in.html) -* -* 需要基础库: `1.6.0` -* -* 在插件中使用:支持 -* -* 将选择器的选取范围更改为自定义组件 `component` 内。(初始时,选择器仅选取页面范围的节点,不会选取任何自定义组件中的节点)。 -* -* **示例代码** -* -* ```js -Component({ - queryMultipleNodes (){ - const query = wx.createSelectorQuery().in(this) - query.select('#the-id').boundingClientRect(function(res){ - res.top // 这个组件内 #the-id 节点的上边界坐标 - }).exec() - } -}) -``` */ - in( - /** 自定义组件实例 */ - component: Component.TrivialInstance | Page.TrivialInstance - ): SelectorQuery - } - interface SocketTask { - /** [SocketTask.close(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.close.html) - * - * 在插件中使用:支持 - * - * 关闭 WebSocket 连接 */ - close(option: SocketTaskCloseOption): void - /** [SocketTask.onClose(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.onClose.html) - * - * 在插件中使用:支持 - * - * 监听 WebSocket 连接关闭事件 */ - onClose( - /** WebSocket 连接关闭事件的监听函数 */ - listener: SocketTaskOnCloseCallback - ): void - /** [SocketTask.onError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.onError.html) - * - * 在插件中使用:支持 - * - * 监听 WebSocket 错误事件 */ - onError( - /** WebSocket 错误事件的监听函数 */ - listener: UDPSocketOnErrorCallback - ): void - /** [SocketTask.onMessage(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.onMessage.html) - * - * 在插件中使用:支持 - * - * 监听 WebSocket 接收到服务器的消息事件 */ - onMessage( - /** WebSocket 接收到服务器的消息事件的监听函数 */ - listener: SocketTaskOnMessageCallback - ): void - /** [SocketTask.onOpen(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.onOpen.html) - * - * 在插件中使用:支持 - * - * 监听 WebSocket 连接打开事件 */ - onOpen( - /** WebSocket 连接打开事件的监听函数 */ - listener: OnOpenCallback - ): void - /** [SocketTask.send(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.send.html) - * - * 在插件中使用:支持 - * - * 通过 WebSocket 连接发送数据 */ - send(option: SocketTaskSendOption): void - } - interface TCPSocket { - /** [TCPSocket.bindWifi(Object options)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.bindWifi.html) - * - * 需要基础库: `2.25.0` - * - * 在插件中使用:不支持 - * - * 将 TCP Socket 绑定到当前 wifi 网络,成功后会触发 onBindWifi 事件(仅安卓支持) */ - bindWifi(options: BindWifiOption): void - /** [TCPSocket.close()](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.close.html) - * - * 在插件中使用:不支持 - * - * 关闭连接 */ - close(): void - /** [TCPSocket.connect(Object options)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.connect.html) - * - * 在插件中使用:不支持 - * - * 在给定的套接字上启动连接 */ - connect(options: TCPSocketConnectOption): void - /** [TCPSocket.offBindWifi(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.offBindWifi.html) -* -* 需要基础库: `2.25.0` -* -* 在插件中使用:不支持 -* -* 移除当一个 socket 绑定当前 wifi 网络成功时触发该事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -TCPSocket.onBindWifi(listener) -TCPSocket.offBindWifi(listener) // 需传入与监听时同一个的函数对象 -``` */ - offBindWifi( - /** onBindWifi 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffBindWifiCallback - ): void - /** [TCPSocket.offClose(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.offClose.html) -* -* 在插件中使用:不支持 -* -* 移除一旦 socket 完全关闭就发出该事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -TCPSocket.onClose(listener) -TCPSocket.offClose(listener) // 需传入与监听时同一个的函数对象 -``` */ - offClose( - /** onClose 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: UDPSocketOffCloseCallback - ): void - /** [TCPSocket.offConnect(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.offConnect.html) -* -* 在插件中使用:不支持 -* -* 移除当一个 socket 连接成功建立的时候触发该事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -TCPSocket.onConnect(listener) -TCPSocket.offConnect(listener) // 需传入与监听时同一个的函数对象 -``` */ - offConnect( - /** onConnect 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffConnectCallback - ): void - /** [TCPSocket.offError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.offError.html) -* -* 在插件中使用:不支持 -* -* 移除当错误发生时触发的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -TCPSocket.onError(listener) -TCPSocket.offError(listener) // 需传入与监听时同一个的函数对象 -``` */ - offError( - /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: UDPSocketOffErrorCallback - ): void - /** [TCPSocket.offMessage(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.offMessage.html) -* -* 在插件中使用:不支持 -* -* 移除当接收到数据的时触发该事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -TCPSocket.onMessage(listener) -TCPSocket.offMessage(listener) // 需传入与监听时同一个的函数对象 -``` */ - offMessage( - /** onMessage 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: TCPSocketOffMessageCallback - ): void - /** [TCPSocket.onBindWifi(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.onBindWifi.html) - * - * 需要基础库: `2.25.0` - * - * 在插件中使用:不支持 - * - * 监听当一个 socket 绑定当前 wifi 网络成功时触发该事件 */ - onBindWifi( - /** 当一个 socket 绑定当前 wifi 网络成功时触发该事件的监听函数 */ - listener: OnBindWifiCallback - ): void - /** [TCPSocket.onClose(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.onClose.html) - * - * 在插件中使用:不支持 - * - * 监听一旦 socket 完全关闭就发出该事件 */ - onClose( - /** 一旦 socket 完全关闭就发出该事件的监听函数 */ - listener: UDPSocketOnCloseCallback - ): void - /** [TCPSocket.onConnect(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.onConnect.html) - * - * 在插件中使用:不支持 - * - * 监听当一个 socket 连接成功建立的时候触发该事件 */ - onConnect( - /** 当一个 socket 连接成功建立的时候触发该事件的监听函数 */ - listener: OnConnectCallback - ): void - /** [TCPSocket.onError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.onError.html) - * - * 在插件中使用:不支持 - * - * 监听当错误发生时触发 */ - onError( - /** 的监听函数 */ - listener: UDPSocketOnErrorCallback - ): void - /** [TCPSocket.onMessage(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.onMessage.html) - * - * 在插件中使用:不支持 - * - * 监听当接收到数据的时触发该事件 */ - onMessage( - /** 当接收到数据的时触发该事件的监听函数 */ - listener: TCPSocketOnMessageCallback - ): void - /** [TCPSocket.write(string|ArrayBuffer data)](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.write.html) - * - * 在插件中使用:不支持 - * - * 在 socket 上发送数据 */ - write( - /** 要发送的数据 */ - data: string | ArrayBuffer - ): void - } - interface UDPSocket { - /** [UDPSocket.close()](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.close.html) - * - * 在插件中使用:需要基础库 `2.11.1` - * - * 关闭 UDP Socket 实例,相当于销毁。 在关闭之后,UDP Socket 实例不能再发送消息,每次调用 `UDPSocket.send` 将会触发错误事件,并且 message 事件回调函数也不会再也执行。在 `UDPSocket` 实例被创建后将被 Native 强引用,保证其不被 GC。在 `UDPSocket.close` 后将解除对其的强引用,让 UDPSocket 实例遵从 GC。 */ - close(): void - /** [UDPSocket.connect(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.connect.html) - * - * 需要基础库: `2.15.0` - * - * 在插件中使用:需要基础库 `2.11.1` - * - * 预先连接到指定的 IP 和 port,需要配合 write 方法一起使用 */ - connect(option: UDPSocketConnectOption): void - /** [UDPSocket.offClose(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.offClose.html) -* -* 在插件中使用:需要基础库 `2.11.1` -* -* 移除关闭事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -UDPSocket.onClose(listener) -UDPSocket.offClose(listener) // 需传入与监听时同一个的函数对象 -``` */ - offClose( - /** onClose 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: UDPSocketOffCloseCallback - ): void - /** [UDPSocket.offError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.offError.html) -* -* 在插件中使用:需要基础库 `2.11.1` -* -* 移除错误事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -UDPSocket.onError(listener) -UDPSocket.offError(listener) // 需传入与监听时同一个的函数对象 -``` */ - offError( - /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: UDPSocketOffErrorCallback - ): void - /** [UDPSocket.offListening(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.offListening.html) -* -* 在插件中使用:需要基础库 `2.11.1` -* -* 移除开始监听数据包消息的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -UDPSocket.onListening(listener) -UDPSocket.offListening(listener) // 需传入与监听时同一个的函数对象 -``` */ - offListening( - /** onListening 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffListeningCallback - ): void - /** [UDPSocket.offMessage(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.offMessage.html) -* -* 在插件中使用:需要基础库 `2.11.1` -* -* 移除收到消息的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -UDPSocket.onMessage(listener) -UDPSocket.offMessage(listener) // 需传入与监听时同一个的函数对象 -``` */ - offMessage( - /** onMessage 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: UDPSocketOffMessageCallback - ): void - /** [UDPSocket.onClose(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.onClose.html) - * - * 在插件中使用:需要基础库 `2.11.1` - * - * 监听关闭事件 */ - onClose( - /** 关闭事件的监听函数 */ - listener: UDPSocketOnCloseCallback - ): void - /** [UDPSocket.onError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.onError.html) - * - * 在插件中使用:需要基础库 `2.11.1` - * - * 监听错误事件 */ - onError( - /** 错误事件的监听函数 */ - listener: UDPSocketOnErrorCallback - ): void - /** [UDPSocket.onListening(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.onListening.html) - * - * 在插件中使用:需要基础库 `2.11.1` - * - * 监听开始监听数据包消息的事件 */ - onListening( - /** 开始监听数据包消息的事件的监听函数 */ - listener: OnListeningCallback - ): void - /** [UDPSocket.onMessage(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.onMessage.html) - * - * 在插件中使用:需要基础库 `2.11.1` - * - * 监听收到消息的事件 */ - onMessage( - /** 收到消息的事件的监听函数 */ - listener: UDPSocketOnMessageCallback - ): void - /** [UDPSocket.send(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.send.html) - * - * 在插件中使用:需要基础库 `2.11.1` - * - * 向指定的 IP 和 port 发送消息。基础库 2.9.0 起支持广播 (指定地址为 255.255.255.255)。 */ - send(option: UDPSocketSendOption): void - /** [UDPSocket.setTTL(number ttl)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.setTTL.html) - * - * 需要基础库: `2.18.0` - * - * 在插件中使用:支持 - * - * 设置 IP_TTL 套接字选项,用于设置一个 IP 数据包传输时允许的最大跳步数 */ - setTTL( - /** ttl 参数可以是 0 到 255 之间 */ - ttl: number - ): void - /** [UDPSocket.write(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.write.html) - * - * 需要基础库: `2.15.0` - * - * 在插件中使用:需要基础库 `2.11.1` - * - * 用法与 send 方法相同,如果没有预先调用 connect 则与 send 无差异(注意即使调用了 connect 也需要在本接口填入地址和端口参数) */ - write(option: UDPSocketSendOption): void - /** [number UDPSocket.bind(number port)](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.bind.html) - * - * 在插件中使用:需要基础库 `2.11.1` - * - * 绑定一个系统随机分配的可用端口,或绑定一个指定的端口号 */ - bind( - /** 需要基础库: `2.9.0` - * - * 指定要绑定的端口号,不传则返回系统随机分配的可用端口 */ - port?: number - ): number - } - interface UpdateManager { - /** [UpdateManager.applyUpdate()](https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.applyUpdate.html) - * - * 在插件中使用:不支持 - * - * 强制小程序重启并使用新版本。在小程序新版本下载完成后(即收到 `onUpdateReady` 回调)调用。 - * - * **示例代码** - * - * [示例代码](https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.html#示例代码) */ - applyUpdate(): void - /** [UpdateManager.onCheckForUpdate(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.onCheckForUpdate.html) - * - * 在插件中使用:不支持 - * - * 监听向微信后台请求检查更新结果事件。微信在小程序每次启动(包括热启动)时自动检查更新,不需由开发者主动触发。 - * - * **示例代码** - * - * [示例代码](https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.html#示例代码) */ - onCheckForUpdate( - /** 向微信后台请求检查更新结果事件的监听函数 */ - listener: OnCheckForUpdateCallback - ): void - /** [UpdateManager.onUpdateFailed(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.onUpdateFailed.html) - * - * 在插件中使用:不支持 - * - * 监听小程序更新失败事件。小程序有新版本,客户端主动触发下载(无需开发者触发),下载失败(可能是网络原因等)后回调 - * - * **示例代码** - * - * [示例代码](https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.html#示例代码) */ - onUpdateFailed( - /** 小程序更新失败事件的监听函数 */ - listener: OnUpdateFailedCallback - ): void - /** [UpdateManager.onUpdateReady(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.onUpdateReady.html) - * - * 在插件中使用:不支持 - * - * 监听小程序有版本更新事件。客户端主动触发下载(无需开发者触发),下载成功后回调 - * - * **示例代码** - * - * [示例代码](https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.html#示例代码) */ - onUpdateReady( - /** 小程序有版本更新事件的监听函数 */ - listener: OnUpdateReadyCallback - ): void - } - interface UploadTask { - /** [UploadTask.abort()](https://developers.weixin.qq.com/miniprogram/dev/api/network/upload/UploadTask.abort.html) - * - * 需要基础库: `1.4.0` - * - * 在插件中使用:支持 - * - * 中断上传任务 */ - abort(): void - /** [UploadTask.offHeadersReceived(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/upload/UploadTask.offHeadersReceived.html) -* -* 需要基础库: `2.1.0` -* -* 在插件中使用:支持 -* -* 移除 HTTP Response Header 事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -UploadTask.onHeadersReceived(listener) -UploadTask.offHeadersReceived(listener) // 需传入与监听时同一个的函数对象 -``` */ - offHeadersReceived( - /** onHeadersReceived 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: DownloadTaskOffHeadersReceivedCallback - ): void - /** [UploadTask.offProgressUpdate(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/upload/UploadTask.offProgressUpdate.html) -* -* 需要基础库: `2.1.0` -* -* 在插件中使用:支持 -* -* 移除上传进度变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -UploadTask.onProgressUpdate(listener) -UploadTask.offProgressUpdate(listener) // 需传入与监听时同一个的函数对象 -``` */ - offProgressUpdate( - /** onProgressUpdate 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: UploadTaskOffProgressUpdateCallback - ): void - /** [UploadTask.onHeadersReceived(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/upload/UploadTask.onHeadersReceived.html) - * - * 需要基础库: `2.1.0` - * - * 在插件中使用:支持 - * - * 监听 HTTP Response Header 事件。会比请求完成事件更早 */ - onHeadersReceived( - /** HTTP Response Header 事件的监听函数 */ - listener: DownloadTaskOnHeadersReceivedCallback - ): void - /** [UploadTask.onProgressUpdate(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/upload/UploadTask.onProgressUpdate.html) - * - * 需要基础库: `1.4.0` - * - * 在插件中使用:支持 - * - * 监听上传进度变化事件 */ - onProgressUpdate( - /** 上传进度变化事件的监听函数 */ - listener: UploadTaskOnProgressUpdateCallback - ): void - } - interface UserCryptoManager { - /** [UserCryptoManager.getLatestUserKey(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/crypto/UserCryptoManager.getLatestUserKey.html) -* -* 需要基础库: `2.17.3` -* -* 在插件中使用:不支持 -* -* 获取最新的用户加密密钥 -* -* **示例代码** -* -* ```js -const userCryptoManager = wx.getUserCryptoManager() -userCryptoManager.getLatestUserKey({ - success: res => { - const {encryptKey, iv, version, expireTime} = res - console.log(encryptKey, iv, version, expireTime) - } -}) -``` */ - getLatestUserKey(option?: GetLatestUserKeyOption): void - /** [UserCryptoManager.getRandomValues(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/crypto/UserCryptoManager.getRandomValues.html) -* -* 需要基础库: `2.17.3` -* -* 在插件中使用:不支持 -* -* 获取密码学安全随机数 -* -* **示例代码** -* -* ```js -const userCryptoManager = wx.getUserCryptoManager() -userCryptoManager.getRandomValues({ - length: 6 // 生成 6 个字节长度的随机数, - success: res => { - // 转成 base64 字符串伪代码 arrayBufferToBase64(res.randomValues) - } -}) -``` */ - getRandomValues(option: GetRandomValuesOption): void - } - interface VideoContext { - /** [VideoContext.exitBackgroundPlayback()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.exitBackgroundPlayback.html) - * - * 需要基础库: `2.14.3` - * - * 在插件中使用:支持 - * - * 退出后台音频播放模式。 */ - exitBackgroundPlayback(): void - /** [VideoContext.exitCasting()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.exitCasting.html) - * - * 需要基础库: `2.32.0` - * - * 在插件中使用:支持 - * - * 退出投屏。仅支持在 tap 事件回调内调用。 */ - exitCasting(): void - /** [VideoContext.exitFullScreen()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.exitFullScreen.html) - * - * 需要基础库: `1.4.0` - * - * 在插件中使用:支持 - * - * 退出全屏 */ - exitFullScreen(): void - /** [VideoContext.exitPictureInPicture(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.exitPictureInPicture.html) - * - * 在插件中使用:支持 - * - * 退出小窗,该方法可在任意页面调用 */ - exitPictureInPicture(option?: ExitPictureInPictureOption): void - /** [VideoContext.hideStatusBar()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.hideStatusBar.html) - * - * 需要基础库: `2.1.0` - * - * 在插件中使用:支持 - * - * 隐藏状态栏,仅在iOS全屏下有效 */ - hideStatusBar(): void - /** [VideoContext.pause()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.pause.html) - * - * 在插件中使用:支持 - * - * 暂停视频 */ - pause(): void - /** [VideoContext.play()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.play.html) - * - * 在插件中使用:支持 - * - * 播放视频 */ - play(): void - /** [VideoContext.playbackRate(number rate)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.playbackRate.html) - * - * 需要基础库: `1.4.0` - * - * 在插件中使用:支持 - * - * 设置倍速播放 */ - playbackRate( - /** 倍率,支持 0.5/0.8/1.0/1.25/1.5,2.6.3 起支持 2.0 倍速 */ - rate: number - ): void - /** [VideoContext.reconnectCasting()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.reconnectCasting.html) - * - * 需要基础库: `2.32.0` - * - * 在插件中使用:支持 - * - * 重连投屏设备。仅支持在 tap 事件回调内调用。 */ - reconnectCasting(): void - /** [VideoContext.requestBackgroundPlayback()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.requestBackgroundPlayback.html) - * - * 需要基础库: `2.14.3` - * - * 在插件中使用:支持 - * - * 进入后台音频播放模式。 */ - requestBackgroundPlayback(): void - /** [VideoContext.requestFullScreen(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.requestFullScreen.html) - * - * 需要基础库: `1.4.0` - * - * 在插件中使用:支持 - * - * 进入全屏。若有自定义内容需在全屏时展示,需将内容节点放置到 video 节点内。 */ - requestFullScreen(option: VideoContextRequestFullScreenOption): void - /** [VideoContext.seek(number position)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.seek.html) - * - * 在插件中使用:支持 - * - * 跳转到指定位置 */ - seek( - /** 跳转到的位置,单位 s */ - position: number - ): void - /** [VideoContext.sendDanmu(Object data)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.sendDanmu.html) - * - * 在插件中使用:支持 - * - * 发送弹幕 */ - sendDanmu( - /** 弹幕内容 */ - data: Danmu - ): void - /** [VideoContext.showStatusBar()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.showStatusBar.html) - * - * 需要基础库: `2.1.0` - * - * 在插件中使用:支持 - * - * 显示状态栏,仅在iOS全屏下有效 */ - showStatusBar(): void - /** [VideoContext.startCasting()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.startCasting.html) - * - * 需要基础库: `2.32.0` - * - * 在插件中使用:支持 - * - * 开始投屏, 拉起半屏搜索设备。仅支持在 tap 事件回调内调用。 */ - startCasting(): void - /** [VideoContext.stop()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.stop.html) - * - * 需要基础库: `1.7.0` - * - * 在插件中使用:支持 - * - * 停止视频 */ - stop(): void - /** [VideoContext.switchCasting()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.switchCasting.html) - * - * 需要基础库: `2.32.0` - * - * 在插件中使用:支持 - * - * 切换投屏设备。仅支持在 tap 事件回调内调用。 */ - switchCasting(): void - } - interface VideoDecoder { - /** [Object VideoDecoder.getFrameData()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.getFrameData.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 获取下一帧的解码数据 */ - getFrameData(): FrameDataOptions - /** [Promise VideoDecoder.remove()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.remove.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 移除解码器 */ - remove(): Promise<any> - /** [Promise VideoDecoder.seek(number position)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.seek.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 跳到某个时间点解码 */ - seek( - /** 跳转的解码位置,单位 ms */ - position: number - ): Promise<any> - /** [Promise VideoDecoder.start(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.start.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 开始解码 */ - start(option: VideoDecoderStartOption): Promise<any> - /** [Promise VideoDecoder.stop()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.stop.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 停止解码 */ - stop(): Promise<any> - /** [VideoDecoder.off(string eventName, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.off.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 取消监听录制事件。当对应事件触发时,该回调函数不再执行 */ - off( - /** 事件名 */ - eventName: string, - /** 事件触发时执行的回调函数 */ - callback: (...args: any[]) => any - ): void - /** [VideoDecoder.on(string eventName, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.on.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 注册监听录制事件的回调函数。当对应事件触发时,回调函数会被执行 */ - on( - /** 事件名 - * - * 参数 eventName 可选值: - * - 'start': 开始事件。返回 {width, height}; - * - 'stop': 结束事件。; - * - 'seek': seek 完成事件。; - * - 'bufferchange': 缓冲区变化事件。; - * - 'ended': 解码结束事件。; */ - eventName: 'start' | 'stop' | 'seek' | 'bufferchange' | 'ended', - /** 事件触发时执行的回调函数 */ - callback: (...args: any[]) => any - ): void - } - interface VirtualPaymentError { - /** 错误信息 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 1001 | | 参数错误 | - * | -1 | | 支付失败 | - * | -2 | | 支付取消 | - * | -4 | | 风控拦截 | - * | -5 | | 开通签约结果未知 | - * | -15001 | | 参数错误,具体原因见err_msg | - * | -15002 | | outTradeNo重复使用,请换新单号重试 | - * | -15003 | | 系统错误 | - * | -15004 | | currencyType错误,目前只能填CNY | - * | -15005 | | 用户态签名signature错误 | - * | -15006 | | 支付签名paySig错误 | - * | -15007 | | session_key过期 | - * | -15008 | | 二级商户进件未完成 | - * | -15009 | | 代币未发布 | - * | -15010 | | 道具productId未发布 | - * | -15011 | | 现网版本的env只能是0,不能填1(沙盒环境) | - * | -15012 | | 调用米大师失败导致关单,请换新单号重试 | - * | -15013 | | goodsPrice道具价格错误 | - * | -15014 | | 道具/代币发布未生效,禁止下单,大概10分钟后生效 | - * | -15016 | | signData格式有问题 | - * | -15017 | | 此商家涉嫌违规,收款功能已被限制,暂无法支付。商家可以登录微信商户平台/微信支付商家助手小程序查看原因和解决方案 | - * | -15018 | | 代币或者道具productId审核不通过 | - * | -15019 | | 调微信报商户受限,商家可以登录微信商户平台/微信支付商家助手小程序查看原因和解决方案 | - * | -15020 | | 操作过快,请稍候再试 | - * | -15021 | | 小程序被限频交易 | */ errMsg: string - /** 错误码 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 1001 | | 参数错误 | - * | -1 | | 支付失败 | - * | -2 | | 支付取消 | - * | -4 | | 风控拦截 | - * | -5 | | 开通签约结果未知 | - * | -15001 | | 参数错误,具体原因见err_msg | - * | -15002 | | outTradeNo重复使用,请换新单号重试 | - * | -15003 | | 系统错误 | - * | -15004 | | currencyType错误,目前只能填CNY | - * | -15005 | | 用户态签名signature错误 | - * | -15006 | | 支付签名paySig错误 | - * | -15007 | | session_key过期 | - * | -15008 | | 二级商户进件未完成 | - * | -15009 | | 代币未发布 | - * | -15010 | | 道具productId未发布 | - * | -15011 | | 现网版本的env只能是0,不能填1(沙盒环境) | - * | -15012 | | 调用米大师失败导致关单,请换新单号重试 | - * | -15013 | | goodsPrice道具价格错误 | - * | -15014 | | 道具/代币发布未生效,禁止下单,大概10分钟后生效 | - * | -15016 | | signData格式有问题 | - * | -15017 | | 此商家涉嫌违规,收款功能已被限制,暂无法支付。商家可以登录微信商户平台/微信支付商家助手小程序查看原因和解决方案 | - * | -15018 | | 代币或者道具productId审核不通过 | - * | -15019 | | 调微信报商户受限,商家可以登录微信商户平台/微信支付商家助手小程序查看原因和解决方案 | - * | -15020 | | 操作过快,请稍候再试 | - * | -15021 | | 小程序被限频交易 | */ errCode: number - } - interface WifiError { - /** 错误信息 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 0 | ok | 正常 | - * | 12000 | not init | 未先调用 `startWifi` 接口 | - * | 12001 | system not support | 当前系统不支持相关能力 | - * | 12002 | password error Wi-Fi | 密码错误 | - * | 12003 | connection timeout | 连接超时, 仅 Android 支持 | - * | 12004 | duplicate request | 重复连接 Wi-Fi | - * | 12005 | wifi not turned on | Android 特有,未打开 Wi-Fi 开关 | - * | 12006 | gps not turned on | Android 特有,未打开 GPS 定位开关 | - * | 12007 | user denied | 用户拒绝授权链接 Wi-Fi | - * | 12008 | invalid SSID | 无效 SSID | - * | 12009 | system config err | 系统运营商配置拒绝连接 Wi-Fi | - * | 12010 | system internal error | 系统其他错误,需要在 errmsg 打印具体的错误原因 | - * | 12011 | weapp in background | 应用在后台无法配置 Wi-Fi | - * | 12013 | wifi config may be expired | 系统保存的 Wi-Fi 配置过期,建议忘记 Wi-Fi 后重试,仅 Android 支持 | - * | 12014 | invalid WEP / WPA password | iOS 特有,无效的 WEP / WPA 密码 | */ errMsg: string - /** 错误码 - * - * | 错误码 | 错误信息 | 说明 | - * | - | - | - | - * | 0 | ok | 正常 | - * | 12000 | not init | 未先调用 `startWifi` 接口 | - * | 12001 | system not support | 当前系统不支持相关能力 | - * | 12002 | password error Wi-Fi | 密码错误 | - * | 12003 | connection timeout | 连接超时, 仅 Android 支持 | - * | 12004 | duplicate request | 重复连接 Wi-Fi | - * | 12005 | wifi not turned on | Android 特有,未打开 Wi-Fi 开关 | - * | 12006 | gps not turned on | Android 特有,未打开 GPS 定位开关 | - * | 12007 | user denied | 用户拒绝授权链接 Wi-Fi | - * | 12008 | invalid SSID | 无效 SSID | - * | 12009 | system config err | 系统运营商配置拒绝连接 Wi-Fi | - * | 12010 | system internal error | 系统其他错误,需要在 errmsg 打印具体的错误原因 | - * | 12011 | weapp in background | 应用在后台无法配置 Wi-Fi | - * | 12013 | wifi config may be expired | 系统保存的 Wi-Fi 配置过期,建议忘记 Wi-Fi 后重试,仅 Android 支持 | - * | 12014 | invalid WEP / WPA password | iOS 特有,无效的 WEP / WPA 密码 | */ errCode: number - } - interface Worklet { - /** Easing 模块实现了常见的动画缓动函数(动画效果参考 https://easings.net/ ),可从 [wx.worklet](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/wx.worklet.html) 对象中读取。 -* -* **** -* -* ## 示例代码 -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/f94TCOmg7JFH) -* -* ### 预置动画函数 -* -* * [Easing.bounce](#Easing.bounce) 反弹动画 -* * [Easing.ease](#Easing.ease) 惯性动画 -* * [Easing.elastic](#Easing.elastic) 弹性动画 -* -* ### 标准缓动函数 -* -* * [Easing.linear](#Easing.linear) 线性 -* * [Easing.quad](#Easing.quad) 二次方 -* * [Easing.cubic](#Easing.cubic) 三次方 -* * [Easing.poly](#Easing.poly) 实现其它幂函数 -* -* ### 其它数学函数 -* -* * [Easing.bezier](#Easing.bezier) 三次贝塞尔曲线 -* * [Easing.circle](#Easing.circle) 圆形曲线 -* * [Easing.sin](#Easing.sin) 正弦函数 -* * [Easing.exp](#Easing.exp) 指数函数 -* -* ### 缓动方式 -* -* 以上效果均有三种缓动方式 -* -* * [Easing.in](#in) 正向执行缓动函数 -* * [Easing.out](#out) 反向执行缓动函数 -* * [Easing.inOut](#inout) 前半程正向,后半程反向 -* 以 `sin` 函数为例,其中 `Easing.in(Easing.sin)` 和直接使用 `Easing.sin` 效果相同。 -* -* 1. `Easing.in(Easing.sin)` 动画效果参考 https://easings.net/#easeInSine -* 2. `Easing.out(Easing.sin)` 动画效果参考 https://easings.net/#easeOutSine -* 3. `Easing.inOut(Easing.sin)` 动画效果参考 https://easings.net/#easeInOutSine -* -* ### Easing.bounce -* -* 简单的反弹效果,[动画效果参考](https://easings.net/#easeInBounce) -* -* ```js -Easing.bounce(t) -``` -* -* ### Easing.ease -* -* 简单的惯性动画,[动画效果参考](https://cubic-bezier.com/#.42,0,1,1) -* -* ```js -Easing.ease(t) -``` -* -* ### Easing.elastic -* -* 简单的弹性动画,类似弹簧来回摆动,高阶函数。默认弹性为 1,会稍微超出一次。弹性为 0 时 不会过冲。[动画效果参考](https://easings.net/#easeInElastic) -* -* ```js -Easing.elastic(bounciness = 1) -``` -* -* ### Easing.linear -* -* 线性函数,f(t) = t,[动画效果参考](https://cubic-bezier.com/#0,0,1,1) -* -* ```js -Easing.linear(t) -``` -* ### Easing.quad -* -* 二次方函数,f(t) = t * t,[动画效果参考](https://easings.net/#easeInQuad) -* -* ```js -Easing.quad(t) -``` -* -* ### Easing.cubic -* -* 立方函数,f(t) = t * t * t,[动画效果参考](https://easings.net/#easeInCubic) -* -* ```js -Easing.cubic(t) -``` -* -* ### Easing.poly -* -* 高阶函数,返回幂函数 -* -* poly(4): [动画效果参考](https://easings.net/#easeInQuart) -* -* poly(5): [动画效果参考](https://easings.net/#easeInQuint) -* -* ```js -Easing.poly(n) -``` -* -* ### Easing.bezier -* -* 三次贝塞尔曲线,效果同 css `transition-timing-function` -* -* 调试参数可借助 [可视化工具](https://cubic-bezier.com/) -* -* ```js -Easing.bezier(x1, y1, x2, y2) -``` -* -* ### Easing.circle -* -* 圆形曲线,[动画效果参考](https://easings.net/#easeInCirc) -* -* ```js -Easing.circle(t) -``` -* -* ### Easing.sin -* -* 正弦函数,[动画效果参考](https://easings.net/#easeInSine) -* -* ```js -Easing.sin(t) -``` -* -* ### Easing.exp -* -* 指数函数,[动画效果参考](https://easings.net/#easeInExpo) -* -* ```js -Easing.exp(t) -``` -* -* ### Easing.in -* -* 正向运行 `easing function`,高阶函数。 -* -* ```js -Easing.in(easing) -``` -* -* ### Easing.out -* -* 反向运行 `easing function`,高阶函数。 -* -* ```js -Easing.out(easing) -``` -* -* ### Easing.inOut -* -* 前半程正向,后半程反向,高阶函数。 -* -* ```js -Easing.inOut(easing) -``` */ - Easing: WorkletEasing - /** [AnimationObject worklet.decay(Object options, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/animation/worklet.decay.html) -* -* 在插件中使用:不支持 -* -* 基于滚动衰减的动画。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/zaI8sgmw7lGW) -* -* ```html -* <pan-gesture-handler onGestureEvent="handlepan"> -* <view class="circle"></view> -* </pan-gesture-handler> -* ``` -* -* ```js -const { shared, decay } = wx.worklet -Page({ - onLoad() { - this._offset = shared(0); - this.applyAnimatedStyle('.circle', () => { - 'worklet'; - return { - transform: `translateX(${this._offset.value}px)` - }; - }); - }, - handlepan(evt) { - 'worklet'; - if (evt.state === GestureState.ACTIVE) { - this._offset.value += evt.deltaX; - } else if (evt.state === GestureState.END) { - this._offset.value = decay({ - velocity: evt.velocityX, - clamp: [-200, 200], - }, - () => { - 'worklet' - console.info('@@@ decay finish') - } - ); - } - } -}); -``` */ - decay( - /** 动画配置 */ - options: DecayOption, - /** 动画完成回调。动画被取消时,返回 fasle,正常完成时返回 true。 */ - callback: (...args: any[]) => any - ): AnimationObject - /** [AnimationObject worklet.delay(number delayMS, AnimationObject delayedAnimation)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/combine-animation/worklet.delay.html) - * - * 在插件中使用:不支持 - * - * 延迟执行动画。 */ - delay( - /** 动画开始前等待的时间,单位:毫秒。 */ - delayMS: number, - /** 动画对象。 */ - delayedAnimation: AnimationObject - ): AnimationObject - /** [AnimationObject worklet.repeat(AnimationObject animation, number numberOfReps, boolean reverse, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/combine-animation/worklet.repeat.html) - * - * 在插件中使用:不支持 - * - * 重复执行动画。 */ - repeat( - /** 动画对象 */ - animation: AnimationObject, - /** 重复次数。为负值时一直循环,直到被取消动画。 */ - numberOfReps?: number, - /** 反向运行动画,每周期结束动画由尾到头运行。该字段仅对 timing 和 spring 返回的动画对象生效。 */ - reverse?: boolean, - /** 动画完成回调。动画被取消时,返回 fasle,正常完成时返回 true。 */ - callback?: (...args: any[]) => any - ): AnimationObject - /** [AnimationObject worklet.sequence(AnimationObject animationN)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/combine-animation/worklet.sequence.html) - * - * 在插件中使用:不支持 - * - * 组合动画序列,依次执行传入的动画。 */ - sequence( - /** 动画对象 */ - animationN: AnimationObject - ): AnimationObject - /** [AnimationObject worklet.spring(number|string toValue, Object options, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/animation/worklet.spring.html) - * - * 在插件中使用:不支持 - * - * 基于物理的动画。 */ - spring( - /** 目标值 */ - toValue: number | string, - /** 动画配置 */ - options: SpringOption, - /** 动画完成回调。动画被取消时,返回 fasle,正常完成时返回 true。 */ - callback: (...args: any[]) => any - ): AnimationObject - /** [AnimationObject worklet.timing(number toValue, Object options, function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/animation/worklet.timing.html) - * - * 在插件中使用:不支持 - * - * 基于时间的动画。 */ - timing( - /** 目标值 */ - toValue: number, - /** 动画配置 */ - options: TimingOption, - /** 动画完成回调。动画被取消时,返回 fasle,正常完成时返回 true。 */ - callback: (...args: any[]) => any - ): AnimationObject - /** [DerivedValue worklet.derived(WorkletFunction updaterWorklet)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/base/worklet.derived.html) - * - * 在插件中使用:不支持 - * - * 衍生值 `DerivedValue`,可基于已有的 `SharedValue` 生成其它共享变量。 */ - derived( - /** worklet 函数类型,该函数被立即执行,返回值作为 DerivedValue 的初始值。当函数内捕获的 SharedValue 类型值发生变化时,updaterWorklet 被驱动执行,返回值用于更新 DerivedValue。可类比 computed 计算属性进行理解。 */ - updaterWorklet: WorkletFunction - ): DerivedValue - /** [SharedValue worklet.shared(any initialValue)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/base/worklet.shared.html) - * - * 在插件中使用:不支持 - * - * 创建共享变量 `SharedValue`,用于跨线程共享数据和驱动动画。 */ - shared( - /** 初始值,可通过 `.value` 属性进行读取和修改。类型可以是 `number | string | bool | null | undefined | Object | Array | Function`。 */ - initialValue: any - ): SharedValue - /** [function worklet.runOnJS(function fn)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/tool-function/worklet.runOnJS.html) - * - * 在插件中使用:不支持 - * - * `worklet` 函数运行在 `UI` 线程时,捕获的外部函数可能为 `worklet` 类型或普通函数,为了更明显的对其区分,要求必须使用 `runOnJS` 调回 `JS` 线程的普通函数。 - * 有这样的要求是因为,调用其它 `worklet` 函数时是同步调用,但在 `UI` 线程执行 `JS` 线程的函数只能是异步,开发者容易混淆,试图同步获取 `JS` 线程的返回值。 */ - runOnJS( - /** 未声明为 worklet 类型的普通函数。 */ - fn: (...args: any[]) => any - ): (...args: any[]) => any - /** [function worklet.runOnUI(function fn)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/tool-function/worklet.runOnUI.html) - * - * 在插件中使用:不支持 - * - * 在 UI 线程执行 worklet 函数。 */ - runOnUI( - /** worklet 类型函数。 */ - fn: (...args: any[]) => any - ): (...args: any[]) => any - /** [worklet.cancelAnimation(SharedValue SharedValue)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/base/worklet.cancelAnimation.html) - * - * 在插件中使用:不支持 - * - * 取消由 `SharedValue` 驱动的动画。 */ - cancelAnimation( - /** 共享变量。 */ - SharedValue: SharedValue - ): void - /** [worklet.scrollViewContext.scrollTo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/worklet/base/worklet.scrollViewContext.scrollTo.html) - * - * 需要基础库: `3.3.0` - * - * 在插件中使用:不支持 - * - * 滚动至指定位置 - * - * **示例代码** - * - * [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/R0cfBJml7SNB) */ - scrollTo(option: WorkletScrollViewContextScrollToOption): void - /** 需要基础库: `3.3.0` - * - * `ScrollView` 实例,可在 `worklet` 函数内操作 `scroll-view` 组件。 */ - scrollViewContext: WorkletScrollViewContext - } - interface Wx { - /** [Array.<any> wx.batchGetStorageSync(Array.<string> keyList)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.batchGetStorageSync.html) -* -* 需要基础库: `2.25.0` -* -* 在插件中使用:不支持 -* -* 从本地缓存中同步批量获取指定 key 的内容。 -* -* **示例代码** -* -* ```js -try { - var valueList = wx.batchGetStorageSync(['key']) - if (valueList) { - // Do something with return value - } -} catch (e) { - // Do something when catch error -} -``` -* -* **** -* -* 对于多个key的读取, 批量读取在性能上优于多次getStorageSync读取 */ - batchGetStorageSync( - /** 本地缓存中指定的 key 数组 */ - keyList: string[] - ): any[] - /** [ArrayBuffer wx.base64ToArrayBuffer(string base64)](https://developers.weixin.qq.com/miniprogram/dev/api/base/wx.base64ToArrayBuffer.html) - * - * 需要基础库: `1.1.0` - * - * 在插件中使用:支持 - * @deprecated 基础库版本 [2.4.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃 - * - * 将 Base64 字符串转成 ArrayBuffer 对象 */ - base64ToArrayBuffer( - /** 要转化成 ArrayBuffer 对象的 Base64 字符串 */ - base64: string - ): ArrayBuffer - /** [Object wx.getAccountInfoSync()](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/account-info/wx.getAccountInfoSync.html) -* -* 需要基础库: `2.2.2` -* -* 在插件中使用:需要基础库 `2.2.2` -* -* 获取当前账号信息。线上小程序版本号仅支持在正式版小程序中获取,开发版和体验版中无法获取。 -* -* **示例代码** -* -* ```js -const accountInfo = wx.getAccountInfoSync(); -console.log(accountInfo.miniProgram.appId) // 小程序 appId -console.log(accountInfo.plugin.appId) // 插件 appId -console.log(accountInfo.plugin.version) // 插件版本号, 'a.b.c' 这样的形式 -``` */ - getAccountInfoSync(): AccountInfo - /** [Object wx.getAppAuthorizeSetting()](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getAppAuthorizeSetting.html) -* -* 需要基础库: `2.20.1` -* -* 在插件中使用:需要基础库 `2.21.3` -* -* 获取微信APP授权设置 -* -* **示例代码** -* -* ```js -const appAuthorizeSetting = wx.getAppAuthorizeSetting() - -console.log(appAuthorizeSetting.albumAuthorized) -console.log(appAuthorizeSetting.bluetoothAuthorized) -console.log(appAuthorizeSetting.cameraAuthorized) -console.log(appAuthorizeSetting.locationAuthorized) -console.log(appAuthorizeSetting.locationReducedAccuracy) -console.log(appAuthorizeSetting.microphoneAuthorized) -console.log(appAuthorizeSetting.notificationAlertAuthorized) -console.log(appAuthorizeSetting.notificationAuthorized) -console.log(appAuthorizeSetting.notificationBadgeAuthorized) -console.log(appAuthorizeSetting.notificationSoundAuthorized) -console.log(appAuthorizeSetting.phoneCalendarAuthorized) -``` -* -* **返回值说明** -* -* `'authorized'` 表示已经获得授权,无需再次请求授权; -* `'denied'` 表示请求授权被拒绝,无法再次请求授权;(此情况需要引导用户[打开系统设置](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.openAppAuthorizeSetting.html),在设置页中打开权限) -* `'non determined'` 表示尚未请求授权,会在微信下一次调用系统相应权限时请求;(仅 iOS 会出现。此种情况下引导用户打开系统设置,不展示开关) */ - getAppAuthorizeSetting(): AppAuthorizeSetting - /** [Object wx.getAppBaseInfo()](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getAppBaseInfo.html) -* -* 需要基础库: `2.20.1` -* -* 在插件中使用:需要基础库 `2.21.3` -* -* 获取微信APP基础信息 -* -* **示例代码** -* -* ```js -const appBaseInfo = wx.getAppBaseInfo() - -console.log(appBaseInfo.SDKVersion) -console.log(appBaseInfo.enableDebug) -console.log(appBaseInfo.host) -console.log(appBaseInfo.language) -console.log(appBaseInfo.version) -console.log(appBaseInfo.theme) -``` */ - getAppBaseInfo(): AppBaseInfo - /** [Object wx.getBatteryInfoSync()](https://developers.weixin.qq.com/miniprogram/dev/api/device/battery/wx.getBatteryInfoSync.html) - * - * 在插件中使用:需要基础库 `2.15.0` - * - * [wx.getBatteryInfo](https://developers.weixin.qq.com/miniprogram/dev/api/device/battery/wx.getBatteryInfo.html) 的同步版本 */ - getBatteryInfoSync(): GetBatteryInfoSyncResult - /** [Object wx.getDeviceInfo()](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getDeviceInfo.html) -* -* 需要基础库: `2.20.1` -* -* 在插件中使用:需要基础库 `2.21.3` -* -* 获取设备基础信息 -* -* **示例代码** -* -* ```js -const deviceInfo = wx.getDeviceInfo() - -console.log(deviceInfo.abi) -console.log(deviceInfo.benchmarkLevel) -console.log(deviceInfo.brand) -console.log(deviceInfo.model) -console.log(deviceInfo.platform) -console.log(deviceInfo.system) -``` */ - getDeviceInfo(): DeviceInfo - /** [Object wx.getEnterOptionsSync()](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/life-cycle/wx.getEnterOptionsSync.html) - * - * 需要基础库: `2.9.4` - * - * 在插件中使用:需要基础库 `2.9.4` - * - * 获取本次小程序启动时的参数。如果当前是冷启动,则返回值与 [`App.onLaunch`](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html#onLaunch-Object-object) 的回调参数一致;如果当前是热启动,则返回值与 [`App.onShow`](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html#onShow-Object-object) 一致。 - * - * **返回有效 referrerInfo 的场景** - * - * | 场景值 | 场景 | appId含义 | - * | ------ | ------------------------------- | ---------- | - * | 1020 | 公众号 profile 页相关小程序列表 | 来源公众号 | - * | 1035 | 公众号自定义菜单 | 来源公众号 | - * | 1036 | App 分享消息卡片 | 来源App | - * | 1037 | 小程序打开小程序 | 来源小程序 | - * | 1038 | 从另一个小程序返回 | 来源小程序 | - * | 1043 | 公众号模板消息 | 来源公众号 | - * - * **不同 apiCategory 场景下的 API 限制** - * - * `X` 表示 API 被限制无法使用;不在表格中的 API 不限制。 - * - * | | default | nativeFunctionalized | browseOnly | embedded | - * |-|-|-|-|-| - * |navigateToMiniProgram | | `X` | `X` | | - * |openSetting | | | `X` | | - * |<button open-type="share"> | | `X` | `X` | `X` | - * |<button open-type="feedback"> | | | `X` | | - * |<button open-type="open-setting">| | | `X` | | - * |openEmbeddedMiniProgram | | `X` | `X` | `X` | - * - * **注意** - * - * 部分版本在无 `referrerInfo` 的时候会返回 `undefined`,建议使用 `options.referrerInfo && options.referrerInfo.appId` 进行判断。 */ - getEnterOptionsSync(): LaunchOptionsApp - /** [Object wx.getExptInfoSync(Array.<string> keys)](https://developers.weixin.qq.com/miniprogram/dev/api/data-analysis/wx.getExptInfoSync.html) - * - * 需要基础库: `2.17.0` - * - * 在插件中使用:不支持 - * - * 给定实验参数数组,获取对应的实验参数值 - * - * **提示** - * - * 假设实验参数有 `color`, `size` - * 调用 wx.getExptInfoSync() 会返回 `{color:'#fff',size:20}` 类似的结果 - * 而 wx.getExptInfoSync(['color']) 则只会返回 `{color:'#fff'}` */ - getExptInfoSync( - /** 实验参数数组,不填则获取所有实验参数 */ - keys?: string[] - ): IAnyObject - /** [Object wx.getExtConfigSync()](https://developers.weixin.qq.com/miniprogram/dev/api/ext/wx.getExtConfigSync.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:不支持 -* -* [wx.getExtConfig](https://developers.weixin.qq.com/miniprogram/dev/api/ext/wx.getExtConfig.html) 的同步版本。 -* -* **Tips** -* -* 1. 本接口暂时无法通过 [wx.canIUse](https://developers.weixin.qq.com/miniprogram/dev/api/base/wx.canIUse.html) 判断是否兼容,开发者需要自行判断 [wx.getExtConfigSync](https://developers.weixin.qq.com/miniprogram/dev/api/ext/wx.getExtConfigSync.html) 是否存在来兼容 -* -* **** -* -* ```js -let extConfig = wx.getExtConfigSync? wx.getExtConfigSync(): {} -console.log(extConfig) -``` */ - getExtConfigSync(): IAnyObject - /** [Object wx.getLaunchOptionsSync()](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/life-cycle/wx.getLaunchOptionsSync.html) - * - * 需要基础库: `2.1.2` - * - * 在插件中使用:需要基础库 `2.9.4` - * - * 获取小程序启动时的参数。与 [`App.onLaunch`](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html#onlaunchobject-object) 的回调参数一致。 - * - * **返回有效 referrerInfo 的场景** - * - * | 场景值 | 场景 | appId含义 | - * | ------ | ------------------------------- | ---------- | - * | 1020 | 公众号 profile 页相关小程序列表 | 来源公众号 | - * | 1035 | 公众号自定义菜单 | 来源公众号 | - * | 1036 | App 分享消息卡片 | 来源App | - * | 1037 | 小程序打开小程序 | 来源小程序 | - * | 1038 | 从另一个小程序返回 | 来源小程序 | - * | 1043 | 公众号模板消息 | 来源公众号 | - * | 1069 | 移动应用 | 来源App | - * - * **不同 apiCategory 场景下的 API 限制** - * - * `X` 表示 API 被限制无法使用;不在表格中的 API 不限制。 - * - * | | default | nativeFunctionalized | browseOnly | embedded | - * |-|-|-|-|-| - * |navigateToMiniProgram | | `X` | `X` | | - * |openSetting | | | `X` | | - * |<button open-type="share"> | | `X` | `X` | `X` | - * |<button open-type="feedback"> | | | `X` | | - * |<button open-type="open-setting">| | | `X` | | - * |openEmbeddedMiniProgram | | `X` | `X` | `X` | - * - * **注意** - * - * 部分版本在无`referrerInfo`的时候会返回 `undefined`,建议使用 `options.referrerInfo && options.referrerInfo.appId` 进行判断。 */ - getLaunchOptionsSync(): LaunchOptionsApp - /** [Object wx.getMenuButtonBoundingClientRect()](https://developers.weixin.qq.com/miniprogram/dev/api/ui/menu/wx.getMenuButtonBoundingClientRect.html) -* -* 需要基础库: `2.1.0` -* -* 在插件中使用:需要基础库 `2.15.0` -* -* 获取菜单按钮(右上角胶囊按钮)的布局位置信息。坐标信息以屏幕左上角为原点。 -* -* **示例代码** -* -* ```js -const res = wx.getMenuButtonBoundingClientRect() - -console.log(res.width) -console.log(res.height) -console.log(res.top) -console.log(res.right) -console.log(res.bottom) -console.log(res.left) -``` */ - getMenuButtonBoundingClientRect(): ClientRect - /** [Object wx.getSkylineInfoSync()](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSkylineInfoSync.html) - * - * 需要基础库: `2.26.2` - * - * 在插件中使用:需要基础库 `2.26.2` - * - * 获取当前运行环境对于 [Skyline 渲染引擎](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html) 的支持情况 */ - getSkylineInfoSync(): SkylineInfo - /** [Object wx.getStorageInfoSync()](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.getStorageInfoSync.html) -* -* 在插件中使用:不支持 -* -* [wx.getStorageInfo](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.getStorageInfo.html) 的同步版本 -* -* **示例代码** -* -* ```js -wx.getStorageInfo({ - success (res) { - console.log(res.keys) - console.log(res.currentSize) - console.log(res.limitSize) - } -}) -``` -* -* ```js -try { - const res = wx.getStorageInfoSync() - console.log(res.keys) - console.log(res.currentSize) - console.log(res.limitSize) -} catch (e) { - // Do something when catch error -} -``` */ - getStorageInfoSync(): GetStorageInfoSyncOption - /** [Object wx.getSystemInfoSync()](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemInfoSync.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [2.20.1](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getSystemSetting](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemSetting.html)、[wx.getAppAuthorizeSetting](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getAppAuthorizeSetting.html)、[wx.getDeviceInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getDeviceInfo.html)、[wx.getWindowInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getWindowInfo.html)、[wx.getAppBaseInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getAppBaseInfo.html) 替换 -* -* [wx.getSystemInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemInfo.html) 的同步版本 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/WkUCgXmS7mqO) -* -* ```js -wx.getSystemInfo({ - success (res) { - console.log(res.model) - console.log(res.pixelRatio) - console.log(res.windowWidth) - console.log(res.windowHeight) - console.log(res.language) - console.log(res.version) - console.log(res.platform) - } -}) -``` -* -* ```js -try { - const res = wx.getSystemInfoSync() - console.log(res.model) - console.log(res.pixelRatio) - console.log(res.windowWidth) - console.log(res.windowHeight) - console.log(res.language) - console.log(res.version) - console.log(res.platform) -} catch (e) { - // Do something when catch error -} -``` -* -* **** -* -* ## 注意事项 -* - 当 wx.getSystemInfoSync() 接口发生错误时可能会返回空对象 -* - wx.getSystemInfo 接口由于会获取系统权限,可能触发授权弹窗,请使用 [wx.getSystemSetting](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemSetting.html)、[wx.getAppAuthorizeSetting](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getAppAuthorizeSetting.html)、[wx.getDeviceInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getDeviceInfo.html)、[wx.getWindowInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getWindowInfo.html)、[wx.getAppBaseInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getAppBaseInfo.html) 替代 */ - getSystemInfoSync(): SystemInfo - /** [Object wx.getSystemSetting()](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemSetting.html) -* -* 需要基础库: `2.20.1` -* -* 在插件中使用:需要基础库 `2.21.3` -* -* 获取设备设置 -* -* **示例代码** -* -* ```js -const systemSetting = wx.getSystemSetting() - -console.log(systemSetting.bluetoothEnabled) -console.log(systemSetting.deviceOrientation) -console.log(systemSetting.locationEnabled) -console.log(systemSetting.wifiEnabled) -``` */ - getSystemSetting(): SystemSetting - /** [Object wx.getWindowInfo()](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getWindowInfo.html) -* -* 需要基础库: `2.20.1` -* -* 在插件中使用:需要基础库 `2.21.3` -* -* 获取窗口信息 -* -* **示例代码** -* -* ```js -const windowInfo = wx.getWindowInfo() - -console.log(windowInfo.pixelRatio) -console.log(windowInfo.screenWidth) -console.log(windowInfo.screenHeight) -console.log(windowInfo.windowWidth) -console.log(windowInfo.windowHeight) -console.log(windowInfo.statusBarHeight) -console.log(windowInfo.safeArea) -console.log(windowInfo.screenTop) -``` */ - getWindowInfo(): WindowInfo - /** [Promise<string> wx.getRendererUserAgent(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getRendererUserAgent.html) -* -* 需要基础库: `2.26.3` -* -* 在插件中使用:需要基础库 `2.21.3` -* -* 获取 Webview 小程序的 UserAgent -* -* **示例代码** -* -* ```js -// v2.30.4 前,仅支持 promise 风格调用 -wx.getRendererUserAgent().then(userAgent => console.log(userAgent)) -// v2.30.4 起,除 promise 风格调用外,也支持 invoke 风格使用 -wx.getRendererUserAgent({ - success(res) { console.log(res.userAgent) } -}) -``` */ - getRendererUserAgent( - option?: GetRendererUserAgentOption - ): Promise<string> - /** [[Animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html) wx.createAnimation(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/wx.createAnimation.html) - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 创建一个动画实例 [animation](https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/Animation.html)。调用实例的方法来描述动画。最后通过动画实例的 export 方法导出动画数据传递给组件的 animation 属性。 */ - createAnimation(option: StepOption): Animation - /** [[AudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioContext.html) wx.createAudioContext(string id, Object this)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createAudioContext.html) - * - * 在插件中使用:需要基础库 `1.9.6` - * @deprecated 基础库版本 [1.6.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.createInnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createInnerAudioContext.html) 替换 - * - * 创建 [audio](https://developers.weixin.qq.com/miniprogram/dev/component/audio.html) 上下文 [AudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/AudioContext.html) 对象。 */ - createAudioContext( - /** [audio](https://developers.weixin.qq.com/miniprogram/dev/component/audio.html) 组件的 id */ - id: string, - /** 在自定义组件下,当前组件实例的this,以操作组件内 [audio](https://developers.weixin.qq.com/miniprogram/dev/component/audio.html) 组件 */ - component?: Component.TrivialInstance | Page.TrivialInstance - ): AudioContext - /** [[BackgroundAudioManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/BackgroundAudioManager.html) wx.getBackgroundAudioManager()](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioManager.html) - * - * 需要基础库: `1.2.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 获取**全局唯一**的背景音频管理器。 - * 小程序切入后台,如果音频处于播放状态,可以继续播放。但是后台状态不能通过调用API操纵音频的播放状态。 - * - * 从微信客户端6.7.2版本开始,若需要在小程序切后台后继续播放音频,需要在 [app.json](https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html) 中配置 `requiredBackgroundModes` 属性。开发版和体验版上可以直接生效,正式版还需通过审核。 */ - getBackgroundAudioManager(): BackgroundAudioManager - /** [[CacheManager](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/CacheManager.html) wx.createCacheManager(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/cachemanager/wx.createCacheManager.html) -* -* 需要基础库: `2.24.0` -* -* 在插件中使用:不支持 -* -* 创建缓存管理器 -* -* **示例代码** -* -* <a href="https://github.com/wechat-miniprogram/miniprogram-offline-demo" target="_blank">查看完整示例代码</a> -* -* ```js -const cacheManager = createCacheManager() -cacheManager.addRule(/https:\/\/(?:.*)/ig) // 表示所有 https 请求都匹配 - -cacheManager.on('request', evt => { - // 在弱网时接收到 wx.request 请求 - return new Promise((resolve, reject) => { - const matchRes = cm.match(evt) - if (matchRes && matchRes.data) { - // 有缓存,返回 - resolve(matchRes.data) - } else { - // 没缓存,抛错 - reject({ errMsg: 'no cache' }) - } - }) -}) -``` */ - createCacheManager(option: CreateCacheManagerOption): CacheManager - /** [[CameraContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/CameraContext.html) wx.createCameraContext()](https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/wx.createCameraContext.html) - * - * 需要基础库: `1.6.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 创建 [camera](https://developers.weixin.qq.com/miniprogram/dev/component/camera.html) 上下文 [CameraContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/camera/CameraContext.html) 对象。 */ - createCameraContext(): CameraContext - /** [[CanvasContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html) wx.createCanvasContext(string canvasId, Object this)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.createCanvasContext.html) - * - * 在插件中使用:需要基础库 `1.9.6` - * @deprecated 基础库版本 [2.9.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [Canvas](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/Canvas.html) 替换 - * - * 创建 canvas 的绘图上下文 [CanvasContext](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html) 对象 */ - createCanvasContext( - /** 要获取上下文的 [canvas](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 组件 canvas-id 属性 */ - canvasId: string, - /** 在自定义组件下,当前组件实例的this,表示在这个自定义组件下查找拥有 canvas-id 的 [canvas](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) ,如果省略则不在任何自定义组件内查找 */ - component?: Component.TrivialInstance | Page.TrivialInstance - ): CanvasContext - /** [[DownloadTask](https://developers.weixin.qq.com/miniprogram/dev/api/network/download/DownloadTask.html) wx.downloadFile(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/download/wx.downloadFile.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 下载文件资源到本地。客户端直接发起一个 HTTPS GET 请求,返回文件的本地临时路径 (本地路径),单次下载允许的最大文件为 200MB。使用前请注意阅读[相关说明](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html)。 -* -* 注意:请在服务端响应的 header 中指定合理的 `Content-Type` 字段,以保证客户端正确处理文件类型。 -* -* **示例代码** -* -* ```js -wx.downloadFile({ - url: 'https://example.com/audio/123', //仅为示例,并非真实的资源 - success (res) { - // 只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务需要自行判断是否下载到了想要的内容 - if (res.statusCode === 200) { - wx.playVoice({ - filePath: res.tempFilePath - }) - } - } -}) -``` */ - downloadFile(option: DownloadFileOption): DownloadTask - /** [[FileSystemManager](https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.html) wx.getFileSystemManager()](https://developers.weixin.qq.com/miniprogram/dev/api/file/wx.getFileSystemManager.html) - * - * 需要基础库: `1.9.9` - * - * 在插件中使用:需要基础库 `2.19.2` - * - * 获取全局唯一的文件管理器 */ - getFileSystemManager(): FileSystemManager - /** [[InferenceSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/InferenceSession.html) wx.createInferenceSession(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/wx.createInferenceSession.html) -* -* 需要基础库: `2.30.0` -* -* 在插件中使用:需要基础库 `2.30.0` -* -* 创建 AI 推理 Session。使用前可参考[AI指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/inference/tutorial.html) -* -* **示例代码** -* -* ```js -// 创建会话,加载模型 -const session = wx.createInferenceSession({ - model: `${wx.env.USER_DATA_PATH}/MNIST.onnx`, - precisionLevel: 4, - typicalShape:{input1:[1, 3, 224, 224], input2:[1, 1, 224, 224]}, //除非使用动态轴,一般不用显式指定 - allowNPU: false, - allowQuantize: false -}) - -// 监听error事件 -session.onError(err => { - console.error(err) -}) - -// 监听模型加载完成事件 -session.onLoad(() => { - // 运行推理 - // 其中input1, input2, output0 必须与使用的onnx模型中实际的输入输出名字完全一致,不可随意填写。 - // 模型输入输出信息可以通过Netron 打开onnx模型看到 - session.run({ - input1: { - type: 'float32', - data: new Float32Array(3 * 224 * 224).buffer, - shape: [1, 3, 224, 224] // NCHW 顺序 - }, - // 多个input的添加方法,假设第二个input需要数据类型为uint8 - input2: { - type: 'uint8', - data: new Uint8Array(224 * 224).buffer, - shape: [1, 1, 224, 224] - }, - }).then(res => { - console.log(res.output0) - }) -}) - -// 销毁Session -// session完成创建后可以多次调用run进行推理,直到调用`session.destroy()`释放相关内存。 - -// 销毁会话 -session.destroy() -``` */ - createInferenceSession( - option: CreateInferenceSessionOption - ): InferenceSession - /** [[InnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.html) wx.createInnerAudioContext(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createInnerAudioContext.html) -* -* 需要基础库: `1.6.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 创建内部 [audio](https://developers.weixin.qq.com/miniprogram/dev/component/audio.html) 上下文 [InnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.html) 对象。 -* -* **示例代码** -* -* ```js -const innerAudioContext = wx.createInnerAudioContext({ - useWebAudioImplement: false // 是否使用 WebAudio 作为底层音频驱动,默认关闭。对于短音频、播放频繁的音频建议开启此选项,开启后将获得更优的性能表现。由于开启此选项后也会带来一定的内存增长,因此对于长音频建议关闭此选项 -}) -innerAudioContext.src = 'http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E061FF02C31F716658E5C81F5594D561F2E88B854E81CAAB7806D5E4F103E55D33C16F3FAC506D1AB172DE8600B37E43FAD&fromtag=46' - -innerAudioContext.play() // 播放 - -innerAudioContext.pause() // 暂停 - -innerAudioContext.stop() // 停止 - -innerAudioContext.destroy() // 释放音频资源 -``` */ - createInnerAudioContext( - option?: CreateInnerAudioContextOption - ): InnerAudioContext - /** [[IntersectionObserver](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/IntersectionObserver.html) wx.createIntersectionObserver(Object component, Object options)](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/wx.createIntersectionObserver.html) - * - * 需要基础库: `1.9.3` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 创建并返回一个 IntersectionObserver 对象实例。在自定义组件或包含自定义组件的页面中,应使用 `this.createIntersectionObserver([options])` 来代替。 - * - * **示例代码** - * - * [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/ETQafJmu7BTm) - * - * **原生模式** - * - * 小程序的观察器默认使用非原生模式。非原生模式下,部分表现会与原生模式有差异,具体差异为: - * - * 1. 非原生观察器 `relativeTo` 设置的参照区域可以为任意节点;而原生模式只能相对祖先节点。 - * 2. 非原生观察器计算区域相交时,直接计算节点区域和参照区域的交集;而原生模式会对节点的祖先节点进行遍历,计算节点的祖先节点到参照节点的路径中,所有节点区域的交集。 - * 3. 原生观察器性能比非原生模式更高。 - * - * 原生观察器相关信息可参考 [IntersectionObserver 文档](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API)。 - * - * **Tips** - * - * 1. 若 `relativeTo` 设置的参照区域不是祖先节点,则无法开启原生模式。 - * 2. 若调用多次 `relativeTo` 和 `relativeToViewport`,观察器性能会下降。 */ - createIntersectionObserver( - /** 自定义组件实例 */ - component: IAnyObject, - /** 选项 */ - options?: CreateIntersectionObserverOption - ): IntersectionObserver - /** [[InterstitialAd](https://developers.weixin.qq.com/miniprogram/dev/api/ad/InterstitialAd.html) wx.createInterstitialAd(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/wx.createInterstitialAd.html) - * - * 需要基础库: `2.6.0` - * - * 在插件中使用:需要基础库 `2.8.1` - * - * 创建插屏广告组件。请通过 [wx.getSystemInfoSync()](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemInfoSync.html) 返回对象的 SDKVersion 判断基础库版本号后再使用该 API。每次调用该方法创建插屏广告都会返回一个全新的实例(小程序端的插屏广告实例不允许跨页面使用)。 */ - createInterstitialAd(option: CreateInterstitialAdOption): InterstitialAd - /** [[LivePlayerContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.html) wx.createLivePlayerContext(string id, Object this)](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/wx.createLivePlayerContext.html) - * - * 需要基础库: `1.7.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 创建 [live-player](https://developers.weixin.qq.com/miniprogram/dev/component/live-player.html) 上下文 [LivePlayerContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePlayerContext.html) 对象。建议使用 [wx.createSelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/wx.createSelectorQuery.html) 获取 context 对象。 */ - createLivePlayerContext( - /** [live-player](https://developers.weixin.qq.com/miniprogram/dev/component/live-player.html) 组件的 id */ - id: string, - /** 在自定义组件下,当前组件实例的this,以操作组件内 [live-player](https://developers.weixin.qq.com/miniprogram/dev/component/live-player.html) 组件 */ - component?: Component.TrivialInstance | Page.TrivialInstance - ): LivePlayerContext - /** [[LivePusherContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.html) wx.createLivePusherContext()](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/wx.createLivePusherContext.html) - * - * 需要基础库: `1.7.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 创建 [live-pusher](https://developers.weixin.qq.com/miniprogram/dev/component/live-pusher.html) 上下文 [LivePusherContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/live/LivePusherContext.html) 对象。 */ - createLivePusherContext(): LivePusherContext - /** [[LogManager](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/LogManager.html) wx.getLogManager(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/wx.getLogManager.html) -* -* 需要基础库: `2.1.0` -* -* 在插件中使用:不支持 -* -* 获取日志管理器对象。 -* -* **示例代码** -* -* ```js -const logger = wx.getLogManager({level: 1}) -logger.log({str: 'hello world'}, 'basic log', 100, [1, 2, 3]) -logger.info({str: 'hello world'}, 'info log', 100, [1, 2, 3]) -logger.debug({str: 'hello world'}, 'debug log', 100, [1, 2, 3]) -logger.warn({str: 'hello world'}, 'warn log', 100, [1, 2, 3]) -``` */ - getLogManager(option: GetLogManagerOption): LogManager - /** [[MapContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.html) wx.createMapContext(string mapId, Object this)](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/wx.createMapContext.html) - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 创建 [map](https://developers.weixin.qq.com/miniprogram/dev/component/map.html) 上下文 [MapContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.html) 对象。建议使用 [wx.createSelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/wx.createSelectorQuery.html) 获取 context 对象。 */ - createMapContext( - /** [map](https://developers.weixin.qq.com/miniprogram/dev/component/map.html) 组件的 id */ - mapId: string, - /** 在自定义组件下,当前组件实例的this,以操作组件内 [map](https://developers.weixin.qq.com/miniprogram/dev/component/map.html) 组件 */ - component?: Component.TrivialInstance | Page.TrivialInstance - ): MapContext - /** [[MediaAudioPlayer](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/MediaAudioPlayer.html) wx.createMediaAudioPlayer()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createMediaAudioPlayer.html) -* -* 需要基础库: `2.13.0` -* -* 在插件中使用:支持 -* -* 创建媒体音频播放器对象 [MediaAudioPlayer](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/MediaAudioPlayer.html) 对象,可用于播放视频解码器 [VideoDecoder](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.html) 输出的音频。 -* -* **示例代码** -* -* ```js - // 创建视频解码器,具体参数见 createVideoDecoder 文档 - const videoDecoder = wx.createVideoDecoder() - // 创建媒体音频播放器 - const mediaAudioPlayer = wx.createMediaAudioPlayer() - // 启动视频解码器 - videoDecoder.start() - // 启动播放器 - mediaAudioPlayer.start().then(() => { - // 添加播放器音频来源 - mediaAudioPlayer.addAudioSource(videoDecoder).then(res => { - videoDecoder.getFrameData() // 建议在 requestAnimationFrame 里获取每一帧视频数据 - console.log(res) - }) - - // 移除播放器音频来源 - mediaAudioPlayer.removeAudioSource(videoDecoder).then() - // 停止播放器 - mediaAudioPlayer.stop().then() - // 销毁播放器 - mediaAudioPlayer.destroy().then() - // 设置播放器音量 - mediaAudioPlayer.volume = 0.5 - }) -``` -* -* **完整demo(小游戏)** -* -* - https://developers.weixin.qq.com/s/SF2duHmb7MjI */ - createMediaAudioPlayer(): MediaAudioPlayer - /** [[MediaContainer](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/MediaContainer.html) wx.createMediaContainer()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-processing/wx.createMediaContainer.html) - * - * 需要基础库: `2.9.0` - * - * 在插件中使用:需要基础库 `2.10.0` - * - * 创建音视频处理容器,最终可将容器中的轨道合成一个视频 */ - createMediaContainer(): MediaContainer - /** [[MediaRecorder](https://developers.weixin.qq.com/miniprogram/dev/api/media/media-recorder/MediaRecorder.html) wx.createMediaRecorder(Object canvas, Object options)](https://developers.weixin.qq.com/miniprogram/dev/api/media/media-recorder/wx.createMediaRecorder.html) -* -* 需要基础库: `2.11.0` -* -* 在插件中使用:需要基础库 `2.11.0` -* -* 创建 WebGL 画面录制器,可逐帧录制在 WebGL 上渲染的画面并导出视频文件 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/MCz3kPmC7zpa) -* -* **低版本异步接口兼容** -* -* 对基础库 2.16.1 版本前的 mediaRecorder,所有的接口都没有返回 Promise 对象,若需要兼容低版本,则可采用如下方式的写法: -* ```javascript -// 启动 mediaRecorder -await new Promise(resolve => { - recorder.on('start', resolve) - recorder.start() -}) - -// 逐帧绘制 -while (frames--) { - await new Promise(resolve => recorder.requestFrame(resolve)) - render() -} - -// 绘制完成,生成视频 -const {tempFilePath} = await new Promise(resolve => { - recorder.on('stop', resolve) - recorder.stop() -}) -``` */ - createMediaRecorder( - /** WebGL 对象,通过 [SelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html) 获取到的 node 对象或通过 [wx.createOffscreenCanvas](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.createOffscreenCanvas.html) 创建的离屏 WebGL Canvas 对象 */ - canvas: IAnyObject, - options: CreateMediaRecorderOption - ): MediaRecorder - /** [[NFCAdapter](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/NFCAdapter.html) wx.getNFCAdapter()](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc/wx.getNFCAdapter.html) - * - * 需要基础库: `2.11.2` - * - * 在插件中使用:需要基础库 `2.11.2` - * - * 获取 NFC 实例 - * - * **示例代码** - * - * [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/1WsbDwmb75ig) */ - getNFCAdapter(): NFCAdapter - /** [[OffscreenCanvas](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/OffscreenCanvas.html) wx.createOffscreenCanvas(object object, number width, number height, Object this)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.createOffscreenCanvas.html) - * - * 需要基础库: `2.16.1` - * - * 在插件中使用:需要基础库 `2.16.1` - * - * 创建离屏 canvas 实例 - * - * **离屏 Canvas 类型不可混用** - * - * 由于 webgl canvas 和 2d canvas 的底层实现方式不同,因此必须要在调用 `wx.createOffscreenCanvas` 时提前指定类型。 - * - * 指定类型后,离屏 canvas `getContext(type)` 调用不允许混用,如不能对 webgl canvas 调用 `getContext('2d')`。 - * - * 同样的,不同类型 canvas 调用 `createImage` 创建的图片对象也不支持混用,使用时请注意尽量使用 canvas 自身的 `createImage` 创建图片对象。 - * - * **与 MediaRecorder 结合** - * - * 离屏 webgl canvas 支持作为参数传递给 [`wx.createMediaRecorder`](https://developers.weixin.qq.com/miniprogram/dev/api/media/media-recorder/wx.createMediaRecorder.html), 离屏 2d canvas 暂不支持。 - * - * **旧版 createOffscreenCanvas** - * - * 旧版函数签名为 `wx.createOffscreenCanvas(width: number, height: number, this: object): OffscreenCanvas`,从基础库 2.7.0 开始支持 - * - * 从基础库 2.16.1 开始改为 `wx.createOffscreenCanvas(options: object): OffscreenCanvas`,向下兼容旧版入参。 - * 但需注意旧版入参只能创建 webgl 类型,如需创建 2d 类型则必须使用新版。 */ - createOffscreenCanvas( - /** 画布宽度 */ - width: number, - /** 画布高度 */ - height: number, - /** 在自定义组件下,当前组件实例的 this */ - component?: Component.TrivialInstance | Page.TrivialInstance - ): OffscreenCanvas - /** [[OffscreenCanvas](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/OffscreenCanvas.html) wx.createOffscreenCanvas(object object, number width, number height, Object this)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.createOffscreenCanvas.html) - * - * 需要基础库: `2.16.1` - * - * 在插件中使用:需要基础库 `2.16.1` - * - * 创建离屏 canvas 实例 - * - * **离屏 Canvas 类型不可混用** - * - * 由于 webgl canvas 和 2d canvas 的底层实现方式不同,因此必须要在调用 `wx.createOffscreenCanvas` 时提前指定类型。 - * - * 指定类型后,离屏 canvas `getContext(type)` 调用不允许混用,如不能对 webgl canvas 调用 `getContext('2d')`。 - * - * 同样的,不同类型 canvas 调用 `createImage` 创建的图片对象也不支持混用,使用时请注意尽量使用 canvas 自身的 `createImage` 创建图片对象。 - * - * **与 MediaRecorder 结合** - * - * 离屏 webgl canvas 支持作为参数传递给 [`wx.createMediaRecorder`](https://developers.weixin.qq.com/miniprogram/dev/api/media/media-recorder/wx.createMediaRecorder.html), 离屏 2d canvas 暂不支持。 - * - * **旧版 createOffscreenCanvas** - * - * 旧版函数签名为 `wx.createOffscreenCanvas(width: number, height: number, this: object): OffscreenCanvas`,从基础库 2.7.0 开始支持 - * - * 从基础库 2.16.1 开始改为 `wx.createOffscreenCanvas(options: object): OffscreenCanvas`,向下兼容旧版入参。 - * 但需注意旧版入参只能创建 webgl 类型,如需创建 2d 类型则必须使用新版。 */ - createOffscreenCanvas( - option: CreateOffscreenCanvasOption - ): OffscreenCanvas - /** [[Performance](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/Performance.html) wx.getPerformance()](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/wx.getPerformance.html) -* -* 需要基础库: `2.11.0` -* -* 在插件中使用:支持 -* -* 获取当前小程序性能相关的信息。关于小程序启动性能优化的更多内容,请参考[启动性能指南](https://developers.weixin.qq.com/miniprogram/dev/framework/performance/tips/start.html)。 -* -* **** -* -* 目前支持获取以下几类性能指标,具体内容请参考 [PerformanceEntry](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/PerformanceEntry.html): -* -* | 指标类型(entryType) | 指标名称 | 最低版本 | -* | ------------------- | ---------------- | ------ | -* | 路由(navigation) | route: 路由性能 | | -* | 路由(navigation) | appLaunch: 小程序启动耗时 | | -* | 渲染(render) | firstRender: 页面首次渲染耗时 | | -* | 渲染(render) | firstPaint: 页面首次绘制 | <2.21.2> | -* | 渲染(render) | firstContentfulPaint: 页面首次内容绘制 | <2.21.2> | -* | 渲染(render) | largestContentfulPaint: 页面最大内容绘制 | <2.23.1> | -* | 脚本(script) | evaluateScript: 注入脚本耗时 | | -* | 包加载(loadPackage)| downloadPackage: 代码包下载耗时 | <2.24.0> | -* | 资源(resource) | resourceTiming: 视图层资源加载耗时 | <2.24.0> | -* -* **示例代码** -* -* ```js -const performance = wx.getPerformance() -const observer = performance.createObserver((entryList) => { - console.log(entryList.getEntries()) -}) -observer.observe({ entryTypes: ['render', 'script', 'navigation'] }) -``` -* -* **注意** -* -* - 目前,当开启代码 [按需注入](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/lazyload.html) 时,`evaluateScript` 将仅包含公有部分代码(2.21.2 开始会区分公共部分/页面和组件的部分),页面和组件的代码注入的时间会包含在 `firstRender` 中(因为页面和组件的代码注入过程成为了首次渲染过程的一部分)。因此开启按需注入后,脚本耗时降低,渲染时间提高属于正常现象,优化效果可以关注整体启动耗时(`appLaunch`)来评估。 -* - firstPaint 和 firstContentfulPaint 指标在开启 vConsole 的情况下,由于绘制 vConsole 面板,会导致数据提前。 */ - getPerformance(): Performance - /** [[PreDownloadSubpackageTask](https://developers.weixin.qq.com/miniprogram/dev/api/base/subpackage/PreDownloadSubpackageTask.html) wx.preDownloadSubpackage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/subpackage/wx.preDownloadSubpackage.html) -* -* 需要基础库: `2.27.3` -* -* 在插件中使用:不支持 -* -* 触发分包预下载。 -* -* **示例代码** -* -* ```js -// 首先要在 app.json / game.json 中配置workers作为分包 -{ - "workers": { - "path": "myWorkersFolder", - "isSubpackage": true // true 表示把 worker 打包为分包。默认 false。填 false 时等同于 { "workers": "myWorkersFolder" } - } -} -``` -* ```js -// 然后调用 wx.preDownloadSubpackage 下载 worker 分包,下载成功后才可以创建 worker -var task = wx.preDownloadSubpackage({ - packageType: "workers", - success(res) { - console.log("load worker success", res) - wx.createWorker("myWorkersFolder/request/index.js") // 创建 worker。 如果 worker 分包没下载完就调 createWorker 的话将报错 - }, - fail(res) { - console.log("load worker fail", res) - } -}) - -task.onProgressUpdate(res => { - console.log(res.progress) // 可通过 onProgressUpdate 接口监听下载进度 - console.log(res.totalBytesWritten) - console.log(res.totalBytesExpectedToWrite) -}) -``` */ - preDownloadSubpackage( - option: PreDownloadSubpackageOption - ): PreDownloadSubpackageTask - /** [[RealtimeLogManager](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/RealtimeLogManager.html) wx.getRealtimeLogManager()](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/wx.getRealtimeLogManager.html) -* -* 需要基础库: `2.7.1` -* -* 在插件中使用:需要基础库 `2.16.0` -* -* 获取实时日志管理器对象。 -* -* **示例代码** -* -* ```js -// 小程序端 -const logger = wx.getRealtimeLogManager() -logger.info({str: 'hello world'}, 'info log', 100, [1, 2, 3]) -logger.error({str: 'hello world'}, 'error log', 100, [1, 2, 3]) -logger.warn({str: 'hello world'}, 'warn log', 100, [1, 2, 3]) - -// 插件端,基础库 2.16.0 版本后支持,只允许采用 key-value 的新格式上报 -const logManager = wx.getRealtimeLogManager() -const logger = logManager.tag('plugin-log1') -logger.info('key1', 'value1') -logger.error('key2', {str: 'value2'}) -logger.warn('key3', 'value3') -``` */ - getRealtimeLogManager(): RealtimeLogManager - /** [[RecorderManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/RecorderManager.html) wx.getRecorderManager()](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/wx.getRecorderManager.html) - * - * 需要基础库: `1.6.0` - * - * 在插件中使用:需要基础库 `1.9.94` - * - * 获取**全局唯一**的录音管理器 RecorderManager */ - getRecorderManager(): RecorderManager - /** [[RequestTask](https://developers.weixin.qq.com/miniprogram/dev/api/network/request/RequestTask.html) wx.request(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 发起 HTTPS 网络请求。使用前请注意阅读[相关说明](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html)。 -* -* **data 参数说明** -* -* 最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String 。转换规则如下: -* - 对于 `GET` 方法的数据,会将数据转换成 query string(`encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)...`) -* - 对于 `POST` 方法且 `header['content-type']` 为 `application/json` 的数据,会对数据进行 JSON 序列化 -* - 对于 `POST` 方法且 `header['content-type']` 为 `application/x-www-form-urlencoded` 的数据,会将数据转换成 query string `(encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)...)` -* -* **useHighPerformanceMode 高性能模式说明** -* -* 在该模式下,框架将会采用全新的网络请求模块,默认支持 HTTP3,可以提升小程序的网络请求性能。有以下注意事项: -* - 除声明了 `enableChunked` 后会走 HTTP1 以外,均会自动开启 HTTP2/HTTP3 等优化能力,`enableQuic`、`enableHttp2` 参数将会强制开启。建议开发者在后台服务也开启对应能力以获得更好的效果。 -* - 暂仅支持 Android,iOS/PC 端设置该参数后会使用原 request 模块。iOS 会在后续支持该参数。 -* - 暂不支持 forceCellularNetwork 参数。 -* - 暂不支持 HttpDNS 能力。 -* - 开启 `enableProfile` 后,返回的 profile 字段部分信息缺失,会被缺省值代替。缺失部分包括 redirectStart、redirectEnd、rtt、estimate_nettype、httpRttEstimate、transportRttEstimate、downstreamThroughputKbpsEstimate、throughputKbps、peerIP、port。 -* -* **示例代码** -* -* ```js -wx.request({ - url: 'example.php', //仅为示例,并非真实的接口地址 - data: { - x: '', - y: '' - }, - header: { - 'content-type': 'application/json' // 默认值 - }, - success (res) { - console.log(res.data) - } -}) -``` */ - request< - T extends string | IAnyObject | ArrayBuffer = - | string - | IAnyObject - | ArrayBuffer - >( - option: RequestOption<T> - ): RequestTask - /** [[RewardedVideoAd](https://developers.weixin.qq.com/miniprogram/dev/api/ad/RewardedVideoAd.html) wx.createRewardedVideoAd(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ad/wx.createRewardedVideoAd.html) - * - * 需要基础库: `2.0.4` - * - * 在插件中使用:需要基础库 `2.8.1` - * - * 创建激励视频广告组件。请通过 [wx.getSystemInfoSync()](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemInfoSync.html) 返回对象的 SDKVersion 判断基础库版本号后再使用该 API(小游戏端要求 >= 2.0.4, 小程序端要求 >= 2.6.0)。调用该方法创建的激励视频广告是一个单例(小游戏端是全局单例,小程序端是页面内单例,在小程序端的单例对象不允许跨页面使用)。 */ - createRewardedVideoAd( - option: CreateRewardedVideoAdOption - ): RewardedVideoAd - /** [[SelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html) wx.createSelectorQuery()](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/wx.createSelectorQuery.html) -* -* 需要基础库: `1.4.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 返回一个 SelectorQuery 对象实例。在自定义组件或包含自定义组件的页面中,应使用 `this.createSelectorQuery()` 来代替。 -* -* **示例代码** -* -* ```js -const query = wx.createSelectorQuery() -query.select('#the-id').boundingClientRect() -query.selectViewport().scrollOffset() -query.exec(function(res){ - res[0].top // #the-id节点的上边界坐标 - res[1].scrollTop // 显示区域的竖直滚动位置 -}) -``` */ - createSelectorQuery(): SelectorQuery - /** [[SocketTask](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.html) wx.connectSocket(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/wx.connectSocket.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* @warning **推荐使用 [SocketTask](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.html) 的方式去管理 webSocket 链接,每一条链路的生命周期都更加可控,同时存在多个 webSocket 的链接的情况下使用 wx 前缀的方法可能会带来一些和预期不一致的情况。** -* -* 创建一个 WebSocket 连接。使用前请注意阅读[相关说明](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html)。 -* -* **并发数** -* -* - 1.7.0 及以上版本,最多可以同时存在 5 个 WebSocket 连接。 -* - 1.7.0 以下版本,一个小程序同时只能有一个 WebSocket 连接,如果当前已存在一个 WebSocket 连接,会自动关闭该连接,并重新创建一个 WebSocket 连接。 -* -* **示例代码** -* -* ```js -wx.connectSocket({ - url: 'wss://example.qq.com', - header:{ - 'content-type': 'application/json' - } -}) -``` */ - connectSocket(option: ConnectSocketOption): SocketTask - /** [[TCPSocket](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/TCPSocket.html) wx.createTCPSocket()](https://developers.weixin.qq.com/miniprogram/dev/api/network/tcp/wx.createTCPSocket.html) - * - * 需要基础库: `2.18.0` - * - * 在插件中使用:支持 - * - * 创建一个 TCP Socket 实例。使用前请注意阅读[相关说明](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html)。 - * - * **连接限制** - * - * - 允许与局域网内的非本机 IP 通信 - * - 允许与配置过的服务器域名通信,详见[相关说明](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html) - * - 禁止与以下端口号连接:`1024 以下` `1099` `1433` `1521` `1719` `1720` `1723` `2049` `2375` `3128` `3306` `3389` `3659` `4045` `5060` `5061` `5432` `5984` `6379` `6000` `6566` `7001` `7002` `8000-8100` `8443` `8888` `9200` `9300` `10051` `10080` `11211` `27017` `27018` `27019` - * - 每 5 分钟内最多创建 20 个 TCPSocket */ - createTCPSocket(): TCPSocket - /** [[UDPSocket](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/UDPSocket.html) wx.createUDPSocket()](https://developers.weixin.qq.com/miniprogram/dev/api/network/udp/wx.createUDPSocket.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:需要基础库 `2.11.1` - * - * 创建一个 UDP Socket 实例。使用前请注意阅读[相关说明](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html)。 */ - createUDPSocket(): UDPSocket - /** [[UpdateManager](https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.html) wx.getUpdateManager()](https://developers.weixin.qq.com/miniprogram/dev/api/base/update/wx.getUpdateManager.html) - * - * 需要基础库: `1.9.90` - * - * 在插件中使用:不支持 - * - * 获取**全局唯一**的版本更新管理器,用于管理小程序更新。关于小程序的更新机制,可以查看[运行机制](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/operating-mechanism.html)文档。 - * - * **示例代码** - * - * [示例代码](https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.html#示例代码) */ - getUpdateManager(): UpdateManager - /** [[UploadTask](https://developers.weixin.qq.com/miniprogram/dev/api/network/upload/UploadTask.html) wx.uploadFile(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/upload/wx.uploadFile.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 将本地资源上传到服务器。客户端发起一个 HTTPS POST 请求,其中 `content-type` 为 `multipart/form-data`。使用前请注意阅读[相关说明](https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html)。 -* -* **示例代码** -* -* ```js -wx.chooseImage({ - success (res) { - const tempFilePaths = res.tempFilePaths - wx.uploadFile({ - url: 'https://example.weixin.qq.com/upload', //仅为示例,非真实的接口地址 - filePath: tempFilePaths[0], - name: 'file', - formData: { - 'user': 'test' - }, - success (res){ - const data = res.data - //do something - } - }) - } -}) -``` */ - uploadFile(option: UploadFileOption): UploadTask - /** [[UserCryptoManager](https://developers.weixin.qq.com/miniprogram/dev/api/base/crypto/UserCryptoManager.html) wx.getUserCryptoManager()](https://developers.weixin.qq.com/miniprogram/dev/api/base/crypto/wx.getUserCryptoManager.html) - * - * 需要基础库: `2.17.3` - * - * 在插件中使用:不支持 - * - * 获取用户加密模块 */ - getUserCryptoManager(): UserCryptoManager - /** [[VKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/VKSession.html) wx.createVKSession(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) -* -* 需要基础库: `2.20.0` -* -* 在插件中使用:需要基础库 `2.20.0` -* -* 创建 vision kit 会话对象。详见[指南](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/base.html) -* -* **示例代码** -* -* v1 版本:[VisionKit基础能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/visionkit-basic) -* v2 版本:[VisionKit-v2基础能力使用参考](https://github.com/wechat-miniprogram/miniprogram-demo/tree/master/miniprogram/packageAPI/pages/ar/visionkit-basic-v2) -* ```js -// 以下 demo 以 v2 为例 -// 创建 session 对象 -const ssession = wx.createVKSession({ - track: { - plane: {mode: 3}, - }, - version: 'v2', - gl, // WebGLRenderingContext -}) - -// 逐帧分析 -const onFrame = timestamp => { - // 开发者可以自己控制帧率 - const frame = session.getVKFrame(canvasWidth, canvasHeight) - if (frame) { - // 分析完毕,可以拿到帧对象 - doRender(frame) - } - - session.requestAnimationFrame(onFrame) -} -session.start(err => { - if (!err) session.requestAnimationFrame(onFrame) -}) - -// 渲染函数 -const doRender = frame => { - // ... -} -``` */ - createVKSession(option: VKConfig): VKSession - /** [[VideoContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.html) wx.createVideoContext(string id, Object this)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.createVideoContext.html) - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 创建 [video](https://developers.weixin.qq.com/miniprogram/dev/component/video.html) 上下文 [VideoContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.html) 对象。建议使用 [wx.createSelectorQuery](https://developers.weixin.qq.com/miniprogram/dev/api/wxml/wx.createSelectorQuery.html) 获取 context 对象。 */ - createVideoContext( - /** [video](https://developers.weixin.qq.com/miniprogram/dev/component/video.html) 组件的 id */ - id: string, - /** 在自定义组件下,当前组件实例的this,以操作组件内 [video](https://developers.weixin.qq.com/miniprogram/dev/component/video.html) 组件 */ - component?: Component.TrivialInstance | Page.TrivialInstance - ): VideoContext - /** [[VideoDecoder](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/VideoDecoder.html) wx.createVideoDecoder()](https://developers.weixin.qq.com/miniprogram/dev/api/media/video-decoder/wx.createVideoDecoder.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:需要基础库 `2.11.0` - * - * 创建视频解码器,可逐帧获取解码后的数据 */ - createVideoDecoder(): VideoDecoder - /** [[WebAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/WebAudioContext.html) wx.createWebAudioContext()](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createWebAudioContext.html) - * - * 需要基础库: `2.19.0` - * - * 在插件中使用:不支持 - * - * 创建 WebAudio 上下文。 */ - createWebAudioContext(): WebAudioContext - /** [[Worker](https://developers.weixin.qq.com/miniprogram/dev/api/worker/Worker.html) wx.createWorker(string scriptPath, object options)](https://developers.weixin.qq.com/miniprogram/dev/api/worker/wx.createWorker.html) -* -* 需要基础库: `1.9.90` -* -* 在插件中使用:需要基础库 `2.18.1` -* -* 创建一个 Worker 线程 -* -* **示例代码** -* -* ```js -// 创建普通worker -wx.createWorker('workers/index.js') -``` -* ```js -function createNewWorker() { - const worker = wx.createWorker('workers/index.js', { - useExperimentalWorker: true - }) - // 监听worker被系统回收事件 - worker.onProcessKilled(() => { - // 重新创建一个worker - createNewWorker() - }) -} -// 创建实验worker -createNewWorker() -``` */ - createWorker( - /** worker 入口文件的**绝对路径** */ - scriptPath: string, - /** 可选参数 */ - options?: CreateWorkerOption - ): Worker - /** [any wx.getStorageSync(string key)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.getStorageSync.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 从本地缓存中同步获取指定 key 的内容。 -* -* **注意** -* -* storage 应只用来进行数据的持久化存储,不应用于运行时的数据传递或全局状态管理。启动过程中过多的同步读写存储,会显著影响启动耗时。 -* -* **示例代码** -* -* ```js -try { - var value = wx.getStorageSync('key') - if (value) { - // Do something with return value - } -} catch (e) { - // Do something when catch error -} -``` */ - getStorageSync<T = any>( - /** 本地缓存中指定的 key */ - key: string - ): T - /** [boolean wx.canIUse(string schema)](https://developers.weixin.qq.com/miniprogram/dev/api/base/wx.canIUse.html) -* -* 需要基础库: `1.1.1` -* -* 在插件中使用:不支持 -* -* 判断小程序的API,回调,参数,组件等是否在当前版本可用。 -* -* **参数说明** -* -* - `${API}` 代表 API 名字 -* - `${method}` 代表调用方式,有效值为return, success, object, callback -* - `${param}` 代表参数或者返回值 -* - `${option}` 代表参数的可选值或者返回值的属性 -* - `${component}` 代表组件名字 -* - `${attribute}` 代表组件属性 -* - `${option}` 代表组件属性的可选值 -* -* **示例代码** -* -* ```js -// 对象的属性或方法 -wx.canIUse('console.log') -wx.canIUse('CameraContext.onCameraFrame') -wx.canIUse('CameraFrameListener.start') -wx.canIUse('Image.src') - -// wx接口参数、回调或者返回值 -wx.canIUse('openBluetoothAdapter') -wx.canIUse('getSystemInfoSync.return.safeArea.left') -wx.canIUse('getSystemInfo.success.screenWidth') -wx.canIUse('showToast.object.image') -wx.canIUse('onCompassChange.callback.direction') -wx.canIUse('request.object.method.GET') - -// 组件的属性 -wx.canIUse('live-player') -wx.canIUse('text.selectable') -wx.canIUse('button.open-type.contact') -``` */ - canIUse( - /** 使用 `${API}.${method}.${param}.${option}` 或者 `${component}.${attribute}.${option}` 方式来调用 */ - schema: string - ): boolean - /** [boolean wx.checkIsPictureInPictureActive()](https://developers.weixin.qq.com/miniprogram/dev/api/ui/window/wx.checkIsPictureInPictureActive.html) - * - * 需要基础库: `2.29.2` - * - * 在插件中使用:不支持 - * - * 返回当前是否存在小窗播放(小窗在 video/live-player/live-pusher 下可用) */ - checkIsPictureInPictureActive(): boolean - /** [boolean wx.isVKSupport(string version)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.isVKSupport.html) -* -* 需要基础库: `2.22.0` -* -* 在插件中使用:需要基础库 `2.22.0` -* -* 判断支持版本 -* -* **示例代码** -* -* ```js -const isSupportV2 = wx.isVKSupport('v2') -``` */ - isVKSupport( - /** 参数 version 可选值: - * - 'v1': 旧版本; - * - 'v2': v2 版本,目前只有 iOS 基础库 2.22.0 以上支持; */ - version: 'v1' | 'v2' - ): boolean - /** [string wx.arrayBufferToBase64(ArrayBuffer arrayBuffer)](https://developers.weixin.qq.com/miniprogram/dev/api/base/wx.arrayBufferToBase64.html) - * - * 需要基础库: `1.1.0` - * - * 在插件中使用:支持 - * @deprecated 基础库版本 [2.4.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃 - * - * 将 ArrayBuffer 对象转成 Base64 字符串 */ - arrayBufferToBase64( - /** 要转换成 Base64 字符串的 ArrayBuffer 对象 */ - arrayBuffer: ArrayBuffer - ): string - /** [string wx.createBufferURL(ArrayBuffer|TypedArray buffer)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.createBufferURL.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:不支持 - * - * 根据传入的 buffer 创建一个唯一的 URL 存在内存中 */ - createBufferURL( - /** 需要存入内存的二进制数据 */ - buffer: - | ArrayBuffer - | Int8Array - | Uint8Array - | Uint8ClampedArray - | Int16Array - | Uint16Array - | Int32Array - | Uint32Array - | Float32Array - | Float64Array - ): string - /** [string wx.getApiCategory()](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/life-cycle/wx.getApiCategory.html) - * - * 需要基础库: `2.33.0` - * - * 在插件中使用:不支持 - * - * 获取当前 API 类别 - * - * **不同 apiCategory 场景下的 API 限制** - * - * `X` 表示 API 被限制无法使用;不在表格中的 API 不限制。 - * - * | | default | nativeFunctionalized | browseOnly | embedded | - * |-|-|-|-|-| - * |navigateToMiniProgram | | `X` | `X` | | - * |openSetting | | | `X` | | - * |<button open-type="share"> | | `X` | `X` | `X` | - * |<button open-type="feedback"> | | | `X` | | - * |<button open-type="open-setting">| | | `X` | | - * |openEmbeddedMiniProgram | | `X` | `X` | `X` | */ - getApiCategory(): string - /** [wx.addCard(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/card/wx.addCard.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:不支持 -* -* 批量添加卡券。只有通过 [认证](https://developers.weixin.qq.com/miniprogram/product/renzheng.html) 的小程序或文化互动类目的小游戏才能使用。更多文档请参考 [微信卡券接口文档](https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&key=1490190158&version=1&lang=zh_CN&platform=2)。 -* -* **cardExt 说明** -* -* cardExt 是卡券的扩展参数,其值是一个 JSON 字符串。 -* -* **示例代码** -* -* ```js -wx.addCard({ - cardList: [ - { - cardId: '', - cardExt: '{"code": "", "openid": "", "timestamp": "", "signature":""}' - }, { - cardId: '', - cardExt: '{"code": "", "openid": "", "timestamp": "", "signature":""}' - } - ], - success (res) { - console.log(res.cardList) // 卡券添加结果 - } -}) -``` */ - addCard<T extends AddCardOption = AddCardOption>( - option: T - ): PromisifySuccessResult<T, AddCardOption> - /** [wx.addFileToFavorites(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/favorites/wx.addFileToFavorites.html) - * - * 需要基础库: `2.16.1` - * - * 在插件中使用:不支持 - * - * 收藏文件 */ - addFileToFavorites< - T extends AddFileToFavoritesOption = AddFileToFavoritesOption - >( - option: T - ): PromisifySuccessResult<T, AddFileToFavoritesOption> - /** [wx.addPhoneCalendar(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/calendar/wx.addPhoneCalendar.html) - * - * 需要基础库: `2.15.0` - * - * 在插件中使用:不支持 - * - * 向系统日历添加事件 */ - addPhoneCalendar< - T extends AddPhoneCalendarOption = AddPhoneCalendarOption - >( - option: T - ): PromisifySuccessResult<T, AddPhoneCalendarOption> - /** [wx.addPhoneContact(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/contact/wx.addPhoneContact.html) - * - * 需要基础库: `1.2.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 添加手机通讯录联系人。用户可以选择将该表单以「新增联系人」或「添加到已有联系人」的方式,写入手机系统通讯录。 */ - addPhoneContact< - T extends AddPhoneContactOption = AddPhoneContactOption - >( - option: T - ): PromisifySuccessResult<T, AddPhoneContactOption> - /** [wx.addPhoneRepeatCalendar(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/calendar/wx.addPhoneRepeatCalendar.html) - * - * 需要基础库: `2.15.0` - * - * 在插件中使用:不支持 - * - * 向系统日历添加重复事件 */ - addPhoneRepeatCalendar< - T extends AddPhoneRepeatCalendarOption = AddPhoneRepeatCalendarOption - >( - option: T - ): PromisifySuccessResult<T, AddPhoneRepeatCalendarOption> - /** [wx.addVideoToFavorites(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/favorites/wx.addVideoToFavorites.html) - * - * 需要基础库: `2.16.1` - * - * 在插件中使用:不支持 - * - * 收藏视频 */ - addVideoToFavorites< - T extends AddVideoToFavoritesOption = AddVideoToFavoritesOption - >( - option: T - ): PromisifySuccessResult<T, AddVideoToFavoritesOption> - /** [wx.authPrivateMessage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/share/wx.authPrivateMessage.html) -* -* 需要基础库: `2.13.0` -* -* 在插件中使用:不支持 -* -* 验证私密消息。用法详情见 [小程序私密消息使用指南](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share/private-message.html) -* -* **示例代码** -* -* ```js -wx.authPrivateMessage({ - shareTicket: 'xxxxxx', - success(res) { - console.log('authPrivateMessage success', res) - // res - // { - // errMsg: 'authPrivateMessage:ok' - // valid: true - // iv: 'xxxx', - // encryptedData: 'xxxxxx' - // } - }, - fail(res) { - console.log('authPrivateMessage fail', res) - } -}) -``` */ - authPrivateMessage(option?: AuthPrivateMessageOption): void - /** [wx.authorize(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/authorize/wx.authorize.html) -* -* 需要基础库: `1.2.0` -* -* 在插件中使用:不支持 -* -* 提前向用户发起授权请求。调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据,但不会实际调用对应接口。如果用户之前已经同意授权,则不会出现弹窗,直接返回成功。更多用法详见 [用户授权](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html)。 -* > 小程序插件可以使用 [wx.authorizeForMiniProgram](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/authorize/wx.authorizeForMiniProgram.html) -* -* **示例代码** -* -* ```js -// 可以通过 wx.getSetting 先查询一下用户是否授权了 "scope.record" 这个 scope -wx.getSetting({ - success(res) { - if (!res.authSetting['scope.record']) { - wx.authorize({ - scope: 'scope.record', - success () { - // 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问 - wx.startRecord() - } - }) - } - } -}) -``` */ - authorize<T extends AuthorizeOption = AuthorizeOption>( - option: T - ): PromisifySuccessResult<T, AuthorizeOption> - /** [wx.authorizeForMiniProgram(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/authorize/wx.authorizeForMiniProgram.html) -* -* 需要基础库: `2.14.4` -* -* 在插件中使用:需要基础库 `2.14.4` -* -* **仅小程序插件中能调用该接口**,用法同 [wx.authorize](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/authorize/wx.authorize.html)。目前仅支持三种 scope(见下) -* -* **示例代码** -* -* ```js -wx.authorizeForMiniProgram({ - scope: 'scope.record', - success () { - // 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问 - wx.startRecord() - } -}) -``` */ - authorizeForMiniProgram(option: AuthorizeForMiniProgramOption): void - /** [wx.batchGetStorage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.batchGetStorage.html) -* -* 需要基础库: `2.25.0` -* -* 在插件中使用:不支持 -* -* 从本地缓存中异步批量获取指定 key 的内容。 -* -* **示例代码** -* -* ```js -wx.batchGetStorage({ - keyList: ['key'], - success (res) { - console.log(res) - } -}) -``` */ - batchGetStorage< - T extends BatchGetStorageOption = BatchGetStorageOption - >( - option: T - ): PromisifySuccessResult<T, BatchGetStorageOption> - /** [wx.batchSetStorage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.batchSetStorage.html) -* -* 需要基础库: `2.25.0` -* -* 在插件中使用:不支持 -* -* 将数据批量存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。 -* -* **示例代码** -* -* ```js -wx.setStorage({ - key:"key", - data:"value" -}) -``` -* -* ```js -// 开启加密存储 -wx.batchSetStorage({ - kvList: [{ - key: 'key', - value: 'value', - }], -}) -``` */ - batchSetStorage< - T extends BatchSetStorageOption = BatchSetStorageOption - >( - option: T - ): PromisifySuccessResult<T, BatchSetStorageOption> - /** [wx.batchSetStorageSync(Array.<Object> kvList)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.batchSetStorageSync.html) -* -* 需要基础库: `2.25.0` -* -* 在插件中使用:不支持 -* -* 将数据批量存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。 -* -* **示例代码** -* -* ```js -try { - wx.batchSetStorageSync([{key: 'key', value: 'value'}]) -} catch (e) { } -``` */ - batchSetStorageSync(kvList: KvList[]): void - /** [wx.canvasGetImageData(Object object, Object this)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.canvasGetImageData.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 获取 canvas 区域隐含的像素数据。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/yufmRjmZ7W8f) -* -* ```js -wx.canvasGetImageData({ - canvasId: 'myCanvas', - x: 0, - y: 0, - width: 100, - height: 100, - success(res) { - console.log(res.width) // 100 - console.log(res.height) // 100 - console.log(res.data instanceof Uint8ClampedArray) // true - console.log(res.data.length) // 100 * 100 * 4 - } -}) -``` */ - canvasGetImageData< - T extends CanvasGetImageDataOption = CanvasGetImageDataOption - >( - option: T, - /** 在自定义组件下,当前组件实例的this,以操作组件内 [canvas](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 组件 */ - component?: Component.TrivialInstance | Page.TrivialInstance - ): PromisifySuccessResult<T, CanvasGetImageDataOption> - /** [wx.canvasPutImageData(Object object, Object this)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.canvasPutImageData.html) - * - * 需要基础库: `1.9.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 将像素数据绘制到画布。在自定义组件下,第二个参数传入自定义组件实例 this,以操作组件内 <canvas> 组件 */ - canvasPutImageData< - T extends CanvasPutImageDataOption = CanvasPutImageDataOption - >( - option: T, - /** 在自定义组件下,当前组件实例的this,以操作组件内 [canvas](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 组件 */ - component?: Component.TrivialInstance | Page.TrivialInstance - ): PromisifySuccessResult<T, CanvasPutImageDataOption> - /** [wx.canvasToTempFilePath(Object object, Object this)](https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.canvasToTempFilePath.html) - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 把当前画布指定区域的内容导出生成指定大小的图片。在 `draw()` 回调里调用该方法才能保证图片导出成功。 */ - canvasToTempFilePath< - T extends CanvasToTempFilePathOption = CanvasToTempFilePathOption - >( - option: T, - /** 在自定义组件下,当前组件实例的this,以操作组件内 [canvas](https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html) 组件 */ - component?: Component.TrivialInstance | Page.TrivialInstance - ): PromisifySuccessResult<T, CanvasToTempFilePathOption> - /** [wx.checkIsAddedToMyMiniProgram(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/my-miniprogram/wx.checkIsAddedToMyMiniProgram.html) - * - * 需要基础库: `2.29.1` - * - * 在插件中使用:不支持 - * - * 检查小程序是否被添加至 「我的小程序」 */ - checkIsAddedToMyMiniProgram( - option: CheckIsAddedToMyMiniProgramOption - ): void - /** [wx.checkIsOpenAccessibility(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/accessibility/wx.checkIsOpenAccessibility.html) - * - * 需要基础库: `2.13.0` - * - * 在插件中使用:不支持 - * - * 检测是否开启视觉无障碍功能。 */ - checkIsOpenAccessibility< - T extends CheckIsOpenAccessibilityOption = CheckIsOpenAccessibilityOption - >( - option?: T - ): PromisifySuccessResult<T, CheckIsOpenAccessibilityOption> - /** [wx.checkIsSoterEnrolledInDevice(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/soter/wx.checkIsSoterEnrolledInDevice.html) -* -* 需要基础库: `1.6.0` -* -* 在插件中使用:不支持 -* -* 获取设备内是否录入如指纹等生物信息的接口 -* -* **示例代码** -* -* ```js -wx.checkIsSoterEnrolledInDevice({ - checkAuthMode: 'fingerPrint', - success(res) { - console.log(res.isEnrolled) - } -}) -``` */ - checkIsSoterEnrolledInDevice< - T extends CheckIsSoterEnrolledInDeviceOption = CheckIsSoterEnrolledInDeviceOption - >( - option: T - ): PromisifySuccessResult<T, CheckIsSoterEnrolledInDeviceOption> - /** [wx.checkIsSupportSoterAuthentication(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/soter/wx.checkIsSupportSoterAuthentication.html) -* -* 需要基础库: `1.5.0` -* -* 在插件中使用:不支持 -* -* 获取本机支持的 SOTER 生物认证方式 -* -* **示例代码** -* -* ```js -wx.checkIsSupportSoterAuthentication({ - success(res) { - // res.supportMode = [] 不具备任何被SOTER支持的生物识别方式 - // res.supportMode = ['fingerPrint'] 只支持指纹识别 - // res.supportMode = ['fingerPrint', 'facial'] 支持指纹识别和人脸识别 - } -}) -``` */ - checkIsSupportSoterAuthentication< - T extends CheckIsSupportSoterAuthenticationOption = CheckIsSupportSoterAuthenticationOption - >( - option?: T - ): PromisifySuccessResult<T, CheckIsSupportSoterAuthenticationOption> - /** [wx.checkSession(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.checkSession.html) -* -* 在插件中使用:不支持 -* -* 检查登录态 session_key 是否过期。 -* -* session_key 具有唯一性,在使用小程序时,同一用户在同一时刻仅有一个有效的 session_key。 -* -* 通过 wx.login 接口获得的用户登录态拥有一定的时效性。用户越久未使用小程序,用户登录态越有可能过期。反之如果用户一直在使用小程序,则用户登录态一直保持有效。具体时效逻辑由微信维护,对开发者透明。除了过期失效外,触发获取临时登录凭证 code 的操作([小程序登录](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html) 和 [数据预拉取](#))可能会生成新的登录态session_key,从而使旧的 session_key 被顶替而失效。 -* -* 开发者可以调用 wx.checkSession 接口检测用户登录态是否过期。**注意,wx.checkSession 的校验对象是最后一次获取 code 操作对应的登录态 session_key**,调用成功说明该 session_key 未过期,调用失败说明 session_key 已过期。如果要校验指定的 session_key 是否有效,可以在开发者服务器后台调用 [checkSessionKey](https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/checkSessionKey.html)。 -* -* 登录态失效后开发者可以再调用 wx.login 获取新的用户登录态。 -* -* **示例代码** -* -* ```js -wx.checkSession({ - success () { - //session_key 未过期,并且在本生命周期一直有效 - }, - fail () { - // session_key 已经失效,需要重新执行登录流程 - wx.login() //重新登录 - } -}) -``` */ - checkSession<T extends CheckSessionOption = CheckSessionOption>( - option?: T - ): PromisifySuccessResult<T, CheckSessionOption> - /** [wx.chooseAddress(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/address/wx.chooseAddress.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `2.16.1` -* -* 获取用户收货地址。调起用户编辑收货地址原生界面,并在编辑完成后返回用户选择的地址。 -* ## 使用方法 -* 自 2022 年 7 月 14 日后发布的小程序,若使用该接口,需要在 app.json 中进行声明,否则将无法正常使用该接口,2022年7月14日前发布的小程序不受影响。[具体规则见公告](https://developers.weixin.qq.com/community/develop/doc/000a02f2c5026891650e7f40351c01) -* ## 申请开通 -* 暂只针对具备与地理位置强相关的使用场景的小程序开放,在小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通该接口权限。 -* 接口权限申请入口将于2022年3月11日开始内测,于3月31日全量上线。并从4月18日开始,在代码审核环节将检测该接口是否已完成开通,如未开通,将在代码提审环节进行拦截。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/024hHnmd772y) -* ```js -wx.chooseAddress({ - success (res) { - console.log(res.userName) - console.log(res.postalCode) - console.log(res.provinceName) - console.log(res.cityName) - console.log(res.countyName) - console.log(res.detailInfo) - console.log(res.nationalCode) - console.log(res.telNumber) - } -}) -``` */ - chooseAddress<T extends ChooseAddressOption = ChooseAddressOption>( - option?: T - ): PromisifySuccessResult<T, ChooseAddressOption> - /** [wx.chooseContact(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/contact/wx.chooseContact.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:不支持 - * - * 拉起手机通讯录,选择联系人。 */ - chooseContact(option?: ChooseContactOption): void - /** [wx.chooseImage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.chooseImage.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [2.21.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.chooseMedia](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html) 替换 -* -* 从本地相册选择图片或使用相机拍照。 -* -* **** -* -* ```js -wx.chooseImage({ - count: 1, - sizeType: ['original', 'compressed'], - sourceType: ['album', 'camera'], - success (res) { - // tempFilePath可以作为img标签的src属性显示图片 - const tempFilePaths = res.tempFilePaths - } -}) -``` */ - chooseImage<T extends ChooseImageOption = ChooseImageOption>( - option?: T - ): PromisifySuccessResult<T, ChooseImageOption> - /** [wx.chooseInvoice(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/invoice/wx.chooseInvoice.html) - * - * 需要基础库: `2.3.0` - * - * 在插件中使用:需要基础库 `2.16.1` - * - * 选择用户已有的发票。 - * - * **通过 cardId 和 encryptCode 获得报销发票的信息** - * - * 请参考[微信电子发票文档](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=21517918939oae3U)中,「查询报销发票信息」部分。 - * 其中 `access_token` 的获取请参考[auth.getAccessToken](#)文档 */ - chooseInvoice<T extends ChooseInvoiceOption = ChooseInvoiceOption>( - option?: T - ): PromisifySuccessResult<T, ChooseInvoiceOption> - /** [wx.chooseInvoiceTitle(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/invoice/wx.chooseInvoiceTitle.html) -* -* 需要基础库: `1.5.0` -* -* 在插件中使用:需要基础库 `2.16.1` -* -* 选择用户的发票抬头。当前小程序必须关联一个公众号,且这个公众号是完成了[微信认证](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1496554031_RD4xe)的,才能调用 chooseInvoiceTitle。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/GJ4S9nmQ7x2E) -* -* ```js -wx.chooseInvoiceTitle({ - success(res) {} -}) -``` */ - chooseInvoiceTitle< - T extends ChooseInvoiceTitleOption = ChooseInvoiceTitleOption - >( - option?: T - ): PromisifySuccessResult<T, ChooseInvoiceTitleOption> - /** [wx.chooseLicensePlate(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/license-plate/wx.chooseLicensePlate.html) - * - * 需要基础库: `2.19.0` - * - * 在插件中使用:不支持 - * - * 选择车牌号 */ - chooseLicensePlate< - T extends ChooseLicensePlateOption = ChooseLicensePlateOption - >( - option?: T - ): PromisifySuccessResult<T, ChooseLicensePlateOption> - /** [wx.chooseLocation(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.chooseLocation.html) - * - * 在插件中使用:需要基础库 `1.9.6` - * - * @warning **为确保选择地理位置接口的合理使用,位置接口调整参考 [选择地理位置接口调整公告](https://developers.weixin.qq.com/community/develop/doc/0006e45df2cac030e6edf367c56001)** - * - * 打开地图选择位置。 - * ## 使用方法 - * 自 2022 年 7 月 14 日后发布的小程序,若使用该接口,需要在 app.json 中进行声明,否则将无法正常使用该接口,2022年7月14日前发布的小程序不受影响。[具体规则见公告](https://developers.weixin.qq.com/community/develop/doc/000a02f2c5026891650e7f40351c01) - * ## 申请开通 - * 暂只针对具备与地理位置强相关的使用场景的小程序开放,在小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通该接口权限。 - * 接口权限申请入口将于2022年3月11日开始内测,于3月31日全量上线。并从4月18日开始,在代码审核环节将检测该接口是否已完成开通,如未开通,将在代码提审环节进行拦截。 - * - * **示例** - * - * ![](https://res.wx.qq.com/op_res/WDFC8aB4FI8rJ9oEmbYfbH_Fl3EIv91471YVxezVfLRESkUuCgfODZcbOoyteKU4j-OLZa2EFKY9BDPd3g-tfg#width:260px) */ - chooseLocation<T extends ChooseLocationOption = ChooseLocationOption>( - option: T - ): PromisifySuccessResult<T, ChooseLocationOption> - /** [wx.chooseMedia(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html) -* -* 需要基础库: `2.10.0` -* -* 在插件中使用:需要基础库 `2.11.1` -* -* 拍摄或从手机相册中选择图片或视频。 -* -* **示例代码** -* -* ```js -wx.chooseMedia({ - count: 9, - mediaType: ['image','video'], - sourceType: ['album', 'camera'], - maxDuration: 30, - camera: 'back', - success(res) { - console.log(res.tempFiles[0].tempFilePath) - console.log(res.tempFiles[0].size) - } -}) -``` */ - chooseMedia<T extends ChooseMediaOption = ChooseMediaOption>( - option: T - ): PromisifySuccessResult<T, ChooseMediaOption> - /** [wx.chooseMessageFile(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.chooseMessageFile.html) -* -* 需要基础库: `2.5.0` -* -* 在插件中使用:不支持 -* -* 从客户端会话选择文件。 -* -* **** -* -* ```js -wx.chooseMessageFile({ - count: 10, - type: 'image', - success (res) { - // tempFilePath可以作为img标签的src属性显示图片 - const tempFilePaths = res.tempFiles - } -}) -``` */ - chooseMessageFile< - T extends ChooseMessageFileOption = ChooseMessageFileOption - >( - option: T - ): PromisifySuccessResult<T, ChooseMessageFileOption> - /** [wx.choosePoi(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.choosePoi.html) - * - * 在插件中使用:不支持 - * - * @warning **为确保选择地理位置接口的合理使用,位置接口调整参考 [选择地理位置接口调整公告](https://developers.weixin.qq.com/community/develop/doc/0006e45df2cac030e6edf367c56001)** - * - * 打开POI列表选择位置,支持模糊定位(精确到市)和精确定位混选。 - * ## 使用方法 - * 自 2022 年 7 月 14 日后发布的小程序,若使用该接口,需要在 app.json 中进行声明,否则将无法正常使用该接口,2022年7月14日前发布的小程序不受影响。[具体规则见公告](https://developers.weixin.qq.com/community/develop/doc/000a02f2c5026891650e7f40351c01) - * ## 申请开通 - * 暂只针对具备与地理位置强相关的使用场景的小程序开放,在小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通该接口权限。 - * 接口权限申请入口将于2022年3月11日开始内测,于3月31日全量上线。并从4月18日开始,在代码审核环节将检测该接口是否已完成开通,如未开通,将在代码提审环节进行拦截。 - * - * **示例** - * - * ![](https://res.wx.qq.com/op_res/lzDsNyBNifLczyLX0ms7ZpPQysgAgdhrQTGzzTQPiXkAB2HJIf1Slvl4rnN9I1q0AT3xqoGTg98jMsNexDLbbA#width:260px) */ - choosePoi<T extends ChoosePoiOption = ChoosePoiOption>( - option: T - ): PromisifySuccessResult<T, ChoosePoiOption> - /** [wx.chooseVideo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseVideo.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [2.21.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.chooseMedia](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html) 替换 -* -* 拍摄视频或从手机相册中选视频。 -* -* **示例代码** -* -* ```js -wx.chooseVideo({ - sourceType: ['album','camera'], - maxDuration: 60, - camera: 'back', - success(res) { - console.log(res.tempFilePath) - } -}) -``` */ - chooseVideo<T extends ChooseVideoOption = ChooseVideoOption>( - option: T - ): PromisifySuccessResult<T, ChooseVideoOption> - /** [wx.clearStorage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.clearStorage.html) -* -* 在插件中使用:不支持 -* -* 清理本地数据缓存。 -* -* **示例代码** -* -* ```js -wx.clearStorage() -``` -* -* ```js -try { - wx.clearStorageSync() -} catch(e) { - // Do something when catch error -} -``` */ - clearStorage<T extends ClearStorageOption = ClearStorageOption>( - option?: T - ): PromisifySuccessResult<T, ClearStorageOption> - /** [wx.clearStorageSync()](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.clearStorageSync.html) -* -* 在插件中使用:不支持 -* -* [wx.clearStorage](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.clearStorage.html) 的同步版本 -* -* **示例代码** -* -* ```js -wx.clearStorage() -``` -* -* ```js -try { - wx.clearStorageSync() -} catch(e) { - // Do something when catch error -} -``` */ - clearStorageSync(): void - /** [wx.closeBLEConnection(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.closeBLEConnection.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 断开与蓝牙低功耗设备的连接。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.closeBLEConnection({ - deviceId, - success (res) { - console.log(res) - } -}) -``` */ - closeBLEConnection< - T extends CloseBLEConnectionOption = CloseBLEConnectionOption - >( - option: T - ): PromisifySuccessResult<T, CloseBLEConnectionOption> - /** [wx.closeBluetoothAdapter(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.closeBluetoothAdapter.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 关闭蓝牙模块。调用该方法将断开所有已建立的连接并释放系统资源。建议在使用蓝牙流程后,与 [wx.openBluetoothAdapter](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.openBluetoothAdapter.html) 成对调用。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.closeBluetoothAdapter({ - success (res) { - console.log(res) - } -}) -``` */ - closeBluetoothAdapter< - T extends CloseBluetoothAdapterOption = CloseBluetoothAdapterOption - >( - option?: T - ): PromisifySuccessResult<T, CloseBluetoothAdapterOption> - /** [wx.closeSocket(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/wx.closeSocket.html) -* -* 在插件中使用:不支持 -* -* @warning **推荐使用 [SocketTask](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.html) 的方式去管理 webSocket 链接,每一条链路的生命周期都更加可控,同时存在多个 webSocket 的链接的情况下使用 wx 前缀的方法可能会带来一些和预期不一致的情况。** -* -* 关闭 WebSocket 连接。 -* -* **示例代码** -* -* ```js -wx.connectSocket({ - url: 'test.php' -}) - -//注意这里有时序问题, -//如果 wx.connectSocket 还没回调 wx.onSocketOpen,而先调用 wx.closeSocket,那么就做不到关闭 WebSocket 的目的。 -//必须在 WebSocket 打开期间调用 wx.closeSocket 才能关闭。 -wx.onSocketOpen(function() { - wx.closeSocket() -}) - -wx.onSocketClose(function(res) { - console.log('WebSocket 已关闭!') -}) -``` */ - closeSocket<T extends CloseSocketOption = CloseSocketOption>( - option?: T - ): PromisifySuccessResult<T, CloseSocketOption> - /** [wx.compressImage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.compressImage.html) -* -* 需要基础库: `2.4.0` -* -* 在插件中使用:需要基础库 `2.12.0` -* -* 压缩图片接口,可选压缩质量。iOS 仅支持压缩 JPG 格式图片。 -* -* **示例代码** -* -* ```js -wx.compressImage({ - src: '', // 图片路径 - quality: 80 // 压缩质量 -}) -``` */ - compressImage<T extends CompressImageOption = CompressImageOption>( - option: T - ): PromisifySuccessResult<T, CompressImageOption> - /** [wx.compressVideo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.compressVideo.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:需要基础库 `2.11.1` - * - * 压缩视频接口。开发者可指定压缩质量 `quality` 进行压缩。当需要更精细的控制时,可指定 `bitrate`、`fps`、和 `resolution`,当 `quality` 传入时,这三个参数将被忽略。原视频的相关信息可通过 [getVideoInfo](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.getVideoInfo.html) 获取。 */ - compressVideo<T extends CompressVideoOption = CompressVideoOption>( - option: T - ): PromisifySuccessResult<T, CompressVideoOption> - /** [wx.connectWifi(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.connectWifi.html) -* -* 需要基础库: `1.6.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 连接 Wi-Fi。若已知 Wi-Fi 信息,可以直接利用该接口连接。仅 Android 与 iOS 11 以上版本支持。 -* -* **示例代码** -* -* ```js -wx.connectWifi({ - SSID: '', - password: '', - success (res) { - console.log(res.errMsg) - } -}) -``` -* -* **注意** -* -* - Android 微信客户端 7.0.22 以上版本,connectWifi 的实现在 Android 10 及以上的手机无法生效,对于 Android 10 及以上版本,设备连接 wifi 之后,(受系统能力限制)其他进程无法使用当前连接的 wifi ;即连接上的 wifi 只对当前小程序有效,如果想要对整个系统生效,需要配置 maunal 来连接 wifi。 -* - iOS 系统底层没有给开发者提供因 wifi 密码错误而连接失败的事件,但用户可以收到密码错误的系统弹窗。建议开发者通过 onWifiConnected 事件来判断 wifi 是否连接成功;即设置定时器,若超时后仍没有 onWifiConnected 事件,则认定此次 wifi 连接无效。 -* - Android / iOS 在系统已经连上目标 wifi 的情况下,小程序再次连接目标 wifi,此时无论输入的密码是否正确,系统都会默认此次连接成功,且没有 onWifiConnected 事件。 -* - onWifiConnected 事件可能会返回空对象,此时代表 wifi 断开连接,开发者可忽略这种情况。 */ - connectWifi<T extends ConnectWifiOption = ConnectWifiOption>( - option: T - ): PromisifySuccessResult<T, ConnectWifiOption> - /** [wx.createBLEConnection(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.createBLEConnection.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 连接蓝牙低功耗设备。 -* -* 若小程序在之前已有搜索过某个蓝牙设备,并成功建立连接,可直接传入之前搜索获取的 deviceId 直接尝试连接该设备,无需再次进行搜索操作。 -* -* **注意** -* -* - 请保证尽量成对的调用 [wx.createBLEConnection](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.createBLEConnection.html) 和 [wx.closeBLEConnection](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.closeBLEConnection.html) 接口。安卓如果重复调用 [wx.createBLEConnection](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.createBLEConnection.html) 创建连接,有可能导致系统持有同一设备多个连接的实例,导致调用 `closeBLEConnection` 的时候并不能真正的断开与设备的连接。 -* - 蓝牙连接随时可能断开,建议监听 [wx.onBLEConnectionStateChange](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.onBLEConnectionStateChange.html) 回调事件,当蓝牙设备断开时按需执行重连操作 -* - 若对未连接的设备或已断开连接的设备调用数据读写操作的接口,会返回 10006 错误,建议进行重连操作。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.createBLEConnection({ - deviceId, - success (res) { - console.log(res) - } -}) -``` */ - createBLEConnection< - T extends CreateBLEConnectionOption = CreateBLEConnectionOption - >( - option: T - ): PromisifySuccessResult<T, CreateBLEConnectionOption> - /** [wx.createBLEPeripheralServer(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/wx.createBLEPeripheralServer.html) - * - * 需要基础库: `2.10.3` - * - * 在插件中使用:需要基础库 `2.22.1` - * - * 建立本地作为蓝牙低功耗外围设备的服务端,可创建多个。 */ - createBLEPeripheralServer< - T extends CreateBLEPeripheralServerOption = CreateBLEPeripheralServerOption - >( - option?: T - ): PromisifySuccessResult<T, CreateBLEPeripheralServerOption> - /** [wx.cropImage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.cropImage.html) -* -* 需要基础库: `2.26.0` -* -* 在插件中使用:不支持 -* -* 裁剪图片接口 -* -* **示例代码** -* -* ```js -wx.cropImage({ - src: '', // 图片路径 - cropScale: '16:9', // 裁剪比例 -}) -``` */ - cropImage(option: CropImageOption): void - /** [wx.disableAlertBeforeUnload(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.disableAlertBeforeUnload.html) - * - * 需要基础库: `2.12.0` - * - * 在插件中使用:不支持 - * - * 关闭小程序页面返回询问对话框。 */ - disableAlertBeforeUnload(option?: DisableAlertBeforeUnloadOption): void - /** [wx.editImage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.editImage.html) -* -* 需要基础库: `2.22.0` -* -* 在插件中使用:不支持 -* -* 编辑图片接口 -* -* **示例代码** -* -* ```js -wx.editImage({ - src: '', // 图片路径 -}) -``` */ - editImage(option: EditImageOption): void - /** [wx.enableAlertBeforeUnload(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.enableAlertBeforeUnload.html) - * - * 需要基础库: `2.12.0` - * - * 在插件中使用:不支持 - * - * 开启小程序页面返回询问对话框。 - * - * ## 弹窗条件 - * * 当用户在小程序内非首页页面/最底层页 - * * 官方导航栏上的的返回 - * * 全屏模式下自绘返回键 - * * android 系统 back 键时 - * - * ## 注意事项 - * * 手势滑动返回时不做拦截 - * * 在任何场景下,此功能都不应拦住用户退出小程序的行为 - * - * **示例代码** - * - * [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/MTPm9Cmh7VfT) */ - enableAlertBeforeUnload(option: EnableAlertBeforeUnloadOption): void - /** [wx.exitMiniProgram(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.exitMiniProgram.html) - * - * 需要基础库: `2.17.3` - * - * 在插件中使用:需要基础库 `2.30.1` - * - * 退出当前小程序。必须有点击行为才能调用成功。 */ - exitMiniProgram< - T extends ExitMiniProgramOption = ExitMiniProgramOption - >( - option?: T - ): PromisifySuccessResult<T, ExitMiniProgramOption> - /** [wx.exitVoIPChat(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.exitVoIPChat.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:需要基础库 `2.9.0` - * - * 退出(销毁)实时语音通话 */ - exitVoIPChat<T extends ExitVoIPChatOption = ExitVoIPChatOption>( - option?: T - ): PromisifySuccessResult<T, ExitVoIPChatOption> - /** [wx.faceDetect(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/face/wx.faceDetect.html) - * - * 需要基础库: `2.18.0` - * - * 在插件中使用:需要基础库 `2.21.3` - * - * @warning **该接口已停止维护,推荐使用 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 代替** - * - * 人脸检测,使用前需要通过 wx.initFaceDetect 进行一次初始化,推荐使用相机接口返回的帧数据。本接口不再维护,请使用 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 接口代替。详情参考[人脸检测指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/face.html) - * - * **** - * - * ### 特别说明 - * 若小程序人脸识别功能涉及采集、存储用户生物特征(如人脸照片或视频、身份证和手持身份证、身份证照和免冠照等),此类型服务需使用[微信原生人脸识别接口](https://developers.weixin.qq.com/community/develop/doc/000442d352c1202bd498ecb105c00d?highline=%E4%BA%BA%E8%84%B8%E6%A0%B8%E8%BA%AB)。 */ - faceDetect(option: FaceDetectOption): void - /** [wx.getAvailableAudioSources(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.getAvailableAudioSources.html) - * - * 需要基础库: `2.1.0` - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 获取当前支持的音频输入源 */ - getAvailableAudioSources< - T extends GetAvailableAudioSourcesOption = GetAvailableAudioSourcesOption - >( - option?: T - ): PromisifySuccessResult<T, GetAvailableAudioSourcesOption> - /** [wx.getBLEDeviceCharacteristics(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.getBLEDeviceCharacteristics.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 获取蓝牙低功耗设备某个服务中所有特征 (characteristic)。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.getBLEDeviceCharacteristics({ - // 这里的 deviceId 需要已经通过 wx.createBLEConnection 与对应设备建立链接 - deviceId, - // 这里的 serviceId 需要在 wx.getBLEDeviceServices 接口中获取 - serviceId, - success (res) { - console.log('device getBLEDeviceCharacteristics:', res.characteristics) - } -}) -``` */ - getBLEDeviceCharacteristics< - T extends GetBLEDeviceCharacteristicsOption = GetBLEDeviceCharacteristicsOption - >( - option: T - ): PromisifySuccessResult<T, GetBLEDeviceCharacteristicsOption> - /** [wx.getBLEDeviceRSSI(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.getBLEDeviceRSSI.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:需要基础库 `2.11.0` - * - * 获取蓝牙低功耗设备的信号强度 (Received Signal Strength Indication, RSSI)。 */ - getBLEDeviceRSSI< - T extends GetBLEDeviceRSSIOption = GetBLEDeviceRSSIOption - >( - option: T - ): PromisifySuccessResult<T, GetBLEDeviceRSSIOption> - /** [wx.getBLEDeviceServices(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.getBLEDeviceServices.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 获取蓝牙低功耗设备所有服务 (service)。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.getBLEDeviceServices({ - // 这里的 deviceId 需要已经通过 wx.createBLEConnection 与对应设备建立连接 - deviceId, - success (res) { - console.log('device services:', res.services) - } -}) -``` */ - getBLEDeviceServices< - T extends GetBLEDeviceServicesOption = GetBLEDeviceServicesOption - >( - option: T - ): PromisifySuccessResult<T, GetBLEDeviceServicesOption> - /** [wx.getBLEMTU(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.getBLEMTU.html) -* -* 需要基础库: `2.20.1` -* -* 在插件中使用:需要基础库 `2.20.1` -* -* 获取蓝牙低功耗的最大传输单元。需在 [wx.createBLEConnection](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.createBLEConnection.html) 调用成功后调用。 -* -* **注意** -* -* - 小程序中 MTU 为 ATT_MTU,包含 Op-Code 和 Attribute Handle 的长度,实际可以传输的数据长度为 `ATT_MTU - 3` -* - iOS 系统中 MTU 为固定值;安卓系统中,MTU 会在系统协商成功之后发生改变,建议使用 [wx.onBLEMTUChange](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.onBLEMTUChange.html) 监听。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.getBLEMTU({ - deviceId: '', - writeType: 'write', - success (res) { - console.log(res) - } -}) -``` */ - getBLEMTU<T extends GetBLEMTUOption = GetBLEMTUOption>( - option: T - ): PromisifySuccessResult<T, GetBLEMTUOption> - /** [wx.getBackgroundAudioPlayerState(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioPlayerState.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [1.2.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getBackgroundAudioManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioManager.html) 替换 -* -* 获取后台音乐播放状态。 -* -* **示例代码** -* -* ```js -wx.getBackgroundAudioPlayerState({ - success (res) { - const status = res.status - const dataUrl = res.dataUrl - const currentPosition = res.currentPosition - const duration = res.duration - const downloadPercent = res.downloadPercent - } -}) -``` */ - getBackgroundAudioPlayerState< - T extends GetBackgroundAudioPlayerStateOption = GetBackgroundAudioPlayerStateOption - >( - option?: T - ): PromisifySuccessResult<T, GetBackgroundAudioPlayerStateOption> - /** [wx.getBackgroundFetchData(object object)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/background-fetch/wx.getBackgroundFetchData.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:不支持 - * - * 拉取 backgroundFetch 客户端缓存数据。 - * 当调用接口时,若当次请求未结束,会先返回本地的旧数据(之前打开小程序时请求的),如果本地没有旧数据,安卓上会返回fail,不会等待请求完成,iOS上会返回success但fetchedData为空,也不会等待请求完成。建议和 [wx.onBackgroundFetchData](https://developers.weixin.qq.com/miniprogram/dev/api/storage/background-fetch/wx.onBackgroundFetchData.html) 配合使用。 */ - getBackgroundFetchData< - T extends GetBackgroundFetchDataOption = GetBackgroundFetchDataOption - >( - option: T - ): PromisifySuccessResult<T, GetBackgroundFetchDataOption> - /** [wx.getBackgroundFetchToken(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/background-fetch/wx.getBackgroundFetchToken.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:不支持 - * - * 获取设置过的自定义登录态。若无,则返回 fail。 */ - getBackgroundFetchToken< - T extends GetBackgroundFetchTokenOption = GetBackgroundFetchTokenOption - >( - option?: T - ): PromisifySuccessResult<T, GetBackgroundFetchTokenOption> - /** [wx.getBatteryInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/battery/wx.getBatteryInfo.html) - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 获取设备电池信息。同步 API [wx.getBatteryInfoSync](https://developers.weixin.qq.com/miniprogram/dev/api/device/battery/wx.getBatteryInfoSync.html) 在 iOS 上不可用。 */ - getBatteryInfo<T extends GetBatteryInfoOption = GetBatteryInfoOption>( - option?: T - ): PromisifySuccessResult<T, GetBatteryInfoOption> - /** [wx.getBeacons(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/ibeacon/wx.getBeacons.html) - * - * 需要基础库: `1.2.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 获取所有已搜索到的 Beacon 设备 */ - getBeacons<T extends GetBeaconsOption = GetBeaconsOption>( - option?: T - ): PromisifySuccessResult<T, GetBeaconsOption> - /** [wx.getBluetoothAdapterState(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.getBluetoothAdapterState.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 获取本机蓝牙适配器状态。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.getBluetoothAdapterState({ - success (res) { - console.log(res) - } -}) -``` */ - getBluetoothAdapterState< - T extends GetBluetoothAdapterStateOption = GetBluetoothAdapterStateOption - >( - option?: T - ): PromisifySuccessResult<T, GetBluetoothAdapterStateOption> - /** [wx.getBluetoothDevices(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.getBluetoothDevices.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 获取在蓝牙模块生效期间所有搜索到的蓝牙设备。包括已经和本机处于连接状态的设备。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* -* ```js -// ArrayBuffer转16进度字符串示例 -function ab2hex(buffer) { - var hexArr = Array.prototype.map.call( - new Uint8Array(buffer), - function(bit) { - return ('00' + bit.toString(16)).slice(-2) - } - ) - return hexArr.join(''); -} -wx.getBluetoothDevices({ - success: function (res) { - console.log(res) - if (res.devices[0]) { - console.log(ab2hex(res.devices[0].advertisData)) - } - } -}) -``` -* -* **注意** -* -* - 该接口获取到的设备列表为**蓝牙模块生效期间所有搜索到的蓝牙设备**,若在蓝牙模块使用流程结束后未及时调用 [wx.closeBluetoothAdapter](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.closeBluetoothAdapter.html) 释放资源,会存在调用该接口会返回之前的蓝牙使用流程中搜索到的蓝牙设备,可能设备已经不在用户身边,无法连接。 */ - getBluetoothDevices< - T extends GetBluetoothDevicesOption = GetBluetoothDevicesOption - >( - option?: T - ): PromisifySuccessResult<T, GetBluetoothDevicesOption> - /** [wx.getChannelsLiveInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/channels/wx.getChannelsLiveInfo.html) - * - * 需要基础库: `2.15.0` - * - * 在插件中使用:不支持 - * - * 获取视频号直播信息 */ - getChannelsLiveInfo(option: GetChannelsLiveInfoOption): void - /** [wx.getChannelsLiveNoticeInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/channels/wx.getChannelsLiveNoticeInfo.html) - * - * 需要基础库: `2.19.0` - * - * 在插件中使用:不支持 - * - * 获取视频号直播预告信息 */ - getChannelsLiveNoticeInfo(option: GetChannelsLiveNoticeInfoOption): void - /** [wx.getChannelsShareKey(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/channels/wx.getChannelsShareKey.html) - * - * 需要基础库: `2.22.1` - * - * 在插件中使用:不支持 - * - * 获取视频号直播卡片/视频卡片的分享来源,仅当卡片携带了分享信息、同时用户已授权该小程序获取视频号分享信息且启动场景值为 1177、1184、1195、1208 时可用。 */ - getChannelsShareKey(option?: GetChannelsShareKeyOption): void - /** [wx.getClipboardData(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/clipboard/wx.getClipboardData.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 获取系统剪贴板的内容 -* -* **示例代码** -* -* ```js -wx.getClipboardData({ - success (res){ - console.log(res.data) - } -}) -``` */ - getClipboardData< - T extends GetClipboardDataOption = GetClipboardDataOption - >( - option?: T - ): PromisifySuccessResult<T, GetClipboardDataOption> - /** [wx.getCommonConfig(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/data-analysis/wx.getCommonConfig.html) -* -* 需要基础库: `2.33.0` -* -* 在插件中使用:不支持 -* -* 给定实验参数数组,获取对应的实验参数值。 -* -* **示例代码** -* -* ```js - wx.getCommonConfig({ - keys:["key1", "key2"], - mode: 0, - success: (res)=>{ - console.log("success") - console.log(res) - }, - fail: (res)=>{ - console.log("fail") - console.log(res) - }}) -``` */ - getCommonConfig(option: GetCommonConfigOption): void - /** [wx.getConnectedBluetoothDevices(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.getConnectedBluetoothDevices.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 根据主服务 UUID 获取已连接的蓝牙设备。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.getConnectedBluetoothDevices({ - services: ['FEE7'], - success (res) { - console.log(res) - } -}) -``` */ - getConnectedBluetoothDevices< - T extends GetConnectedBluetoothDevicesOption = GetConnectedBluetoothDevicesOption - >( - option: T - ): PromisifySuccessResult<T, GetConnectedBluetoothDevicesOption> - /** [wx.getConnectedWifi(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.getConnectedWifi.html) - * - * 需要基础库: `1.6.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 获取已连接中的 Wi-Fi 信息。 */ - getConnectedWifi< - T extends GetConnectedWifiOption = GetConnectedWifiOption - >( - option: T - ): PromisifySuccessResult<T, GetConnectedWifiOption> - /** [wx.getDeviceBenchmarkInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getDeviceBenchmarkInfo.html) -* -* 需要基础库: `3.4.5` -* -* 在插件中使用:不支持 -* -* 获取设备性能得分和机型档位数据 -* -* **示例代码** -* -* ```js -wx.getDeviceBenchmarkInfo({ - success (res) { - console.log(res.benchmarkLevel) - console.log(res.modelLevel) - } -}) -``` */ - getDeviceBenchmarkInfo(option?: GetDeviceBenchmarkInfoOption): void - /** [wx.getDeviceVoIPList(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/device-voip/wx.getDeviceVoIPList.html) -* -* 需要基础库: `2.30.3` -* -* 在插件中使用:不支持 -* -* 查询当前用户授权的音视频通话设备(组)信息 -* -* **示例代码** -* -* ```js -wx.getDeviceVoIPList({ - success(res) { - console.log(res) - }, - fail(res) { - console.log(res) - } -}) -``` */ - getDeviceVoIPList(option?: GetDeviceVoIPListOption): void - /** [wx.getExtConfig(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ext/wx.getExtConfig.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:不支持 -* -* 获取[第三方平台](https://developers.weixin.qq.com/miniprogram/dev/devtools/ext.html)自定义的数据字段。 -* -* **Tips** -* -* 1. 本接口暂时无法通过 [wx.canIUse](https://developers.weixin.qq.com/miniprogram/dev/api/base/wx.canIUse.html) 判断是否兼容,开发者需要自行判断 [wx.getExtConfig](https://developers.weixin.qq.com/miniprogram/dev/api/ext/wx.getExtConfig.html) 是否存在来兼容 -* -* **** -* -* ```js -if (wx.getExtConfig) { - wx.getExtConfig({ - success (res) { - console.log(res.extConfig) - } - }) -} -``` */ - getExtConfig<T extends GetExtConfigOption = GetExtConfigOption>( - option?: T - ): PromisifySuccessResult<T, GetExtConfigOption> - /** [wx.getFuzzyLocation(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.getFuzzyLocation.html) -* -* 需要基础库: `2.25.0` -* -* 在插件中使用:支持 -* -* 获取当前的模糊地理位置。 -* ## 使用方法 -* 自 2022 年 7 月 14 日后发布的小程序,若使用该接口,需要在 app.json 中进行声明,否则将无法正常使用该接口,2022年7月14日前发布的小程序不受影响。[具体规则见公告](https://developers.weixin.qq.com/community/develop/doc/000a02f2c5026891650e7f40351c01) -* ## 申请开通 -* 暂只针对具备与地理位置强相关的使用场景的小程序开放,在小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通该接口权限。 从2022年7月14日开始在代码审核环节将检测该接口是否已完成开通,如未开通,将在代码提审环节进行拦截。 -* -* **示例代码** -* -* ```js - wx.getFuzzyLocation({ - type: 'wgs84', - success (res) { - const latitude = res.latitude - const longitude = res.longitude - } -}) - ``` */ - getFuzzyLocation(option: GetFuzzyLocationOption): void - /** [wx.getGroupEnterInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/group/wx.getGroupEnterInfo.html) -* -* 需要基础库: `2.10.4` -* -* 在插件中使用:不支持 -* -* 获取微信群聊场景下的小程序启动信息。群聊场景包括群聊小程序消息卡片、群待办、群工具。可用于获取当前群的 opengid。 -* ## 注意事项 -* - 基础库 v2.10.4 开始支持获取群工具小程序启动信息 -* - 基础库 v2.17.3 开始支持获取群聊小程序消息卡片、群待办小程序启动信息 -* -* **示例代码** -* -* ```js -wx.getGroupEnterInfo({ - success(res) { - // res - { - errMsg: 'getGroupEnterInfo:ok', - encryptedData: '', - iv: '' - } - }, - fail() { - - } -}) -``` -* -* 敏感数据有两种获取方式,一是使用 [加密数据解密算法](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#加密数据解密算法) 。 -* 获取得到的开放数据为以下 json 结构(其中 opengid 为当前群的唯一标识): -* -* ```json -{ - "opengid": "OPENGID" -} -``` -* -* **Tips** -* -* - 如需要展示群名称,小程序可以使用[开放数据组件](https://developers.weixin.qq.com/miniprogram/dev/component/open-data.html) -* - 小游戏可以通过 `wx.getGroupInfo` 接口获取群名称 */ - getGroupEnterInfo(option: GetGroupEnterInfoOption): void - /** [wx.getHCEState(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc-hce/wx.getHCEState.html) -* -* 需要基础库: `1.7.0` -* -* 在插件中使用:需要基础库 `2.1.0` -* -* 判断当前设备是否支持 HCE 能力。 -* -* **示例代码** -* -* ```js -wx.getHCEState({ - success (res) { - console.log(res.errCode) - } -}) -``` */ - getHCEState<T extends GetHCEStateOption = GetHCEStateOption>( - option?: T - ): PromisifySuccessResult<T, GetHCEStateOption> - /** [wx.getImageInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.getImageInfo.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 获取图片信息。网络图片需先配置download域名才能生效。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/Kd47Sbmr6yYu) -* -* ```js -wx.getImageInfo({ - src: 'images/a.jpg', - success (res) { - console.log(res.width) - console.log(res.height) - } -}) - -wx.chooseImage({ - success (res) { - wx.getImageInfo({ - src: res.tempFilePaths[0], - success (res) { - console.log(res.width) - console.log(res.height) - } - }) - } -}) -``` */ - getImageInfo<T extends GetImageInfoOption = GetImageInfoOption>( - option: T - ): PromisifySuccessResult<T, GetImageInfoOption> - /** [wx.getInferenceEnvInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/inference/wx.getInferenceEnvInfo.html) -* -* 需要基础库: `2.30.1` -* -* 在插件中使用:需要基础库 `2.30.1` -* -* 获取通用AI推理引擎版本。使用前可参考[AI指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/inference/tutorial.html) -* -* **示例代码** -* -* ```js -// 获取通用AI推理引擎版本 -wx.getInferenceEnvInfo({ - complete: (res) => { - console.log(res.ver) - console.log(res.errMsg) - }, -}) -``` */ - getInferenceEnvInfo(option?: GetInferenceEnvInfoOption): void - /** [wx.getLocalIPAddress(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/network/wx.getLocalIPAddress.html) -* -* 需要基础库: `2.20.1` -* -* 在插件中使用:需要基础库 `2.21.3` -* -* 获取局域网IP地址 -* -* **示例代码** -* -* ```js -wx.getLocalIPAddress({ - success (res) { - const localip = res.localip - } -}) -``` */ - getLocalIPAddress(option: GetLocalIPAddressOption): void - /** [wx.getLocation(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.getLocation.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 获取当前的地理位置、速度。当用户离开小程序后,此接口无法调用。开启高精度定位,接口耗时会增加,可指定 highAccuracyExpireTime 作为超时时间。地图相关使用的坐标格式应为 gcj02。 -* 高频率调用会导致耗电,如有需要可使用持续定位接口 `wx.onLocationChange`。 -* 基础库 `2.17.0` 版本起 `wx.getLocation` 增加调用频率限制,[相关公告](https://developers.weixin.qq.com/community/develop/doc/000aee91a98d206bc6dbe722b51801)。 -* -* ## 使用方法 -* 自 2022 年 7 月 14 日后发布的小程序,若使用该接口,需要在 app.json 中进行声明,否则将无法正常使用该接口,2022年7月14日前发布的小程序不受影响。[具体规则见公告](https://developers.weixin.qq.com/community/develop/doc/000a02f2c5026891650e7f40351c01) -* -* ## 申请开通 -* 暂只针对如下类目的小程序开放,需要先通过类目审核,再在小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通该接口权限。 -* 接口权限申请入口将于2022年3月11日开始内测,于3月31日全量上线。并从4月18日开始,在代码审核环节将检测该接口是否已完成开通,如未开通,将在代码提审环节进行拦截。 -* -* ### 国内主体开放类目 -* -* | 一级类目/主体类型 | 二级类目 | 应用场景 | -* | -------------- | -------| -------- | -* | 电商平台 | / | 售卖商品线下发货、线下收货服务 | -* | 商家自营 | / | 提供售卖商品线下发货、线下收货服务、线下商超导览、导航服务 | -* | 医疗服务 | 公立医疗机构、三级私立医疗机构、其他私立医疗机构、就医服务、其他医学健康服务、药品(非处方药)销售、非处方药销售平台、医疗器械生产企业、医疗器械自营、医疗器械经营销售平台、互联网医院血液、干细胞服务、临床试验 | 1、实际物品/药品接收服务 2、基于地理位置取号并现场报到、附近医院导航等服务 | -* | 交通服务 | / | 代驾服务、租车网点导航等相关服务 | -* | 生活服务 | / | 上门服务作业等线下场景 | -* | 物流服务 | 收件/派件、查件、邮政、装卸搬运、快递柜、货物运输 | 快递/货物收发服务 | -* | 餐饮服务 | 点餐平台、外卖平台、餐饮服务场所/餐饮服务管理企业 | 线下送餐服务 | -* | 工具 | 天气、信息查询、办公、设备管理 | 与地理位置相关的服务,比如潮汐查询、海拔查询、天气查询、智能穿戴、智能门禁、与地理位置相关的打卡服务等 | -* | 金融 | 银行、非金融机构自营小额贷款/融资担保/商业保理、保险 | 提供线下网点预约、基于地理位置取号并现场报到、附近网点导航等服务 | -* | 旅游 | 景区服务、住宿服务 | 提供景区导航、导览服务、酒店导航服务 | -* | 汽车服务 | 维修保养、汽车用品、汽车经销商/4S店、汽车厂商、汽车预售、二手车 | 提供汽车售卖、维保洗美服务、查找附近的维修点/洗车网点等导航服务 | -* | IT科技 | 基础电信运营商、电信业务代理商 | 提供运营商线下网点的预约、基于地理位置取号并现场报到、网点导航等服务 | -* | 房地产服务 | 物业管理、房屋中介、房屋装修 | 提供房地产开发商及物业公司门店导览导航服务 | -* | 政务民生 | / | 提供政务单位相关业务 | -* | 政府主体账号 | / | 提供政务单位相关业务 | -* -* ### 海外主体开放类目 -* -* | 一级类目/主体类型 | 二级类目 | 应用场景 | -* | -------------- | -------| -------- | -* | 出行与交通 | / | 代驾服务、租车网点导航等相关服务 | -* | 快递业与邮政 | / | 快递/货物收发服务 | -* | 餐饮 | / | 线下送餐服务 | -* | 电商平台 | / | 售卖商品线下发货、线下收货服务 | -* | 出行与交通 | / | 代驾服务、租车网点导航等相关服务 | -* | 跨境电商 | / | 提供售卖商品线下发货、收货服务、线下商超导览、导航服务 | -* | 本地服务 | 服装/鞋/箱包、玩具、家电/数码/手机、美妆/洗护、珠宝/饰品/眼镜/钟表、运动/户外/乐器、鲜花/园艺/工艺品、家居/家饰/家纺、办公/文具、机械/电子器件、酒、食品、百货、超市/便利店、宠物食品/用品 | 提供售卖商品线下发货、线下收货服务、线下商超导览、导航服务 | -* | 生活服务 | 家政、外送 | 上门服务作业等线下场景 | -* -* **示例代码** -* -* ```js - wx.getLocation({ - type: 'wgs84', - success (res) { - const latitude = res.latitude - const longitude = res.longitude - const speed = res.speed - const accuracy = res.accuracy - } -}) - ``` -* -* **注意** -* -* - `2.17.0 起 `wx.getLocation` 增加调用频率限制,[相关公告](https://developers.weixin.qq.com/community/develop/doc/000aee91a98d206bc6dbe722b51801) -* - 工具中定位模拟使用IP定位,可能会有一定误差。且工具目前仅支持 gcj02 坐标。 -* - 使用第三方服务进行逆地址解析时,请确认第三方服务默认的坐标系,正确进行坐标转换。 */ - getLocation<T extends GetLocationOption = GetLocationOption>( - option: T - ): PromisifySuccessResult<T, GetLocationOption> - /** [wx.getNetworkType(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/network/wx.getNetworkType.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 获取网络类型 -* -* **示例代码** -* -* ```js -wx.getNetworkType({ - success (res) { - const networkType = res.networkType - const weakNet = res.weakNet - } -}) -``` */ - getNetworkType<T extends GetNetworkTypeOption = GetNetworkTypeOption>( - option?: T - ): PromisifySuccessResult<T, GetNetworkTypeOption> - /** [wx.getPrivacySetting(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/privacy/wx.getPrivacySetting.html) -* -* 需要基础库: `2.32.3` -* -* 在插件中使用:不支持 -* -* 查询隐私授权情况。隐私合规开发指南详情可见[《小程序隐私协议开发指南》](https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html) -* -* **** -* -* ## 具体说明: -* -* 1. 一定要调用 wx.getPrivacySetting 接口吗? -* -* - 不是,wx.getPrivacySetting 只是一个辅助接口,可以根据实际情况选择使用。 -* -* **示例代码** -* -* ```html -* // page.wxml -* <view wx:if="{{showPrivacy}}"> -* <view>隐私弹窗内容....</view> -* <button id="agree-btn" open-type="agreePrivacyAuthorization" bindagreeprivacyauthorization="handleAgreePrivacyAuthorization">同意</button> -* </view> -* ``` -* ```js -Page({ - data: { - showPrivacy: false - }, - onLoad() { - wx.getPrivacySetting({ - success: res => { - console.log(res) // 返回结果为: res = { needAuthorization: true/false, privacyContractName: '《xxx隐私保护指引》' } - if (res.needAuthorization) { - // 需要弹出隐私协议 - this.setData({ - showPrivacy: true - }) - } else { - // 用户已经同意过隐私协议,所以不需要再弹出隐私协议,也能调用隐私接口 - } - }, - fail: () => {}, - complete: () => {} - }) - }, - handleAgreePrivacyAuthorization() { - // 用户同意隐私协议事件回调 - // 用户点击了同意,之后所有隐私接口和组件都可以调用了 - // wx.getUserProfile() - // wx.chooseMedia() - // wx.getClipboardData() - // wx.startRecord() - } -}) -``` -* -* **完整示例demo** -* -* demo1: 演示使用 `wx.getPrivacySetting` 和 `<button open-type="agreePrivacyAuthorization">` 在首页处理隐私弹窗逻辑 -* [https://developers.weixin.qq.com/s/gi71sGm67hK0](https://developers.weixin.qq.com/s/gi71sGm67hK0) -* -* demo2: 演示使用 `wx.onNeedPrivacyAuthorization` 和 `<button open-type="agreePrivacyAuthorization">` 在多个页面处理隐私弹窗逻辑,同时演示了如何处理多个隐私接口同时调用。 -* [https://developers.weixin.qq.com/s/hndZUOmA7gKn](https://developers.weixin.qq.com/s/hndZUOmA7gKn) -* -* demo3: 演示 `wx.onNeedPrivacyAuthorization`、`wx.requirePrivacyAuthorize`、`<button open-type="agreePrivacyAuthorization">` 和 `<input type="nickname">` 组件如何结合使用 -* [https://developers.weixin.qq.com/s/jX7xWGmA7UKa](https://developers.weixin.qq.com/s/jX7xWGmA7UKa) -* -* demo4: 演示使用 `wx.onNeedPrivacyAuthorization` 和 `<button open-type="agreePrivacyAuthorization">` 在多个 tabBar 页面处理隐私弹窗逻辑。 -* [https://developers.weixin.qq.com/s/g6BWZGmt7XK9](https://developers.weixin.qq.com/s/g6BWZGmt7XK9) */ - getPrivacySetting(option: GetPrivacySettingOption): void - /** [wx.getRandomValues(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/crypto/wx.getRandomValues.html) -* -* 需要基础库: `2.15.0` -* -* 在插件中使用:不支持 -* -* 获取密码学安全随机数 -* -* **示例代码** -* -* ```js -wx.getRandomValues({ - length: 6 // 生成 6 个字节长度的随机数, - success: res => { - console.log(wx.arrayBufferToBase64(res.randomValues)) // 转换为 base64 字符串后打印 - } -}) -``` */ - getRandomValues< - T extends GetRandomValuesOption = GetRandomValuesOption - >( - option: T - ): PromisifySuccessResult<T, GetRandomValuesOption> - /** [wx.getScreenBrightness(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/screen/wx.getScreenBrightness.html) - * - * 需要基础库: `1.2.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 获取屏幕亮度 - * - * **说明** - * - * - 若安卓系统设置中开启了自动调节亮度功能,则屏幕亮度会根据光线自动调整,该接口仅能获取自动调节亮度之前的值,而非实时的亮度值。 */ - getScreenBrightness< - T extends GetScreenBrightnessOption = GetScreenBrightnessOption - >( - option?: T - ): PromisifySuccessResult<T, GetScreenBrightnessOption> - /** [wx.getScreenRecordingState(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/screen/wx.getScreenRecordingState.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 查询用户是否在录屏。 - * - * **示例代码** - * - * ```js - * wx.getScreenRecordingState({ - * success: function (res) { - * console.log(res.state) - * }, - * }) */ - getScreenRecordingState(option?: GetScreenRecordingStateOption): void - /** [wx.getSelectedTextRange(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/keyboard/wx.getSelectedTextRange.html) -* -* 需要基础库: `2.7.0` -* -* 在插件中使用:不支持 -* -* 在input、textarea等focus之后,获取输入框的光标位置。注意:只有在focus的时候调用此接口才有效。 -* -* **示例代码** -* -* ```js -wx.getSelectedTextRange({ - complete: res => { - console.log('getSelectedTextRange res', res.start, res.end) - } -}) -``` */ - getSelectedTextRange< - T extends GetSelectedTextRangeOption = GetSelectedTextRangeOption - >( - option?: T - ): PromisifySuccessResult<T, GetSelectedTextRangeOption> - /** [wx.getSetting(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/wx.getSetting.html) -* -* 需要基础库: `1.2.0` -* -* 在插件中使用:需要基础库 `2.6.3` -* -* 在插件中使用时,接口有以下不同: -* - `withSubscriptions` 无效(插件暂无订阅消息) -* - 返回值中的 `authSetting` 字段中是插件的权限(如用户信息功能页授权) -* - [2.14.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起返回值中有 `miniprogramAuthSetting` 字段,内容等于当前小程序 `getSetting` 的结果(不含订阅状态) -* -* 获取用户的当前设置。**返回值中只会出现小程序已经向用户请求过的[权限](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html)**。 -* -* **示例代码** -* -* ```js -wx.getSetting({ - success (res) { - console.log(res.authSetting) - // res.authSetting = { - // "scope.userInfo": true, - // "scope.userLocation": true - // } - } -}) -``` -* -* ```js -wx.getSetting({ - withSubscriptions: true, - success (res) { - console.log(res.authSetting) - // res.authSetting = { - // "scope.userInfo": true, - // "scope.userLocation": true - // } - console.log(res.subscriptionsSetting) - // res.subscriptionsSetting = { - // mainSwitch: true, // 订阅消息总开关 - // itemSettings: { // 每一项开关 - // SYS_MSG_TYPE_INTERACTIVE: 'accept', // 小游戏系统订阅消息 - // SYS_MSG_TYPE_RANK: 'accept' - // zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: 'reject', // 普通一次性订阅消息 - // ke_OZC_66gZxALLcsuI7ilCJSP2OJ2vWo2ooUPpkWrw: 'ban', - // } - // } - } -}) -``` */ - getSetting<T extends GetSettingOption = GetSettingOption>( - option?: T - ): PromisifySuccessResult<T, GetSettingOption> - /** [wx.getShareInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/share/wx.getShareInfo.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `2.1.0` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 获取转发详细信息(主要是获取群ID)。 从群聊内的小程序消息卡片打开小程序时,调用此接口才有效。从基础库 v2.17.3 开始,推荐用 [wx.getGroupEnterInfo](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/group/wx.getGroupEnterInfo.html) 替代此接口。 -* -* **示例代码** -* -* 敏感数据获取方式 [加密数据解密算法](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#加密数据解密算法) 。 -* 获取得到的开放数据为以下 json 结构(其中 openGId 为当前群的唯一标识): -* -* ```json -{ - "openGId": "OPENGID" -} -``` -* -* **Tips** -* -* - 如需要展示群名称,小程序可以使用 [开放数据组件](https://developers.weixin.qq.com/miniprogram/dev/component/open-data.html) -* - 小游戏可以通过 [`wx.getGroupInfo`](#) 接口获取群名称 */ - getShareInfo<T extends GetShareInfoOption = GetShareInfoOption>( - option: T - ): PromisifySuccessResult<T, GetShareInfoOption> - /** [wx.getSkylineInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSkylineInfo.html) - * - * 需要基础库: `2.26.2` - * - * 在插件中使用:需要基础库 `2.26.2` - * - * 获取当前运行环境对于 [Skyline 渲染引擎](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html) 的支持情况 */ - getSkylineInfo(option?: GetSkylineInfoOption): void - /** [wx.getStorage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.getStorage.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 从本地缓存中异步获取指定 key 的内容。 -* -* **示例代码** -* -* ```js -wx.getStorage({ - key: 'key', - success (res) { - console.log(res.data) - } -}) -``` -* -* ```js -// 开启加密存储 -wx.setStorage({ - key: "key", - data: "value", - encrypt: true, // 若开启加密存储,setStorage 和 getStorage 需要同时声明 encrypt 的值为 true - success() { - wx.getStorage({ - key: "key", - encrypt: true, // 若开启加密存储,setStorage 和 getStorage 需要同时声明 encrypt 的值为 true - success(res) { - console.log(res.data) - } - }) - } -}) -``` */ - getStorage< - T = any, - U extends GetStorageOption<T> = GetStorageOption<T> - >( - option: U - ): PromisifySuccessResult<U, GetStorageOption<T>> - /** [wx.getStorageInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.getStorageInfo.html) -* -* 在插件中使用:不支持 -* -* 异步获取当前storage的相关信息。 -* -* **示例代码** -* -* ```js -wx.getStorageInfo({ - success (res) { - console.log(res.keys) - console.log(res.currentSize) - console.log(res.limitSize) - } -}) -``` -* -* ```js -try { - const res = wx.getStorageInfoSync() - console.log(res.keys) - console.log(res.currentSize) - console.log(res.limitSize) -} catch (e) { - // Do something when catch error -} -``` */ - getStorageInfo<T extends GetStorageInfoOption = GetStorageInfoOption>( - option?: T - ): PromisifySuccessResult<T, GetStorageInfoOption> - /** [wx.getSystemInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemInfo.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [2.20.1](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getSystemSetting](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemSetting.html)、[wx.getAppAuthorizeSetting](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getAppAuthorizeSetting.html)、[wx.getDeviceInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getDeviceInfo.html)、[wx.getWindowInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getWindowInfo.html)、[wx.getAppBaseInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getAppBaseInfo.html) 替换 -* -* 获取系统信息。**由于历史原因,wx.getSystemInfo 是异步的调用格式,但是是同步返回,需要异步获取系统信息请使用 [wx.getSystemInfoAsync](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemInfoAsync.html)。** -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/WkUCgXmS7mqO) -* -* ```js -wx.getSystemInfo({ - success (res) { - console.log(res.model) - console.log(res.pixelRatio) - console.log(res.windowWidth) - console.log(res.windowHeight) - console.log(res.language) - console.log(res.version) - console.log(res.platform) - } -}) -``` -* -* ```js -try { - const res = wx.getSystemInfoSync() - console.log(res.model) - console.log(res.pixelRatio) - console.log(res.windowWidth) - console.log(res.windowHeight) - console.log(res.language) - console.log(res.version) - console.log(res.platform) -} catch (e) { - // Do something when catch error -} -``` -* -* **** -* -* ## 注意事项 -* - 当 wx.getSystemInfoSync() 接口发生错误时可能会返回空对象 -* - wx.getSystemInfo 接口由于会获取系统权限,可能触发授权弹窗,请使用 [wx.getSystemSetting](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemSetting.html)、[wx.getAppAuthorizeSetting](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getAppAuthorizeSetting.html)、[wx.getDeviceInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getDeviceInfo.html)、[wx.getWindowInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getWindowInfo.html)、[wx.getAppBaseInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getAppBaseInfo.html) 替代 */ - getSystemInfo<T extends GetSystemInfoOption = GetSystemInfoOption>( - option?: T - ): PromisifySuccessResult<T, GetSystemInfoOption> - /** [wx.getSystemInfoAsync(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemInfoAsync.html) -* -* 需要基础库: `2.14.1` -* -* 在插件中使用:不支持 -* @deprecated 基础库版本 [2.20.1](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getSystemSetting](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemSetting.html)、[wx.getAppAuthorizeSetting](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getAppAuthorizeSetting.html)、[wx.getDeviceInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getDeviceInfo.html)、[wx.getWindowInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getWindowInfo.html)、[wx.getAppBaseInfo](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getAppBaseInfo.html) 替换 -* -* 异步获取系统信息。需要一定的微信客户端版本支持,在不支持的客户端上,会使用同步实现来返回。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/WkUCgXmS7mqO) -* -* ```js -wx.getSystemInfoAsync({ - success (res) { - console.log(res.model) - console.log(res.pixelRatio) - console.log(res.windowWidth) - console.log(res.windowHeight) - console.log(res.language) - console.log(res.version) - console.log(res.platform) - } -}) -``` */ - getSystemInfoAsync(option?: GetSystemInfoAsyncOption): void - /** [wx.getUserInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html) -* -* 在插件中使用:需要基础库 `2.3.1` -* -* 在插件中使用时,需要在用户信息功能页中获得用户授权或满足一定条件后调用。否则将返回 fail。详见 [用户信息功能页](https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/functional-pages/user-info.html) -* -* @warning **用户头像昵称获取规则已调整,参考 [用户信息接口调整说明](https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801)、[小程序用户头像昵称获取规则调整公告](https://developers.weixin.qq.com/community/develop/doc/00022c683e8a80b29bed2142b56c01)** -* -* 获取用户信息。 -* -* **示例代码** -* -* ```js -// 必须是在用户已经授权的情况下调用 -wx.getUserInfo({ - success: function(res) { - var userInfo = res.userInfo - var nickName = userInfo.nickName - var avatarUrl = userInfo.avatarUrl - var gender = userInfo.gender //性别 0:未知、1:男、2:女 - var province = userInfo.province - var city = userInfo.city - var country = userInfo.country - } -}) -``` -* -* 敏感数据有两种获取方式: -* 1. 使用 [加密数据解密算法](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#加密数据解密算法) -* 2. 使用 [云调用直接获取开放数据](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#云调用直接获取开放数据) -* 获取得到的开放数据为以下 json 结构: -* -* ```json -{ - "openId": "OPENID", - "nickName": "NICKNAME", - "gender": GENDER, - "city": "CITY", - "province": "PROVINCE", - "country": "COUNTRY", - "avatarUrl": "AVATARURL", - "unionId": "UNIONID", - "watermark": { - "appid":"APPID", - "timestamp":TIMESTAMP - } -} -``` -* -* **小程序用户信息组件示例代码** -* -* ```html -* <!-- 如果只是展示用户头像昵称,可以使用 <open-data /> 组件 --> -* <open-data type="userAvatarUrl"></open-data> -* <open-data type="userNickName"></open-data> -* <!-- 需要使用 button 来授权登录 --> -* <button wx:if="{{canIUse}}" open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">授权登录</button> -* <view wx:else>请升级微信版本</view> -* ``` -* -* ```js -Page({ - data: { - canIUse: wx.canIUse('button.open-type.getUserInfo') - }, - onLoad: function() { - // 查看是否授权 - wx.getSetting({ - success (res){ - if (res.authSetting['scope.userInfo']) { - // 已经授权,可以直接调用 getUserInfo 获取头像昵称 - wx.getUserInfo({ - success: function(res) { - console.log(res.userInfo) - } - }) - } - } - }) - }, - bindGetUserInfo (e) { - console.log(e.detail.userInfo) - } -}) -``` */ - getUserInfo<T extends GetUserInfoOption = GetUserInfoOption>( - option: T - ): PromisifySuccessResult<T, GetUserInfoOption> - /** [wx.getUserProfile(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html) -* -* 需要基础库: `2.10.4` -* -* 在插件中使用:不支持 -* -* @warning **用户头像昵称获取规则已调整,参考 [小程序用户头像昵称获取规则调整公告](https://developers.weixin.qq.com/community/develop/doc/00022c683e8a80b29bed2142b56c01)** -* -* 获取用户信息。页面产生点击事件(例如 `button` 上 `bindtap` 的回调中)后才可调用,每次请求都会弹出授权窗口,用户同意后返回 `userInfo`。该接口用于替换 `wx.getUserInfo`,详见 [用户信息接口调整说明](https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801?highLine=login)。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/tsJaq2mP7Mp4) -* -* **Bug & Tip** -* -* 1. `tip`:仅小程序中 `wx.getUserInfo` 接口进行调整,小游戏中不受影响; -* 2. `tip`:开发者工具中仅 2.10.4 及以上版本可访问 `wx.getUserProfile` 接口,在真机上可参考示例代码进行判断,无需根据版本号或者 `canIUse` 进行条件。 -* 3. `tip`:`wx.getUserProfile` 返回的加密数据中不包含 `openId` 和 `unionId` 字段。 -* 4. `bug`:开发者工具中 `2.10.4`~`2.16.1` 基础库版本通过 `<button open-type="getUserInfo">` 会返回真实数据,真机上此区间会按照公告返回匿名数据。 -* -* ```html -* <view class="container"> -* <view class="userinfo"> -* <block wx:if="{{!hasUserInfo}}"> -* <button wx:if="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 获取头像昵称 </button> -* <button wx:else open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button> -* </block> -* <block wx:else> -* <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image> -* <text class="userinfo-nickname">{{userInfo.nickName}}</text> -* </block> -* </view> -* </view> -* ``` -* -* ```js -Page({ - data: { - userInfo: {}, - hasUserInfo: false, - canIUseGetUserProfile: false, - }, - onLoad() { - if (wx.getUserProfile) { - this.setData({ - canIUseGetUserProfile: true - }) - } - }, - getUserProfile(e) { - // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认 - // 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗 - wx.getUserProfile({ - desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写 - success: (res) => { - this.setData({ - userInfo: res.userInfo, - hasUserInfo: true - }) - } - }) - }, - getUserInfo(e) { - // 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息 - this.setData({ - userInfo: e.detail.userInfo, - hasUserInfo: true - }) - }, -}) -``` */ - getUserProfile<T extends GetUserProfileOption = GetUserProfileOption>( - option: T - ): PromisifySuccessResult<T, GetUserProfileOption> - /** [wx.getVideoInfo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.getVideoInfo.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:支持 - * - * 获取视频详细信息。 */ - getVideoInfo<T extends GetVideoInfoOption = GetVideoInfoOption>( - option: T - ): PromisifySuccessResult<T, GetVideoInfoOption> - /** [wx.getWeRunData(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/werun/wx.getWeRunData.html) -* -* 需要基础库: `1.2.0` -* -* 在插件中使用:不支持 -* -* 获取用户过去三十一天微信运动步数。需要先调用 [wx.login](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html) 接口。步数信息会在用户主动进入小程序时更新。 -* -* **示例代码** -* -* ```js -wx.getWeRunData({ - success (res) { - // 拿 encryptedData 到开发者后台解密开放数据 - const encryptedData = res.encryptedData - // 或拿 cloudID 通过云调用直接获取开放数据 - const cloudID = res.cloudID - } -}) -``` -* -* **开放数据 JSON 结构** -* -* 敏感数据有两种获取方式,一是使用 [加密数据解密算法](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#加密数据解密算法) 。 -* 获取得到的开放数据为以下 json 结构: -* -* ```json -{ - "stepInfoList": [ - { - "timestamp": 1445866601, - "step": 100 - }, - { - "timestamp": 1445876601, - "step": 120 - } - ] -} -``` -* -* stepInfoList 中,每一项结构如下: -* -* | 属性 | 类型 | 说明 | -* | --- | ---- | --- | -* | timestamp | number | 时间戳,表示数据对应的时间 | -* | step | number | 微信运动步数 | */ - getWeRunData<T extends GetWeRunDataOption = GetWeRunDataOption>( - option?: T - ): PromisifySuccessResult<T, GetWeRunDataOption> - /** [wx.getWifiList(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.getWifiList.html) - * - * 需要基础库: `1.6.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 请求获取 Wi-Fi 列表。`wifiList` 数据会在 [onGetWifiList](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.onGetWifiList.html) 注册的回调中返回。 **Android 调用前需要 [用户授权](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html) scope.userLocation。** - * - * iOS 上将跳转到系统设置中的微信设置页,需要用户手动进入「无线局域网」设置页,并在系统扫描到设备后,小程序才能收到 onGetWifiList 回调。Android 不会跳转。 - * - * **注意** - * - * 因系统问题,本方法在 iOS 11.0 及 11.1 两个版本失效。但在 iOS 11.2 中已修复。 */ - getWifiList<T extends GetWifiListOption = GetWifiListOption>( - option?: T - ): PromisifySuccessResult<T, GetWifiListOption> - /** [wx.hideHomeButton(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/navigation-bar/wx.hideHomeButton.html) - * - * 需要基础库: `2.8.3` - * - * 在插件中使用:不支持 - * - * 隐藏返回首页按钮。微信7.0.7版本起,当用户打开的小程序最底层页面是非首页时,默认展示“返回首页”按钮,开发者可在页面 onShow 中调用 hideHomeButton 进行隐藏。 */ - hideHomeButton<T extends HideHomeButtonOption = HideHomeButtonOption>( - option?: T - ): PromisifySuccessResult<T, HideHomeButtonOption> - /** [wx.hideKeyboard(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/keyboard/wx.hideKeyboard.html) -* -* 需要基础库: `2.8.2` -* -* 在插件中使用:不支持 -* -* 在input、textarea等focus拉起键盘之后,手动调用此接口收起键盘 -* -* **示例代码** -* -* ```js -wx.hideKeyboard({ - complete: res => { - console.log('hideKeyboard res', res) - } -}) -``` */ - hideKeyboard<T extends HideKeyboardOption = HideKeyboardOption>( - option?: T - ): PromisifySuccessResult<T, HideKeyboardOption> - /** [wx.hideLoading(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.hideLoading.html) - * - * 需要基础库: `1.1.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 隐藏 loading 提示框 */ - hideLoading<T extends HideLoadingOption = HideLoadingOption>( - option?: T - ): PromisifySuccessResult<T, HideLoadingOption> - /** [wx.hideNavigationBarLoading(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/navigation-bar/wx.hideNavigationBarLoading.html) - * - * 在插件中使用:需要基础库 `2.1.0` - * - * 在插件中使用时,只能在当前插件的页面中调用 - * - * 在当前页面隐藏导航条加载动画 */ - hideNavigationBarLoading< - T extends HideNavigationBarLoadingOption = HideNavigationBarLoadingOption - >( - option?: T - ): PromisifySuccessResult<T, HideNavigationBarLoadingOption> - /** [wx.hideShareMenu(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/share/wx.hideShareMenu.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `2.1.0` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 隐藏当前页面的转发按钮 -* -* **** -* -* ## 注意事项 -* - "shareAppMessage"表示“发送给朋友”按钮,"shareTimeline"表示“分享到朋友圈”按钮 -* - 隐藏“发送给朋友”按钮时必须同时隐藏“分享到朋友圈”按钮,隐藏“分享到朋友圈”按钮时则允许不隐藏“发送给朋友”按钮 -* -* **示例代码** -* -* ```js -wx.hideShareMenu({ - menus: ['shareAppMessage', 'shareTimeline'] -}) -``` */ - hideShareMenu<T extends HideShareMenuOption = HideShareMenuOption>( - option?: T - ): PromisifySuccessResult<T, HideShareMenuOption> - /** [wx.hideTabBar(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/tab-bar/wx.hideTabBar.html) - * - * 需要基础库: `1.9.0` - * - * 在插件中使用:不支持 - * - * 隐藏 tabBar */ - hideTabBar<T extends HideTabBarOption = HideTabBarOption>( - option: T - ): PromisifySuccessResult<T, HideTabBarOption> - /** [wx.hideTabBarRedDot(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/tab-bar/wx.hideTabBarRedDot.html) - * - * 需要基础库: `1.9.0` - * - * 在插件中使用:不支持 - * - * 隐藏 tabBar 某一项的右上角的红点 */ - hideTabBarRedDot< - T extends HideTabBarRedDotOption = HideTabBarRedDotOption - >( - option: T - ): PromisifySuccessResult<T, HideTabBarRedDotOption> - /** [wx.hideToast(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.hideToast.html) - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 隐藏消息提示框 */ - hideToast<T extends HideToastOption = HideToastOption>( - option?: T - ): PromisifySuccessResult<T, HideToastOption> - /** [wx.initFaceDetect(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/face/wx.initFaceDetect.html) - * - * 需要基础库: `2.18.0` - * - * 在插件中使用:需要基础库 `2.21.3` - * - * @warning **该接口已停止维护,推荐使用 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 代替** - * - * 初始化人脸检测。本接口不再维护,请使用 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 接口代替。详情参考[人脸检测指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/face.html) - * - * **** - * - * ### 特别说明 - * 若小程序人脸识别功能涉及采集、存储用户生物特征(如人脸照片或视频、身份证和手持身份证、身份证照和免冠照等),此类型服务需使用[微信原生人脸识别接口](https://developers.weixin.qq.com/community/develop/doc/000442d352c1202bd498ecb105c00d?highline=%E4%BA%BA%E8%84%B8%E6%A0%B8%E8%BA%AB)。 */ - initFaceDetect(option?: InitFaceDetectOption): void - /** [wx.isBluetoothDevicePaired(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.isBluetoothDevicePaired.html) - * - * 需要基础库: `2.20.1` - * - * 在插件中使用:需要基础库 `2.19.1` - * - * 查询蓝牙设备是否配对,仅安卓支持。 */ - isBluetoothDevicePaired< - T extends IsBluetoothDevicePairedOption = IsBluetoothDevicePairedOption - >( - option: T - ): PromisifySuccessResult<T, IsBluetoothDevicePairedOption> - /** [wx.join1v1Chat(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.join1v1Chat.html) - * - * 需要基础库: `2.20.1` - * - * 在插件中使用:不支持 - * - * 加入(创建)双人通话。 */ - join1v1Chat(option: Join1v1ChatOption): void - /** [wx.joinVoIPChat(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.joinVoIPChat.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:需要基础库 `2.9.0` - * - * 加入 (创建) 实时语音通话,更多信息可见 [实时语音指南](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/voip-chat.html)。调用前需要用户授权 `scope.record`,若房间类型为视频房间需要用户授权 `scope.camera`。 */ - joinVoIPChat<T extends JoinVoIPChatOption = JoinVoIPChatOption>( - option: T - ): PromisifySuccessResult<T, JoinVoIPChatOption> - /** [wx.loadFontFace(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/font/wx.loadFontFace.html) -* -* 需要基础库: `2.1.0` -* -* 在插件中使用:需要基础库 `2.15.0` -* -* 动态加载网络字体,文件地址需为下载类型。[2.10.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)起支持全局生效,需在 `app.js` 中调用。 -* -* 注意: -* 1. 字体文件返回的 content-type 参考 [font](https://www.iana.org/assignments/media-types/media-types.xhtml#font),格式不正确时会解析失败。 -* 2. 字体链接必须是https(ios不支持http) -* 3. 字体链接必须是同源下的,或开启了cors支持,小程序的域名是`servicewechat.com` -* 4. 工具里提示 Faild to load font可以忽略 -* 5. [2.10.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 以前仅在调用页面生效。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/b6Zrajm67R2x) -* ```js -wx.loadFontFace({ - family: 'Bitstream Vera Serif Bold', - source: 'url("https://res.wx.qq.com/t/wx_fed/base/weixin_portal/res/static/font/33uDySX.ttf")', - success: console.log -}) -``` */ - loadFontFace<T extends LoadFontFaceOption = LoadFontFaceOption>( - option: T - ): PromisifySuccessResult<T, LoadFontFaceOption> - /** [wx.login(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html) -* -* 在插件中使用:需要基础库 `2.3.1` -* -* 在插件中使用时,需要在用户信息功能页中获得用户授权或满足一定条件后调用。否则将返回 fail。详见 [用户信息功能页](https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/functional-pages/user-info.html) -* -* 调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台账号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台账号)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。 -* -* **示例代码** -* -* ```js -wx.login({ - success (res) { - if (res.code) { - //发起网络请求 - wx.request({ - url: 'https://example.com/onLogin', - data: { - code: res.code - } - }) - } else { - console.log('登录失败!' + res.errMsg) - } - } -}) -``` */ - login<T extends LoginOption = LoginOption>( - option?: T - ): PromisifySuccessResult<T, LoginOption> - /** [wx.makeBluetoothPair(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.makeBluetoothPair.html) - * - * 需要基础库: `2.12.0` - * - * 在插件中使用:需要基础库 `2.12.0` - * - * 蓝牙配对接口,仅安卓支持。 - * - * 通常情况下(需要指定 `pin` 码或者密码时)系统会接管配对流程,直接调用 [wx.createBLEConnection](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.createBLEConnection.html) 即可。该接口只应当在开发者不想让用户手动输入 `pin` 码且真机验证确认可以正常生效情况下用。 */ - makeBluetoothPair< - T extends MakeBluetoothPairOption = MakeBluetoothPairOption - >( - option: T - ): PromisifySuccessResult<T, MakeBluetoothPairOption> - /** [wx.makePhoneCall(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/phone/wx.makePhoneCall.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 拨打电话 -* -* **示例代码** -* -* ```js -wx.makePhoneCall({ - phoneNumber: '1340000' //仅为示例,并非真实的电话号码 -}) -``` */ - makePhoneCall<T extends MakePhoneCallOption = MakePhoneCallOption>( - option: T - ): PromisifySuccessResult<T, MakePhoneCallOption> - /** [wx.navigateBack(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateBack.html) - * - * 在插件中使用:需要基础库 `2.1.0` - * - * 在插件中使用时,只能在当前插件的页面中调用 - * - * 关闭当前页面,返回上一页面或多级页面。可通过 [getCurrentPages](https://developers.weixin.qq.com/miniprogram/dev/reference/api/getCurrentPages.html) 获取当前的页面栈,决定需要返回几层。 */ - navigateBack<T extends NavigateBackOption = NavigateBackOption>( - option?: T - ): PromisifySuccessResult<T, NavigateBackOption> - /** [wx.navigateBackMiniProgram(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.navigateBackMiniProgram.html) -* -* 需要基础库: `1.3.0` -* -* 在插件中使用:不支持 -* -* 返回到上一个小程序。只有在当前小程序是被其他小程序打开时可以调用成功。 -* -* 注意:**微信客户端 iOS 6.5.9,Android 6.5.10 及以上版本支持** -* -* **示例代码** -* -* ```js -wx.navigateBackMiniProgram({ - extraData: { - foo: 'bar' - }, - success(res) { - // 返回成功 - } -}) -``` */ - navigateBackMiniProgram< - T extends NavigateBackMiniProgramOption = NavigateBackMiniProgramOption - >( - option: T - ): PromisifySuccessResult<T, NavigateBackMiniProgramOption> - /** [wx.navigateTo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateTo.html) -* -* 在插件中使用:需要基础库 `2.2.2` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 [wx.navigateBack](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateBack.html) 可以返回到原页面。小程序中页面栈最多十层。 -* -* **示例代码** -* -* ```js -wx.navigateTo({ - url: 'test?id=1', - events: { - // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据 - acceptDataFromOpenedPage: function(data) { - console.log(data) - }, - someEvent: function(data) { - console.log(data) - } - ... - }, - success: function(res) { - // 通过eventChannel向被打开页面传送数据 - res.eventChannel.emit('acceptDataFromOpenerPage', { data: 'test' }) - } -}) -``` -* -* ```javascript -//test.js -Page({ - onLoad: function(option){ - console.log(option.query) - const eventChannel = this.getOpenerEventChannel() - eventChannel.emit('acceptDataFromOpenedPage', {data: 'test'}); - eventChannel.emit('someEvent', {data: 'test'}); - // 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据 - eventChannel.on('acceptDataFromOpenerPage', function(data) { - console.log(data) - }) - } -}) -``` */ - navigateTo<T extends NavigateToOption = NavigateToOption>( - option: T - ): PromisifySuccessResult<T, NavigateToOption> - /** [wx.navigateToMiniProgram(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.navigateToMiniProgram.html) -* -* 需要基础库: `1.3.0` -* -* 在插件中使用:需要基础库 `2.18.1` -* -* 打开另一个小程序 -* -* **使用限制** -* -* ##### 需要用户触发跳转 -* 从 2.3.0 版本开始,若用户未点击小程序页面任意位置,则开发者将无法调用此接口自动跳转至其他小程序。 -* ##### 需要用户确认跳转 -* 从 2.3.0 版本开始,在跳转至其他小程序前,将统一增加弹窗,询问是否跳转,用户确认后才可以跳转其他小程序。如果用户点击取消,则回调 `fail cancel`。 -* ##### 无需声明跳转名单,不限跳转数量(众测中) -* 1. 从2020年4月24日起,使用跳转其他小程序功能将无需在全局配置中声明跳转名单,调用此接口时将不再校验所跳转的 AppID 是否在 navigateToMiniProgramAppIdList 中。 -* 2. 从2020年4月24日起,跳转其他小程序将不再受数量限制,使用此功能时请注意遵守运营规范。 -* -* **运营规范** -* -* 平台将坚决打击小程序盒子等互推行为,使用此功能时请严格遵守[《微信小程序平台运营规范》](https://developers.weixin.qq.com/miniprogram/product/#_5-10-%E4%BA%92%E6%8E%A8%E8%A1%8C%E4%B8%BA),若发现小程序违反运营规范将被下架处理。 -* -* **关于调试** -* -* - 在开发者工具上调用此 API 并不会真实的跳转到另外的小程序,但是开发者工具会校验本次调用跳转是否成功。[详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/different.html#跳转小程序调试支持) -* - 开发者工具上支持被跳转的小程序处理接收参数的调试。[详情](https://developers.weixin.qq.com/miniprogram/dev/devtools/different.html#跳转小程序调试支持) -* -* **示例代码** -* -* ```js -wx.navigateToMiniProgram({ - appId: '', - path: 'page/index/index?id=123', - extraData: { - foo: 'bar' - }, - envVersion: 'develop', - success(res) { - // 打开成功 - } -}) -``` */ - navigateToMiniProgram< - T extends NavigateToMiniProgramOption = NavigateToMiniProgramOption - >( - option: T - ): PromisifySuccessResult<T, NavigateToMiniProgramOption> - /** [wx.nextTick(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/custom-component/wx.nextTick.html) -* -* 需要基础库: `2.2.3` -* -* 在插件中使用:需要基础库 `2.7.1` -* -* 延迟一部分操作到下一个时间片再执行。(类似于 setTimeout) -* -* **说明** -* -* 因为自定义组件中的 setData 和 triggerEvent 等接口本身是同步的操作,当这几个接口被连续调用时,都是在一个同步流程中执行完的,因此若逻辑不当可能会导致出错。 -* -* 一个极端的案例:当父组件的 setData 引发了子组件的 triggerEvent,进而使得父组件又进行了一次 setData,期间有通过 wx:if 语句对子组件进行卸载,就有可能引发奇怪的错误,所以对于不需要在一个同步流程内完成的逻辑,可以使用此接口延迟到下一个时间片再执行。 -* -* **示例代码** -* -* ```js -Component({ - doSth() { - this.setData({ number: 1 }) // 直接在当前同步流程中执行 - - wx.nextTick(() => { - this.setData({ number: 3 }) // 在当前同步流程结束后,下一个时间片执行 - }) - - this.setData({ number: 2 }) // 直接在当前同步流程中执行 - } -}) -``` */ - nextTick(callback: (...args: any[]) => any): void - /** [wx.notifyBLECharacteristicValueChange(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.notifyBLECharacteristicValueChange.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 启用蓝牙低功耗设备特征值变化时的 notify 功能,订阅特征。注意:必须设备的特征支持 notify 或者 indicate 才可以成功调用。 -* -* 另外,必须先启用 [wx.notifyBLECharacteristicValueChange](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.notifyBLECharacteristicValueChange.html) 才能监听到设备 `characteristicValueChange` 事件 -* -* **注意** -* -* - 订阅操作成功后需要设备主动更新特征的 value,才会触发 [wx.onBLECharacteristicValueChange](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.onBLECharacteristicValueChange.html) 回调。 -* - 安卓平台上,在本接口调用成功后立即调用 [wx.writeBLECharacteristicValue](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.writeBLECharacteristicValue.html) 接口,在部分机型上会发生 10008 系统错误 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.notifyBLECharacteristicValueChange({ - state: true, // 启用 notify 功能 - // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 - deviceId, - // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取 - serviceId, - // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取 - characteristicId, - success (res) { - console.log('notifyBLECharacteristicValueChange success', res.errMsg) - } -}) -``` */ - notifyBLECharacteristicValueChange< - T extends NotifyBLECharacteristicValueChangeOption = NotifyBLECharacteristicValueChangeOption - >( - option: T - ): PromisifySuccessResult<T, NotifyBLECharacteristicValueChangeOption> - /** [wx.offAccelerometerChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/accelerometer/wx.offAccelerometerChange.html) -* -* 需要基础库: `2.9.3` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除加速度数据事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onAccelerometerChange(listener) -wx.offAccelerometerChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offAccelerometerChange( - /** onAccelerometerChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffAccelerometerChangeCallback - ): void - /** [wx.offAfterPageLoad(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.offAfterPageLoad.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 移除路由事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onAfterPageLoad(listener) -wx.offAfterPageLoad(listener) // 需传入与监听时同一个的函数对象 -``` */ - offAfterPageLoad( - /** onAfterPageLoad 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffAfterPageLoadCallback - ): void - /** [wx.offAfterPageUnload(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.offAfterPageUnload.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 移除路由事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onAfterPageUnload(listener) -wx.offAfterPageUnload(listener) // 需传入与监听时同一个的函数对象 -``` */ - offAfterPageUnload( - /** onAfterPageUnload 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffAfterPageUnloadCallback - ): void - /** [wx.offApiCategoryChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/life-cycle/wx.offApiCategoryChange.html) -* -* 需要基础库: `2.33.0` -* -* 在插件中使用:不支持 -* -* 移除 API 类别变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onApiCategoryChange(listener) -wx.offApiCategoryChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offApiCategoryChange( - /** onApiCategoryChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffApiCategoryChangeCallback - ): void - /** [wx.offAppHide(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.offAppHide.html) -* -* 需要基础库: `2.1.2` -* -* 在插件中使用:不支持 -* -* 移除小程序切后台事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onAppHide(listener) -wx.offAppHide(listener) // 需传入与监听时同一个的函数对象 -``` */ - offAppHide( - /** onAppHide 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffAppHideCallback - ): void - /** [wx.offAppRoute(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.offAppRoute.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 移除路由事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onAppRoute(listener) -wx.offAppRoute(listener) // 需传入与监听时同一个的函数对象 -``` */ - offAppRoute( - /** onAppRoute 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffAppRouteCallback - ): void - /** [wx.offAppRouteDone(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.offAppRouteDone.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 移除当前路由动画执行完成的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onAppRouteDone(listener) -wx.offAppRouteDone(listener) // 需传入与监听时同一个的函数对象 -``` */ - offAppRouteDone( - /** onAppRouteDone 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffAppRouteDoneCallback - ): void - /** [wx.offAppShow(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.offAppShow.html) -* -* 需要基础库: `2.1.2` -* -* 在插件中使用:不支持 -* -* 移除小程序切前台事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onAppShow(listener) -wx.offAppShow(listener) // 需传入与监听时同一个的函数对象 -``` */ - offAppShow( - /** onAppShow 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffAppShowCallback - ): void - /** [wx.offAudioInterruptionBegin(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.offAudioInterruptionBegin.html) -* -* 需要基础库: `2.6.2` -* -* 在插件中使用:需要基础库 `2.15.0` -* -* 移除音频因为受到系统占用而被中断开始事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onAudioInterruptionBegin(listener) -wx.offAudioInterruptionBegin(listener) // 需传入与监听时同一个的函数对象 -``` */ - offAudioInterruptionBegin( - /** onAudioInterruptionBegin 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffAudioInterruptionBeginCallback - ): void - /** [wx.offAudioInterruptionEnd(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.offAudioInterruptionEnd.html) -* -* 需要基础库: `2.6.2` -* -* 在插件中使用:需要基础库 `2.15.0` -* -* 移除音频中断结束事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onAudioInterruptionEnd(listener) -wx.offAudioInterruptionEnd(listener) // 需传入与监听时同一个的函数对象 -``` */ - offAudioInterruptionEnd( - /** onAudioInterruptionEnd 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffAudioInterruptionEndCallback - ): void - /** [wx.offBLECharacteristicValueChange()](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.offBLECharacteristicValueChange.html) -* -* 需要基础库: `2.9.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除蓝牙低功耗设备的特征值变化事件的全部监听函数 -* -* **示例代码** -* -* ```js -wx.offBLECharacteristicValueChange() -``` */ - offBLECharacteristicValueChange(): void - /** [wx.offBLEConnectionStateChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.offBLEConnectionStateChange.html) -* -* 需要基础库: `2.9.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除蓝牙低功耗连接状态改变事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onBLEConnectionStateChange(listener) -wx.offBLEConnectionStateChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offBLEConnectionStateChange( - /** onBLEConnectionStateChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffBLEConnectionStateChangeCallback - ): void - /** [wx.offBLEMTUChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.offBLEMTUChange.html) -* -* 需要基础库: `2.20.1` -* -* 在插件中使用:需要基础库 `2.20.1` -* -* 移除蓝牙低功耗的最大传输单元变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onBLEMTUChange(listener) -wx.offBLEMTUChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offBLEMTUChange( - /** onBLEMTUChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffBLEMTUChangeCallback - ): void - /** [wx.offBLEPeripheralConnectionStateChanged(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/wx.offBLEPeripheralConnectionStateChanged.html) -* -* 需要基础库: `2.10.3` -* -* 在插件中使用:需要基础库 `2.22.1` -* -* 移除当前外围设备被连接或断开连接事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onBLEPeripheralConnectionStateChanged(listener) -wx.offBLEPeripheralConnectionStateChanged(listener) // 需传入与监听时同一个的函数对象 -``` */ - offBLEPeripheralConnectionStateChanged( - /** onBLEPeripheralConnectionStateChanged 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffBLEPeripheralConnectionStateChangedCallback - ): void - /** [wx.offBatteryInfoChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/battery/wx.offBatteryInfoChange.html) -* -* 需要基础库: `3.4.3` -* -* 在插件中使用:不支持 -* -* 移除电池信息变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onBatteryInfoChange(listener) -wx.offBatteryInfoChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offBatteryInfoChange( - /** onBatteryInfoChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffBatteryInfoChangeCallback - ): void - /** [wx.offBeaconServiceChange()](https://developers.weixin.qq.com/miniprogram/dev/api/device/ibeacon/wx.offBeaconServiceChange.html) -* -* 需要基础库: `2.8.1` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除 Beacon 服务状态变化事件的全部监听函数 -* -* **示例代码** -* -* ```js -wx.offBeaconServiceChange() -``` */ - offBeaconServiceChange(): void - /** [wx.offBeaconUpdate()](https://developers.weixin.qq.com/miniprogram/dev/api/device/ibeacon/wx.offBeaconUpdate.html) -* -* 需要基础库: `2.8.1` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除 Beacon 设备更新事件的全部监听函数 -* -* **示例代码** -* -* ```js -wx.offBeaconUpdate() -``` */ - offBeaconUpdate(): void - /** [wx.offBeforeAppRoute(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.offBeforeAppRoute.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 移除路由事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onBeforeAppRoute(listener) -wx.offBeforeAppRoute(listener) // 需传入与监听时同一个的函数对象 -``` */ - offBeforeAppRoute( - /** onBeforeAppRoute 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffBeforeAppRouteCallback - ): void - /** [wx.offBeforePageLoad(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.offBeforePageLoad.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 移除路由事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onBeforePageLoad(listener) -wx.offBeforePageLoad(listener) // 需传入与监听时同一个的函数对象 -``` */ - offBeforePageLoad( - /** onBeforePageLoad 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffBeforePageLoadCallback - ): void - /** [wx.offBeforePageUnload(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.offBeforePageUnload.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 移除路由事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onBeforePageUnload(listener) -wx.offBeforePageUnload(listener) // 需传入与监听时同一个的函数对象 -``` */ - offBeforePageUnload( - /** onBeforePageUnload 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffBeforePageUnloadCallback - ): void - /** [wx.offBluetoothAdapterStateChange()](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.offBluetoothAdapterStateChange.html) -* -* 需要基础库: `2.9.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除蓝牙适配器状态变化事件的全部监听函数 -* -* **示例代码** -* -* ```js -wx.offBluetoothAdapterStateChange() -``` */ - offBluetoothAdapterStateChange(): void - /** [wx.offBluetoothDeviceFound()](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.offBluetoothDeviceFound.html) -* -* 需要基础库: `2.9.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除搜索到新设备的事件的全部监听函数 -* -* **示例代码** -* -* ```js -wx.offBluetoothDeviceFound() -``` */ - offBluetoothDeviceFound(): void - /** [wx.offCompassChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/compass/wx.offCompassChange.html) -* -* 需要基础库: `2.9.3` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除罗盘数据变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onCompassChange(listener) -wx.offCompassChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offCompassChange( - /** onCompassChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffCompassChangeCallback - ): void - /** [wx.offCopyUrl()](https://developers.weixin.qq.com/miniprogram/dev/api/share/wx.offCopyUrl.html) - * - * 需要基础库: `2.14.3` - * - * 在插件中使用:不支持 - * - * 移除用户点击右上角菜单的「复制链接」按钮时触发的事件的全部监听函数 */ - offCopyUrl(): void - /** [wx.offDeviceMotionChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/motion/wx.offDeviceMotionChange.html) -* -* 需要基础库: `2.9.3` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除设备方向变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onDeviceMotionChange(listener) -wx.offDeviceMotionChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offDeviceMotionChange( - /** onDeviceMotionChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffDeviceMotionChangeCallback - ): void - /** [wx.offEmbeddedMiniProgramHeightChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.offEmbeddedMiniProgramHeightChange.html) -* -* 需要基础库: `2.33.0` -* -* 在插件中使用:不支持 -* -* 移除半屏小程序可视高度变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onEmbeddedMiniProgramHeightChange(listener) -wx.offEmbeddedMiniProgramHeightChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offEmbeddedMiniProgramHeightChange( - /** onEmbeddedMiniProgramHeightChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffEmbeddedMiniProgramHeightChangeCallback - ): void - /** [wx.offError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.offError.html) -* -* 需要基础库: `2.1.2` -* -* 在插件中使用:不支持 -* -* 移除小程序错误事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onError(listener) -wx.offError(listener) // 需传入与监听时同一个的函数对象 -``` */ - offError( - /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: WxOffErrorCallback - ): void - /** [wx.offGetWifiList(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.offGetWifiList.html) -* -* 需要基础库: `2.9.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除获取到 Wi-Fi 列表数据事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onGetWifiList(listener) -wx.offGetWifiList(listener) // 需传入与监听时同一个的函数对象 -``` */ - offGetWifiList( - /** onGetWifiList 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffGetWifiListCallback - ): void - /** [wx.offGyroscopeChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/gyroscope/wx.offGyroscopeChange.html) -* -* 需要基础库: `2.9.3` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除陀螺仪数据变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onGyroscopeChange(listener) -wx.offGyroscopeChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offGyroscopeChange( - /** onGyroscopeChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffGyroscopeChangeCallback - ): void - /** [wx.offHCEMessage(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc-hce/wx.offHCEMessage.html) -* -* 需要基础库: `2.8.1` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除接收 NFC 设备消息事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onHCEMessage(listener) -wx.offHCEMessage(listener) // 需传入与监听时同一个的函数对象 -``` */ - offHCEMessage( - /** onHCEMessage 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffHCEMessageCallback - ): void - /** [wx.offKeyboardHeightChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/keyboard/wx.offKeyboardHeightChange.html) -* -* 需要基础库: `2.9.2` -* -* 在插件中使用:不支持 -* -* 移除键盘高度变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onKeyboardHeightChange(listener) -wx.offKeyboardHeightChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offKeyboardHeightChange( - /** onKeyboardHeightChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffKeyboardHeightChangeCallback - ): void - /** [wx.offLazyLoadError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.offLazyLoadError.html) -* -* 需要基础库: `2.24.3` -* -* 在插件中使用:不支持 -* -* 移除小程序异步组件加载失败事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onLazyLoadError(listener) -wx.offLazyLoadError(listener) // 需传入与监听时同一个的函数对象 -``` */ - offLazyLoadError( - /** onLazyLoadError 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffLazyLoadErrorCallback - ): void - /** [wx.offLocalServiceDiscoveryStop(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/mdns/wx.offLocalServiceDiscoveryStop.html) -* -* 需要基础库: `2.4.0` -* -* 在插件中使用:需要基础库 `2.15.0` -* -* 移除 mDNS 服务停止搜索的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onLocalServiceDiscoveryStop(listener) -wx.offLocalServiceDiscoveryStop(listener) // 需传入与监听时同一个的函数对象 -``` */ - offLocalServiceDiscoveryStop( - /** onLocalServiceDiscoveryStop 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffLocalServiceDiscoveryStopCallback - ): void - /** [wx.offLocalServiceFound(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/mdns/wx.offLocalServiceFound.html) -* -* 需要基础库: `2.4.0` -* -* 在插件中使用:需要基础库 `2.15.0` -* -* 移除 mDNS 服务发现的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onLocalServiceFound(listener) -wx.offLocalServiceFound(listener) // 需传入与监听时同一个的函数对象 -``` */ - offLocalServiceFound( - /** onLocalServiceFound 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffLocalServiceFoundCallback - ): void - /** [wx.offLocalServiceLost(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/mdns/wx.offLocalServiceLost.html) -* -* 需要基础库: `2.4.0` -* -* 在插件中使用:需要基础库 `2.15.0` -* -* 移除 mDNS 服务离开的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onLocalServiceLost(listener) -wx.offLocalServiceLost(listener) // 需传入与监听时同一个的函数对象 -``` */ - offLocalServiceLost( - /** onLocalServiceLost 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffLocalServiceLostCallback - ): void - /** [wx.offLocalServiceResolveFail(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/mdns/wx.offLocalServiceResolveFail.html) -* -* 需要基础库: `2.4.0` -* -* 在插件中使用:需要基础库 `2.15.0` -* -* 移除 mDNS 服务解析失败的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onLocalServiceResolveFail(listener) -wx.offLocalServiceResolveFail(listener) // 需传入与监听时同一个的函数对象 -``` */ - offLocalServiceResolveFail( - /** onLocalServiceResolveFail 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffLocalServiceResolveFailCallback - ): void - /** [wx.offLocationChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.offLocationChange.html) -* -* 需要基础库: `2.8.1` -* -* 在插件中使用:不支持 -* -* 移除实时地理位置变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onLocationChange(listener) -wx.offLocationChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offLocationChange( - /** onLocationChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffLocationChangeCallback - ): void - /** [wx.offLocationChangeError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.offLocationChangeError.html) -* -* 需要基础库: `2.19.5` -* -* 在插件中使用:不支持 -* -* 移除持续定位接口返回失败时触发。的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onLocationChangeError(listener) -wx.offLocationChangeError(listener) // 需传入与监听时同一个的函数对象 -``` */ - offLocationChangeError( - /** onLocationChangeError 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffLocationChangeErrorCallback - ): void - /** [wx.offMemoryWarning(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/memory/wx.offMemoryWarning.html) -* -* 需要基础库: `2.9.0` -* -* 在插件中使用:不支持 -* -* 移除内存不足告警事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onMemoryWarning(listener) -wx.offMemoryWarning(listener) // 需传入与监听时同一个的函数对象 -``` */ - offMemoryWarning( - /** onMemoryWarning 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffMemoryWarningCallback - ): void - /** [wx.offMenuButtonBoundingClientRectWeightChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/menu/wx.offMenuButtonBoundingClientRectWeightChange.html) -* -* 需要基础库: `3.4.3` -* -* 在插件中使用:不支持 -* -* 移除菜单按钮(右上角胶囊按钮)的布局位置信息变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onMenuButtonBoundingClientRectWeightChange(listener) -wx.offMenuButtonBoundingClientRectWeightChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offMenuButtonBoundingClientRectWeightChange( - /** onMenuButtonBoundingClientRectWeightChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffMenuButtonBoundingClientRectWeightChangeCallback - ): void - /** [wx.offNetworkStatusChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/network/wx.offNetworkStatusChange.html) -* -* 需要基础库: `2.9.3` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除网络状态变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onNetworkStatusChange(listener) -wx.offNetworkStatusChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offNetworkStatusChange( - /** onNetworkStatusChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffNetworkStatusChangeCallback - ): void - /** [wx.offNetworkWeakChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/network/wx.offNetworkWeakChange.html) -* -* 需要基础库: `2.21.0` -* -* 在插件中使用:不支持 -* -* 移除弱网状态变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onNetworkWeakChange(listener) -wx.offNetworkWeakChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offNetworkWeakChange( - /** onNetworkWeakChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffNetworkWeakChangeCallback - ): void - /** [wx.offPageNotFound(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.offPageNotFound.html) -* -* 需要基础库: `2.1.2` -* -* 在插件中使用:不支持 -* -* 移除小程序要打开的页面不存在事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onPageNotFound(listener) -wx.offPageNotFound(listener) // 需传入与监听时同一个的函数对象 -``` */ - offPageNotFound( - /** onPageNotFound 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffPageNotFoundCallback - ): void - /** [wx.offScreenRecordingStateChanged(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/screen/wx.offScreenRecordingStateChanged.html) -* -* 需要基础库: `2.24.0` -* -* 在插件中使用:不支持 -* -* 移除用户录屏事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onScreenRecordingStateChanged(listener) -wx.offScreenRecordingStateChanged(listener) // 需传入与监听时同一个的函数对象 -``` */ - offScreenRecordingStateChanged( - /** onScreenRecordingStateChanged 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffScreenRecordingStateChangedCallback - ): void - /** [wx.offThemeChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.offThemeChange.html) -* -* 需要基础库: `2.11.0` -* -* 在插件中使用:不支持 -* -* 移除系统主题改变事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onThemeChange(listener) -wx.offThemeChange(listener) // 需传入与监听时同一个的函数对象 -``` */ - offThemeChange( - /** onThemeChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffThemeChangeCallback - ): void - /** [wx.offUnhandledRejection(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.offUnhandledRejection.html) -* -* 需要基础库: `2.10.0` -* -* 在插件中使用:不支持 -* -* 移除未处理的 Promise 拒绝事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onUnhandledRejection(listener) -wx.offUnhandledRejection(listener) // 需传入与监听时同一个的函数对象 -``` */ - offUnhandledRejection( - /** onUnhandledRejection 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffUnhandledRejectionCallback - ): void - /** [wx.offUserCaptureScreen(function callback)](https://developers.weixin.qq.com/miniprogram/dev/api/device/screen/wx.offUserCaptureScreen.html) - * - * 需要基础库: `2.9.3` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 在插件中使用时,只能在当前插件的页面中调用 - * - * 用户主动截屏事件。取消事件监听。 */ - offUserCaptureScreen( - /** 用户主动截屏事件的回调函数 */ - callback?: (...args: any[]) => any - ): void - /** [wx.offVoIPChatInterrupted(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.offVoIPChatInterrupted.html) -* -* 需要基础库: `2.9.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除被动断开实时语音通话事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onVoIPChatInterrupted(listener) -wx.offVoIPChatInterrupted(listener) // 需传入与监听时同一个的函数对象 -``` */ - offVoIPChatInterrupted( - /** onVoIPChatInterrupted 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffVoIPChatInterruptedCallback - ): void - /** [wx.offVoIPChatMembersChanged(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.offVoIPChatMembersChanged.html) -* -* 需要基础库: `2.9.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除实时语音通话成员在线状态变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onVoIPChatMembersChanged(listener) -wx.offVoIPChatMembersChanged(listener) // 需传入与监听时同一个的函数对象 -``` */ - offVoIPChatMembersChanged( - /** onVoIPChatMembersChanged 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffVoIPChatMembersChangedCallback - ): void - /** [wx.offVoIPChatSpeakersChanged(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.offVoIPChatSpeakersChanged.html) -* -* 需要基础库: `2.9.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除实时语音通话成员通话状态变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onVoIPChatSpeakersChanged(listener) -wx.offVoIPChatSpeakersChanged(listener) // 需传入与监听时同一个的函数对象 -``` */ - offVoIPChatSpeakersChanged( - /** onVoIPChatSpeakersChanged 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffVoIPChatSpeakersChangedCallback - ): void - /** [wx.offVoIPChatStateChanged(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.offVoIPChatStateChanged.html) -* -* 需要基础库: `2.16.0` -* -* 在插件中使用:不支持 -* -* 移除房间状态变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onVoIPChatStateChanged(listener) -wx.offVoIPChatStateChanged(listener) // 需传入与监听时同一个的函数对象 -``` */ - offVoIPChatStateChanged( - /** onVoIPChatStateChanged 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffVoIPChatStateChangedCallback - ): void - /** [wx.offVoIPVideoMembersChanged(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.offVoIPVideoMembersChanged.html) -* -* 需要基础库: `2.11.0` -* -* 在插件中使用:不支持 -* -* 移除实时语音通话成员视频状态变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onVoIPVideoMembersChanged(listener) -wx.offVoIPVideoMembersChanged(listener) // 需传入与监听时同一个的函数对象 -``` */ - offVoIPVideoMembersChanged( - /** onVoIPVideoMembersChanged 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffVoIPVideoMembersChangedCallback - ): void - /** [wx.offWifiConnected(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.offWifiConnected.html) -* -* 需要基础库: `2.9.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 移除连接上 Wi-Fi 的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onWifiConnected(listener) -wx.offWifiConnected(listener) // 需传入与监听时同一个的函数对象 -``` */ - offWifiConnected( - /** onWifiConnected 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffWifiConnectedCallback - ): void - /** [wx.offWifiConnectedWithPartialInfo(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.offWifiConnectedWithPartialInfo.html) -* -* 需要基础库: `2.22.0` -* -* 在插件中使用:需要基础库 `2.22.1` -* -* 移除连接上 Wi-Fi 的事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onWifiConnectedWithPartialInfo(listener) -wx.offWifiConnectedWithPartialInfo(listener) // 需传入与监听时同一个的函数对象 -``` */ - offWifiConnectedWithPartialInfo( - /** onWifiConnectedWithPartialInfo 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffWifiConnectedWithPartialInfoCallback - ): void - /** [wx.offWindowResize(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/window/wx.offWindowResize.html) -* -* 需要基础库: `2.3.0` -* -* 在插件中使用:不支持 -* -* 移除窗口尺寸变化事件的监听函数 -* -* **示例代码** -* -* ```js -const listener = function (res) { console.log(res) } - -wx.onWindowResize(listener) -wx.offWindowResize(listener) // 需传入与监听时同一个的函数对象 -``` */ - offWindowResize( - /** onWindowResize 传入的监听函数。不传此参数则移除所有监听函数。 */ - listener?: OffWindowResizeCallback - ): void - /** [wx.onAccelerometerChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/accelerometer/wx.onAccelerometerChange.html) -* -* 在插件中使用:不支持 -* -* 监听加速度数据事件。频率根据 [wx.startAccelerometer()](https://developers.weixin.qq.com/miniprogram/dev/api/device/accelerometer/wx.startAccelerometer.html) 的 interval 参数, 接口调用后会自动开始监听。 -* -* **示例代码** -* -* ```js -wx.onAccelerometerChange(callback) -``` */ - onAccelerometerChange( - /** 加速度数据事件的监听函数 */ - listener: OnAccelerometerChangeCallback - ): void - /** [wx.onAfterPageLoad(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.onAfterPageLoad.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 监听路由事件引起新的页面实例化时,页面实例化完成的事件监听,详见 [页面路由监听](#)。 -* -* **** -* -* > 新旧版本小程序组件框架的说明详见:[glass-easel:新版微信小程序组件框架](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/glass-easel/introduction.html) -* -* **示例代码** -* -* ```js -const func = function (res) { - console.log(res) -} -wx.onAfterPageLoad(func) -// 取消监听 -wx.offAfterPageLoad(func) -``` */ - onAfterPageLoad( - /** 路由事件的监听函数 */ - listener: OnAfterPageLoadCallback - ): void - /** [wx.onAfterPageUnload(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.onAfterPageUnload.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 监听路由事件引起现有页面实例销毁时,页面实例销毁后的事件监听,详见 [页面路由监听](#)。 -* -* **示例代码** -* -* ```js -const func = function (res) { - console.log(res) -} -wx.onAfterPageUnload(func) -// 取消监听 -wx.offAfterPageUnload(func) -``` */ - onAfterPageUnload( - /** 路由事件的监听函数 */ - listener: OnAfterPageUnloadCallback - ): void - /** [wx.onApiCategoryChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/life-cycle/wx.onApiCategoryChange.html) -* -* 需要基础库: `2.33.0` -* -* 在插件中使用:不支持 -* -* 监听 API 类别变化事件 -* -* **不同 apiCategory 场景下的 API 限制** -* -* `X` 表示 API 被限制无法使用;不在表格中的 API 不限制。 -* -* | | default | nativeFunctionalized | browseOnly | embedded | -* |-|-|-|-|-| -* |navigateToMiniProgram | | `X` | `X` | | -* |openSetting | | | `X` | | -* |<button open-type="share"> | | `X` | `X` | `X` | -* |<button open-type="feedback"> | | | `X` | | -* |<button open-type="open-setting">| | | `X` | | -* |openEmbeddedMiniProgram | | `X` | `X` | `X` | -* -* **示例代码** -* -* ```js -const func = function (res) { - console.log(res.apiCategory) -} -wx.onApiCategoryChange(func) -// 取消监听 -wx.offApiCategoryChange(func) -``` */ - onApiCategoryChange( - /** API 类别变化事件的监听函数 */ - listener: OnApiCategoryChangeCallback - ): void - /** [wx.onAppHide(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onAppHide.html) - * - * 需要基础库: `2.1.2` - * - * 在插件中使用:不支持 - * - * 监听小程序切后台事件。该事件与 [`App.onHide`](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html#onhide) 的回调时机一致。 */ - onAppHide( - /** 小程序切后台事件的监听函数 */ - listener: OnAppHideCallback - ): void - /** [wx.onAppRoute(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.onAppRoute.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 监听路由事件下发后,执行路由逻辑后的事件监听,详见 [页面路由监听](#)。 -* -* **** -* -* > Skyline 渲染引擎相关说明:[详情](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html) -* > xr-frame 解决方案相关说明:[详情](#) -* -* **注意** -* -* 在低于 3.5.5 版本的基础库中也存在此接口,但参数可能与当前文档不同,请注意。 -* -* **示例代码** -* -* ```js -const func = function (res) { - console.log(res) -} -wx.onAppRoute(func) -// 取消监听 -wx.offAppRoute(func) -``` */ - onAppRoute( - /** 路由事件的监听函数 */ - listener: OnAppRouteCallback - ): void - /** [wx.onAppRouteDone(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.onAppRouteDone.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 监听当前路由动画执行完成的事件监听,详见 [页面路由监听](#)。 -* -* **注意** -* -* 在低于 3.5.5 版本的基础库中也存在此接口,但参数可能与当前文档不同,请注意。 -* -* **示例代码** -* -* ```js -const func = function (res) { - console.log(res) -} -wx.onAppRouteDone(func) -// 取消监听 -wx.offAppRouteDone(func) -``` */ - onAppRouteDone( - /** 当前路由动画执行完成的事件的监听函数 */ - listener: OnAppRouteDoneCallback - ): void - /** [wx.onAppShow(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onAppShow.html) - * - * 需要基础库: `2.1.2` - * - * 在插件中使用:不支持 - * - * 监听小程序切前台事件。该事件与 [`App.onShow`](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html#onshowobject-object) 的回调参数一致。 - * - * **返回有效 referrerInfo 的场景** - * - * | 场景值 | 场景 | appId含义 | - * | ------ | ------------------------------- | ---------- | - * | 1020 | 公众号 profile 页相关小程序列表 | 来源公众号 | - * | 1035 | 公众号自定义菜单 | 来源公众号 | - * | 1036 | App 分享消息卡片 | 来源App | - * | 1037 | 小程序打开小程序 | 来源小程序 | - * | 1038 | 从另一个小程序返回 | 来源小程序 | - * | 1043 | 公众号模板消息 | 来源公众号 | - * - * **不同 apiCategory 场景下的 API 限制** - * - * `X` 表示 API 被限制无法使用;不在表格中的 API 不限制。 - * - * | | default | nativeFunctionalized | browseOnly | embedded | - * |-|-|-|-|-| - * |navigateToMiniProgram | | `X` | `X` | | - * |openSetting | | | `X` | | - * |<button open-type="share"> | | `X` | `X` | `X` | - * |<button open-type="feedback"> | | | `X` | | - * |<button open-type="open-setting">| | | `X` | | - * |openEmbeddedMiniProgram | | `X` | `X` | `X` | - * - * **注意** - * - * 部分版本在无`referrerInfo`的时候会返回 `undefined`,建议使用 `options.referrerInfo && options.referrerInfo.appId` 进行判断。 */ - onAppShow( - /** 小程序切前台事件的监听函数 */ - listener: OnAppShowCallback - ): void - /** [wx.onAudioInterruptionBegin(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onAudioInterruptionBegin.html) - * - * 需要基础库: `2.6.2` - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 监听音频因为受到系统占用而被中断开始事件。以下场景会触发此事件:闹钟、电话、FaceTime 通话、微信语音聊天、微信视频聊天、有声广告开始播放、实名认证页面弹出等。此事件触发后,小程序内所有音频会暂停。 */ - onAudioInterruptionBegin( - /** 音频因为受到系统占用而被中断开始事件的监听函数 */ - listener: OnAudioInterruptionBeginCallback - ): void - /** [wx.onAudioInterruptionEnd(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onAudioInterruptionEnd.html) - * - * 需要基础库: `2.6.2` - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 监听音频中断结束事件。在收到 onAudioInterruptionBegin 事件之后,小程序内所有音频会暂停,收到此事件之后才可再次播放成功 */ - onAudioInterruptionEnd( - /** 音频中断结束事件的监听函数 */ - listener: OnAudioInterruptionEndCallback - ): void - /** [wx.onBLECharacteristicValueChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.onBLECharacteristicValueChange.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 监听蓝牙低功耗设备的特征值变化事件。必须先调用 [wx.notifyBLECharacteristicValueChange](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.notifyBLECharacteristicValueChange.html) 接口才能接收到设备推送的 notification。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* -* ```js -// ArrayBuffer转16进制字符串示例 -function ab2hex(buffer) { - let hexArr = Array.prototype.map.call( - new Uint8Array(buffer), - function(bit) { - return ('00' + bit.toString(16)).slice(-2) - } - ) - return hexArr.join(''); -} -wx.onBLECharacteristicValueChange(function(res) { - console.log(`characteristic ${res.characteristicId} has changed, now is ${res.value}`) - console.log(ab2hex(res.value)) -}) -``` */ - onBLECharacteristicValueChange( - /** 蓝牙低功耗设备的特征值变化事件的监听函数 */ - listener: OnBLECharacteristicValueChangeCallback - ): void - /** [wx.onBLEConnectionStateChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.onBLEConnectionStateChange.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 监听蓝牙低功耗连接状态改变事件。包括开发者主动连接或断开连接,设备丢失,连接异常断开等等 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.onBLEConnectionStateChange(function(res) { - // 该方法回调中可以用于处理连接意外断开等异常情况 - console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`) -}) -``` */ - onBLEConnectionStateChange( - /** 蓝牙低功耗连接状态改变事件的监听函数 */ - listener: OnBLEConnectionStateChangeCallback - ): void - /** [wx.onBLEMTUChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.onBLEMTUChange.html) -* -* 需要基础库: `2.20.1` -* -* 在插件中使用:需要基础库 `2.20.1` -* -* 监听蓝牙低功耗的最大传输单元变化事件(仅安卓触发)。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.onBLEMTUChange(function (res) { - console.log('bluetooth mtu is', res.mtu) -}) -``` */ - onBLEMTUChange( - /** 蓝牙低功耗的最大传输单元变化事件的监听函数 */ - listener: OnBLEMTUChangeCallback - ): void - /** [wx.onBLEPeripheralConnectionStateChanged(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/wx.onBLEPeripheralConnectionStateChanged.html) - * - * 需要基础库: `2.10.3` - * - * 在插件中使用:需要基础库 `2.22.1` - * - * 监听当前外围设备被连接或断开连接事件 */ - onBLEPeripheralConnectionStateChanged( - /** 当前外围设备被连接或断开连接事件的监听函数 */ - listener: OnBLEPeripheralConnectionStateChangedCallback - ): void - /** [wx.onBackgroundAudioPause(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.onBackgroundAudioPause.html) - * - * 在插件中使用:不支持 - * @deprecated 基础库版本 [1.2.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getBackgroundAudioManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioManager.html) 替换 - * - * 监听音乐暂停事件。 */ - onBackgroundAudioPause( - /** 音乐暂停事件的监听函数 */ - listener: OnBackgroundAudioPauseCallback - ): void - /** [wx.onBackgroundAudioPlay(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.onBackgroundAudioPlay.html) - * - * 在插件中使用:不支持 - * @deprecated 基础库版本 [1.2.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getBackgroundAudioManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioManager.html) 替换 - * - * 监听音乐播放事件。 */ - onBackgroundAudioPlay( - /** 音乐播放事件的监听函数 */ - listener: OnBackgroundAudioPlayCallback - ): void - /** [wx.onBackgroundAudioStop(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.onBackgroundAudioStop.html) - * - * 在插件中使用:不支持 - * @deprecated 基础库版本 [1.2.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getBackgroundAudioManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioManager.html) 替换 - * - * 监听音乐停止事件。 */ - onBackgroundAudioStop( - /** 音乐停止事件的监听函数 */ - listener: OnBackgroundAudioStopCallback - ): void - /** [wx.onBackgroundFetchData(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/background-fetch/wx.onBackgroundFetchData.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:不支持 - * - * 监听收到 backgroundFetch 数据事件。如果监听时请求已经完成,则事件不会触发。建议和 [wx.getBackgroundFetchData](https://developers.weixin.qq.com/miniprogram/dev/api/storage/background-fetch/wx.getBackgroundFetchData.html) 配合使用 */ - onBackgroundFetchData( - /** 收到 backgroundFetch 数据事件的监听函数 */ - listener: OnBackgroundFetchDataCallback - ): void - /** [wx.onBatteryInfoChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/battery/wx.onBatteryInfoChange.html) -* -* 需要基础库: `3.4.3` -* -* 在插件中使用:不支持 -* -* 监听电池信息变化事件,目前只支持监听省电模式的切换,目前仅 iOS 端支持 -* -* **示例代码** -* -* ```js -const cb = res => { - console.log(res.isLowPowerModeEnabled) -} -wx.onBatteryInfoChange(cb) -// 取消监听 -wx.offBatteryInfoChange(cb) -``` */ - onBatteryInfoChange( - /** 电池信息变化事件的监听函数 */ - listener: OnBatteryInfoChangeCallback - ): void - /** [wx.onBeaconServiceChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/ibeacon/wx.onBeaconServiceChange.html) -* -* 需要基础库: `1.2.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 监听 Beacon 服务状态变化事件,仅能注册一个监听 -* -* **示例代码** -* -* ```js -wx.onBeaconServiceChange(res => { - console.log(res.available, res.discovering) -}) -``` */ - onBeaconServiceChange( - /** Beacon 服务状态变化事件的监听函数 */ - listener: OnBeaconServiceChangeCallback - ): void - /** [wx.onBeaconUpdate(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/ibeacon/wx.onBeaconUpdate.html) -* -* 需要基础库: `1.2.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 监听 Beacon 设备更新事件,仅能注册一个监听 -* -* **示例代码** -* -* ```js -wx.onBeaconUpdate(res => { - console.log(res.beacons) -}) -``` */ - onBeaconUpdate( - /** Beacon 设备更新事件的监听函数 */ - listener: OnBeaconUpdateCallback - ): void - /** [wx.onBeforeAppRoute(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.onBeforeAppRoute.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 监听路由事件下发后,执行路由逻辑前的事件监听,详见 [页面路由监听](#)。 -* -* **** -* -* > Skyline 渲染引擎相关说明:[详情](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html) -* > xr-frame 解决方案相关说明:[详情](#) -* -* **示例代码** -* -* ```js -const func = function (res) { - console.log(res) -} -wx.onBeforeAppRoute(func) -// 取消监听 -wx.offBeforeAppRoute(func) -``` */ - onBeforeAppRoute( - /** 路由事件的监听函数 */ - listener: OnBeforeAppRouteCallback - ): void - /** [wx.onBeforePageLoad(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.onBeforePageLoad.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 监听路由事件引起新的页面实例化时,页面实例化前的事件监听,详见 [页面路由监听](#)。 -* -* **** -* -* > 新旧版本小程序组件框架的说明详见:[glass-easel:新版微信小程序组件框架](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/glass-easel/introduction.html) -* -* **示例代码** -* -* ```js -const func = function (res) { - console.log(res) -} -wx.onBeforePageLoad(func) -// 取消监听 -wx.offBeforePageLoad(func) -``` */ - onBeforePageLoad( - /** 路由事件的监听函数 */ - listener: OnBeforePageLoadCallback - ): void - /** [wx.onBeforePageUnload(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-route/wx.onBeforePageUnload.html) -* -* 需要基础库: `3.5.5` -* -* 在插件中使用:需要基础库 `3.5.5` -* -* 监听路由事件引起现有页面实例销毁时,页面实例销毁前的事件监听,详见 [页面路由监听](#)。 -* -* **示例代码** -* -* ```js -const func = function (res) { - console.log(res) -} -wx.onBeforePageUnload(func) -// 取消监听 -wx.offBeforePageUnload(func) -``` */ - onBeforePageUnload( - /** 路由事件的监听函数 */ - listener: OnBeforePageUnloadCallback - ): void - /** [wx.onBluetoothAdapterStateChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.onBluetoothAdapterStateChange.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 监听蓝牙适配器状态变化事件 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.onBluetoothAdapterStateChange(function (res) { - console.log('adapterState changed, now is', res) -}) -``` */ - onBluetoothAdapterStateChange( - /** 蓝牙适配器状态变化事件的监听函数 */ - listener: OnBluetoothAdapterStateChangeCallback - ): void - /** [wx.onBluetoothDeviceFound(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.onBluetoothDeviceFound.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 监听搜索到新设备的事件 -* -* **注意** -* -* - 若在 [wx.onBluetoothDeviceFound](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.onBluetoothDeviceFound.html) 回调了某个设备,则此设备会添加到 [wx.getBluetoothDevices](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.getBluetoothDevices.html) 接口获取到的数组中。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* -* ```js -// ArrayBuffer转16进度字符串示例 -function ab2hex(buffer) { - var hexArr = Array.prototype.map.call( - new Uint8Array(buffer), - function(bit) { - return ('00' + bit.toString(16)).slice(-2) - } - ) - return hexArr.join(''); -} -wx.onBluetoothDeviceFound(function(res) { - var devices = res.devices; - console.log('new device list has founded') - console.dir(devices) - console.log(ab2hex(devices[0].advertisData)) -}) -``` -* -* **注意** -* -* - 蓝牙设备在被搜索到时,系统返回的 `name` 字段一般为广播包中的 `LocalName` 字段中的设备名称,而如果与蓝牙设备建立连接,系统返回的 `name` 字段会改为从蓝牙设备上获取到的 `GattName`。若需要动态改变设备名称并展示,建议使用 `localName` 字段。 -* - 安卓下部分机型需要有位置权限才能搜索到设备,需留意是否开启了位置权限 */ - onBluetoothDeviceFound( - /** 搜索到新设备的事件的监听函数 */ - listener: OnBluetoothDeviceFoundCallback - ): void - /** [wx.onCompassChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/compass/wx.onCompassChange.html) - * - * 在插件中使用:不支持 - * - * 监听罗盘数据变化事件。频率:5 次/秒,接口调用后会自动开始监听,可使用 wx.stopCompass 停止监听。 - * - * **accuracy 在 iOS/Android 的差异** - * - * 由于平台差异,accuracy 在 iOS/Android 的值不同。 - * - * - iOS:accuracy 是一个 number 类型的值,表示相对于磁北极的偏差。0 表示设备指向磁北,90 表示指向东,180 表示指向南,依此类推。 - * - Android:accuracy 是一个 string 类型的枚举值。 - * - * | 值 | 说明 | - * | --------------- | -------------------------------------------------------------------------------------- | - * | high | 高精度 | - * | medium | 中等精度 | - * | low | 低精度 | - * | no-contact | 不可信,传感器失去连接 | - * | unreliable | 不可信,原因未知 | - * | unknow ${value} | 未知的精度枚举值,即该 Android 系统此时返回的表示精度的 value 不是一个标准的精度枚举值 | */ - onCompassChange( - /** 罗盘数据变化事件的监听函数 */ - listener: OnCompassChangeCallback - ): void - /** [wx.onCopyUrl(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/share/wx.onCopyUrl.html) - * - * 需要基础库: `2.14.3` - * - * 在插件中使用:不支持 - * - * 监听用户点击右上角菜单的「复制链接」按钮时触发的事件。本接口为 Beta 版本,暂只在 Android 平台支持。 */ - onCopyUrl( - /** 用户点击右上角菜单的「复制链接」按钮时触发的事件的监听函数 */ - listener: OnCopyUrlCallback - ): void - /** [wx.onDeviceMotionChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/motion/wx.onDeviceMotionChange.html) - * - * 需要基础库: `2.3.0` - * - * 在插件中使用:不支持 - * - * 监听设备方向变化事件。频率根据 [wx.startDeviceMotionListening()](https://developers.weixin.qq.com/miniprogram/dev/api/device/motion/wx.startDeviceMotionListening.html) 的 interval 参数。可以使用 [wx.stopDeviceMotionListening()](https://developers.weixin.qq.com/miniprogram/dev/api/device/motion/wx.stopDeviceMotionListening.html) 停止监听。 */ - onDeviceMotionChange( - /** 设备方向变化事件的监听函数 */ - listener: OnDeviceMotionChangeCallback - ): void - /** [wx.onEmbeddedMiniProgramHeightChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.onEmbeddedMiniProgramHeightChange.html) -* -* 需要基础库: `2.33.0` -* -* 在插件中使用:不支持 -* -* 监听半屏小程序可视高度变化事件 -* -* **示例代码** -* -* ```js -const func = function (res) { - console.log(res.height) - console.log(res.initialHeight) -} -wx.onEmbeddedMiniProgramHeightChange(func) -// 取消监听 -wx.offEmbeddedMiniProgramHeightChange(func) -``` */ - onEmbeddedMiniProgramHeightChange( - /** 半屏小程序可视高度变化事件的监听函数 */ - listener: OnEmbeddedMiniProgramHeightChangeCallback - ): void - /** [wx.onError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onError.html) - * - * 需要基础库: `2.1.2` - * - * 在插件中使用:不支持 - * - * 监听小程序错误事件。如脚本错误或 API 调用报错等。该事件与 [`App.onError`](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html#onerrorstring-error) 的回调时机与参数一致。 */ - onError( - /** 小程序错误事件的监听函数 */ - listener: WxOnErrorCallback - ): void - /** [wx.onGetWifiList(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.onGetWifiList.html) - * - * 需要基础库: `1.6.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 监听获取到 Wi-Fi 列表数据事件 */ - onGetWifiList( - /** 获取到 Wi-Fi 列表数据事件的监听函数 */ - listener: OnGetWifiListCallback - ): void - /** [wx.onGyroscopeChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/gyroscope/wx.onGyroscopeChange.html) - * - * 需要基础库: `2.3.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 监听陀螺仪数据变化事件。频率根据 [wx.startGyroscope()](https://developers.weixin.qq.com/miniprogram/dev/api/device/gyroscope/wx.startGyroscope.html) 的 interval 参数。可以使用 [wx.stopGyroscope()](https://developers.weixin.qq.com/miniprogram/dev/api/device/gyroscope/wx.stopGyroscope.html) 停止监听。 */ - onGyroscopeChange( - /** 陀螺仪数据变化事件的监听函数 */ - listener: OnGyroscopeChangeCallback - ): void - /** [wx.onHCEMessage(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc-hce/wx.onHCEMessage.html) - * - * 需要基础库: `1.7.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 监听接收 NFC 设备消息事件。仅能注册一个监听 */ - onHCEMessage( - /** 接收 NFC 设备消息事件的监听函数 */ - listener: OnHCEMessageCallback - ): void - /** [wx.onKeyboardHeightChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/keyboard/wx.onKeyboardHeightChange.html) -* -* 需要基础库: `2.7.0` -* -* 在插件中使用:不支持 -* -* 监听键盘高度变化事件 -* -* **示例代码** -* -* ```js -wx.onKeyboardHeightChange(res => { - console.log(res.height) -}) -``` */ - onKeyboardHeightChange( - /** 键盘高度变化事件的监听函数 */ - listener: OnKeyboardHeightChangeCallback - ): void - /** [wx.onLazyLoadError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onLazyLoadError.html) - * - * 需要基础库: `2.24.3` - * - * 在插件中使用:不支持 - * - * 监听小程序异步组件加载失败事件。 - * - * **注意** - * - * - 加载异步组件通常需要下载分包,若分包下载超时,则会触发 errMsg 为 "loadSubpackage: timeout" 的回调,默认超时等待时间为 5 秒。 - * - 可以通过第二个参数指定超时时间(单位:ms),该设置全局有效,多次指定超时时间则覆盖前面。 - * - 分包确认下载失败时,会再次触发 errMsg 为 "loadSubpackage: fail" 的回调。 - * - 若在页面中使用该接口进行监听,请确保在必要时手动调用 offLazyLoadError 取消监听,以避免非预期的内存泄漏。 */ - onLazyLoadError( - /** 小程序异步组件加载失败事件的监听函数 */ - listener: OnLazyLoadErrorCallback - ): void - /** [wx.onLocalServiceDiscoveryStop(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/mdns/wx.onLocalServiceDiscoveryStop.html) - * - * 需要基础库: `2.4.0` - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 监听 mDNS 服务停止搜索的事件 */ - onLocalServiceDiscoveryStop( - /** mDNS 服务停止搜索的事件的监听函数 */ - listener: OnLocalServiceDiscoveryStopCallback - ): void - /** [wx.onLocalServiceFound(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/mdns/wx.onLocalServiceFound.html) - * - * 需要基础库: `2.4.0` - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 监听 mDNS 服务发现的事件 */ - onLocalServiceFound( - /** mDNS 服务发现的事件的监听函数 */ - listener: OnLocalServiceFoundCallback - ): void - /** [wx.onLocalServiceLost(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/mdns/wx.onLocalServiceLost.html) - * - * 需要基础库: `2.4.0` - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 监听 mDNS 服务离开的事件 */ - onLocalServiceLost( - /** mDNS 服务离开的事件的监听函数 */ - listener: OnLocalServiceLostCallback - ): void - /** [wx.onLocalServiceResolveFail(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/mdns/wx.onLocalServiceResolveFail.html) - * - * 需要基础库: `2.4.0` - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 监听 mDNS 服务解析失败的事件 */ - onLocalServiceResolveFail( - /** mDNS 服务解析失败的事件的监听函数 */ - listener: OnLocalServiceResolveFailCallback - ): void - /** [wx.onLocationChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.onLocationChange.html) -* -* 需要基础库: `2.8.1` -* -* 在插件中使用:不支持 -* -* 监听实时地理位置变化事件,需结合 [wx.startLocationUpdateBackground](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.startLocationUpdateBackground.html)、[wx.startLocationUpdate](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.startLocationUpdate.html)使用。 -* -* ## 使用方法 -* 自 2022 年 7 月 14 日后发布的小程序,若使用该接口,需要在 app.json 中进行声明,否则将无法正常使用该接口,2022年7月14日前发布的小程序不受影响。[具体规则见公告](https://developers.weixin.qq.com/community/develop/doc/000a02f2c5026891650e7f40351c01) -* -* ## 申请开通 -* 暂只针对如下类目的小程序开放,需要先通过类目审核,再在小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通该接口权限。 -* 接口权限申请入口将于2022年3月11日开始内测,于3月31日全量上线。并从4月18日开始,在代码审核环节将检测该接口是否已完成开通,如未开通,将在代码提审环节进行拦截。 -* -* ### 国内主体开放类目 -* -* | 一级类目/主体类型 | 二级类目 | 应用场景 | -* | -------------- | -------| -------- | -* | 电商平台 | / | 售卖商品线下发货、收货、送货服务 | -* | 商家自营 | / | 提供售卖商品线下发货、收货、送货服务、线下商超导览、导航服务 | -* | 医疗服务 | 公立医疗机构、三级私立医疗机构、其他私立医疗机构、就医服务、其他医学健康服务、药品(非处方药)销售、非处方药销售平台、医疗器械生产企业、医疗器械自营、医疗器械经营销售平台、互联网医院血液、干细胞服务、临床试验 | 1、实际物品/药品接收服务 2、基于地理位置取号并现场报到、附近医院导航等服务 | -* | 交通服务 | / | 代驾服务、租车网点导航等相关服务 | -* | 生活服务 | / | 上门服务作业等线下场景 | -* | 物流服务 | 收件/派件、查件、邮政、装卸搬运、快递柜、货物运输 | 快递/货物收发服务 | -* | 餐饮服务 | 点餐平台、外卖平台 | 线下送餐服务 | -* | 工具 | 天气、信息查询 | 与地理位置相关的服务,比如潮汐查询、海拔查询、天气查询等 | -* | 金融 | 保险 | 提供线下网点预约、基于地理位置取号并现场报到、附近网点导航等服务 | -* | 旅游 | 景区服务 | 提供景区导航、导览服务 | -* | 政务民生 | / | 提供政务单位相关业务 | -* | 政府主体账号 | / | 提供政务单位相关业务 | -* -* ### 海外主体开放类目 -* | 一级类目/主体类型 | 二级类目 | 应用场景 | -* | -------------- | -------| -------- | -* | 出行与交通 | / | 代驾服务、租车网点导航等相关服务 | -* | 快递业与邮政 | / | 快递/货物收发服务 | -* | 餐饮 | / | 线下送餐服务 | -* | 电商平台 | / | 售卖商品线下发货、线下收货服务 | -* | 出行与交通 | / | 代驾服务、租车网点导航等相关服务 | -* | 跨境电商 | / | 提供售卖商品线下发货、收货服务、线下商超导览、导航服务 | -* | 本地服务 | 服装/鞋/箱包、玩具、家电/数码/手机、美妆/洗护、珠宝/饰品/眼镜/钟表、运动/户外/乐器、鲜花/园艺/工艺品、家居/家饰/家纺、办公/文具、机械/电子器件、酒、食品、百货/超市/便利店、宠物食品/用品 | 提供售卖商品线下发货、线下收货服务、线下商超导览、导航服务 | -* | 生活服务 | 家政、外送 | 上门服务作业等线下场景 | -* -* **示例代码** -* -* ```js - const _locationChangeFn = function(res) { - console.log('location change', res) - } - wx.onLocationChange(_locationChangeFn) - wx.offLocationChange(_locationChangeFn) -``` */ - onLocationChange( - /** 实时地理位置变化事件的监听函数 */ - listener: OnLocationChangeCallback - ): void - /** [wx.onLocationChangeError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.onLocationChangeError.html) - * - * 需要基础库: `2.19.5` - * - * 在插件中使用:不支持 - * - * 监听持续定位接口返回失败时触发。 */ - onLocationChangeError( - /** 的监听函数 */ - listener: OnLocationChangeErrorCallback - ): void - /** [wx.onMemoryWarning(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/memory/wx.onMemoryWarning.html) - * - * 需要基础库: `2.0.2` - * - * 在插件中使用:不支持 - * - * 监听内存不足告警事件。 - * - * 当 iOS/Android 向小程序进程发出内存警告时,触发该事件。触发该事件不意味小程序被杀,大部分情况下仅仅是告警,开发者可在收到通知后回收一些不必要资源避免进一步加剧内存紧张。 - * - * **示例代码** - * - * ```js - * wx.onMemoryWarning(function () { - * console.log('onMemoryWarningReceive') - * }) - * `` */ - onMemoryWarning( - /** 内存不足告警事件的监听函数 */ - listener: OnMemoryWarningCallback - ): void - /** [wx.onMenuButtonBoundingClientRectWeightChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/menu/wx.onMenuButtonBoundingClientRectWeightChange.html) -* -* 需要基础库: `3.4.3` -* -* 在插件中使用:不支持 -* -* 监听菜单按钮(右上角胶囊按钮)的布局位置信息变化事件 -* -* **示例代码** -* -* ```js -const callback = res => console.log('menuButtonBoundingClientRectWeightChange', res) - -wx.onMenuButtonBoundingClientRectWeightChange(callback) -// 取消监听 -wx.offMenuButtonBoundingClientRectWeightChange(callback) -``` */ - onMenuButtonBoundingClientRectWeightChange( - /** 菜单按钮(右上角胶囊按钮)的布局位置信息变化事件的监听函数 */ - listener: OnMenuButtonBoundingClientRectWeightChangeCallback - ): void - /** [wx.onNeedPrivacyAuthorization(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/privacy/wx.onNeedPrivacyAuthorization.html) -* -* 需要基础库: `2.32.3` -* -* 在插件中使用:不支持 -* -* 监听隐私接口需要用户授权事件。当需要用户进行隐私授权时会触发。触发该事件时,开发者需要弹出隐私协议说明,并在用户同意或拒绝授权后调用回调接口 resolve 触发原隐私接口或组件继续执行。隐私合规开发指南详情可见[《小程序隐私协议开发指南》](https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html) -* -* **** -* -* ## 回调参数 -* -* ### function resolve -* -* resolve 是 onNeedPrivacyAuthorization 的首个回调参数,是一个接口函数。 -* -* 当触发 onNeedPrivacyAuthorization 事件时,触发该事件的隐私接口或组件会处于 pending 状态。 -* -* 如果调用 resolve({ buttonId: 'agree-btn', event:'agree' }),则触发当前 onNeedPrivacyAuthorization 事件的原隐私接口或组件会继续执行。其中 buttonId 为隐私同意授权按钮的id,为确保用户有同意的操作,基础库会检查对应的同意按钮是否被点击过。(Tips: 需要在`<button open-type="agreePrivacyAuthorization">` 组件的 bindagreeprivacyauthorization 事件触发后再调用 `resolve({ buttonId: 'agree-btn', event:'agree' })`) -* -* 如果调用 resolve({ event: 'disagree' }),则触发当前 onNeedPrivacyAuthorization 事件的原隐私接口或组件会失败并返回 `API:fail privacy permission is not authorized` 的错误信息。 -* -* 在调用 resolve({ event: 'agree'/'disagree' }) 之前,开发者可以调用 resolve({ event: 'exposureAuthorization' }) 把隐私弹窗曝光告知平台。 -* -* ### Object eventInfo -* -* eventInfo 是 onNeedPrivacyAuthorization 的第二个回调参数,表示触发本次 onNeedPrivacyAuthorization 事件的关联信息 -* -* | 属性 | 类型 | 说明 | -* | ---- | ---- | ---- | -* | referrer | string | 触发本次 onNeedPrivacyAuthorization 事件的接口或组件名(例如:"getUserProfile", "button.getPhoneNumber") | -* -* **** -* -* ## resolve 接口参数 -* -* | 属性 | 类型 | 是否必填 | 说明 | -* | ---- | ---- | ---- | ---- | -* | event | string | 是 | 用户操作类型 | -* | buttonId | string | 是 | 同意授权按钮的id (仅event=agree时必填) | -* -* ### event 合法值 -* -* | event | 说明 | -* | ---- | ---- | -* | exposureAuthorization | 自定义隐私弹窗曝光 | -* | agree | 用户同意隐私授权 | -* | disagree | 用户拒绝隐私授权 | -* -* **** -* -* ## 具体说明: -* -* - 1. 什么时候会触发 onNeedPrivacyAuthorization 事件? -* - 1. 调用隐私相关接口(比如 wx.getUserProfile、wx.getClipboardData)和组件(比如 `<button open-type="getPhoneNumber"></button>`),并且用户还未同意过隐私协议时 -* - 2. 调用 wx.requirePrivacyAuthorize 接口来模拟隐私接口调用,并且用户还未同意过隐私协议时 -* - 3. 如果用户已经同意过隐私协议,则不会再触发 onNeedPrivacyAuthorization 事件 -* - 2. 当触发 onNeedPrivacyAuthorization 事件时,触发该事件的隐私接口或组件会处于 pending 状态,等待用户授权后才会继续执行,此时开发者需要弹出自定义隐私弹窗,并在用户点击同意/拒绝后调用回调接口 resolve ,触发该事件的隐私接口或组件才会继续执行。 -* - 3. wx.onNeedPrivacyAuthorization 是覆盖式注册监听,若重复注册监听,则只有最后一次注册会生效。 -* - 4. 一定要注册 wx.onNeedPrivacyAuthorization 监听以及调用 resolve 吗? -* - 1. 不是的,如果能保证在调用隐私接口之前,用户已经轻触过了 `<button open-type="agreePrivacyAuthorization">` 按钮,那就不需要 wx.onNeedPrivacyAuthorization。 -* - 2. 但如果注册了 wx.onNeedPrivacyAuthorization 监听,则一定要调用 resolve 接口。 -* -* **示例代码** -* -* ```html -* // page.wxml -* <view wx:if="{{showPrivacy}}"> -* <view>隐私弹窗内容....</view> -* <button id="agree-btn" open-type="agreePrivacyAuthorization" bindagreeprivacyauthorization="handleAgreePrivacyAuthorization">同意</button> -* </view> -* ``` -* ```js -// page.js -Page({ - data: { - showPrivacy: false - }, - onLoad() { - wx.onNeedPrivacyAuthorization((resolve, eventInfo) => { - console.log('触发本次事件的接口是:' + eventInfo.referrer) - // 需要用户同意隐私授权时 - // 弹出开发者自定义的隐私授权弹窗 - this.setData({ - showPrivacy: true - }) - this.resolvePrivacyAuthorization = resolve - }) - - wx.getUserProfile({ - success: console.log, - fail: console.error - }) - }, - handleAgreePrivacyAuthorization() { - // 用户点击同意按钮后 - this.resolvePrivacyAuthorization({ buttonId: 'agree-btn', event: 'agree' }) - // 用户点击同意后,开发者调用 resolve({ buttonId: 'agree-btn', event: 'agree' }) 告知平台用户已经同意,参数传同意按钮的id。为确保用户有同意的操作,基础库在 resolve 被调用后,会去检查对应的同意按钮有没有被点击过。检查通过后,相关隐私接口会继续调用 - // 用户点击拒绝后,开发者调用 resolve({ event:'disagree' }) 告知平台用户已经拒绝 - } -}) -``` -* -* **完整示例demo** -* -* demo1: 演示使用 `wx.getPrivacySetting` 和 `<button open-type="agreePrivacyAuthorization">` 在首页处理隐私弹窗逻辑 -* [https://developers.weixin.qq.com/s/gi71sGm67hK0](https://developers.weixin.qq.com/s/gi71sGm67hK0) -* -* demo2: 演示使用 `wx.onNeedPrivacyAuthorization` 和 `<button open-type="agreePrivacyAuthorization">` 在多个页面处理隐私弹窗逻辑,同时演示了如何处理多个隐私接口同时调用。 -* [https://developers.weixin.qq.com/s/hndZUOmA7gKn](https://developers.weixin.qq.com/s/hndZUOmA7gKn) -* -* demo3: 演示 `wx.onNeedPrivacyAuthorization`、`wx.requirePrivacyAuthorize`、`<button open-type="agreePrivacyAuthorization">` 和 `<input type="nickname">` 组件如何结合使用 -* [https://developers.weixin.qq.com/s/jX7xWGmA7UKa](https://developers.weixin.qq.com/s/jX7xWGmA7UKa) -* -* demo4: 演示使用 `wx.onNeedPrivacyAuthorization` 和 `<button open-type="agreePrivacyAuthorization">` 在多个 tabBar 页面处理隐私弹窗逻辑。 -* [https://developers.weixin.qq.com/s/g6BWZGmt7XK9](https://developers.weixin.qq.com/s/g6BWZGmt7XK9) */ - onNeedPrivacyAuthorization( - /** 隐私接口需要用户授权事件的监听函数 */ - listener: OnNeedPrivacyAuthorizationCallback - ): void - /** [wx.onNetworkStatusChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/network/wx.onNetworkStatusChange.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:支持 -* -* 监听网络状态变化事件 -* -* **示例代码** -* -* ```js -wx.onNetworkStatusChange(function (res) { - console.log(res.isConnected) - console.log(res.networkType) -}) -``` */ - onNetworkStatusChange( - /** 网络状态变化事件的监听函数 */ - listener: OnNetworkStatusChangeCallback - ): void - /** [wx.onNetworkWeakChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/network/wx.onNetworkWeakChange.html) -* -* 需要基础库: `2.21.0` -* -* 在插件中使用:不支持 -* -* 监听弱网状态变化事件 -* -* **示例代码** -* -* ```js -wx.onNetworkWeakChange(function (res) { - console.log(res.weakNet) - console.log(res.networkType) -}) -// 取消监听 -wx.offNetworkWeakChange() -``` */ - onNetworkWeakChange( - /** 弱网状态变化事件的监听函数 */ - listener: OnNetworkWeakChangeCallback - ): void - /** [wx.onPageNotFound(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onPageNotFound.html) - * - * 需要基础库: `2.1.2` - * - * 在插件中使用:不支持 - * - * 监听小程序要打开的页面不存在事件。该事件与 [`App.onPageNotFound`](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html#onpagenotfoundobject-object) 的回调时机一致。 - * - * **注意** - * - * - 开发者可以在回调中进行页面重定向,但必须在回调中**同步**处理,异步处理(例如 `setTimeout` 异步执行)无效。 - * - 若开发者没有调用 [wx.onPageNotFound](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onPageNotFound.html) 绑定监听,也没有声明 `App.onPageNotFound`,当跳转页面不存在时,将推入微信客户端原生的页面不存在提示页面。 - * - 如果回调中又重定向到另一个不存在的页面,将推入微信客户端原生的页面不存在提示页面,并且不再第二次回调。 */ - onPageNotFound( - /** 小程序要打开的页面不存在事件的监听函数 */ - listener: OnPageNotFoundCallback - ): void - /** [wx.onScreenRecordingStateChanged(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/screen/wx.onScreenRecordingStateChanged.html) - * - * 需要基础库: `2.24.0` - * - * 在插件中使用:不支持 - * - * 监听用户录屏事件。 */ - onScreenRecordingStateChanged( - /** 用户录屏事件的监听函数 */ - listener: OnScreenRecordingStateChangedCallback - ): void - /** [wx.onSocketClose(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/wx.onSocketClose.html) - * - * 在插件中使用:不支持 - * - * @warning **推荐使用 [SocketTask](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.html) 的方式去管理 webSocket 链接,每一条链路的生命周期都更加可控,同时存在多个 webSocket 的链接的情况下使用 wx 前缀的方法可能会带来一些和预期不一致的情况。** - * - * 监听 WebSocket 连接关闭事件。 */ - onSocketClose( - /** WebSocket 连接关闭事件的监听函数 */ - listener: OnSocketCloseCallback - ): void - /** [wx.onSocketError(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/wx.onSocketError.html) - * - * 在插件中使用:不支持 - * - * @warning **推荐使用 [SocketTask](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.html) 的方式去管理 webSocket 链接,每一条链路的生命周期都更加可控,同时存在多个 webSocket 的链接的情况下使用 wx 前缀的方法可能会带来一些和预期不一致的情况。** - * - * 监听 WebSocket 错误事件。 */ - onSocketError( - /** WebSocket 错误事件的监听函数 */ - listener: OnSocketErrorCallback - ): void - /** [wx.onSocketMessage(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/wx.onSocketMessage.html) - * - * 在插件中使用:不支持 - * - * @warning **推荐使用 [SocketTask](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.html) 的方式去管理 webSocket 链接,每一条链路的生命周期都更加可控,同时存在多个 webSocket 的链接的情况下使用 wx 前缀的方法可能会带来一些和预期不一致的情况。** - * - * 监听 WebSocket 接收到服务器的消息事件。 */ - onSocketMessage( - /** WebSocket 接收到服务器的消息事件的监听函数 */ - listener: OnSocketMessageCallback - ): void - /** [wx.onSocketOpen(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/wx.onSocketOpen.html) - * - * 在插件中使用:不支持 - * - * @warning **推荐使用 [SocketTask](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.html) 的方式去管理 webSocket 链接,每一条链路的生命周期都更加可控,同时存在多个 webSocket 的链接的情况下使用 wx 前缀的方法可能会带来一些和预期不一致的情况。** - * - * 监听 WebSocket 连接打开事件。 */ - onSocketOpen( - /** WebSocket 连接打开事件的监听函数 */ - listener: OnSocketOpenCallback - ): void - /** [wx.onThemeChange(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onThemeChange.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 监听系统主题改变事件。该事件与 [`App.onThemeChange`](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html#onThemeChange-Object-object) 的回调时机一致。 - * - * **注意** - * - * - 只有在全局配置"darkmode": true时才会触发此事件。 */ - onThemeChange( - /** 系统主题改变事件的监听函数 */ - listener: OnThemeChangeCallback - ): void - /** [wx.onUnhandledRejection(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onUnhandledRejection.html) - * - * 需要基础库: `2.10.0` - * - * 在插件中使用:不支持 - * - * 监听未处理的 Promise 拒绝事件。该事件与 [`App.onUnhandledRejection`](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html#onUnhandledRejection-Object-object) 的回调时机与参数一致。 - * - * **注意** - * - * - 所有的 unhandledRejection 都可以被这一监听捕获,但只有 Error 类型的才会在小程序后台触发报警。 */ - onUnhandledRejection( - /** 未处理的 Promise 拒绝事件的监听函数 */ - listener: OnUnhandledRejectionCallback - ): void - /** [wx.onUserCaptureScreen(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/screen/wx.onUserCaptureScreen.html) -* -* 需要基础库: `1.4.0` -* -* 在插件中使用:不支持 -* -* 监听用户主动截屏事件。用户使用系统截屏按键截屏时触发,只能注册一个监听 -* -* **示例代码** -* -* ```js -wx.onUserCaptureScreen(function (res) { - console.log('用户截屏了') - return { - query: "parameter=test", // 通过截屏图片打开小程序的query参数 - promise: new Promise((resolve) => { // 通过promise延时传递小程序的query参数 - setTimeout(() => { - resolve({ - query: "parameter=test2", - }) - }, 1000) // 在1秒内对query进行解析 - }) - } - } - ) -``` */ - onUserCaptureScreen( - /** 用户主动截屏事件的监听函数 */ - listener: OnUserCaptureScreenCallback - ): void - /** [wx.onVoIPChatInterrupted(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.onVoIPChatInterrupted.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 监听被动断开实时语音通话事件。包括小游戏切入后端时断开 */ - onVoIPChatInterrupted( - /** 被动断开实时语音通话事件的监听函数 */ - listener: OnVoIPChatInterruptedCallback - ): void - /** [wx.onVoIPChatMembersChanged(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.onVoIPChatMembersChanged.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 监听实时语音通话成员在线状态变化事件。有成员加入/退出通话时触发回调 */ - onVoIPChatMembersChanged( - /** 实时语音通话成员在线状态变化事件的监听函数 */ - listener: OnVoIPChatMembersChangedCallback - ): void - /** [wx.onVoIPChatSpeakersChanged(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.onVoIPChatSpeakersChanged.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 监听实时语音通话成员通话状态变化事件。有成员开始/停止说话时触发回调 */ - onVoIPChatSpeakersChanged( - /** 实时语音通话成员通话状态变化事件的监听函数 */ - listener: OnVoIPChatSpeakersChangedCallback - ): void - /** [wx.onVoIPChatStateChanged(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.onVoIPChatStateChanged.html) - * - * 需要基础库: `2.16.0` - * - * 在插件中使用:不支持 - * - * 监听房间状态变化事件。 */ - onVoIPChatStateChanged( - /** 房间状态变化事件的监听函数 */ - listener: OnVoIPChatStateChangedCallback - ): void - /** [wx.onVoIPVideoMembersChanged(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.onVoIPVideoMembersChanged.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:不支持 - * - * 监听实时语音通话成员视频状态变化事件。 */ - onVoIPVideoMembersChanged( - /** 实时语音通话成员视频状态变化事件的监听函数 */ - listener: OnVoIPVideoMembersChangedCallback - ): void - /** [wx.onWifiConnected(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.onWifiConnected.html) - * - * 需要基础库: `1.6.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 监听连接上 Wi-Fi 的事件 */ - onWifiConnected( - /** 连接上 Wi-Fi 的事件的监听函数 */ - listener: OnWifiConnectedCallback - ): void - /** [wx.onWifiConnectedWithPartialInfo(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.onWifiConnectedWithPartialInfo.html) - * - * 需要基础库: `2.22.0` - * - * 在插件中使用:需要基础库 `2.22.1` - * - * 监听连接上 Wi-Fi 的事件 */ - onWifiConnectedWithPartialInfo( - /** 连接上 Wi-Fi 的事件的监听函数 */ - listener: OnWifiConnectedWithPartialInfoCallback - ): void - /** [wx.onWindowResize(function listener)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/window/wx.onWindowResize.html) - * - * 需要基础库: `2.3.0` - * - * 在插件中使用:不支持 - * - * 监听窗口尺寸变化事件 */ - onWindowResize( - /** 窗口尺寸变化事件的监听函数 */ - listener: OnWindowResizeCallback - ): void - /** [wx.openAppAuthorizeSetting(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.openAppAuthorizeSetting.html) -* -* 需要基础库: `2.20.1` -* -* 在插件中使用:需要基础库 `2.21.3` -* -* 跳转系统微信授权管理页 -* -* **示例代码** -* -* ```js -wx.openAppAuthorizeSetting({ - success (res) { - console.log(res) - } -}) -``` */ - openAppAuthorizeSetting< - T extends OpenAppAuthorizeSettingOption = OpenAppAuthorizeSettingOption - >( - option?: T - ): PromisifySuccessResult<T, OpenAppAuthorizeSettingOption> - /** [wx.openBluetoothAdapter(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.openBluetoothAdapter.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 初始化蓝牙模块。iOS 上开启主机/从机(外围设备)模式时需分别调用一次,并指定对应的 `mode`。 -* -* **object.fail 回调函数返回的 state 参数(仅 iOS)** -* -* | 状态码 | 说明 | -* | ------ | ------ | -* | 0 | 未知 | -* | 1 | 重置中 | -* | 2 | 不支持 | -* | 3 | 未授权 | -* | 4 | 未开启 | -* -* **注意** -* -* - 其他蓝牙相关 API 必须在 [wx.openBluetoothAdapter](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.openBluetoothAdapter.html) 调用之后使用。否则 API 会返回错误(errCode=10000)。 -* - 在用户蓝牙开关未开启或者手机不支持蓝牙功能的情况下,调用 [wx.openBluetoothAdapter](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.openBluetoothAdapter.html) 会返回错误(errCode=10001),表示手机蓝牙功能不可用。此时小程序蓝牙模块已经初始化完成,可通过 [wx.onBluetoothAdapterStateChange](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.onBluetoothAdapterStateChange.html) 监听手机蓝牙状态的改变,也可以调用蓝牙模块的所有API。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.openBluetoothAdapter({ - success (res) { - console.log(res) - } -}) -``` */ - openBluetoothAdapter< - T extends OpenBluetoothAdapterOption = OpenBluetoothAdapterOption - >( - option?: T - ): PromisifySuccessResult<T, OpenBluetoothAdapterOption> - /** [wx.openCard(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/card/wx.openCard.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:不支持 -* -* 查看微信卡包中的卡券。只有通过 [认证](https://developers.weixin.qq.com/miniprogram/product/renzheng.html) 的小程序或文化互动类目的小游戏才能使用。更多文档请参考 [微信卡券接口文档](https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&key=1490190158&version=1&lang=zh_CN&platform=2)。 -* -* **示例代码** -* -* ```js -wx.openCard({ - cardList: [{ - cardId: '', - code: '' - }, { - cardId: '', - code: '' - }], - success (res) { } -}) -``` */ - openCard<T extends OpenCardOption = OpenCardOption>( - option: T - ): PromisifySuccessResult<T, OpenCardOption> - /** [wx.openChannelsActivity(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/channels/wx.openChannelsActivity.html) - * - * 需要基础库: `2.19.2` - * - * 在插件中使用:不支持 - * - * 打开视频号视频 */ - openChannelsActivity(option: OpenChannelsActivityOption): void - /** [wx.openChannelsEvent(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/channels/wx.openChannelsEvent.html) - * - * 需要基础库: `2.21.0` - * - * 在插件中使用:不支持 - * - * 打开视频号活动页 */ - openChannelsEvent(option: OpenChannelsEventOption): void - /** [wx.openChannelsLive(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/channels/wx.openChannelsLive.html) - * - * 需要基础库: `2.15.0` - * - * 在插件中使用:不支持 - * - * 打开视频号直播 */ - openChannelsLive(option: OpenChannelsLiveOption): void - /** [wx.openChannelsUserProfile(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/channels/wx.openChannelsUserProfile.html) - * - * 需要基础库: `2.21.2` - * - * 在插件中使用:支持 - * - * 打开视频号主页。若为插件环境,只允许在插件页面中调用。 */ - openChannelsUserProfile(option: OpenChannelsUserProfileOption): void - /** [wx.openCustomerServiceChat(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/service-chat/wx.openCustomerServiceChat.html) -* -* 需要基础库: `2.19.0` -* -* 在插件中使用:不支持 -* -* 打开微信客服,页面产生点击事件(例如 button 上 bindtap 的回调中)后才可调用。了解更多信息,可以参考[微信客服介绍](https://work.weixin.qq.com/kf/)。 -* -* **示例代码** -* -* ```js -wx.openCustomerServiceChat({ - extInfo: {url: ''}, - corpId: '', - success(res) {} -}) -``` */ - openCustomerServiceChat(option: OpenCustomerServiceChatOption): void - /** [wx.openDocument(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/wx.openDocument.html) - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 新开页面打开文档。微信客户端 `7.0.12` 版本前默认显示右上角菜单按钮,之后的版本默认不显示,需主动传入 `showMenu`。 */ - openDocument<T extends OpenDocumentOption = OpenDocumentOption>( - option: T - ): PromisifySuccessResult<T, OpenDocumentOption> - /** [wx.openEmbeddedMiniProgram(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.openEmbeddedMiniProgram.html) - * - * 需要基础库: `2.20.1` - * - * 在插件中使用:需要基础库 `2.26.2` - * - * 打开半屏小程序。接入指引请参考 [半屏小程序能力](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/openEmbeddedMiniProgram.html)。 */ - openEmbeddedMiniProgram< - T extends OpenEmbeddedMiniProgramOption = OpenEmbeddedMiniProgramOption - >( - option: T - ): PromisifySuccessResult<T, OpenEmbeddedMiniProgramOption> - /** [wx.openHKOfflinePayView(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/payment/wx.openHKOfflinePayView.html) -* -* 需要基础库: `3.4.4` -* -* 在插件中使用:不支持 -* -* 拉起WeChat Pay HK付款码。 -* -* 接入步骤: -* 1. 商户需已经开通微信港币钱包WeChat Pay HK的支付权限, -* 2.请用商户在微信支付入驻时预留的邮箱,发起邮件申请接入权限: -* - 【收件人】hkpayment@wechat.com -* - 【邮件主题】申请接入拉起WeChat Pay HK付款码+商户名称:***+商户号:*** -* - 【邮件内容】因XXX原因(原因请按商户实际情况填写,不合理会驳回),需申请拉起WeChat Pay HK付款码,申请材料如下: -* - 商户名称 -* - 商户号 -* - 商户资质材料扫描件或照片(CI,BR任一),所有材料均需清晰,且有盖章 -* - 拉起WeChat Pay HK付款码的场景说明:需有文字和示意图说明 -* - 商户联系方式:邮件***,联系电话*** -* -* **示例代码** -* -* ```js -wx.openHKOfflinePayView({ - timeStamp: '', - nonceStr: '', - package: '', - signType: 'SHA1', - paySign: '', - success (res) { }, - fail (res) { } -}) -``` */ - openHKOfflinePayView(option: OpenHKOfflinePayViewOption): void - /** [wx.openLocation(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.openLocation.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 使用微信内置地图查看位置 -* -* **示例代码** -* -* ```js - wx.getLocation({ - type: 'gcj02', //返回可以用于wx.openLocation的经纬度 - success (res) { - const latitude = res.latitude - const longitude = res.longitude - wx.openLocation({ - latitude, - longitude, - scale: 18 - }) - } -}) - ``` */ - openLocation<T extends OpenLocationOption = OpenLocationOption>( - option: T - ): PromisifySuccessResult<T, OpenLocationOption> - /** [wx.openOfficialAccountArticle(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.openOfficialAccountArticle.html) -* -* 需要基础库: `3.4.8` -* -* 在插件中使用:不支持 -* -* 通过小程序打开任意公众号文章(不包括临时链接等异常状态下的公众号文章),必须有点击行为才能调用成功。 -* -* **示例代码** -* -* ```js - wx.openOfficialAccountArticle({ - url:'', // 此处填写公众号文章连接 - success: res => { - }, - fail: res => { - } - }) -``` */ - openOfficialAccountArticle( - option: OpenOfficialAccountArticleOption - ): void - /** [wx.openPrivacyContract(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/privacy/wx.openPrivacyContract.html) -* -* 需要基础库: `2.32.3` -* -* 在插件中使用:不支持 -* -* 跳转至隐私协议页面。隐私合规开发指南详情可见[《小程序隐私协议开发指南》](https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html) -* -* **** -* -* ## 具体说明: -* -* - 1. 一定要调用 wx.openPrivacyContract 接口吗? -* -* - 不是。开发者也可以选择在小程序页面内自行展示完整的隐私协议。但推荐使用该接口。 -* -* **示例代码** -* -* ```js -wx.openPrivacyContract({ - success: () => {}, // 打开成功 - fail: () => {}, // 打开失败 - complete: () => {} -}) -``` -* -* **完整示例demo** -* -* demo1: 演示使用 `wx.getPrivacySetting` 和 `<button open-type="agreePrivacyAuthorization">` 在首页处理隐私弹窗逻辑 -* [https://developers.weixin.qq.com/s/gi71sGm67hK0](https://developers.weixin.qq.com/s/gi71sGm67hK0) -* -* demo2: 演示使用 `wx.onNeedPrivacyAuthorization` 和 `<button open-type="agreePrivacyAuthorization">` 在多个页面处理隐私弹窗逻辑,同时演示了如何处理多个隐私接口同时调用。 -* [https://developers.weixin.qq.com/s/hndZUOmA7gKn](https://developers.weixin.qq.com/s/hndZUOmA7gKn) -* -* demo3: 演示 `wx.onNeedPrivacyAuthorization`、`wx.requirePrivacyAuthorize`、`<button open-type="agreePrivacyAuthorization">` 和 `<input type="nickname">` 组件如何结合使用 -* [https://developers.weixin.qq.com/s/jX7xWGmA7UKa](https://developers.weixin.qq.com/s/jX7xWGmA7UKa) -* -* demo4: 演示使用 `wx.onNeedPrivacyAuthorization` 和 `<button open-type="agreePrivacyAuthorization">` 在多个 tabBar 页面处理隐私弹窗逻辑。 -* [https://developers.weixin.qq.com/s/g6BWZGmt7XK9](https://developers.weixin.qq.com/s/g6BWZGmt7XK9) */ - openPrivacyContract(option: OpenPrivacyContractOption): void - /** [wx.openSetting(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/wx.openSetting.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `2.10.3` -* -* 调起客户端小程序设置界面,返回用户设置的操作结果。**设置界面只会出现小程序已经向用户请求过的[权限](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html)**。 -* -* **** -* -* - 注意:[2.3.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 版本开始,用户发生点击行为后,才可以跳转打开设置页,管理授权信息。[详情](https://developers.weixin.qq.com/community/develop/doc/000cea2305cc5047af5733de751008) -* -* **示例代码** -* -* ```js -wx.openSetting({ - success (res) { - console.log(res.authSetting) - // res.authSetting = { - // "scope.userInfo": true, - // "scope.userLocation": true - // } - } -}) -``` */ - openSetting<T extends OpenSettingOption = OpenSettingOption>( - option?: T - ): PromisifySuccessResult<T, OpenSettingOption> - /** [wx.openSingleStickerView(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/sticker/wx.openSingleStickerView.html) -* -* 需要基础库: `3.0.1` -* -* 在插件中使用:不支持 -* -* 打开单个表情 -* -* **示例代码** -* -* ```js -wx.openSingleStickerView({ - url: '', - success(res) {} -}) -``` */ - openSingleStickerView(option: OpenSingleStickerViewOption): void - /** [wx.openStickerIPView(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/sticker/wx.openStickerIPView.html) -* -* 需要基础库: `3.0.1` -* -* 在插件中使用:不支持 -* -* 打开表情IP合辑 -* -* **示例代码** -* -* ```js -wx.openStickerIPView({ - url: '', - success(res) {} -}) -``` */ - openStickerIPView(option: OpenStickerIPViewOption): void - /** [wx.openStickerSetView(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/sticker/wx.openStickerSetView.html) -* -* 需要基础库: `3.0.1` -* -* 在插件中使用:不支持 -* -* 打开表情专辑 -* -* **示例代码** -* -* ```js -wx.openStickerSetView({ - url: '', - success(res) {} -}) -``` */ - openStickerSetView(option: OpenStickerSetViewOption): void - /** [wx.openSystemBluetoothSetting(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.openSystemBluetoothSetting.html) -* -* 需要基础库: `2.20.1` -* -* 在插件中使用:需要基础库 `2.21.3` -* -* 跳转系统蓝牙设置页。仅支持安卓。 -* -* **示例代码** -* -* ```js -wx.openSystemBluetoothSetting({ - success (res) { - console.log(res) - } -}) -``` */ - openSystemBluetoothSetting< - T extends OpenSystemBluetoothSettingOption = OpenSystemBluetoothSettingOption - >( - option?: T - ): PromisifySuccessResult<T, OpenSystemBluetoothSettingOption> - /** [wx.openVideoEditor(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.openVideoEditor.html) - * - * 需要基础库: `2.12.0` - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 打开视频编辑器 */ - openVideoEditor(option: OpenVideoEditorOption): void - /** [wx.pageScrollTo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/scroll/wx.pageScrollTo.html) -* -* 需要基础库: `1.4.0` -* -* 在插件中使用:需要基础库 `2.1.0` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 将页面滚动到目标位置,支持选择器和滚动距离两种方式定位 -* -* **selector 语法** -* -* selector类似于 CSS 的选择器,但仅支持下列语法。 -* -* + ID选择器:#the-id -* + class选择器(可以连续指定多个):.a-class.another-class -* + 子元素选择器:.the-parent > .the-child -* + 后代选择器:.the-ancestor .the-descendant -* + 跨自定义组件的后代选择器:.the-ancestor >>> .the-descendant -* + 多选择器的并集:#a-node, .some-other-nodes -* -* **示例代码** -* -* ```js -wx.pageScrollTo({ - scrollTop: 0, - duration: 300 -}) -``` */ - pageScrollTo<T extends PageScrollToOption = PageScrollToOption>( - option: T - ): PromisifySuccessResult<T, PageScrollToOption> - /** [wx.pauseBackgroundAudio(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.pauseBackgroundAudio.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [1.2.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getBackgroundAudioManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioManager.html) 替换 -* -* 暂停播放音乐。 -* -* **示例代码** -* -* ```js -wx.pauseBackgroundAudio() -``` */ - pauseBackgroundAudio< - T extends PauseBackgroundAudioOption = PauseBackgroundAudioOption - >( - option?: T - ): PromisifySuccessResult<T, PauseBackgroundAudioOption> - /** [wx.pauseVoice(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.pauseVoice.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [1.6.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.createInnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createInnerAudioContext.html) 替换 -* -* 暂停正在播放的语音。再次调用 [wx.playVoice](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.playVoice.html) 播放同一个文件时,会从暂停处开始播放。如果想从头开始播放,需要先调用 [wx.stopVoice](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.stopVoice.html)。 -* -* **示例代码** -* -* ```js -wx.startRecord({ - success (res) { - const tempFilePath = res.tempFilePath - wx.playVoice({ - filePath: tempFilePath - }) - - setTimeout(() => { wx.pauseVoice() }, 5000) - } -}) -``` */ - pauseVoice<T extends PauseVoiceOption = PauseVoiceOption>( - option?: T - ): PromisifySuccessResult<T, PauseVoiceOption> - /** [wx.playBackgroundAudio(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.playBackgroundAudio.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [1.2.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getBackgroundAudioManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioManager.html) 替换 -* -* 使用后台播放器播放音乐。对于微信客户端来说,只能同时有一个后台音乐在播放。当用户离开小程序后,音乐将暂停播放;当用户在其他小程序占用了音乐播放器,原有小程序内的音乐将停止播放。 -* -* **示例代码** -* -* ```js -wx.playBackgroundAudio({ - dataUrl: '', - title: '', - coverImgUrl: '' -}) -``` */ - playBackgroundAudio< - T extends PlayBackgroundAudioOption = PlayBackgroundAudioOption - >( - option: T - ): PromisifySuccessResult<T, PlayBackgroundAudioOption> - /** [wx.playVoice(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.playVoice.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [1.6.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.createInnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createInnerAudioContext.html) 替换 -* -* 开始播放语音。同时只允许一个语音文件正在播放,如果前一个语音文件还没播放完,将中断前一个语音播放。 -* -* **示例代码** -* -* ```js -wx.startRecord({ - success (res) { - const tempFilePath = res.tempFilePath - wx.playVoice({ - filePath: tempFilePath, - complete () { } - }) - } -}) -``` */ - playVoice<T extends PlayVoiceOption = PlayVoiceOption>( - option: T - ): PromisifySuccessResult<T, PlayVoiceOption> - /** [wx.pluginLogin(Object args)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.pluginLogin.html) - * - * 需要基础库: `2.20.1` - * - * 在插件中使用:需要基础库 `2.20.1` - * - * __该接口仅在小程序插件中可调用__,调用接口获得插件用户标志凭证(code)。插件可以此凭证换取用于识别用户的标识 openpid。用户不同、宿主小程序不同或插件不同的情况下,该标识均不相同,即当且仅当同一个用户在同一个宿主小程序中使用同一个插件时,openpid 才会相同。 */ - pluginLogin(args?: PluginLoginOption): void - /** [wx.postMessageToReferrerMiniProgram(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.postMessageToReferrerMiniProgram.html) - * - * 需要基础库: `3.2.1` - * - * 在插件中使用:不支持 - * - * 向跳转的源小程序发送消息,源小程序可在 [wx.onShow](#) 或 [wx.getEnterOptionsSync](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/life-cycle/wx.getEnterOptionsSync.html) 中通过 extraData 接收消息。 - * - * **** - * - * 多次调用会覆盖之前传递的消息,通过 [wx.navigateBackMiniProgram](https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.navigateBackMiniProgram.html) 传递 extraData 也会覆盖消息。 - * - * **** - * - * 在触发返回后传递的消息不会被收到。 */ - postMessageToReferrerMiniProgram( - option: PostMessageToReferrerMiniProgramOption - ): void - /** [wx.preloadAssets(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/wx.preloadAssets.html) -* -* 需要基础库: `2.22.1` -* -* 在插件中使用:不支持 -* -* 为视图层预加载媒体资源文件, 目前支持:font,image -* -* **示例代码** -* -* ```js -wx.preloadAssets({ - data: [ - { - type: 'image', - src: imgUrl, - }, - ], - success(resp) { - console.log('preloadAssets success', resp) - }, - fail(err) { - console.log('preloadAssets fail', err) - }, -}) -``` -* -* **** -* -* - 开发过程中,可在开发者工具network面板查看预加载情况。 */ - preloadAssets(option: PreloadAssetsOption): void - /** [wx.preloadSkylineView(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/wx.preloadSkylineView.html) - * - * 需要基础库: `2.24.7` - * - * 在插件中使用:需要基础库 `2.24.7` - * - * 预加载下个页面所需要的 [Skyline](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html) 运行环境。 */ - preloadSkylineView(option?: PreloadSkylineViewOption): void - /** [wx.preloadWebview(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/wx.preloadWebview.html) - * - * 需要基础库: `2.15.0` - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 预加载下个页面的 WebView。参见[预加载下个页面的时机](https://developers.weixin.qq.com/miniprogram/dev/framework/performance/tips/runtime_nav.html#_2-4-控制预加载下个页面的时机) */ - preloadWebview(option?: PreloadWebviewOption): void - /** [wx.previewImage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.previewImage.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 在新页面中全屏预览图片。预览的过程中用户可以进行保存图片、发送给朋友等操作。 -* -* **支持长按识别的码** -* -* | 类型 | 说明 | 最低版本 | -* |------|------| -------| -* | 小程序码 | | -* | 微信个人码 | | [2.18.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) | -* | 企业微信个人码 | | [2.18.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) | -* | 普通群码 | 指仅包含微信用户的群 | [2.18.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) | -* | 互通群码 | 指既有微信用户也有企业微信用户的群 | [2.18.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) | -* | 公众号二维码 | | [2.18.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) | -* -* **示例代码** -* -* ```js -wx.previewImage({ - current: '', // 当前显示图片的http链接 - urls: [] // 需要预览的图片http链接列表 -}) -``` */ - previewImage<T extends PreviewImageOption = PreviewImageOption>( - option: T - ): PromisifySuccessResult<T, PreviewImageOption> - /** [wx.previewMedia(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.previewMedia.html) - * - * 需要基础库: `2.12.0` - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 预览图片和视频。 - * - * **支持长按识别的码** - * - * | 类型 | 说明 | 最低版本 | - * |------|------| -------| - * | 小程序码 | | - * | 微信个人码 | 不支持小游戏 | [2.18.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) | - * | 企业微信个人码 | 不支持小游戏 | [2.18.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) | - * | 普通群码 | 指仅包含微信用户的群,不支持小游戏 | [2.18.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) | - * | 互通群码 | 指既有微信用户也有企业微信用户的群,不支持小游戏 | [2.18.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) | - * | 公众号二维码 | 不支持小游戏 | [2.18.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) | */ - previewMedia<T extends PreviewMediaOption = PreviewMediaOption>( - option: T - ): PromisifySuccessResult<T, PreviewMediaOption> - /** [wx.reLaunch(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.reLaunch.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `2.3.1` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 关闭所有页面,打开到应用内的某个页面 -* -* **示例代码** -* -* ```js -wx.reLaunch({ - url: 'test?id=1' -}) -``` -* -* ```html -* // test -* Page({ -* onLoad (option) { -* console.log(option.query) -* } -* }) -* ``` */ - reLaunch<T extends ReLaunchOption = ReLaunchOption>( - option: T - ): PromisifySuccessResult<T, ReLaunchOption> - /** [wx.readBLECharacteristicValue(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.readBLECharacteristicValue.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 读取蓝牙低功耗设备特征值的二进制数据。注意:必须设备的特征支持 read 才可以成功调用。 -* -* **注意** -* -* - 并行调用多次会存在读失败的可能性。 -* - 接口读取到的信息需要在 [wx.onBLECharacteristicValueChange](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.onBLECharacteristicValueChange.html) 方法注册的回调中获取。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -// 必须在这里的回调才能获取 -wx.onBLECharacteristicValueChange(function(characteristic) { - console.log('characteristic value comed:', characteristic) -}) - -wx.readBLECharacteristicValue({ - // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 - deviceId, - // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取 - serviceId, - // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取 - characteristicId, - success (res) { - console.log('readBLECharacteristicValue:', res.errCode) - } -}) -``` */ - readBLECharacteristicValue< - T extends ReadBLECharacteristicValueOption = ReadBLECharacteristicValueOption - >( - option: T - ): PromisifySuccessResult<T, ReadBLECharacteristicValueOption> - /** [wx.redirectTo(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.redirectTo.html) -* -* 在插件中使用:需要基础库 `2.2.2` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。 -* -* **示例代码** -* -* ```js -wx.redirectTo({ - url: 'test?id=1' -}) -``` */ - redirectTo<T extends RedirectToOption = RedirectToOption>( - option: T - ): PromisifySuccessResult<T, RedirectToOption> - /** [wx.removeStorage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.removeStorage.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 从本地缓存中移除指定 key。 -* -* **示例代码** -* -* ```js -wx.removeStorage({ - key: 'key', - success (res) { - console.log(res) - } -}) -``` -* -* ```js -try { - wx.removeStorageSync('key') -} catch (e) { - // Do something when catch error -} -``` */ - removeStorage<T extends RemoveStorageOption = RemoveStorageOption>( - option: T - ): PromisifySuccessResult<T, RemoveStorageOption> - /** [wx.removeStorageSync(string key)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.removeStorageSync.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* [wx.removeStorage](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.removeStorage.html) 的同步版本 -* -* **示例代码** -* -* ```js -wx.removeStorage({ - key: 'key', - success (res) { - console.log(res) - } -}) -``` -* -* ```js -try { - wx.removeStorageSync('key') -} catch (e) { - // Do something when catch error -} -``` */ - removeStorageSync( - /** 本地缓存中指定的 key */ - key: string - ): void - /** [wx.removeTabBarBadge(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/tab-bar/wx.removeTabBarBadge.html) - * - * 需要基础库: `1.9.0` - * - * 在插件中使用:不支持 - * - * 移除 tabBar 某一项右上角的文本 */ - removeTabBarBadge< - T extends RemoveTabBarBadgeOption = RemoveTabBarBadgeOption - >( - option: T - ): PromisifySuccessResult<T, RemoveTabBarBadgeOption> - /** [wx.reportAnalytics(string eventName, Object data)](https://developers.weixin.qq.com/miniprogram/dev/api/data-analysis/wx.reportAnalytics.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 在插件中使用时,可以被正常调用,但目前不会进行统计展示 -* @deprecated 基础库版本 [2.31.1](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.reportEvent](https://developers.weixin.qq.com/miniprogram/dev/api/data-analysis/wx.reportEvent.html) 替换 -* -* 自定义分析数据上报接口。使用前,需要在小程序管理后台自定义分析中新建事件,配置好事件名与字段。 -* -* **示例代码** -* -* ```js -wx.reportAnalytics('purchase', { - price: 120, - color: 'red' -}) -``` */ - reportAnalytics( - /** 事件名 */ - eventName: string, - /** 上报的自定义数据,key 为配置中的字段名,value 为上报的数据。 */ - data: IAnyObject - ): void - /** [wx.reportEvent(string eventId, object data)](https://developers.weixin.qq.com/miniprogram/dev/api/data-analysis/wx.reportEvent.html) - * - * 需要基础库: `2.14.4` - * - * 在插件中使用:不支持 - * - * 事件上报 */ - reportEvent( - /** 在 mp 实验系统中设置的事件英文名 */ - eventId: string, - /** 可被 JSON.stringify 的对象,将一起上报至系统 */ - data?: IAnyObject - ): void - /** [wx.reportMonitor(string name, number value)](https://developers.weixin.qq.com/miniprogram/dev/api/data-analysis/wx.reportMonitor.html) -* -* 需要基础库: `2.0.1` -* -* 在插件中使用:不支持 -* @deprecated 基础库版本 [2.31.1](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.reportEvent](https://developers.weixin.qq.com/miniprogram/dev/api/data-analysis/wx.reportEvent.html) 替换 -* -* 自定义业务数据监控上报接口。 -* -* **使用说明** -* -* 使用前,需要在「小程序管理后台-运维中心-性能监控-业务数据监控」中新建监控事件,配置监控描述与告警类型。每一个监控事件对应唯一的监控ID,开发者最多可以创建128个监控事件。 -* -* **示例代码** -* -* ```js -wx.reportMonitor('1', 1) -``` */ - reportMonitor( - /** 监控ID,在「小程序管理后台」新建数据指标后获得 */ - name: string, - /** 上报数值,经处理后会在「小程序管理后台」上展示每分钟的上报总量 */ - value: number - ): void - /** [wx.reportPerformance(Number id, Number value, String|Array dimensions)](https://developers.weixin.qq.com/miniprogram/dev/api/base/performance/wx.reportPerformance.html) -* -* 需要基础库: `2.9.2` -* -* 在插件中使用:需要基础库 `2.9.3` -* -* 小程序测速上报。使用前,需要在小程序管理后台配置。 -* -* **示例代码** -* -* ```js -wx.reportPerformance(1101, 680) -wx.reportPerformance(1101, 680, 'custom') -``` */ - reportPerformance( - /** 指标 id */ - id: number, - /** 需要上报的数值 */ - value: number, - /** 自定义维度 (选填) */ - dimensions?: string | any[] - ): void - /** [wx.requestCommonPayment(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/payment/wx.requestCommonPayment.html) -* -* 需要基础库: `2.19.2` -* -* 在插件中使用:不支持 -* -* 发起通用支付。目前该接口仅支持 B2b 支付类型。 -* -* **** -* -* ## 注意事项: -* -* **示例代码** -* -* ```js - wx.requestCommonPayment({ - signData: JSON.stringify({ - mchid: '1234567890', - out_trade_no: 'test1244', - description: '测试测试', - amount: { - order_amount: 1, - currency: 'CNY' - }, - attach: 'test_attach', - product_info: { - product_list: [{ - spu_id: 'spu123456', - sku_id: 'sku123', - title: 'QQ长鹅', - path: 'pages/index', - head_img: 'https://mp.weixin.qq.com/123', - category: '玩偶', - sku_attr: '50cm', - org_price: 5000, - sale_price: 4000, - quantity: 5 - }] - }, - delivery_type: 2, - env: 0 - }), - paySig: 'd0b8bbccbe109b11549bcfd6602b08711f46600965253a949cd6a2b895152f9d', - signature: 'd0b8bbccbe109b11549bcfd6602b08711f46600965253a949cd6a2b895152f9d', - mode: 'retail_pay_goods', - success(res) { - console.log('requestCommonPayment success', res) - }, - fail({ errMsg, errno }) { - console.error(errMsg, errno) - }, - }) -``` */ - requestCommonPayment(option: RequestCommonPaymentOption): void - /** [wx.requestDeviceVoIP(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/device-voip/wx.requestDeviceVoIP.html) -* -* 需要基础库: `2.27.3` -* -* 在插件中使用:不支持 -* -* 请求用户授权与设备(组)间进行音视频通话。 -* -* **示例代码** -* -* ```js -// 授权单台设备 -wx.requestDeviceVoIP({ - sn: 'xxxx', - snTicket: 'xxxxx', - modelId: 'xxx', - deviceName: 'xxx', - success(res) { - console.log(res) - }, - fail(res) { - console.log(res) - } -}) - -// 批量授权(授权设备组) -wx.requestDeviceVoIP({ - isGroup: true, - groupId: '设备组 ID', - success(res) { - console.log(res) - }, - fail(res) { - console.log(res) - } -}) -``` */ - requestDeviceVoIP(option: RequestDeviceVoIPOption): void - /** [wx.requestMerchantTransfer(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/payment/wx.requestMerchantTransfer.html) -* -* 需要基础库: `3.3.0` -* -* 在插件中使用:不支持 -* -* 商家转账用户确认模式下,在微信客户端通过小程序拉起页面请求用户确认收款。调用前需在微信支付商户平台/合作伙伴平台-产品中心,申请开通商家转账。 -* -* **示例代码** -* -* ```js -wx.requestMerchantTransfer({ - mchId: '', - subMchId: '', - appId: '', - subAppId: '', - package: '', - openId: '', - success (res) { }, - fail (res) { } -}) -``` */ - requestMerchantTransfer(option: RequestMerchantTransferOption): void - /** [wx.requestOrderPayment(Object args)](https://developers.weixin.qq.com/miniprogram/dev/api/payment/wx.requestOrderPayment.html) - * - * 需要基础库: `2.16.0` - * - * 在插件中使用:不支持 - * - * 仅接入了[自定义版交易组件](https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent2/Introduction2)的小程序需要使用,普通小程序可直接使用 [`wx.requestPayment`](https://developers.weixin.qq.com/miniprogram/dev/api/payment/wx.requestPayment.html)。 - * - * **前置检查** - * - * 接入自定义版交易组件之后,若要发起微信支付,请先查询[需要校验的场景](https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent2/API/order/check_scene)。 - * 在需要校验的场景中,发起微信支付时,必须使用该接口,需要按照要求传入相关的[订单信息](https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent2/API/order/add_order)进行校验,校验通过后用户才可以完成当前订单的支付,非需要校验的场景则可以按照商家要求自行选择传入订单信息或不传入。 */ - requestOrderPayment< - T extends RequestOrderPaymentOption = RequestOrderPaymentOption - >( - args: T - ): PromisifySuccessResult<T, RequestOrderPaymentOption> - /** [wx.requestPayment(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/payment/wx.requestPayment.html) -* -* 在插件中使用:不支持 -* -* 发起微信支付。调用前需在[小程序微信公众平台](https://mp.weixin.qq.com/) -功能-微信支付入口申请接入微信支付。了解更多信息,可以参考 [微信支付开发文档](https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pages/api.shtml): -* - [开发指引](https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter2_3.shtml) -* - [下单接口](https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_2.shtml) -* - [支付接口](https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_12.shtml) -* - 旧版本 (v2) -* - [开发指引](https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1) -* - [支付接口](https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3) -* -* 如果使用[云开发](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html),则 `wx.requestPayment` 所需参数可以通过云开发微信支付统一下单接口免鉴权获取、并可免证书、免签名的安全调用微信支付服务端接口、及接收异步支付结果回调,详见[云开发微信支付](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/wechatpay/wechatpay.html)。 -* -* **示例代码** -* -* ```js -wx.requestPayment({ - timeStamp: '', - nonceStr: '', - package: '', - signType: 'MD5', - paySign: '', - success (res) { }, - fail (res) { } -}) -``` -* -* 注:如果服务端有使用云开发,可以通过云开发微信支付[统一下单](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/open/pay/CloudPay.unifiedOrder.html)接口免鉴权获取以上所需所有参数,示例: -* -* ```js -// 云函数代码 -const cloud = require('wx-server-sdk') -cloud.init({ - env: cloud.DYNAMIC_CURRENT_ENV -}) - -exports.main = async (event, context) => { - const res = await cloud.cloudPay.unifiedOrder({ - "body" : "小秋TIT店-超市", - "outTradeNo" : "1217752501201407033233368018", - "spbillCreateIp" : "127.0.0.1", - "subMchId" : "1900009231", - "totalFee" : 1, - "envId": "test-f0b102", - "functionName": "pay_cb" - }) - return res -} - -// 小程序代码 -wx.cloud.callFunction({ - name: '函数名', - data: { - // ... - }, - success: res => { - const payment = res.result.payment - wx.requestPayment({ - ...payment, - success (res) { - console.log('pay success', res) - }, - fail (err) { - console.error('pay fail', err) - } - }) - }, - fail: console.error, -}) -``` */ - requestPayment<T extends RequestPaymentOption = RequestPaymentOption>( - option: T - ): PromisifySuccessResult<T, RequestPaymentOption> - /** [wx.requestPluginPayment(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/payment/wx.requestPluginPayment.html) -* -* 需要基础库: `2.22.1` -* -* 在插件中使用:需要基础库 `2.22.1` -* -* 插件中发起支付。 -* -* **Tip** -* -* 1. `tip`: 小程序与插件绑定在同一个open平台账号上且小程序与插件均为open账号的同主体/关联主体时,调用此接口将直接拉起支付收银台。 -* 1. `tip`: 这个接口本身可以在开发者工具中使用,但功能页的跳转目前不支持在开发者工具中调试,请在真机上测试。 -* 1. `tip`: 跳转支付功能页需要在 `app.json` 中配置 `"functionalPages": true` -* -* **示例代码** -* -* 具体用法及参数说明可参考 [插件支付文档](https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/functional-pages/request-payment.html) -* ```js -wx.requestPluginPayment({ - version: 'release', - fee: 1, - paymentArgs: {}, - currencyType: 'CNY', - success (res) { }, - fail (res) { } -}) -``` */ - requestPluginPayment(option: RequestPluginPaymentOption): void - /** [wx.requestSubscribeDeviceMessage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeDeviceMessage.html) -* -* 需要基础库: `2.20.0` -* -* 在插件中使用:需要基础库 `3.4.1` -* -* 订阅设备消息接口,调用后弹出授权框,用户同意后会允许开发者给用户发送订阅模版消息。当用户点击“允许”按钮时,模板消息会被添加到用户的小程序设置页,通过 wx.getSetting 接口可获取用户对相关模板消息的订阅状态。 -* -* **错误码** -* -* | errCode | errMsg | 说明 | -* | ------- | ------------------------------------------------------ | -------------------------------------------------------------- | -* | 10001 | TmplIds can't be empty | tmplIds 为空 | -* | 10004 | Invalid template id | tmplId 参数类型错误 | -* | 20001 | No template data return, verify the template id exist | tmplId 为空 | -* | 20003 | Templates count out of max bounds | tmplId 数量超过上限 | -* | 19720726 | check sn_ticket fail | snTicket 不合法 | -* | 19720727 | sn_ticket expire | snTicket 过期 | -* | 19720728 | err_not_found_tid | tmplId 不存在 | -* | 19720736 | template_id do not match model_id | modelId 类型与 tmplId 类型不符 | -* -* **示例代码** -* -* ```js -wx.requestSubscribeDeviceMessage({ - tmplIds: ['xxxxx'], - sn: 'xxxx', - snTicket: 'xxxxx', - modelId: 'xxx', - success(res) { - console.log(res) - }, - fail(res) { - console.log(res) - } -}) -``` */ - requestSubscribeDeviceMessage< - T extends RequestSubscribeDeviceMessageOption = RequestSubscribeDeviceMessageOption - >( - option: T - ): PromisifySuccessResult<T, RequestSubscribeDeviceMessageOption> - /** [wx.requestSubscribeMessage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html) -* -* 需要基础库: `2.4.4` -* -* 在插件中使用:需要基础库 `3.4.1` -* -* 调起客户端小程序订阅消息界面,返回用户订阅消息的操作结果。当用户勾选了订阅面板中的“总是保持以上选择,不再询问”时,模板消息会被添加到用户的小程序设置页,通过 [wx.getSetting](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/wx.getSetting.html) 接口可获取用户对相关模板消息的订阅状态。 -* -* ## 注意事项 -* - 一次性模板 id 和永久模板 id 不可同时使用。 -* - 低版本基础库2.4.4~2.8.3 已支持订阅消息接口调用,仅支持传入一个一次性 tmplId / 永久 tmplId。 -* - [2.8.2](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 版本开始,用户发生点击行为或者发起支付回调后,才可以调起订阅消息界面。 -* - [2.10.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 版本开始,开发版和体验版小程序将禁止使用模板消息 formId。 -* - 一次授权调用里,每个tmplId对应的模板标题不能存在相同的,若出现相同的,只保留一个。 -* - [2.10.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 版本开始,支持订阅语音消息提醒,[详情](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html) -* -* **错误码** -* -* | errCode | errMsg | 说明 | -* | ------- | ------------------------------------------------------ | -------------------------------------------------------------- | -* | 10001 | TmplIds can't be empty | 参数传空了 | -* | 10002 | Request list fail | 网络问题,请求消息列表失败 | -* | 10003 | Request subscribe fail | 网络问题,订阅请求发送失败 | -* | 10004 | Invalid template id | 参数类型错误 | -* | 10005 | Cannot show subscribe message UI | 无法展示 UI,一般是小程序这个时候退后台了导致的 | -* | 20001 | No template data return, verify the template id exist | 没有模板数据,一般是模板 ID 不存在 或者和模板类型不对应 导致的 | -* | 20002 | Templates type must be same | 模板消息类型 既有一次性的又有永久的 | -* | 20003 | Templates count out of max bounds | 模板消息数量超过上限 | -* | 20004 | The main switch is switched off | 用户关闭了主开关,无法进行订阅 | -* | 20005 | This mini program was banned from subscribing messages | 小程序被禁封 | -* | 20013 | Reject DeviceMsg Template | 不允许通过该接口订阅设备消息 | -* -* **示例代码** -* -* ```js -wx.requestSubscribeMessage({ - tmplIds: [''], - success (res) { } -}) -``` */ - requestSubscribeMessage< - T extends RequestSubscribeMessageOption = RequestSubscribeMessageOption - >( - option: T - ): PromisifySuccessResult<T, RequestSubscribeMessageOption> - /** [wx.requestVirtualPayment(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/payment/wx.requestVirtualPayment.html) -* -* 需要基础库: `2.19.2` -* -* 在插件中使用:不支持 -* -* 发起米大师虚拟支付 -* -* **** -* -* ## 注意事项: -* -* - 1. 目前只有 >= v2.19.2 的基础库支持该接口,后续将对更多低版本基础库支持该接口。因此建议开发者这样判断:当前用户的基础库版本 >= v2.19.2 时可以直接用 wx.requestVirtualPayment,小于 v2.19.2 时,用 wx.canIUse('requestVirtualPayment') 来判断接口是否可用。具体判断方法可参考示例代码。 -* -* **示例代码** -* -* ```js -function compareVersion(_v1, _v2) { - if (typeof _v1 !== 'string' || typeof _v2 !== 'string') return 0 - - const v1 = _v1.split('.') - const v2 = _v2.split('.') - const len = Math.max(v1.length, v2.length) - - while (v1.length < len) { - v1.push('0') - } - while (v2.length < len) { - v2.push('0') - } - - for (let i = 0; i < len; i++) { - const num1 = parseInt(v1[i], 10) - const num2 = parseInt(v2[i], 10) - - if (num1 > num2) { - return 1 - } else if (num1 < num2) { - return -1 - } - } - - return 0 -} - -const SDKVersion = wx.getSystemInfoSync().SDKVersion - -if (compareVersion(SDKVersion, '2.19.2') >= 0 || wx.canIUse('requestVirtualPayment')) { - wx.requestVirtualPayment({ - signData: JSON.stringify({ - offerId: '123', - buyQuantity: 1, - env: 0, - currencyType: 'CNY', - productId: 'testproductId', - goodsPrice: 10, - outTradeNo: 'xxxxxx', - attach: 'testdata', - }), - paySig: 'd0b8bbccbe109b11549bcfd6602b08711f46600965253a949cd6a2b895152f9d', - signature: 'd0b8bbccbe109b11549bcfd6602b08711f46600965253a949cd6a2b895152f9d', - mode: 'short_series_goods', - success(res) { - console.log('requestVirtualPayment success', res) - }, - fail({ errMsg, errCode }) { - console.error(errMsg, errCode) - }, - }) -} else { - console.log('当前用户的客户端版本不支持 wx.requestVirtualPayment') -} -``` */ - requestVirtualPayment(option: RequestVirtualPaymentOption): void - /** [wx.requirePrivacyAuthorize(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/privacy/wx.requirePrivacyAuthorize.html) -* -* 需要基础库: `2.32.3` -* -* 在插件中使用:不支持 -* -* 模拟隐私接口调用,并触发隐私弹窗逻辑。隐私合规开发指南详情可见[《小程序隐私协议开发指南》](https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html) -* -* **** -* -* ## 具体说明: -* -* 1. 调用 wx.requirePrivacyAuthorize() 时: -* -* - 1. 如果用户之前已经同意过隐私授权,会立即返回success回调,不会触发 wx.onNeedPrivacyAuthorization 事件。 -* - 2. 如果用户之前没有授权过,并且开发者注册了 [wx.onNeedPrivacyAuthorization()](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/privacy/wx.onNeedPrivacyAuthorization.html) 事件监听,就会立即触发 wx.onNeedPrivacyAuthorization 事件,然后开发者在 onNeedPrivacyAuthorization 回调中弹出自定义隐私授权弹窗,用户点了同意后开发者调用 wx.onNeedPrivacyAuthorization 的回调接口 resolve({ event: 'agree', buttonId: 'agree-btn' }),会触发 requirePrivacyAuthorize 的 success 回调。开发者调用 wx.onNeedPrivacyAuthorization 的回调接口 resolve({ event: 'disagree' }) 的话,会触发 requirePrivacyAuthorize 的 fail 回调。 -* - 3. 基于上述特性,开发者可以在调用任何真实隐私接口之前调用 wx.requirePrivacyAuthorize 接口来模拟隐私接口调用,并触发隐私弹窗逻辑。 -* -* 2. 一定要调用 wx.requirePrivacyAuthorize 接口吗? -* -* - 不是,wx.requirePrivacyAuthorize 只是一个辅助接口,可以根据实际情况选择使用。 -* -* **示例代码** -* -* ```html -* // page.wxml -* <view wx:if="{{showPrivacy}}"> -* <view>隐私弹窗内容....</view> -* <button id="agree-btn" open-type="agreePrivacyAuthorization" bindagreeprivacyauthorization="handleAgreePrivacyAuthorization">同意</button> -* </view> -* ``` -* ```js -// page.js -Page({ - data: { - showPrivacy: false - }, - onLoad() { - wx.onNeedPrivacyAuthorization(resolve => { - // 需要用户同意隐私授权时 - // 弹出开发者自定义的隐私授权弹窗 - this.setData({ - showPrivacy: true - }) - this.resolvePrivacyAuthorization = resolve - }) - - wx.requirePrivacyAuthorize({ - success: () => { - // 用户同意授权 - // 继续小程序逻辑 - }, - fail: () => {}, // 用户拒绝授权 - complete: () => {} - }) - }, - handleAgreePrivacyAuthorization() { - // 用户点击同意按钮后 - this.resolvePrivacyAuthorization({ buttonId: 'agree-btn', event: 'agree' }) - } -}) -``` -* -* **完整示例demo** -* -* demo1: 演示使用 `wx.getPrivacySetting` 和 `<button open-type="agreePrivacyAuthorization">` 在首页处理隐私弹窗逻辑 -* [https://developers.weixin.qq.com/s/gi71sGm67hK0](https://developers.weixin.qq.com/s/gi71sGm67hK0) -* -* demo2: 演示使用 `wx.onNeedPrivacyAuthorization` 和 `<button open-type="agreePrivacyAuthorization">` 在多个页面处理隐私弹窗逻辑,同时演示了如何处理多个隐私接口同时调用。 -* [https://developers.weixin.qq.com/s/hndZUOmA7gKn](https://developers.weixin.qq.com/s/hndZUOmA7gKn) -* -* demo3: 演示 `wx.onNeedPrivacyAuthorization`、`wx.requirePrivacyAuthorize`、`<button open-type="agreePrivacyAuthorization">` 和 `<input type="nickname">` 组件如何结合使用 -* [https://developers.weixin.qq.com/s/jX7xWGmA7UKa](https://developers.weixin.qq.com/s/jX7xWGmA7UKa) -* -* demo4: 演示使用 `wx.onNeedPrivacyAuthorization` 和 `<button open-type="agreePrivacyAuthorization">` 在多个 tabBar 页面处理隐私弹窗逻辑。 -* [https://developers.weixin.qq.com/s/g6BWZGmt7XK9](https://developers.weixin.qq.com/s/g6BWZGmt7XK9) */ - requirePrivacyAuthorize(option: RequirePrivacyAuthorizeOption): void - /** [wx.reserveChannelsLive(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/channels/wx.reserveChannelsLive.html) - * - * 需要基础库: `2.19.0` - * - * 在插件中使用:不支持 - * - * 预约视频号直播 */ - reserveChannelsLive(option: ReserveChannelsLiveOption): void - /** [wx.restartMiniProgram(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.restartMiniProgram.html) - * - * 需要基础库: `3.0.1` - * - * 在插件中使用:不支持 - * - * 重启当前小程序 */ - restartMiniProgram(option: RestartMiniProgramOption): void - /** [wx.revokeBufferURL(string url)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.revokeBufferURL.html) - * - * 需要基础库: `2.14.0` - * - * 在插件中使用:不支持 - * - * 根据 URL 销毁存在内存中的数据 */ - revokeBufferURL( - /** 需要销毁的二进制数据 URL */ - url: string - ): void - /** [wx.saveFileToDisk(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/file/wx.saveFileToDisk.html) -* -* 需要基础库: `2.11.0` -* -* 在插件中使用:需要基础库 `2.15.0` -* -* 保存文件系统的文件到用户磁盘,仅在 PC 端支持 -* -* **示例代码** -* -* ```js -wx.saveFileToDisk({ - filePath: `${wx.env.USER_DATA_PATH}/hello.txt`, - success(res) { - console.log(res) - }, - fail(res) { - console.error(res) - } -}) -``` */ - saveFileToDisk(option: SaveFileToDiskOption): void - /** [wx.saveImageToPhotosAlbum(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.saveImageToPhotosAlbum.html) -* -* 需要基础库: `1.2.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 保存图片到系统相册。 -* -* **示例代码** -* -* ```js -wx.saveImageToPhotosAlbum({ - success(res) { } -}) -``` */ - saveImageToPhotosAlbum< - T extends SaveImageToPhotosAlbumOption = SaveImageToPhotosAlbumOption - >( - option: T - ): PromisifySuccessResult<T, SaveImageToPhotosAlbumOption> - /** [wx.saveVideoToPhotosAlbum(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.saveVideoToPhotosAlbum.html) -* -* 需要基础库: `1.2.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 保存视频到系统相册。支持mp4视频格式。 -* -* **示例代码** -* -* ```js -wx.saveVideoToPhotosAlbum({ - filePath: 'wxfile://xxx', - success (res) { - console.log(res.errMsg) - } -}) -``` */ - saveVideoToPhotosAlbum< - T extends SaveVideoToPhotosAlbumOption = SaveVideoToPhotosAlbumOption - >( - option: T - ): PromisifySuccessResult<T, SaveVideoToPhotosAlbumOption> - /** [wx.scanCode(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/scan/wx.scanCode.html) -* -* 需要基础库: `1.0.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 调起客户端扫码界面进行扫码 -* -* **示例代码** -* -* ```js -// 允许从相机和相册扫码 -wx.scanCode({ - success (res) { - console.log(res) - } -}) - -// 只允许从相机扫码 -wx.scanCode({ - onlyFromCamera: true, - success (res) { - console.log(res) - } -}) -``` */ - scanCode<T extends ScanCodeOption = ScanCodeOption>( - option: T - ): PromisifySuccessResult<T, ScanCodeOption> - /** [wx.seekBackgroundAudio(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.seekBackgroundAudio.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [1.2.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getBackgroundAudioManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioManager.html) 替换 -* -* 控制音乐播放进度。 -* -* **示例代码** -* -* ```js -wx.seekBackgroundAudio({ - position: 30 -}) -``` */ - seekBackgroundAudio< - T extends SeekBackgroundAudioOption = SeekBackgroundAudioOption - >( - option: T - ): PromisifySuccessResult<T, SeekBackgroundAudioOption> - /** [wx.sendHCEMessage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc-hce/wx.sendHCEMessage.html) -* -* 需要基础库: `1.7.0` -* -* 在插件中使用:需要基础库 `2.1.0` -* -* 发送 NFC 消息。仅在安卓系统下有效。 -* -* **示例代码** -* -* ```js -const buffer = new ArrayBuffer(1) -const dataView = new DataView(buffer) -dataView.setUint8(0, 0) - -wx.startHCE({ - success (res) { - wx.onHCEMessage(function(res) { - if (res.messageType === 1) { - wx.sendHCEMessage({data: buffer}) - } - }) - } -}) -``` */ - sendHCEMessage<T extends SendHCEMessageOption = SendHCEMessageOption>( - option: T - ): PromisifySuccessResult<T, SendHCEMessageOption> - /** [wx.sendSms(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/sms/wx.sendSms.html) - * - * 需要基础库: `2.25.0` - * - * 在插件中使用:不支持 - * - * 拉起手机发送短信界面。 */ - sendSms(option: SendSmsOption): void - /** [wx.sendSocketMessage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/wx.sendSocketMessage.html) -* -* 在插件中使用:不支持 -* -* @warning **推荐使用 [SocketTask](https://developers.weixin.qq.com/miniprogram/dev/api/network/websocket/SocketTask.html) 的方式去管理 webSocket 链接,每一条链路的生命周期都更加可控,同时存在多个 webSocket 的链接的情况下使用 wx 前缀的方法可能会带来一些和预期不一致的情况。** -* -* 通过 WebSocket 连接发送数据。需要先 wx.connectSocket,并在 wx.onSocketOpen 回调之后才能发送。 -* -* **示例代码** -* -* ```js -let socketOpen = false -let socketMsgQueue = [] -wx.connectSocket({ - url: 'test.php' -}) - -wx.onSocketOpen(function(res) { - socketOpen = true - for (let i = 0; i < socketMsgQueue.length; i++){ - sendSocketMessage(socketMsgQueue[i]) - } - socketMsgQueue = [] -}) - -function sendSocketMessage(msg) { - if (socketOpen) { - wx.sendSocketMessage({ - data:msg - }) - } else { - socketMsgQueue.push(msg) - } -} -``` */ - sendSocketMessage< - T extends SendSocketMessageOption = SendSocketMessageOption - >( - option: T - ): PromisifySuccessResult<T, SendSocketMessageOption> - /** [wx.setBLEMTU(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.setBLEMTU.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:需要基础库 `2.11.0` - * - * 协商设置蓝牙低功耗的最大传输单元 (Maximum Transmission Unit, MTU)。需在 [wx.createBLEConnection](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.createBLEConnection.html) 调用成功后调用。仅安卓系统 5.1 以上版本有效,iOS 因系统限制不支持。 */ - setBLEMTU<T extends SetBLEMTUOption = SetBLEMTUOption>( - option: T - ): PromisifySuccessResult<T, SetBLEMTUOption> - /** [wx.setBackgroundColor(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/background/wx.setBackgroundColor.html) -* -* 需要基础库: `2.1.0` -* -* 在插件中使用:需要基础库 `2.4.0` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 动态设置窗口的背景色 -* -* **示例代码** -* -* ```js -wx.setBackgroundColor({ - backgroundColor: '#ffffff', // 窗口的背景色为白色 -}) - -wx.setBackgroundColor({ - backgroundColorTop: '#ffffff', // 顶部窗口的背景色为白色 - backgroundColorBottom: '#ffffff', // 底部窗口的背景色为白色 -}) -``` */ - setBackgroundColor< - T extends SetBackgroundColorOption = SetBackgroundColorOption - >( - option: T - ): PromisifySuccessResult<T, SetBackgroundColorOption> - /** [wx.setBackgroundFetchToken(object object)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/background-fetch/wx.setBackgroundFetchToken.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:不支持 - * - * 设置自定义登录态,在周期性拉取数据时带上,便于第三方服务器验证请求合法性 */ - setBackgroundFetchToken< - T extends SetBackgroundFetchTokenOption = SetBackgroundFetchTokenOption - >( - option: T - ): PromisifySuccessResult<T, SetBackgroundFetchTokenOption> - /** [wx.setBackgroundTextStyle(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/background/wx.setBackgroundTextStyle.html) -* -* 需要基础库: `2.1.0` -* -* 在插件中使用:需要基础库 `2.4.0` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 动态设置下拉背景字体、loading 图的样式 -* -* **示例代码** -* -* ```js -wx.setBackgroundTextStyle({ - textStyle: 'dark' // 下拉背景字体、loading 图的样式为dark -}) -``` */ - setBackgroundTextStyle< - T extends SetBackgroundTextStyleOption = SetBackgroundTextStyleOption - >( - option: T - ): PromisifySuccessResult<T, SetBackgroundTextStyleOption> - /** [wx.setClipboardData(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/clipboard/wx.setClipboardData.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 设置系统剪贴板的内容。调用成功后,会弹出 toast 提示"内容已复制",持续 1.5s -* -* **示例代码** -* -* ```js -wx.setClipboardData({ - data: 'data', - success (res) { - wx.getClipboardData({ - success (res) { - console.log(res.data) // data - } - }) - } -}) -``` */ - setClipboardData< - T extends SetClipboardDataOption = SetClipboardDataOption - >( - option: T - ): PromisifySuccessResult<T, SetClipboardDataOption> - /** [wx.setEnable1v1Chat(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.setEnable1v1Chat.html) - * - * 需要基础库: `2.20.1` - * - * 在插件中使用:不支持 - * - * 开启双人通话。设置 `enable` 为 `false` 时,无法接听呼叫。 */ - setEnable1v1Chat(option: SetEnable1v1ChatOption): void - /** [wx.setEnableDebug(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/wx.setEnableDebug.html) -* -* 需要基础库: `1.4.0` -* -* 在插件中使用:不支持 -* -* 设置是否打开调试开关。此开关对正式版也能生效。 -* -* **示例代码** -* -* ```javascript -// 打开调试 -wx.setEnableDebug({ - enableDebug: true -}) - -// 关闭调试 -wx.setEnableDebug({ - enableDebug: false -}) -``` -* -* **Tips** -* -* - 在正式版打开调试还有一种方法,就是先在开发版或体验版打开调试,再切到正式版就能看到vConsole。 */ - setEnableDebug<T extends SetEnableDebugOption = SetEnableDebugOption>( - option: T - ): PromisifySuccessResult<T, SetEnableDebugOption> - /** [wx.setInnerAudioOption(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.setInnerAudioOption.html) - * - * 需要基础库: `2.3.0` - * - * 在插件中使用:需要基础库 `2.10.0` - * - * 设置 [InnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/InnerAudioContext.html) 的播放选项。设置之后对当前小程序全局生效。 - * - * **** - * - * ## 注意事项 - * - 为保证微信整体体验,speakerOn 为 true 时,客户端会忽略 mixWithOther 参数的内容,强制与其它音频互斥 - * - 不支持在播放音频的过程中切换为扬声器播放,开发者如需切换可以先暂停当前播放的音频并记录下当前暂停的时间点,然后切换后重新从原来暂停的时间点开始播放音频 - * - 目前 wx.setInnerAudioOption 接口不兼容 wx.createWebAudioContext 接口,也不兼容 wx.createInnerAudioContext 开启 useWebAudioImplement 的情况,将在后续版本中支持 */ - setInnerAudioOption< - T extends SetInnerAudioOption = SetInnerAudioOption - >( - option: T - ): PromisifySuccessResult<T, SetInnerAudioOption> - /** [wx.setKeepScreenOn(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/screen/wx.setKeepScreenOn.html) -* -* 需要基础库: `1.4.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 设置是否保持常亮状态。仅在当前小程序生效,离开小程序后设置失效。 -* -* **示例代码** -* -* ```js -wx.setKeepScreenOn({ - keepScreenOn: true -}) -``` */ - setKeepScreenOn< - T extends SetKeepScreenOnOption = SetKeepScreenOnOption - >( - option: T - ): PromisifySuccessResult<T, SetKeepScreenOnOption> - /** [wx.setNavigationBarColor(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/navigation-bar/wx.setNavigationBarColor.html) - * - * 需要基础库: `1.4.0` - * - * 在插件中使用:需要基础库 `2.1.0` - * - * 在插件中使用时,只能在当前插件的页面中调用 - * - * 设置页面导航条颜色 */ - setNavigationBarColor< - T extends SetNavigationBarColorOption = SetNavigationBarColorOption - >( - option: T - ): PromisifySuccessResult<T, SetNavigationBarColorOption> - /** [wx.setNavigationBarTitle(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/navigation-bar/wx.setNavigationBarTitle.html) -* -* 在插件中使用:需要基础库 `2.1.0` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 动态设置当前页面的标题 -* -* **示例代码** -* -* ```js -wx.setNavigationBarTitle({ - title: '当前页面' -}) -``` */ - setNavigationBarTitle< - T extends SetNavigationBarTitleOption = SetNavigationBarTitleOption - >( - option: T - ): PromisifySuccessResult<T, SetNavigationBarTitleOption> - /** [wx.setScreenBrightness(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/screen/wx.setScreenBrightness.html) - * - * 需要基础库: `1.2.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 设置屏幕亮度 */ - setScreenBrightness< - T extends SetScreenBrightnessOption = SetScreenBrightnessOption - >( - option: T - ): PromisifySuccessResult<T, SetScreenBrightnessOption> - /** [wx.setStorage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.setStorage.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 将数据存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。 -* -* **示例代码** -* -* ```js -wx.setStorage({ - key:"key", - data:"value" -}) -``` -* -* ```js -// 开启加密存储 -wx.setStorage({ - key: "key", - data: "value", - encrypt: true, // 若开启加密存储,setStorage 和 getStorage 需要同时声明 encrypt 的值为 true - success() { - wx.getStorage({ - key: "key", - encrypt: true, // 若开启加密存储,setStorage 和 getStorage 需要同时声明 encrypt 的值为 true - success(res) { - console.log(res.data) - } - }) - } -}) -``` */ - setStorage< - T = any, - U extends SetStorageOption<T> = SetStorageOption<T> - >( - option: U - ): PromisifySuccessResult<U, SetStorageOption<T>> - /** [wx.setStorageSync(string key, any data)](https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.setStorageSync.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 将数据存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。 -* -* **注意** -* -* storage 应只用来进行数据的持久化存储,不应用于运行时的数据传递或全局状态管理。启动过程中过多的同步读写存储,会显著影响启动耗时。 -* -* **示例代码** -* -* ```js -try { - wx.setStorageSync('key', 'value') -} catch (e) { } -``` */ - setStorageSync<T = any>( - /** 本地缓存中指定的 key */ - key: string, - /** 需要存储的内容。只支持原生类型、Date、及能够通过`JSON.stringify`序列化的对象。 */ - data: T - ): void - /** [wx.setTabBarBadge(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/tab-bar/wx.setTabBarBadge.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:不支持 -* -* 为 tabBar 某一项的右上角添加文本 -* -* **示例代码** -* -* ```js -wx.setTabBarBadge({ - index: 0, - text: '1' -}) -``` */ - setTabBarBadge<T extends SetTabBarBadgeOption = SetTabBarBadgeOption>( - option: T - ): PromisifySuccessResult<T, SetTabBarBadgeOption> - /** [wx.setTabBarItem(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/tab-bar/wx.setTabBarItem.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:不支持 -* -* 动态设置 tabBar 某一项的内容,`2.7.0` 起图片支持临时文件和网络文件。 -* -* **示例代码** -* -* ```js -wx.setTabBarItem({ - index: 0, - text: 'text', - iconPath: '/path/to/iconPath', - selectedIconPath: '/path/to/selectedIconPath' -}) -``` */ - setTabBarItem<T extends SetTabBarItemOption = SetTabBarItemOption>( - option: T - ): PromisifySuccessResult<T, SetTabBarItemOption> - /** [wx.setTabBarStyle(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/tab-bar/wx.setTabBarStyle.html) -* -* 需要基础库: `1.9.0` -* -* 在插件中使用:不支持 -* -* 动态设置 tabBar 的整体样式 -* -* **示例代码** -* -* ```js -wx.setTabBarStyle({ - color: '#FF0000', - selectedColor: '#00FF00', - backgroundColor: '#0000FF', - borderStyle: 'white' -}) -``` */ - setTabBarStyle<T extends SetTabBarStyleOption = SetTabBarStyleOption>( - option?: T - ): PromisifySuccessResult<T, SetTabBarStyleOption> - /** [wx.setTopBarText(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/sticky/wx.setTopBarText.html) -* -* 需要基础库: `1.4.3` -* -* 在插件中使用:不支持 -* @deprecated 基础库版本 [1.9.9](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃 -* -* 动态设置置顶栏文字内容。只有当前小程序被置顶时能生效,如果当前小程序没有被置顶,也能调用成功,但是不会立即生效,只有在用户将这个小程序置顶后才换上设置的文字内容. -* -* **示例代码** -* -* ```js -wx.setTopBarText({ - text: 'hello, world!' -}) -``` -* -* **注意** -* -* - 调用成功后,需间隔 5s 才能再次调用此接口,如果在 5s 内再次调用此接口,会回调 fail,errMsg:"setTopBarText: fail invoke too frequently" */ - setTopBarText<T extends SetTopBarTextOption = SetTopBarTextOption>( - option: T - ): PromisifySuccessResult<T, SetTopBarTextOption> - /** [wx.setVisualEffectOnCapture(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/screen/wx.setVisualEffectOnCapture.html) - * - * 需要基础库: `2.20.1` - * - * 在插件中使用:需要基础库 `2.21.3` - * - * 设置截屏/录屏时屏幕表现 - * - * **Bug & Tip** - * - * 1. `tip`:iOS 要求基础库版本为 3.3.0 以上,且系统版本为 iOS 16 以上 - * 2. `tip`:iOS 目前只支持处理录屏时的表现 */ - setVisualEffectOnCapture(option: SetVisualEffectOnCaptureOption): void - /** [wx.setWifiList(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.setWifiList.html) -* -* 需要基础库: `1.6.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 设置 `wifiList` 中 AP 的相关信息。在 `onGetWifiList` 回调后调用,**iOS特有接口**。 -* -* **注意** -* -* - 该接口只能在 `onGetWifiList` 回调之后才能调用。 -* - 此时客户端会挂起,等待小程序设置 Wi-Fi 信息,请务必尽快调用该接口,若无数据请传入一个空数组。 -* - 有可能随着周边 Wi-Fi 列表的刷新,单个流程内收到多次带有存在重复的 Wi-Fi 列表的回调。 -* -* **示例代码** -* -* ```js -wx.onGetWifiList(function(res) { - if (res.wifiList.length) { - wx.setWifiList({ - wifiList: [{ - SSID: res.wifiList[0].SSID, - BSSID: res.wifiList[0].BSSID, - password: '123456' - }] - }) - } else { - wx.setWifiList({ - wifiList: [] - }) - } -}) -wx.getWifiList() -``` */ - setWifiList<T extends SetWifiListOption = SetWifiListOption>( - option: T - ): PromisifySuccessResult<T, SetWifiListOption> - /** [wx.setWindowSize(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/window/wx.setWindowSize.html) - * - * 需要基础库: `2.10.1` - * - * 在插件中使用:不支持 - * @deprecated 基础库版本 [2.11.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃 - * - * 设置窗口大小,该接口仅适用于 PC 平台,使用细则请参见指南 */ - setWindowSize(option: SetWindowSizeOption): void - /** [wx.shareFileMessage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/share/wx.shareFileMessage.html) - * - * 需要基础库: `2.16.1` - * - * 在插件中使用:不支持 - * - * 转发文件到聊天 */ - shareFileMessage< - T extends ShareFileMessageOption = ShareFileMessageOption - >( - option: T - ): PromisifySuccessResult<T, ShareFileMessageOption> - /** [wx.shareToWeRun(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/werun/wx.shareToWeRun.html) - * - * 在插件中使用:不支持 - * - * 分享数据到微信运动。 */ - shareToWeRun<T extends ShareToWeRunOption = ShareToWeRunOption>( - option: T - ): PromisifySuccessResult<T, ShareToWeRunOption> - /** [wx.shareVideoMessage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/share/wx.shareVideoMessage.html) - * - * 需要基础库: `2.16.1` - * - * 在插件中使用:不支持 - * - * 转发视频到聊天 */ - shareVideoMessage< - T extends ShareVideoMessageOption = ShareVideoMessageOption - >( - option: T - ): PromisifySuccessResult<T, ShareVideoMessageOption> - /** [wx.showActionSheet(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showActionSheet.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 显示操作菜单 -* -* **示例代码** -* -* ```js -wx.showActionSheet({ - itemList: ['A', 'B', 'C'], - success (res) { - console.log(res.tapIndex) - }, - fail (res) { - console.log(res.errMsg) - } -}) -``` -* -* **注意** -* -* - Android 6.7.2 以下版本,点击取消或蒙层时,回调 fail, errMsg 为 "fail cancel"; -* - Android 6.7.2 及以上版本 和 iOS 点击蒙层不会关闭模态弹窗,所以尽量避免使用「取消」分支中实现业务逻辑 */ - showActionSheet< - T extends ShowActionSheetOption = ShowActionSheetOption - >( - option: T - ): PromisifySuccessResult<T, ShowActionSheetOption> - /** [wx.showLoading(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showLoading.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 显示 loading 提示框。需主动调用 wx.hideLoading 才能关闭提示框 -* -* **示例代码** -* -* ```js -wx.showLoading({ - title: '加载中', -}) - -setTimeout(function () { - wx.hideLoading() -}, 2000) -``` -* -* **注意** -* -* - [wx.showLoading](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showLoading.html) 和 [wx.showToast](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showToast.html) 同时只能显示一个 -* - [wx.showLoading](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showLoading.html) 应与 [wx.hideLoading](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.hideLoading.html) 配对使用 */ - showLoading<T extends ShowLoadingOption = ShowLoadingOption>( - option: T - ): PromisifySuccessResult<T, ShowLoadingOption> - /** [wx.showModal(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showModal.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 显示模态对话框 -* -* **示例代码** -* -* ```js -wx.showModal({ - title: '提示', - content: '这是一个模态弹窗', - success (res) { - if (res.confirm) { - console.log('用户点击确定') - } else if (res.cancel) { - console.log('用户点击取消') - } - } -}) -``` -* -* **注意** -* -* - Android 6.7.2 以下版本,点击取消或蒙层时,回调 fail, errMsg 为 "fail cancel"; -* - Android 6.7.2 及以上版本 和 iOS 点击蒙层不会关闭模态弹窗,所以尽量避免使用「取消」分支中实现业务逻辑 -* - 自基础库 2.17.1 版本起,支持传入 editable 参数,显示带输入框的弹窗 */ - showModal<T extends ShowModalOption = ShowModalOption>( - option: T - ): PromisifySuccessResult<T, ShowModalOption> - /** [wx.showNavigationBarLoading(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/navigation-bar/wx.showNavigationBarLoading.html) - * - * 在插件中使用:需要基础库 `2.1.0` - * - * 在插件中使用时,只能在当前插件的页面中调用 - * - * 在当前页面显示导航条加载动画 */ - showNavigationBarLoading< - T extends ShowNavigationBarLoadingOption = ShowNavigationBarLoadingOption - >( - option?: T - ): PromisifySuccessResult<T, ShowNavigationBarLoadingOption> - /** [wx.showRedPackage(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/redpackage/wx.showRedPackage.html) - * - * 需要基础库: `2.10.0` - * - * 在插件中使用:不支持 - * - * 拉取h5领取红包封面页。获取参考红包封面地址参考 [微信红包封面开发平台](https://cover.weixin.qq.com/cgi-bin/mmcover-bin/readtemplate?t=page/index#/doc?page=introduce)。 */ - showRedPackage<T extends ShowRedPackageOption = ShowRedPackageOption>( - option: T - ): PromisifySuccessResult<T, ShowRedPackageOption> - /** [wx.showShareImageMenu(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/share/wx.showShareImageMenu.html) - * - * 需要基础库: `2.14.3` - * - * 在插件中使用:需要基础库 `2.16.0` - * - * 打开分享图片弹窗,可以将图片发送给朋友、收藏或下载 - * - * **Bug & Tip** - * - * 1. `tip`: `needShowEntrance`分享的图片消息是否要带小程序入口,支持申明类目:商家自营、电商平台、餐饮服务(餐饮服务场所/餐饮服务管理企业、点餐平台、外卖平台)、旅游服务(住宿服务、景区服务、OTA、旅游管理单位)、生活服务(家政服务、丽人服务、宠物(非医院类)、婚庆服务、洗浴保健、休闲娱乐、百货/超市/便利店、开锁服务、营业性演出票务、其他宠物健康服务、洗浴保健平台、共享服务、跑腿、寄存、求职/招聘) - * 2. `tip`: `needShowEntrance`小游戏所有类目都支持 */ - showShareImageMenu< - T extends ShowShareImageMenuOption = ShowShareImageMenuOption - >( - option: T - ): PromisifySuccessResult<T, ShowShareImageMenuOption> - /** [wx.showShareMenu(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/share/wx.showShareMenu.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `2.1.0` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 显示当前页面的转发按钮 -* -* **** -* -* ## 注意事项 -* - "shareAppMessage"表示“发送给朋友”按钮,"shareTimeline"表示“分享到朋友圈”按钮 -* - 显示“分享到朋友圈”按钮时必须同时显示“发送给朋友”按钮,显示“发送给朋友”按钮时则允许不显示“分享到朋友圈”按钮 -* -* **示例代码** -* -* ```js -wx.showShareMenu({ - withShareTicket: true, - menus: ['shareAppMessage', 'shareTimeline'] -}) -``` */ - showShareMenu<T extends ShowShareMenuOption = ShowShareMenuOption>( - option: T - ): PromisifySuccessResult<T, ShowShareMenuOption> - /** [wx.showTabBar(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/tab-bar/wx.showTabBar.html) - * - * 需要基础库: `1.9.0` - * - * 在插件中使用:不支持 - * - * 显示 tabBar */ - showTabBar<T extends ShowTabBarOption = ShowTabBarOption>( - option: T - ): PromisifySuccessResult<T, ShowTabBarOption> - /** [wx.showTabBarRedDot(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/tab-bar/wx.showTabBarRedDot.html) - * - * 需要基础库: `1.9.0` - * - * 在插件中使用:不支持 - * - * 显示 tabBar 某一项的右上角的红点 */ - showTabBarRedDot< - T extends ShowTabBarRedDotOption = ShowTabBarRedDotOption - >( - option: T - ): PromisifySuccessResult<T, ShowTabBarRedDotOption> - /** [wx.showToast(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showToast.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 显示消息提示框 -* -* **示例代码** -* -* ```js -wx.showToast({ - title: '成功', - icon: 'success', - duration: 2000 -}) -``` -* -* **注意** -* -* - [wx.showLoading](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showLoading.html) 和 [wx.showToast](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showToast.html) 同时只能显示一个 -* - [wx.showToast](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showToast.html) 应与 [wx.hideToast](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.hideToast.html) 配对使用 */ - showToast<T extends ShowToastOption = ShowToastOption>( - option: T - ): PromisifySuccessResult<T, ShowToastOption> - /** [wx.startAccelerometer(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/accelerometer/wx.startAccelerometer.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 开始监听加速度数据。 -* -* **示例代码** -* -* ```js -wx.startAccelerometer({ - interval: 'game' -}) -``` -* -* **注意** -* -* - 根据机型性能、当前 CPU 与内存的占用情况,`interval` 的设置与实际 `wx.onAccelerometerChange()` 回调函数的执行频率会有一些出入。 */ - startAccelerometer< - T extends StartAccelerometerOption = StartAccelerometerOption - >( - option?: T - ): PromisifySuccessResult<T, StartAccelerometerOption> - /** [wx.startBeaconDiscovery(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/ibeacon/wx.startBeaconDiscovery.html) -* -* 需要基础库: `1.2.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 开始搜索附近的 Beacon 设备 -* -* **示例代码** -* -* ```js -wx.startBeaconDiscovery({ - success(res) { } -}) -``` */ - startBeaconDiscovery< - T extends StartBeaconDiscoveryOption = StartBeaconDiscoveryOption - >( - option: T - ): PromisifySuccessResult<T, StartBeaconDiscoveryOption> - /** [wx.startBluetoothDevicesDiscovery(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.startBluetoothDevicesDiscovery.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 开始搜寻附近的蓝牙外围设备。 -* -* **此操作比较耗费系统资源,请在搜索到需要的设备后及时调用 [wx.stopBluetoothDevicesDiscovery](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.stopBluetoothDevicesDiscovery.html) 停止搜索。** -* -* **注意** -* -* - 考虑到蓝牙功能可以间接进行定位,安卓 6.0 及以上版本,无定位权限或定位开关未打开时,无法进行设备搜索。这种情况下,安卓 8.0.16 前,接口调用成功但无法扫描设备;8.0.16 及以上版本,会返回错误。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/m7klFDmZ72i1) -* -* ```js -// 以微信硬件平台的蓝牙智能灯为例,主服务的 UUID 是 FEE7。传入这个参数,只搜索主服务 UUID 为 FEE7 的设备 -wx.startBluetoothDevicesDiscovery({ - services: ['FEE7'], - success (res) { - console.log(res) - } -}) -``` */ - startBluetoothDevicesDiscovery< - T extends StartBluetoothDevicesDiscoveryOption = StartBluetoothDevicesDiscoveryOption - >( - option: T - ): PromisifySuccessResult<T, StartBluetoothDevicesDiscoveryOption> - /** [wx.startCompass(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/compass/wx.startCompass.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 开始监听罗盘数据 -* -* **示例代码** -* -* ```js -wx.startCompass() -``` */ - startCompass<T extends StartCompassOption = StartCompassOption>( - option?: T - ): PromisifySuccessResult<T, StartCompassOption> - /** [wx.startDeviceMotionListening(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/motion/wx.startDeviceMotionListening.html) - * - * 需要基础库: `2.3.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 开始监听设备方向的变化。 */ - startDeviceMotionListening< - T extends StartDeviceMotionListeningOption = StartDeviceMotionListeningOption - >( - option?: T - ): PromisifySuccessResult<T, StartDeviceMotionListeningOption> - /** [wx.startGyroscope(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/gyroscope/wx.startGyroscope.html) - * - * 需要基础库: `2.3.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 开始监听陀螺仪数据。 */ - startGyroscope<T extends StartGyroscopeOption = StartGyroscopeOption>( - option?: T - ): PromisifySuccessResult<T, StartGyroscopeOption> - /** [wx.startHCE(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc-hce/wx.startHCE.html) -* -* 需要基础库: `1.7.0` -* -* 在插件中使用:需要基础库 `2.1.0` -* -* 初始化 NFC 模块。(HCE 模式仅安卓支持) -* -* **示例代码** -* -* ```js -wx.startHCE({ - aid_list: ['F222222222'], - success (res) { - console.log(res.errMsg) - } -}) -``` */ - startHCE<T extends StartHCEOption = StartHCEOption>( - option: T - ): PromisifySuccessResult<T, StartHCEOption> - /** [wx.startLocalServiceDiscovery(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/mdns/wx.startLocalServiceDiscovery.html) - * - * 需要基础库: `2.4.0` - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 开始搜索局域网下的 mDNS 服务。搜索的结果会通过 wx.onLocalService* 事件返回。 - * - * **注意** - * - * 1. 由于操作系统相关能力变更,iOS 微信客户端 7.0.18 及以上版本无法使用 mDNS 相关接口,安卓版本不受影响 - * 2. wx.startLocalServiceDiscovery 是一个消耗性能的行为,开始 30 秒后会自动 stop 并执行 wx.onLocalServiceDiscoveryStop 注册的回调函数。 - * 3. 在调用 wx.startLocalServiceDiscovery 后,在这次搜索行为停止后才能发起下次 wx.startLocalServiceDiscovery。停止本次搜索行为的操作包括调用 wx.stopLocalServiceDiscovery 和 30 秒后系统自动 stop 本次搜索。 */ - startLocalServiceDiscovery< - T extends StartLocalServiceDiscoveryOption = StartLocalServiceDiscoveryOption - >( - option: T - ): PromisifySuccessResult<T, StartLocalServiceDiscoveryOption> - /** [wx.startLocationUpdate(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.startLocationUpdate.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:需要基础库 `2.8.0` - * - * 开启小程序进入前台时接收位置消息。 - * ## 使用方法 - * 自 2022 年 7 月 14 日后发布的小程序,若使用该接口,需要在 app.json 中进行声明,否则将无法正常使用该接口,2022年7月14日前发布的小程序不受影响。[具体规则见公告](https://developers.weixin.qq.com/community/develop/doc/000a02f2c5026891650e7f40351c01) - * - * ## 申请开通 - * 暂只针对如下类目的小程序开放,需要先通过类目审核,再在小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通该接口权限。从2022年7月14日开始,在代码审核环节将检测该接口是否已完成开通,如未开通,将在代码提审环节进行拦截。 - * - * ### 国内主体开放类目 - * - * | 一级类目/主体类型 | 二级类目 | 应用场景 | - * | -------------- | -------| -------- | - * | 电商平台 | / | 售卖商品线下发货、收货、送货服务 | - * | 商家自营 | / | 提供售卖商品线下发货、收货、送货服务、线下商超导览、导航服务 | - * | 医疗服务 | 公立医疗机构、三级私立医疗机构、其他私立医疗机构、就医服务、其他医学健康服务、药品(非处方药)销售、非处方药销售平台、医疗器械生产企业、医疗器械自营、医疗器械经营销售平台、互联网医院血液、干细胞服务、临床试验 | 1、实际物品/药品接收服务 2、基于地理位置取号并现场报到、附近医院导航等服务 | - * | 交通服务 | / | 代驾服务、租车网点导航等相关服务 | - * | 生活服务 | / | 上门服务作业等线下场景 | - * | 物流服务 | 收件/派件、查件、邮政、装卸搬运、快递柜、货物运输 | 快递/货物收发服务 | - * | 餐饮服务 | 点餐平台、外卖平台 | 线下送餐服务 | - * | 工具 | 天气、信息查询 | 与地理位置相关的服务,比如潮汐查询、海拔查询、天气查询等 | - * | 金融 | 保险 | 提供线下网点预约、基于地理位置取号并现场报到、附近网点导航等服务 | - * | 旅游 | 景区服务 | 提供景区导航、导览服务 | - * | 政务民生 | / | 提供政务单位相关业务 | - * | 政府主体账号 | / | 提供政务单位相关业务 | - * - * ### 海外主体开放类目 - * | 一级类目/主体类型 | 二级类目 | 应用场景 | - * | -------------- | -------| -------- | - * | 出行与交通 | / | 代驾服务、租车网点导航等相关服务 | - * | 快递业与邮政 | / | 快递/货物收发服务 | - * | 餐饮 | / | 线下送餐服务 | - * | 电商平台 | / | 售卖商品线下发货、线下收货服务 | - * | 出行与交通 | / | 代驾服务、租车网点导航等相关服务 | - * | 跨境电商 | / | 提供售卖商品线下发货、收货服务、线下商超导览、导航服务 | - * | 本地服务 | 服装/鞋/箱包、玩具、家电/数码/手机、美妆/洗护、珠宝/饰品/眼镜/钟表、运动/户外/乐器、鲜花/园艺/工艺品、家居/家饰/家纺、办公/文具、机械/电子器件、酒、食品、百货/超市/便利店、宠物食品/用品 | 提供售卖商品线下发货、线下收货服务、线下商超导览、导航服务 | - * | 生活服务 | 家政、外送 | 上门服务作业等线下场景 | - * - * **注意** - * - * - 获取位置信息需配置[地理位置用途说明](https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html#permission)。 */ - startLocationUpdate< - T extends StartLocationUpdateOption = StartLocationUpdateOption - >( - option: T - ): PromisifySuccessResult<T, StartLocationUpdateOption> - /** [wx.startLocationUpdateBackground(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.startLocationUpdateBackground.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:不支持 - * - * 开启小程序在前后台时均可接收位置消息,后台包括离开小程序后继续使用微信(微信仍在前台)、离开微信(微信在后台)两个场景,需引导用户开启[授权](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html#后台定位)。授权以后,小程序在运行中或进入后台均可接受位置消息变化。 - * ## 使用方法 - * 自 2022 年 7 月 14 日后发布的小程序,若使用该接口,需要在 app.json 中进行声明,否则将无法正常使用该接口,2022年7月14日前发布的小程序不受影响。[具体规则见公告](https://developers.weixin.qq.com/community/develop/doc/000a02f2c5026891650e7f40351c01) - * - * ## 申请开通 - * 暂只针对如下类目的小程序开放,需要先通过类目审核,再在小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通该接口权限。从2022年7月14日开始,在代码审核环节将检测该接口是否已完成开通,如未开通,将在代码提审环节进行拦截。 - * - * ### 国内主体开放类目 - * - * | 一级类目/主体类型 | 二级类目 | 应用场景 | - * | -------------- | -------| -------- | - * | 电商平台 | / | 在小程序内提供线下商超导览、导航服务 | - * | 商家自营 | / | 在小程序内提供线下商超导览、导航服务 | - * | 交通服务 | / | 代驾服务、打车出行、城市共享交通、实时导航服务等 | - * | 生活服务 | 跑腿、共享服务 | 含有B端小程序配送服务,基于地理位置共享工具类服务 | - * | 物流服务 | 收件/派件、查件、邮政、装卸搬运、快递柜、货物运输 | 提供B端小程序快递/货物收发服务 | - * | 餐饮服务 | 点餐平台、外卖平台 | 提供B端小程序餐饮配送服务、线下门店实时导航 | - * | 工具 | 健康管理 | 基于实时地理位置提供身体管理记录等服务 | - * | 旅游 | 景区服务、住宿服务 | 在小程序内提供景区导航、导览服务、酒店导航服务 | - * | 政务民生 | / | 提供政务单位相关业务 | - * | 政府主体账号 | / | 提供政务单位相关业务 | - * - * ### 海外主体开放类目 - * | 一级类目/主体类型 | 二级类目 | 应用场景 | - * | -------------- | -------| -------- | - * | 交通服务 | / | 代驾服务、打车出行、城市共享交通、实时导航服务等 | - * | 生活服务 | 家政、外送 | 含有B端小程序配送服务,基于地理位置导航上门服务 | - * | 快递业与邮政 | / | 提供B端小程序快递/货物收发服务 | - * | 餐饮服务 | 外卖点餐 | 提供B端小程序餐饮配送服务、线下门店实时导航 | - * | 电商平台 | / | 在小程序内提供线下商超导览、导航服务 | - * | 跨境电商 | / | 在小程序内提供线下商超导览、导航服务 | - * | 本地服务 | 服装/鞋/箱包、玩具、家电/数码/手机、美妆/洗护、珠宝/饰品/眼镜/钟表、运动/户外/乐器、鲜花/园艺/工艺品、家居/家饰/家纺、办公/文具、机械/电子器件、酒、食品、百货/超市/便利店、宠物食品/用品 | 在小程序内提供线下商超导览、导航服务 | - * - * **注意** - * - * - 安卓微信7.0.6版本,iOS 7.0.5版本起支持该接口 - * - 需在app.json中配置requiredBackgroundModes: ['location']后使用 - * - 获取位置信息需配置[地理位置用途说明](https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html#permission)。 */ - startLocationUpdateBackground< - T extends StartLocationUpdateBackgroundOption = StartLocationUpdateBackgroundOption - >( - option: T - ): PromisifySuccessResult<T, StartLocationUpdateBackgroundOption> - /** [wx.startPullDownRefresh(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/pull-down-refresh/wx.startPullDownRefresh.html) -* -* 需要基础库: `1.5.0` -* -* 在插件中使用:需要基础库 `2.1.0` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 开始下拉刷新。调用后触发下拉刷新动画,效果与用户手动下拉刷新一致。 -* -* **示例代码** -* -* ```js -wx.startPullDownRefresh() -``` */ - startPullDownRefresh< - T extends StartPullDownRefreshOption = StartPullDownRefreshOption - >( - option?: T - ): PromisifySuccessResult<T, StartPullDownRefreshOption> - /** [wx.startRecord(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/wx.startRecord.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [1.6.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getRecorderManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/wx.getRecorderManager.html) 替换 -* -* 开始录音。当主动调用 [wx.stopRecord](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/wx.stopRecord.html),或者录音超过1分钟时自动结束录音。当用户离开小程序时,此接口无法调用。 -* -* **示例代码** -* -* ```js -wx.startRecord({ - success (res) { - const tempFilePath = res.tempFilePath - } -}) -setTimeout(function () { - wx.stopRecord() // 结束录音 -}, 10000) -``` */ - startRecord<T extends WxStartRecordOption = WxStartRecordOption>( - option?: T - ): PromisifySuccessResult<T, WxStartRecordOption> - /** [wx.startSoterAuthentication(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/soter/wx.startSoterAuthentication.html) -* -* 需要基础库: `1.5.0` -* -* 在插件中使用:不支持 -* -* 开始 SOTER 生物认证。验证流程请参考[说明](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/bio-auth.html)。 -* -* **resultJSON 说明** -* -* 此数据为设备TEE中,将传入的challenge和TEE内其他安全信息组成的数据进行组装而来的JSON,对下述字段的解释如下表。例子如下: -* | 字段名 | 说明 | -* |---------|-------------------------------------------------------------------------------------------| -* | raw | 调用者传入的challenge | -* | fid | (仅Android支持)本次生物识别认证的生物信息编号(如指纹识别则是指纹信息在本设备内部编号) | -* | counter | 防重放特征参数 | -* | tee_n | TEE名称(如高通或者trustonic等) | -* | tee_v | TEE版本号 | -* | fp_n | 指纹以及相关逻辑模块提供商(如FPC等) | -* | fp_v | 指纹以及相关模块版本号 | -* | cpu_id | 机器唯一识别ID | -* | uid | 概念同Android系统定义uid,即应用程序编号 | -* -* ```json -{ - "raw":"msg", - "fid":"2", - "counter":123, - "tee_n":"TEE Name", - "tee_v":"TEE Version", - "fp_n":"Fingerprint Sensor Name", - "fp_v":"Fingerprint Sensor Version", - "cpu_id":"CPU Id", - "uid":"21" -} -``` -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/q3tCKkmJ7g2e) -* ```js -wx.startSoterAuthentication({ - requestAuthModes: ['fingerPrint'], - challenge: '123456', - authContent: '请用指纹解锁', - success(res) { - } -}) -``` */ - startSoterAuthentication< - T extends StartSoterAuthenticationOption = StartSoterAuthenticationOption - >( - option: T - ): PromisifySuccessResult<T, StartSoterAuthenticationOption> - /** [wx.startWifi(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.startWifi.html) -* -* 需要基础库: `1.6.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 初始化 Wi-Fi 模块。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/8P7zrkmd7r2n) -* ```js -wx.startWifi({ - success (res) { - console.log(res.errMsg) - } -}) -``` */ - startWifi<T extends StartWifiOption = StartWifiOption>( - option?: T - ): PromisifySuccessResult<T, StartWifiOption> - /** [wx.stopAccelerometer(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/accelerometer/wx.stopAccelerometer.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 停止监听加速度数据。 -* -* **示例代码** -* -* ```js -wx.stopAccelerometer() -``` */ - stopAccelerometer< - T extends StopAccelerometerOption = StopAccelerometerOption - >( - option?: T - ): PromisifySuccessResult<T, StopAccelerometerOption> - /** [wx.stopBackgroundAudio(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.stopBackgroundAudio.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [1.2.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getBackgroundAudioManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/background-audio/wx.getBackgroundAudioManager.html) 替换 -* -* 停止播放音乐。 -* -* **示例代码** -* -* ```js -wx.stopBackgroundAudio() -``` */ - stopBackgroundAudio< - T extends StopBackgroundAudioOption = StopBackgroundAudioOption - >( - option?: T - ): PromisifySuccessResult<T, StopBackgroundAudioOption> - /** [wx.stopBeaconDiscovery(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/ibeacon/wx.stopBeaconDiscovery.html) - * - * 需要基础库: `1.2.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 停止搜索附近的 Beacon 设备 */ - stopBeaconDiscovery< - T extends StopBeaconDiscoveryOption = StopBeaconDiscoveryOption - >( - option?: T - ): PromisifySuccessResult<T, StopBeaconDiscoveryOption> - /** [wx.stopBluetoothDevicesDiscovery(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.stopBluetoothDevicesDiscovery.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 停止搜寻附近的蓝牙外围设备。若已经找到需要的蓝牙设备并不需要继续搜索时,建议调用该接口停止蓝牙搜索。 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -wx.stopBluetoothDevicesDiscovery({ - success (res) { - console.log(res) - } -}) -``` */ - stopBluetoothDevicesDiscovery< - T extends StopBluetoothDevicesDiscoveryOption = StopBluetoothDevicesDiscoveryOption - >( - option?: T - ): PromisifySuccessResult<T, StopBluetoothDevicesDiscoveryOption> - /** [wx.stopCompass(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/compass/wx.stopCompass.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 停止监听罗盘数据 -* -* **示例代码** -* -* ```js -wx.stopCompass() -``` */ - stopCompass<T extends StopCompassOption = StopCompassOption>( - option?: T - ): PromisifySuccessResult<T, StopCompassOption> - /** [wx.stopDeviceMotionListening(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/motion/wx.stopDeviceMotionListening.html) - * - * 需要基础库: `2.3.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 停止监听设备方向的变化。 */ - stopDeviceMotionListening< - T extends StopDeviceMotionListeningOption = StopDeviceMotionListeningOption - >( - option?: T - ): PromisifySuccessResult<T, StopDeviceMotionListeningOption> - /** [wx.stopFaceDetect(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ai/face/wx.stopFaceDetect.html) - * - * 需要基础库: `2.18.0` - * - * 在插件中使用:需要基础库 `2.21.3` - * - * @warning **该接口已停止维护,推荐使用 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 代替** - * - * 停止人脸检测。本接口不再维护,请使用 [wx.createVKSession](https://developers.weixin.qq.com/miniprogram/dev/api/ai/visionkit/wx.createVKSession.html) 接口代替。详情参考[人脸检测指南文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/face.html) */ - stopFaceDetect(option?: StopFaceDetectOption): void - /** [wx.stopGyroscope(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/gyroscope/wx.stopGyroscope.html) - * - * 需要基础库: `2.3.0` - * - * 在插件中使用:需要基础库 `2.9.1` - * - * 停止监听陀螺仪数据。 */ - stopGyroscope<T extends StopGyroscopeOption = StopGyroscopeOption>( - option?: T - ): PromisifySuccessResult<T, StopGyroscopeOption> - /** [wx.stopHCE(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/nfc-hce/wx.stopHCE.html) -* -* 需要基础库: `1.7.0` -* -* 在插件中使用:需要基础库 `2.1.0` -* -* 关闭 NFC 模块。仅在安卓系统下有效。 -* -* **示例代码** -* -* ```js -wx.stopHCE({ - success (res) { - console.log(res.errMsg) - } -}) -``` */ - stopHCE<T extends StopHCEOption = StopHCEOption>( - option?: T - ): PromisifySuccessResult<T, StopHCEOption> - /** [wx.stopLocalServiceDiscovery(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/network/mdns/wx.stopLocalServiceDiscovery.html) - * - * 需要基础库: `2.4.0` - * - * 在插件中使用:需要基础库 `2.15.0` - * - * 停止搜索 mDNS 服务 */ - stopLocalServiceDiscovery< - T extends StopLocalServiceDiscoveryOption = StopLocalServiceDiscoveryOption - >( - option?: T - ): PromisifySuccessResult<T, StopLocalServiceDiscoveryOption> - /** [wx.stopLocationUpdate(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.stopLocationUpdate.html) - * - * 需要基础库: `2.8.0` - * - * 在插件中使用:需要基础库 `2.8.0` - * - * 关闭监听实时位置变化,前后台都停止消息接收 */ - stopLocationUpdate< - T extends StopLocationUpdateOption = StopLocationUpdateOption - >( - option?: T - ): PromisifySuccessResult<T, StopLocationUpdateOption> - /** [wx.stopPullDownRefresh(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/ui/pull-down-refresh/wx.stopPullDownRefresh.html) -* -* 需要基础库: `1.5.0` -* -* 在插件中使用:需要基础库 `2.1.0` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 停止当前页面下拉刷新。 -* -* **示例代码** -* -* ```js -Page({ - onPullDownRefresh () { - wx.stopPullDownRefresh() - } -}) -``` */ - stopPullDownRefresh< - T extends StopPullDownRefreshOption = StopPullDownRefreshOption - >( - option?: T - ): PromisifySuccessResult<T, StopPullDownRefreshOption> - /** [wx.stopRecord(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/wx.stopRecord.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [1.6.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.getRecorderManager](https://developers.weixin.qq.com/miniprogram/dev/api/media/recorder/wx.getRecorderManager.html) 替换 -* -* 停止录音。 -* -* **示例代码** -* -* ```js -wx.startRecord({ - success (res) { - const tempFilePath = res.tempFilePath - } -}) -setTimeout(function () { - wx.stopRecord() // 结束录音 -}, 10000) -``` */ - stopRecord<T extends WxStopRecordOption = WxStopRecordOption>( - option?: T - ): PromisifySuccessResult<T, WxStopRecordOption> - /** [wx.stopVoice(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.stopVoice.html) -* -* 在插件中使用:需要基础库 `1.9.6` -* @deprecated 基础库版本 [1.6.0](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 起已废弃,请使用 [wx.createInnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createInnerAudioContext.html) 替换 -* -* 结束播放语音。 -* -* **示例代码** -* -* ```js -wx.startRecord({ - success (res) { - const tempFilePath = res.tempFilePath - wx.playVoice({ - filePath: tempFilePath, - }) - - setTimeout(() => { wx.stopVoice() }, 5000) - } -}) -``` */ - stopVoice<T extends StopVoiceOption = StopVoiceOption>( - option?: T - ): PromisifySuccessResult<T, StopVoiceOption> - /** [wx.stopWifi(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/wifi/wx.stopWifi.html) -* -* 需要基础库: `1.6.0` -* -* 在插件中使用:需要基础库 `2.9.1` -* -* 关闭 Wi-Fi 模块。 -* -* **示例代码** -* -* ```js -wx.stopWifi({ - success (res) { - console.log(res.errMsg) - } -}) -``` */ - stopWifi<T extends StopWifiOption = StopWifiOption>( - option?: T - ): PromisifySuccessResult<T, StopWifiOption> - /** [wx.subscribeVoIPVideoMembers(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.subscribeVoIPVideoMembers.html) - * - * 需要基础库: `2.11.0` - * - * 在插件中使用:需要基础库 `2.11.0` - * - * 订阅视频画面成员。对于视频房间,当成员超过两人时需进行订阅,否则只能看到最先加入房间的两人画面。 */ - subscribeVoIPVideoMembers< - T extends SubscribeVoIPVideoMembersOption = SubscribeVoIPVideoMembersOption - >( - option: T - ): PromisifySuccessResult<T, SubscribeVoIPVideoMembersOption> - /** [wx.switchTab(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.switchTab.html) -* -* 在插件中使用:需要基础库 `2.3.1` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 -* -* **示例代码** -* -* ```json -// app.json -{ - "tabBar": { - "list": [{ - "pagePath": "index", - "text": "首页" - },{ - "pagePath": "other", - "text": "其他" - }] - } -} -``` -* -* ```js -wx.switchTab({ - url: '/index' -}) -``` */ - switchTab<T extends SwitchTabOption = SwitchTabOption>( - option: T - ): PromisifySuccessResult<T, SwitchTabOption> - /** [wx.updateShareMenu(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/share/wx.updateShareMenu.html) -* -* 需要基础库: `1.2.0` -* -* 在插件中使用:需要基础库 `2.1.0` -* -* 在插件中使用时,只能在当前插件的页面中调用 -* -* 更新转发属性 -* -* **** -* -* ## 注意事项 -* - bug:在iOS上,如果 withShareTicket 传了 true ,同时 isUpdatableMessage 传了 false,会导致 withShareTicket 失效。解决办法:当 withShareTicket 传了 true 的时候,isUpdatableMessage 传 true 或者不传都可以,但不要传 false。如果需要关掉动态消息设置,则另外单独调用一次 wx.updateShareMenu({ isUpdatableMessage: false }) 即可。 -* -* **示例代码** -* -* ```js -wx.updateShareMenu({ - withShareTicket: true, - success () { } -}) -``` -* ```js -// 转发私密消息 -wx.updateShareMenu({ - isPrivateMessage: true, - activityId: 'xxx', - templateInfo: {}, - success () { }, - fail () {} -}) -``` */ - updateShareMenu< - T extends UpdateShareMenuOption = UpdateShareMenuOption - >( - option: T - ): PromisifySuccessResult<T, UpdateShareMenuOption> - /** [wx.updateVoIPChatMuteConfig(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/media/voip/wx.updateVoIPChatMuteConfig.html) - * - * 需要基础库: `2.7.0` - * - * 在插件中使用:需要基础库 `2.9.0` - * - * 更新实时语音静音设置 */ - updateVoIPChatMuteConfig< - T extends UpdateVoIPChatMuteConfigOption = UpdateVoIPChatMuteConfigOption - >( - option: T - ): PromisifySuccessResult<T, UpdateVoIPChatMuteConfigOption> - /** [wx.updateWeChatApp(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/base/update/wx.updateWeChatApp.html) - * - * 需要基础库: `2.12.0` - * - * 在插件中使用:需要基础库 `2.12.0` - * - * 更新客户端版本。当判断用户小程序所在客户端版本过低时,可使用该接口跳转到更新微信页面。 */ - updateWeChatApp< - T extends UpdateWeChatAppOption = UpdateWeChatAppOption - >( - option?: T - ): PromisifySuccessResult<T, UpdateWeChatAppOption> - /** [wx.vibrateLong(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/vibrate/wx.vibrateLong.html) - * - * 需要基础库: `1.2.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 使手机发生较长时间的振动(400 ms) */ - vibrateLong<T extends VibrateLongOption = VibrateLongOption>( - option?: T - ): PromisifySuccessResult<T, VibrateLongOption> - /** [wx.vibrateShort(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/vibrate/wx.vibrateShort.html) - * - * 需要基础库: `1.2.0` - * - * 在插件中使用:需要基础库 `1.9.6` - * - * 使手机发生较短时间的振动(15 ms)。仅在 iPhone `7 / 7 Plus` 以上及 Android 机型生效 */ - vibrateShort<T extends VibrateShortOption = VibrateShortOption>( - option: T - ): PromisifySuccessResult<T, VibrateShortOption> - /** [wx.writeBLECharacteristicValue(Object object)](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.writeBLECharacteristicValue.html) -* -* 需要基础库: `1.1.0` -* -* 在插件中使用:需要基础库 `1.9.6` -* -* 向蓝牙低功耗设备特征值中写入二进制数据。注意:必须设备的特征支持 write 才可以成功调用。 -* -* **注意** -* -* - 并行调用多次会存在写失败的可能性。 -* - 小程序不会对写入数据包大小做限制,但系统与蓝牙设备会限制蓝牙 4.0 单次传输的数据大小,超过最大字节数后会发生写入错误,建议每次写入不超过 20 字节。 -* - 若单次写入数据过长,iOS 上存在系统不会有任何回调的情况(包括错误回调)。 -* - 安卓平台上,在调用 [wx.notifyBLECharacteristicValueChange](https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.notifyBLECharacteristicValueChange.html) 成功后立即调用本接口,在部分机型上会发生 10008 系统错误 -* -* **示例代码** -* -* [在微信开发者工具中查看示例](https://developers.weixin.qq.com/s/pQU51zmz7a3K) -* ```js -// 向蓝牙设备发送一个0x00的16进制数据 -let buffer = new ArrayBuffer(1) -let dataView = new DataView(buffer) -dataView.setUint8(0, 0) - -wx.writeBLECharacteristicValue({ - // 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取 - deviceId, - // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取 - serviceId, - // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取 - characteristicId, - // 这里的value是ArrayBuffer类型 - value: buffer, - success (res) { - console.log('writeBLECharacteristicValue success', res.errMsg) - } -}) -``` */ - writeBLECharacteristicValue< - T extends WriteBLECharacteristicValueOption = WriteBLECharacteristicValueOption - >( - option: T - ): PromisifySuccessResult<T, WriteBLECharacteristicValueOption> - /** 小程序云开发 */ - cloud: WxCloud - /** 文件系统中的用户目录路径 */ - env: { USER_DATA_PATH: string } - /** 获得 xr-frame 接口系统 */ - getXrFrameSystem(): import('XrFrame').IXrFrameSystem - /** 需要基础库: `2.29.2` - * - * router 对象,可以通过 `wx.router` 获取。 */ - router: Router - /** 需要基础库: `2.29.2` - * - * worklet 对象,可以通过 `wx.worklet` 获取。 */ - worklet: Worklet - } - - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AccessCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type AccessFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type AccessSuccessCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AddArcCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type AddArcFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type AddArcSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AddCardCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type AddCardFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type AddCardSuccessCallback = (result: AddCardSuccessCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AddCustomLayerCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type AddCustomLayerFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type AddCustomLayerSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AddFileToFavoritesCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type AddFileToFavoritesFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type AddFileToFavoritesSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AddGroundOverlayCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type AddGroundOverlayFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type AddGroundOverlaySuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AddMarkersCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type AddMarkersFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type AddMarkersSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AddPhoneCalendarCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type AddPhoneCalendarFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type AddPhoneCalendarSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AddPhoneContactCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type AddPhoneContactFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type AddPhoneContactSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AddPhoneRepeatCalendarCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type AddPhoneRepeatCalendarFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type AddPhoneRepeatCalendarSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AddServiceCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type AddServiceFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type AddServiceSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AddVideoToFavoritesCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type AddVideoToFavoritesFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type AddVideoToFavoritesSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AddVisualLayerCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type AddVisualLayerFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type AddVisualLayerSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AppendFileCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type AppendFileFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type AppendFileSuccessCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ApplyBlusherStickMakeupCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ApplyBlusherStickMakeupFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type ApplyBlusherStickMakeupSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ApplyEyeBrowMakeupCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ApplyEyeBrowMakeupFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ApplyEyeBrowMakeupSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ApplyEyeShadowMakeupCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ApplyEyeShadowMakeupFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ApplyEyeShadowMakeupSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ApplyFaceContourMakeupCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ApplyFaceContourMakeupFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type ApplyFaceContourMakeupSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ApplyFilterCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ApplyFilterFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ApplyFilterSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ApplyLipStickMakeupCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ApplyLipStickMakeupFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ApplyLipStickMakeupSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ApplyStickerCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ApplyStickerFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ApplyStickerSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AuthPrivateMessageCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type AuthPrivateMessageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type AuthPrivateMessageSuccessCallback = ( - result: AuthPrivateMessageSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AuthorizeCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type AuthorizeFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type AuthorizeForMiniProgramCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type AuthorizeForMiniProgramFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type AuthorizeForMiniProgramSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type AuthorizeSuccessCallback = (res: GeneralCallbackResult) => void - /** 背景音频播放错误事件的监听函数 */ - type BackgroundAudioManagerOnErrorCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type BatchGetStorageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type BatchGetStorageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type BatchGetStorageSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type BatchSetStorageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type BatchSetStorageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type BatchSetStorageSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type BlurCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type BlurFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type BlurSuccessCallback = (res: GeneralCallbackResult) => void - /** 回调函数,在执行 `SelectorQuery.exec` 方法后,节点信息会在 `callback` 中返回。 */ - type BoundingClientRectCallback = ( - result: BoundingClientRectCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type CameraContextSetZoomSuccessCallback = ( - result: SetZoomSuccessCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type CameraContextStartRecordSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type CameraContextStopRecordSuccessCallback = ( - result: StopRecordSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CanvasGetImageDataCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type CanvasGetImageDataFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type CanvasGetImageDataSuccessCallback = ( - result: CanvasGetImageDataSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CanvasPutImageDataCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type CanvasPutImageDataFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type CanvasPutImageDataSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CanvasToTempFilePathCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type CanvasToTempFilePathFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type CanvasToTempFilePathSuccessCallback = ( - result: CanvasToTempFilePathSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CheckIsAddedToMyMiniProgramCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type CheckIsAddedToMyMiniProgramFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type CheckIsAddedToMyMiniProgramSuccessCallback = ( - result: CheckIsAddedToMyMiniProgramSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CheckIsOpenAccessibilityCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type CheckIsOpenAccessibilityFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type CheckIsOpenAccessibilitySuccessCallback = ( - option: CheckIsOpenAccessibilitySuccessCallbackOption - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CheckIsSoterEnrolledInDeviceCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type CheckIsSoterEnrolledInDeviceFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type CheckIsSoterEnrolledInDeviceSuccessCallback = ( - result: CheckIsSoterEnrolledInDeviceSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CheckIsSupportSoterAuthenticationCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type CheckIsSupportSoterAuthenticationFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type CheckIsSupportSoterAuthenticationSuccessCallback = ( - result: CheckIsSupportSoterAuthenticationSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CheckSessionCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type CheckSessionFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type CheckSessionSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ChooseAddressCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ChooseAddressFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ChooseAddressSuccessCallback = ( - result: ChooseAddressSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ChooseContactCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ChooseContactFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ChooseContactSuccessCallback = ( - option: ChooseContactSuccessCallbackOption - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ChooseImageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ChooseImageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ChooseImageSuccessCallback = ( - result: ChooseImageSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ChooseInvoiceCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ChooseInvoiceFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ChooseInvoiceSuccessCallback = ( - result: ChooseInvoiceSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ChooseInvoiceTitleCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ChooseInvoiceTitleFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ChooseInvoiceTitleSuccessCallback = ( - result: ChooseInvoiceTitleSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ChooseLicensePlateCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ChooseLicensePlateFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ChooseLicensePlateSuccessCallback = ( - result: ChooseLicensePlateSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ChooseLocationCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ChooseLocationFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ChooseLocationSuccessCallback = ( - result: ChooseLocationSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ChooseMediaCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ChooseMediaFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ChooseMediaSuccessCallback = ( - result: ChooseMediaSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ChooseMessageFileCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ChooseMessageFileFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ChooseMessageFileSuccessCallback = ( - result: ChooseMessageFileSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ChoosePoiCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ChoosePoiFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ChoosePoiSuccessCallback = ( - result: ChoosePoiSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ChooseVideoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ChooseVideoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ChooseVideoSuccessCallback = ( - result: ChooseVideoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ClearCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ClearFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ClearFiltersCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ClearFiltersFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ClearFiltersSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ClearMakeupsCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ClearMakeupsFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ClearMakeupsSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ClearStickersCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ClearStickersFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ClearStickersSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ClearStorageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ClearStorageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ClearStorageSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ClearSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CloseBLEConnectionCompleteCallback = (res: BluetoothError) => void - /** 接口调用失败的回调函数 */ - type CloseBLEConnectionFailCallback = (res: BluetoothError) => void - /** 接口调用成功的回调函数 */ - type CloseBLEConnectionSuccessCallback = (res: BluetoothError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CloseBluetoothAdapterCompleteCallback = (res: BluetoothError) => void - /** 接口调用失败的回调函数 */ - type CloseBluetoothAdapterFailCallback = (res: BluetoothError) => void - /** 接口调用成功的回调函数 */ - type CloseBluetoothAdapterSuccessCallback = (res: BluetoothError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CloseSocketCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type CloseSocketFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type CloseSocketSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CompressImageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type CompressImageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type CompressImageSuccessCallback = ( - result: CompressImageSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CompressVideoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type CompressVideoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type CompressVideoSuccessCallback = ( - result: CompressVideoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ConnectCompleteCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type ConnectFailCallback = (res: Nfcrwerror) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ConnectSocketCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ConnectSocketFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ConnectSocketSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ConnectSuccessCallback = (res: Nfcrwerror) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ConnectWifiCompleteCallback = (res: WifiError) => void - /** 接口调用失败的回调函数 */ - type ConnectWifiFailCallback = (res: WifiError) => void - /** 接口调用成功的回调函数 */ - type ConnectWifiSuccessCallback = (res: WifiError) => void - /** 回调函数,在执行 `SelectorQuery.exec` 方法后,返回节点信息。 */ - type ContextCallback = (result: ContextCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CopyFileCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type CopyFileFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type CopyFileSuccessCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CreateBLEConnectionCompleteCallback = (res: BluetoothError) => void - /** 接口调用失败的回调函数 */ - type CreateBLEConnectionFailCallback = (res: BluetoothError) => void - /** 接口调用成功的回调函数 */ - type CreateBLEConnectionSuccessCallback = (res: BluetoothError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CreateBLEPeripheralServerCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type CreateBLEPeripheralServerFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type CreateBLEPeripheralServerSuccessCallback = ( - result: CreateBLEPeripheralServerSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type CropImageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type CropImageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type CropImageSuccessCallback = ( - result: CropImageSuccessCallbackResult - ) => void - /** 自定义渲染事件处理回调函数 */ - type CustomRendererFrameEventCallback = ( - result: OnCustomRendererEventCallbackResult - ) => void - /** [路由动画定义函数](#) */ - type CustomRouteBuilder = ( - /** 自定义路由上下文对象 */ - customRouteContext: CustomRouteContext - ) => CustomRouteConfig - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type DisableAlertBeforeUnloadCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type DisableAlertBeforeUnloadFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type DisableAlertBeforeUnloadSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type DownloadFileCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type DownloadFileFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type DownloadFileSuccessCallback = ( - result: DownloadFileSuccessCallbackResult - ) => void - /** onHeadersReceived 传入的监听函数。不传此参数则移除所有监听函数。 */ - type DownloadTaskOffHeadersReceivedCallback = ( - result: DownloadTaskOnHeadersReceivedListenerResult - ) => void - /** onProgressUpdate 传入的监听函数。不传此参数则移除所有监听函数。 */ - type DownloadTaskOffProgressUpdateCallback = ( - result: DownloadTaskOnProgressUpdateListenerResult - ) => void - /** HTTP Response Header 事件的监听函数 */ - type DownloadTaskOnHeadersReceivedCallback = ( - result: DownloadTaskOnHeadersReceivedListenerResult - ) => void - /** 下载进度变化事件的监听函数 */ - type DownloadTaskOnProgressUpdateCallback = ( - result: DownloadTaskOnProgressUpdateListenerResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type EditImageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type EditImageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type EditImageSuccessCallback = ( - result: CropImageSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type EnableAlertBeforeUnloadCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type EnableAlertBeforeUnloadFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type EnableAlertBeforeUnloadSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type EraseLinesCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type EraseLinesFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type EraseLinesSuccessCallback = (res: GeneralCallbackResult) => void - /** 事件监听函数 */ - type EventCallback = ( - /** 触发事件参数 */ - ...args: any - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ExecuteVisualLayerCommandCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ExecuteVisualLayerCommandFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type ExecuteVisualLayerCommandSuccessCallback = ( - result: ExecuteVisualLayerCommandSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ExitCastingCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ExitCastingFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ExitCastingSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ExitFullScreenCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ExitFullScreenFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ExitFullScreenSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ExitMiniProgramCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ExitMiniProgramFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ExitMiniProgramSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ExitPictureInPictureCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ExitPictureInPictureFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ExitPictureInPictureSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ExitVoIPChatCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ExitVoIPChatFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ExitVoIPChatSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type FaceDetectCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type FaceDetectFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type FaceDetectSuccessCallback = ( - result: FaceDetectSuccessCallbackResult - ) => void - /** 回调函数 */ - type FieldsCallback = ( - /** 节点的相关信息 */ - res: IAnyObject - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type FileSystemManagerCloseCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type FileSystemManagerCloseFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type FileSystemManagerCloseSuccessCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type FromScreenLocationCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type FromScreenLocationFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type FromScreenLocationSuccessCallback = ( - result: GetCenterLocationSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type FstatCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type FstatFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type FstatSuccessCallback = (result: FstatSuccessCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type FtruncateCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type FtruncateFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type FtruncateSuccessCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetAtqaCompleteCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type GetAtqaFailCallback = (res: Nfcrwerror) => void - /** 接口调用成功的回调函数 */ - type GetAtqaSuccessCallback = (result: GetAtqaSuccessCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetAvailableAudioSourcesCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetAvailableAudioSourcesFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type GetAvailableAudioSourcesSuccessCallback = ( - result: GetAvailableAudioSourcesSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetBLEDeviceCharacteristicsCompleteCallback = ( - res: BluetoothError - ) => void - /** 接口调用失败的回调函数 */ - type GetBLEDeviceCharacteristicsFailCallback = (res: BluetoothError) => void - /** 接口调用成功的回调函数 */ - type GetBLEDeviceCharacteristicsSuccessCallback = ( - result: GetBLEDeviceCharacteristicsSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetBLEDeviceRSSICompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetBLEDeviceRSSIFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetBLEDeviceRSSISuccessCallback = ( - result: GetBLEDeviceRSSISuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetBLEDeviceServicesCompleteCallback = (res: BluetoothError) => void - /** 接口调用失败的回调函数 */ - type GetBLEDeviceServicesFailCallback = (res: BluetoothError) => void - /** 接口调用成功的回调函数 */ - type GetBLEDeviceServicesSuccessCallback = ( - result: GetBLEDeviceServicesSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetBLEMTUCompleteCallback = (res: BluetoothError) => void - /** 接口调用失败的回调函数 */ - type GetBLEMTUFailCallback = (res: BluetoothError) => void - /** 接口调用成功的回调函数 */ - type GetBLEMTUSuccessCallback = ( - result: GetBLEMTUSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetBackgroundAudioPlayerStateCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetBackgroundAudioPlayerStateFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type GetBackgroundAudioPlayerStateSuccessCallback = ( - result: GetBackgroundAudioPlayerStateSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetBackgroundFetchDataCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetBackgroundFetchDataFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type GetBackgroundFetchDataSuccessCallback = ( - result: GetBackgroundFetchDataSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetBackgroundFetchTokenCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetBackgroundFetchTokenFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type GetBackgroundFetchTokenSuccessCallback = ( - result: GetBackgroundFetchTokenSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetBatteryInfoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetBatteryInfoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetBatteryInfoSuccessCallback = ( - result: GetBatteryInfoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetBeaconsCompleteCallback = (res: BeaconError) => void - /** 接口调用失败的回调函数 */ - type GetBeaconsFailCallback = (res: BeaconError) => void - /** 接口调用成功的回调函数 */ - type GetBeaconsSuccessCallback = ( - result: GetBeaconsSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetBluetoothAdapterStateCompleteCallback = ( - res: BluetoothError - ) => void - /** 接口调用失败的回调函数 */ - type GetBluetoothAdapterStateFailCallback = (res: BluetoothError) => void - /** 接口调用成功的回调函数 */ - type GetBluetoothAdapterStateSuccessCallback = ( - result: GetBluetoothAdapterStateSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetBluetoothDevicesCompleteCallback = (res: BluetoothError) => void - /** 接口调用失败的回调函数 */ - type GetBluetoothDevicesFailCallback = (res: BluetoothError) => void - /** 接口调用成功的回调函数 */ - type GetBluetoothDevicesSuccessCallback = ( - result: GetBluetoothDevicesSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetCenterLocationCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetCenterLocationFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetCenterLocationSuccessCallback = ( - result: GetCenterLocationSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetChannelsLiveInfoCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetChannelsLiveInfoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetChannelsLiveInfoSuccessCallback = ( - result: GetChannelsLiveInfoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetChannelsLiveNoticeInfoCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetChannelsLiveNoticeInfoFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type GetChannelsLiveNoticeInfoSuccessCallback = ( - result: GetChannelsLiveNoticeInfoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetChannelsShareKeyCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetChannelsShareKeyFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetChannelsShareKeySuccessCallback = ( - result: GetChannelsShareKeySuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetClipboardDataCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetClipboardDataFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetClipboardDataSuccessCallback = ( - option: GetClipboardDataSuccessCallbackOption - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetCommonConfigCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetCommonConfigFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetCommonConfigSuccessCallback = ( - result: GetCommonConfigSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetConnectedBluetoothDevicesCompleteCallback = ( - res: BluetoothError - ) => void - /** 接口调用失败的回调函数 */ - type GetConnectedBluetoothDevicesFailCallback = ( - res: BluetoothError - ) => void - /** 接口调用成功的回调函数 */ - type GetConnectedBluetoothDevicesSuccessCallback = ( - result: GetConnectedBluetoothDevicesSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetConnectedWifiCompleteCallback = (res: WifiError) => void - /** 接口调用失败的回调函数 */ - type GetConnectedWifiFailCallback = (res: WifiError) => void - /** 接口调用成功的回调函数 */ - type GetConnectedWifiSuccessCallback = ( - result: GetConnectedWifiSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetContentsCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetContentsFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetContentsSuccessCallback = ( - result: GetContentsSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetDeviceBenchmarkInfoCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetDeviceBenchmarkInfoFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type GetDeviceBenchmarkInfoSuccessCallback = ( - result: GetDeviceBenchmarkInfoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetDeviceVoIPListCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetDeviceVoIPListFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetDeviceVoIPListSuccessCallback = ( - result: GetDeviceVoIPListSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetExtConfigCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetExtConfigFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetExtConfigSuccessCallback = ( - result: GetExtConfigSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetFileInfoCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type GetFileInfoFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type GetFileInfoSuccessCallback = ( - result: GetFileInfoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetFuzzyLocationCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetFuzzyLocationFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetFuzzyLocationSuccessCallback = ( - result: GetFuzzyLocationSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetGroupEnterInfoCompleteCallback = ( - res: GetGroupEnterInfoError - ) => void - /** 接口调用失败的回调函数 */ - type GetGroupEnterInfoFailCallback = (res: GetGroupEnterInfoError) => void - /** 接口调用成功的回调函数 */ - type GetGroupEnterInfoSuccessCallback = ( - result: GetGroupEnterInfoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetHCEStateCompleteCallback = (res: NFCError) => void - /** 接口调用失败的回调函数 */ - type GetHCEStateFailCallback = (res: NFCError) => void - /** 接口调用成功的回调函数 */ - type GetHCEStateSuccessCallback = (res: NFCError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetHistoricalBytesCompleteCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type GetHistoricalBytesFailCallback = (res: Nfcrwerror) => void - /** 接口调用成功的回调函数 */ - type GetHistoricalBytesSuccessCallback = ( - result: GetHistoricalBytesSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetImageInfoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetImageInfoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetImageInfoSuccessCallback = ( - result: GetImageInfoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetInferenceEnvInfoCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetInferenceEnvInfoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetInferenceEnvInfoSuccessCallback = ( - result: GetInferenceEnvInfoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetLatestUserKeyCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetLatestUserKeyFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetLatestUserKeySuccessCallback = ( - result: GetLatestUserKeySuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetLocalIPAddressCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetLocalIPAddressFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetLocalIPAddressSuccessCallback = ( - result: GetLocalIPAddressSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetLocationCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetLocationFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetLocationSuccessCallback = ( - result: GetLocationSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetMaxTransceiveLengthCompleteCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type GetMaxTransceiveLengthFailCallback = (res: Nfcrwerror) => void - /** 接口调用成功的回调函数 */ - type GetMaxTransceiveLengthSuccessCallback = ( - result: GetMaxTransceiveLengthSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetMaxZoomCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetMaxZoomFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetMaxZoomSuccessCallback = ( - result: GetMaxZoomSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetNetworkTypeCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetNetworkTypeFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetNetworkTypeSuccessCallback = ( - result: GetNetworkTypeSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetPrivacySettingCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetPrivacySettingFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetPrivacySettingSuccessCallback = ( - result: GetPrivacySettingSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetRandomValuesCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetRandomValuesFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetRandomValuesSuccessCallback = ( - result: GetRandomValuesSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetRegionCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetRegionFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetRegionSuccessCallback = ( - result: GetRegionSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetRendererUserAgentCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetRendererUserAgentFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetRendererUserAgentSuccessCallback = ( - /** UserAgent */ - userAgent: string - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetRotateCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetRotateFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetRotateSuccessCallback = ( - result: GetRotateSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetSakCompleteCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type GetSakFailCallback = (res: Nfcrwerror) => void - /** 接口调用成功的回调函数 */ - type GetSakSuccessCallback = (result: GetSakSuccessCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetSavedFileListCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetSavedFileListFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetSavedFileListSuccessCallback = ( - result: GetSavedFileListSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetScaleCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetScaleFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetScaleSuccessCallback = ( - result: GetScaleSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetScreenBrightnessCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetScreenBrightnessFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetScreenBrightnessSuccessCallback = ( - option: GetScreenBrightnessSuccessCallbackOption - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetScreenRecordingStateCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetScreenRecordingStateFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type GetScreenRecordingStateSuccessCallback = ( - result: GetScreenRecordingStateSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetSelectedTextRangeCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetSelectedTextRangeFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetSelectedTextRangeSuccessCallback = ( - result: GetSelectedTextRangeSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetSelectionTextCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetSelectionTextFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetSelectionTextSuccessCallback = ( - result: GetSelectionTextSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetSettingCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetSettingFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetSettingSuccessCallback = ( - result: GetSettingSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetShareInfoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetShareInfoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetShareInfoSuccessCallback = ( - result: GetGroupEnterInfoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetSkewCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetSkewFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetSkewSuccessCallback = (result: GetSkewSuccessCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetSkylineInfoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetSkylineInfoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetSkylineInfoSuccessCallback = ( - /** 当前运行环境对于 [Skyline 渲染引擎](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/introduction.html) 的支持情况 */ - result: SkylineInfo - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetStorageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetStorageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetStorageInfoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetStorageInfoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetStorageInfoSuccessCallback = ( - option: GetStorageInfoSuccessCallbackOption - ) => void - /** 接口调用成功的回调函数 */ - type GetStorageSuccessCallback<T = any> = ( - result: GetStorageSuccessCallbackResult<T> - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetSystemInfoAsyncCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type GetSystemInfoAsyncFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetSystemInfoAsyncSuccessCallback = (result: SystemInfo) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetSystemInfoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetSystemInfoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetSystemInfoSuccessCallback = (result: SystemInfo) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetUserInfoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetUserInfoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetUserInfoSuccessCallback = ( - result: GetUserInfoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetUserProfileCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetUserProfileFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetUserProfileSuccessCallback = ( - result: GetUserProfileSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetVideoInfoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetVideoInfoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetVideoInfoSuccessCallback = ( - result: GetVideoInfoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetWeRunDataCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type GetWeRunDataFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type GetWeRunDataSuccessCallback = ( - result: GetWeRunDataSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type GetWifiListCompleteCallback = (res: WifiError) => void - /** 接口调用失败的回调函数 */ - type GetWifiListFailCallback = (res: WifiError) => void - /** 接口调用成功的回调函数 */ - type GetWifiListSuccessCallback = (res: WifiError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type HideHomeButtonCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type HideHomeButtonFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type HideHomeButtonSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type HideKeyboardCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type HideKeyboardFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type HideKeyboardSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type HideLoadingCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type HideLoadingFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type HideLoadingSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type HideNavigationBarLoadingCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type HideNavigationBarLoadingFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type HideNavigationBarLoadingSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type HideShareMenuCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type HideShareMenuFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type HideShareMenuSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type HideTabBarCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type HideTabBarFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type HideTabBarRedDotCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type HideTabBarRedDotFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type HideTabBarRedDotSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type HideTabBarSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type HideToastCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type HideToastFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type HideToastSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type IncludePointsCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type IncludePointsFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type IncludePointsSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type InitFaceDetectCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type InitFaceDetectFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type InitFaceDetectSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type InitMarkerClusterCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type InitMarkerClusterFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type InitMarkerClusterSuccessCallback = (res: GeneralCallbackResult) => void - /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */ - type InnerAudioContextOffErrorCallback = ( - result: InnerAudioContextOnErrorListenerResult - ) => void - /** 音频播放错误事件的监听函数 */ - type InnerAudioContextOnErrorCallback = ( - result: InnerAudioContextOnErrorListenerResult - ) => void - type InnerAudioContextOnStopCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type InsertDividerCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type InsertDividerFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type InsertDividerSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type InsertImageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type InsertImageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type InsertImageSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type InsertTextCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type InsertTextFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type InsertTextSuccessCallback = (res: GeneralCallbackResult) => void - /** 监听相交状态变化的回调函数 */ - type IntersectionObserverObserveCallback = ( - result: IntersectionObserverObserveCallbackResult - ) => void - /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */ - type InterstitialAdOffErrorCallback = ( - result: InterstitialAdOnErrorListenerResult - ) => void - /** 插屏错误事件的监听函数 */ - type InterstitialAdOnErrorCallback = ( - result: InterstitialAdOnErrorListenerResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type IsBluetoothDevicePairedCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type IsBluetoothDevicePairedFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type IsBluetoothDevicePairedSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type IsConnectedCompleteCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type IsConnectedFailCallback = (res: Nfcrwerror) => void - /** 接口调用成功的回调函数 */ - type IsConnectedSuccessCallback = (res: Nfcrwerror) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type Join1v1ChatCompleteCallback = (res: Join1v1ChatError) => void - /** 接口调用失败的回调函数 */ - type Join1v1ChatFailCallback = (res: Join1v1ChatError) => void - /** 接口调用成功的回调函数 */ - type Join1v1ChatSuccessCallback = (res: Join1v1ChatError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type JoinVoIPChatCompleteCallback = (res: JoinVoIPChatError) => void - /** 接口调用失败的回调函数 */ - type JoinVoIPChatFailCallback = (res: JoinVoIPChatError) => void - /** 接口调用成功的回调函数 */ - type JoinVoIPChatSuccessCallback = ( - result: JoinVoIPChatSuccessCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type LivePlayerContextSnapshotSuccessCallback = ( - result: LivePlayerContextSnapshotSuccessCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type LivePusherContextSetZoomSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type LivePusherContextSnapshotSuccessCallback = ( - result: LivePusherContextSnapshotSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type LoadFontFaceCompleteCallback = ( - result: LoadFontFaceCompleteCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type LoadFontFaceFailCallback = ( - result: LoadFontFaceCompleteCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type LoadFontFaceSuccessCallback = ( - result: LoadFontFaceCompleteCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type LoginCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type LoginFailCallback = (err: RequestFailCallbackErr) => void - /** 接口调用成功的回调函数 */ - type LoginSuccessCallback = (result: LoginSuccessCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type MakeBluetoothPairCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type MakeBluetoothPairFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type MakeBluetoothPairSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type MakePhoneCallCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type MakePhoneCallFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type MakePhoneCallSuccessCallback = (res: GeneralCallbackResult) => void - /** 监听 media query 状态变化的回调函数 */ - type MediaQueryObserverObserveCallback = ( - result: MediaQueryObserverObserveCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type MkdirCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type MkdirFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type MkdirSuccessCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type MoveAlongCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type MoveAlongFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type MoveAlongSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type MoveToLocationCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type MoveToLocationFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type MoveToLocationSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type MuteCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type MuteFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type MuteSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type NavigateBackCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type NavigateBackFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type NavigateBackMiniProgramCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type NavigateBackMiniProgramFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type NavigateBackMiniProgramSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type NavigateBackSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type NavigateToCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type NavigateToFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type NavigateToMiniProgramCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type NavigateToMiniProgramFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type NavigateToMiniProgramSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type NavigateToSuccessCallback = ( - result: NavigateToSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type NdefCloseCompleteCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type NdefCloseFailCallback = (res: Nfcrwerror) => void - /** 接口调用成功的回调函数 */ - type NdefCloseSuccessCallback = (res: Nfcrwerror) => void - /** 回调函数,在执行 `SelectorQuery.exec` 方法后,返回节点信息。 */ - type NodeCallback = (result: NodeCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type NotifyBLECharacteristicValueChangeCompleteCallback = ( - res: BluetoothError - ) => void - /** 接口调用失败的回调函数 */ - type NotifyBLECharacteristicValueChangeFailCallback = ( - res: BluetoothError - ) => void - /** 接口调用成功的回调函数 */ - type NotifyBLECharacteristicValueChangeSuccessCallback = ( - res: BluetoothError - ) => void - /** onAccelerometerChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffAccelerometerChangeCallback = (res: GeneralCallbackResult) => void - /** onAfterPageLoad 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffAfterPageLoadCallback = ( - result: OnAfterPageLoadListenerResult - ) => void - /** onAfterPageUnload 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffAfterPageUnloadCallback = ( - result: OnAfterPageUnloadListenerResult - ) => void - /** onApiCategoryChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffApiCategoryChangeCallback = ( - result: OnApiCategoryChangeListenerResult - ) => void - /** onAppHide 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffAppHideCallback = (res: GeneralCallbackResult) => void - /** onAppRoute 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffAppRouteCallback = (result: OnAppRouteListenerResult) => void - /** onAppRouteDone 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffAppRouteDoneCallback = ( - result: OnAppRouteDoneListenerResult - ) => void - /** onAppShow 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffAppShowCallback = (res: GeneralCallbackResult) => void - /** onAudioInterruptionBegin 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffAudioInterruptionBeginCallback = ( - res: GeneralCallbackResult - ) => void - /** onAudioInterruptionEnd 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffAudioInterruptionEndCallback = (res: GeneralCallbackResult) => void - /** onBLEConnectionStateChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffBLEConnectionStateChangeCallback = ( - result: OnBLEConnectionStateChangeListenerResult - ) => void - /** onBLEMTUChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffBLEMTUChangeCallback = ( - result: OnBLEMTUChangeListenerResult - ) => void - /** onBLEPeripheralConnectionStateChanged 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffBLEPeripheralConnectionStateChangedCallback = ( - result: OnBLEPeripheralConnectionStateChangedListenerResult - ) => void - /** onBatteryInfoChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffBatteryInfoChangeCallback = ( - result: OnBatteryInfoChangeListenerResult - ) => void - /** onBeforeAppRoute 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffBeforeAppRouteCallback = ( - result: OnBeforeAppRouteListenerResult - ) => void - /** onBeforePageLoad 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffBeforePageLoadCallback = ( - result: OnBeforePageLoadListenerResult - ) => void - /** onBeforePageUnload 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffBeforePageUnloadCallback = ( - result: OnBeforePageUnloadListenerResult - ) => void - /** onBindWifi 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffBindWifiCallback = (res: GeneralCallbackResult) => void - /** onCanplay 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffCanplayCallback = (res: GeneralCallbackResult) => void - /** onCharacteristicReadRequest 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffCharacteristicReadRequestCallback = ( - result: OnCharacteristicReadRequestListenerResult - ) => void - /** onCharacteristicSubscribed 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffCharacteristicSubscribedCallback = ( - result: OnCharacteristicSubscribedListenerResult - ) => void - /** onCharacteristicUnsubscribed 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffCharacteristicUnsubscribedCallback = ( - result: OnCharacteristicSubscribedListenerResult - ) => void - /** onCharacteristicWriteRequest 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffCharacteristicWriteRequestCallback = ( - result: OnCharacteristicWriteRequestListenerResult - ) => void - /** onChunkReceived 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffChunkReceivedCallback = ( - result: OnChunkReceivedListenerResult - ) => void - /** onCompassChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffCompassChangeCallback = (res: GeneralCallbackResult) => void - /** onConnect 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffConnectCallback = (result: OnConnectListenerResult) => void - /** onDeviceMotionChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffDeviceMotionChangeCallback = (res: GeneralCallbackResult) => void - /** onDiscovered 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffDiscoveredCallback = (result: OnDiscoveredListenerResult) => void - /** onEmbeddedMiniProgramHeightChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffEmbeddedMiniProgramHeightChangeCallback = ( - result: OnEmbeddedMiniProgramHeightChangeListenerResult - ) => void - /** onEnded 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffEndedCallback = (res: GeneralCallbackResult) => void - /** onGetWifiList 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffGetWifiListCallback = (result: OnGetWifiListListenerResult) => void - /** onGyroscopeChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffGyroscopeChangeCallback = (res: GeneralCallbackResult) => void - /** onHCEMessage 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffHCEMessageCallback = (result: OnHCEMessageListenerResult) => void - /** onKeyboardHeightChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffKeyboardHeightChangeCallback = ( - result: OnKeyboardHeightChangeListenerResult - ) => void - /** onLazyLoadError 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffLazyLoadErrorCallback = ( - result: OnLazyLoadErrorListenerResult - ) => void - /** onListening 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffListeningCallback = (res: GeneralCallbackResult) => void - /** onLoad 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffLoadCallback = (res: GeneralCallbackResult) => void - /** onLocalServiceDiscoveryStop 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffLocalServiceDiscoveryStopCallback = ( - res: GeneralCallbackResult - ) => void - /** onLocalServiceFound 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffLocalServiceFoundCallback = ( - result: OnLocalServiceFoundListenerResult - ) => void - /** onLocalServiceLost 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffLocalServiceLostCallback = ( - result: OnLocalServiceLostListenerResult - ) => void - /** onLocalServiceResolveFail 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffLocalServiceResolveFailCallback = ( - result: OnLocalServiceLostListenerResult - ) => void - /** onLocationChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffLocationChangeCallback = ( - result: OnLocationChangeListenerResult - ) => void - /** onLocationChangeError 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffLocationChangeErrorCallback = ( - result: OnLocationChangeErrorListenerResult - ) => void - /** onMemoryWarning 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffMemoryWarningCallback = ( - result: OnMemoryWarningListenerResult - ) => void - /** onMenuButtonBoundingClientRectWeightChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffMenuButtonBoundingClientRectWeightChangeCallback = ( - result: OnMenuButtonBoundingClientRectWeightChangeListenerResult - ) => void - /** onNetworkStatusChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffNetworkStatusChangeCallback = (res: GeneralCallbackResult) => void - /** onNetworkWeakChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffNetworkWeakChangeCallback = ( - result: OnNetworkWeakChangeListenerResult - ) => void - /** onPageNotFound 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffPageNotFoundCallback = ( - result: OnPageNotFoundListenerResult - ) => void - /** onPause 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffPauseCallback = (res: GeneralCallbackResult) => void - /** onPlay 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffPlayCallback = (res: GeneralCallbackResult) => void - /** onScreenRecordingStateChanged 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffScreenRecordingStateChangedCallback = ( - result: OnScreenRecordingStateChangedListenerResult - ) => void - /** onSeeked 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffSeekedCallback = (res: GeneralCallbackResult) => void - /** onSeeking 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffSeekingCallback = (res: GeneralCallbackResult) => void - /** onStop 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffStopCallback = (res: GeneralCallbackResult) => void - /** onThemeChange 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffThemeChangeCallback = (result: OnThemeChangeListenerResult) => void - /** onTimeUpdate 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffTimeUpdateCallback = (res: GeneralCallbackResult) => void - /** onUnhandledRejection 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffUnhandledRejectionCallback = ( - result: OnUnhandledRejectionListenerResult - ) => void - /** onVoIPChatInterrupted 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffVoIPChatInterruptedCallback = ( - result: OnVoIPChatInterruptedListenerResult - ) => void - /** onVoIPChatMembersChanged 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffVoIPChatMembersChangedCallback = ( - result: OnVoIPChatMembersChangedListenerResult - ) => void - /** onVoIPChatSpeakersChanged 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffVoIPChatSpeakersChangedCallback = ( - result: OnVoIPChatSpeakersChangedListenerResult - ) => void - /** onVoIPChatStateChanged 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffVoIPChatStateChangedCallback = ( - result: OnVoIPChatStateChangedListenerResult - ) => void - /** onVoIPVideoMembersChanged 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffVoIPVideoMembersChangedCallback = ( - result: OnVoIPVideoMembersChangedListenerResult - ) => void - /** onWaiting 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffWaitingCallback = (res: GeneralCallbackResult) => void - /** onWifiConnected 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffWifiConnectedCallback = ( - result: OnWifiConnectedListenerResult - ) => void - /** onWifiConnectedWithPartialInfo 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffWifiConnectedWithPartialInfoCallback = ( - result: OnWifiConnectedWithPartialInfoListenerResult - ) => void - /** onWindowResize 传入的监听函数。不传此参数则移除所有监听函数。 */ - type OffWindowResizeCallback = ( - result: OnWindowResizeListenerResult - ) => void - /** 加速度数据事件的监听函数 */ - type OnAccelerometerChangeCallback = ( - result: OnAccelerometerChangeListenerResult - ) => void - /** 路由事件的监听函数 */ - type OnAfterPageLoadCallback = ( - result: OnAfterPageLoadListenerResult - ) => void - /** 路由事件的监听函数 */ - type OnAfterPageUnloadCallback = ( - result: OnAfterPageUnloadListenerResult - ) => void - /** API 类别变化事件的监听函数 */ - type OnApiCategoryChangeCallback = ( - result: OnApiCategoryChangeListenerResult - ) => void - /** 小程序切后台事件的监听函数 */ - type OnAppHideCallback = (res: GeneralCallbackResult) => void - /** 路由事件的监听函数 */ - type OnAppRouteCallback = (result: OnAppRouteListenerResult) => void - /** 当前路由动画执行完成的事件的监听函数 */ - type OnAppRouteDoneCallback = (result: OnAppRouteDoneListenerResult) => void - /** 小程序切前台事件的监听函数 */ - type OnAppShowCallback = ( - /** 启动参数 */ - options: LaunchOptionsApp - ) => void - /** 音频因为受到系统占用而被中断开始事件的监听函数 */ - type OnAudioInterruptionBeginCallback = (res: GeneralCallbackResult) => void - /** 音频中断结束事件的监听函数 */ - type OnAudioInterruptionEndCallback = (res: GeneralCallbackResult) => void - /** 蓝牙低功耗设备的特征值变化事件的监听函数 */ - type OnBLECharacteristicValueChangeCallback = ( - result: OnBLECharacteristicValueChangeListenerResult - ) => void - /** 蓝牙低功耗连接状态改变事件的监听函数 */ - type OnBLEConnectionStateChangeCallback = ( - result: OnBLEConnectionStateChangeListenerResult - ) => void - /** 蓝牙低功耗的最大传输单元变化事件的监听函数 */ - type OnBLEMTUChangeCallback = (result: OnBLEMTUChangeListenerResult) => void - /** 当前外围设备被连接或断开连接事件的监听函数 */ - type OnBLEPeripheralConnectionStateChangedCallback = ( - result: OnBLEPeripheralConnectionStateChangedListenerResult - ) => void - /** 音乐暂停事件的监听函数 */ - type OnBackgroundAudioPauseCallback = (res: GeneralCallbackResult) => void - /** 音乐播放事件的监听函数 */ - type OnBackgroundAudioPlayCallback = (res: GeneralCallbackResult) => void - /** 音乐停止事件的监听函数 */ - type OnBackgroundAudioStopCallback = (res: GeneralCallbackResult) => void - /** 收到 backgroundFetch 数据事件的监听函数 */ - type OnBackgroundFetchDataCallback = ( - result: OnBackgroundFetchDataListenerResult - ) => void - /** 电池信息变化事件的监听函数 */ - type OnBatteryInfoChangeCallback = ( - result: OnBatteryInfoChangeListenerResult - ) => void - /** Beacon 服务状态变化事件的监听函数 */ - type OnBeaconServiceChangeCallback = ( - result: OnBeaconServiceChangeListenerResult - ) => void - /** Beacon 设备更新事件的监听函数 */ - type OnBeaconUpdateCallback = (result: OnBeaconUpdateListenerResult) => void - /** 路由事件的监听函数 */ - type OnBeforeAppRouteCallback = ( - result: OnBeforeAppRouteListenerResult - ) => void - /** 路由事件的监听函数 */ - type OnBeforePageLoadCallback = ( - result: OnBeforePageLoadListenerResult - ) => void - /** 路由事件的监听函数 */ - type OnBeforePageUnloadCallback = ( - result: OnBeforePageUnloadListenerResult - ) => void - /** 当一个 socket 绑定当前 wifi 网络成功时触发该事件的监听函数 */ - type OnBindWifiCallback = (res: GeneralCallbackResult) => void - /** 蓝牙适配器状态变化事件的监听函数 */ - type OnBluetoothAdapterStateChangeCallback = ( - result: OnBluetoothAdapterStateChangeListenerResult - ) => void - /** 搜索到新设备的事件的监听函数 */ - type OnBluetoothDeviceFoundCallback = ( - result: OnBluetoothDeviceFoundListenerResult - ) => void - /** 回调函数 */ - type OnCameraFrameCallback = (result: OnCameraFrameCallbackResult) => void - type OnCanplayCallback = (res: GeneralCallbackResult) => void - /** 已连接的设备请求读当前外围设备的特征值事件的监听函数 */ - type OnCharacteristicReadRequestCallback = ( - result: OnCharacteristicReadRequestListenerResult - ) => void - /** 特征订阅事件的监听函数 */ - type OnCharacteristicSubscribedCallback = ( - result: OnCharacteristicSubscribedListenerResult - ) => void - /** 取消特征订阅事件的监听函数 */ - type OnCharacteristicUnsubscribedCallback = ( - result: OnCharacteristicSubscribedListenerResult - ) => void - /** 已连接的设备请求写当前外围设备的特征值事件的监听函数 */ - type OnCharacteristicWriteRequestCallback = ( - result: OnCharacteristicWriteRequestListenerResult - ) => void - /** 向微信后台请求检查更新结果事件的监听函数 */ - type OnCheckForUpdateCallback = ( - result: OnCheckForUpdateListenerResult - ) => void - /** Transfer-Encoding Chunk Received 事件的监听函数 */ - type OnChunkReceivedCallback = ( - result: OnChunkReceivedListenerResult - ) => void - /** 罗盘数据变化事件的监听函数 */ - type OnCompassChangeCallback = ( - result: OnCompassChangeListenerResult - ) => void - /** 当一个 socket 连接成功建立的时候触发该事件的监听函数 */ - type OnConnectCallback = (result: OnConnectListenerResult) => void - /** 用户点击右上角菜单的「复制链接」按钮时触发的事件的监听函数 */ - type OnCopyUrlCallback = (result: OnCopyUrlListenerResult) => void - /** 设备方向变化事件的监听函数 */ - type OnDeviceMotionChangeCallback = ( - result: OnDeviceMotionChangeListenerResult - ) => void - /** 的监听函数 */ - type OnDiscoveredCallback = (result: OnDiscoveredListenerResult) => void - /** 半屏小程序可视高度变化事件的监听函数 */ - type OnEmbeddedMiniProgramHeightChangeCallback = ( - result: OnEmbeddedMiniProgramHeightChangeListenerResult - ) => void - type OnEndedCallback = (res: GeneralCallbackResult) => void - /** 已录制完指定帧大小的文件事件的监听函数 */ - type OnFrameRecordedCallback = ( - result: OnFrameRecordedListenerResult - ) => void - /** 获取到 Wi-Fi 列表数据事件的监听函数 */ - type OnGetWifiListCallback = (result: OnGetWifiListListenerResult) => void - /** 陀螺仪数据变化事件的监听函数 */ - type OnGyroscopeChangeCallback = ( - result: OnGyroscopeChangeListenerResult - ) => void - /** 接收 NFC 设备消息事件的监听函数 */ - type OnHCEMessageCallback = (result: OnHCEMessageListenerResult) => void - /** 录音因为受到系统占用而被中断开始事件的监听函数 */ - type OnInterruptionBeginCallback = (res: GeneralCallbackResult) => void - /** 录音中断结束事件的监听函数 */ - type OnInterruptionEndCallback = (res: GeneralCallbackResult) => void - /** 键盘高度变化事件的监听函数 */ - type OnKeyboardHeightChangeCallback = ( - result: OnKeyboardHeightChangeListenerResult - ) => void - /** 小程序异步组件加载失败事件的监听函数 */ - type OnLazyLoadErrorCallback = ( - result: OnLazyLoadErrorListenerResult - ) => void - /** 开始监听数据包消息的事件的监听函数 */ - type OnListeningCallback = (res: GeneralCallbackResult) => void - type OnLoadCallback = (res: GeneralCallbackResult) => void - /** mDNS 服务停止搜索的事件的监听函数 */ - type OnLocalServiceDiscoveryStopCallback = ( - res: GeneralCallbackResult - ) => void - /** mDNS 服务发现的事件的监听函数 */ - type OnLocalServiceFoundCallback = ( - result: OnLocalServiceFoundListenerResult - ) => void - /** mDNS 服务离开的事件的监听函数 */ - type OnLocalServiceLostCallback = ( - result: OnLocalServiceLostListenerResult - ) => void - /** mDNS 服务解析失败的事件的监听函数 */ - type OnLocalServiceResolveFailCallback = ( - result: OnLocalServiceLostListenerResult - ) => void - /** 实时地理位置变化事件的监听函数 */ - type OnLocationChangeCallback = ( - result: OnLocationChangeListenerResult - ) => void - /** 的监听函数 */ - type OnLocationChangeErrorCallback = ( - result: OnLocationChangeErrorListenerResult - ) => void - /** 内存不足告警事件的监听函数 */ - type OnMemoryWarningCallback = ( - result: OnMemoryWarningListenerResult - ) => void - /** 菜单按钮(右上角胶囊按钮)的布局位置信息变化事件的监听函数 */ - type OnMenuButtonBoundingClientRectWeightChangeCallback = ( - result: OnMenuButtonBoundingClientRectWeightChangeListenerResult - ) => void - /** 隐私接口需要用户授权事件的监听函数 */ - type OnNeedPrivacyAuthorizationCallback = ( - res: GeneralCallbackResult - ) => void - /** 网络状态变化事件的监听函数 */ - type OnNetworkStatusChangeCallback = ( - result: OnNetworkStatusChangeListenerResult - ) => void - /** 弱网状态变化事件的监听函数 */ - type OnNetworkWeakChangeCallback = ( - result: OnNetworkWeakChangeListenerResult - ) => void - /** 用户在系统音乐播放面板点击下一曲事件的监听函数 */ - type OnNextCallback = (res: GeneralCallbackResult) => void - /** WebSocket 连接打开事件的监听函数 */ - type OnOpenCallback = (result: OnOpenListenerResult) => void - /** 小程序要打开的页面不存在事件的监听函数 */ - type OnPageNotFoundCallback = (result: OnPageNotFoundListenerResult) => void - type OnPauseCallback = (res: GeneralCallbackResult) => void - type OnPlayCallback = (res: GeneralCallbackResult) => void - /** 用户在系统音乐播放面板点击上一曲事件的监听函数 */ - type OnPrevCallback = (res: GeneralCallbackResult) => void - /** worker线程被系统回收事件的监听函数 */ - type OnProcessKilledCallback = (res: GeneralCallbackResult) => void - /** 录音继续事件的监听函数 */ - type OnResumeCallback = (res: GeneralCallbackResult) => void - /** 用户录屏事件的监听函数 */ - type OnScreenRecordingStateChangedCallback = ( - result: OnScreenRecordingStateChangedListenerResult - ) => void - type OnSeekedCallback = (res: GeneralCallbackResult) => void - type OnSeekingCallback = (res: GeneralCallbackResult) => void - /** WebSocket 连接关闭事件的监听函数 */ - type OnSocketCloseCallback = ( - result: SocketTaskOnCloseListenerResult - ) => void - /** WebSocket 错误事件的监听函数 */ - type OnSocketErrorCallback = (result: GeneralCallbackResult) => void - /** WebSocket 接收到服务器的消息事件的监听函数 */ - type OnSocketMessageCallback = ( - result: SocketTaskOnMessageListenerResult - ) => void - /** WebSocket 连接打开事件的监听函数 */ - type OnSocketOpenCallback = (result: OnSocketOpenListenerResult) => void - /** 录音开始事件的监听函数 */ - type OnStartCallback = (res: GeneralCallbackResult) => void - /** 系统主题改变事件的监听函数 */ - type OnThemeChangeCallback = (result: OnThemeChangeListenerResult) => void - type OnTimeUpdateCallback = (res: GeneralCallbackResult) => void - /** 未处理的 Promise 拒绝事件的监听函数 */ - type OnUnhandledRejectionCallback = ( - result: OnUnhandledRejectionListenerResult - ) => void - /** 小程序更新失败事件的监听函数 */ - type OnUpdateFailedCallback = (res: GeneralCallbackResult) => void - /** 小程序有版本更新事件的监听函数 */ - type OnUpdateReadyCallback = (res: GeneralCallbackResult) => void - /** 用户主动截屏事件的监听函数 */ - type OnUserCaptureScreenCallback = ( - result: OnUserCaptureScreenListenerResult - ) => void - /** 被动断开实时语音通话事件的监听函数 */ - type OnVoIPChatInterruptedCallback = ( - result: OnVoIPChatInterruptedListenerResult - ) => void - /** 实时语音通话成员在线状态变化事件的监听函数 */ - type OnVoIPChatMembersChangedCallback = ( - result: OnVoIPChatMembersChangedListenerResult - ) => void - /** 实时语音通话成员通话状态变化事件的监听函数 */ - type OnVoIPChatSpeakersChangedCallback = ( - result: OnVoIPChatSpeakersChangedListenerResult - ) => void - /** 房间状态变化事件的监听函数 */ - type OnVoIPChatStateChangedCallback = ( - result: OnVoIPChatStateChangedListenerResult - ) => void - /** 实时语音通话成员视频状态变化事件的监听函数 */ - type OnVoIPVideoMembersChangedCallback = ( - result: OnVoIPVideoMembersChangedListenerResult - ) => void - /** 音频加载中事件的监听函数 */ - type OnWaitingCallback = (res: GeneralCallbackResult) => void - /** 连接上 Wi-Fi 的事件的监听函数 */ - type OnWifiConnectedCallback = ( - result: OnWifiConnectedListenerResult - ) => void - /** 连接上 Wi-Fi 的事件的监听函数 */ - type OnWifiConnectedWithPartialInfoCallback = ( - result: OnWifiConnectedWithPartialInfoListenerResult - ) => void - /** 窗口尺寸变化事件的监听函数 */ - type OnWindowResizeCallback = (result: OnWindowResizeListenerResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenAppAuthorizeSettingCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenAppAuthorizeSettingFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type OpenAppAuthorizeSettingSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenBluetoothAdapterCompleteCallback = (res: BluetoothError) => void - /** 接口调用失败的回调函数 */ - type OpenBluetoothAdapterFailCallback = (res: BluetoothError) => void - /** 接口调用成功的回调函数 */ - type OpenBluetoothAdapterSuccessCallback = (res: BluetoothError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenCardCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type OpenCardFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenCardSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenChannelsActivityCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenChannelsActivityFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenChannelsActivitySuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenChannelsEventCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenChannelsEventFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenChannelsEventSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenChannelsLiveCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type OpenChannelsLiveFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenChannelsLiveSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenChannelsUserProfileCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenChannelsUserProfileFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type OpenChannelsUserProfileSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenCompleteCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenCustomerServiceChatCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenCustomerServiceChatFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type OpenCustomerServiceChatSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenDocumentCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type OpenDocumentFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenDocumentSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenEmbeddedMiniProgramCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenEmbeddedMiniProgramFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type OpenEmbeddedMiniProgramSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenFailCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenHKOfflinePayViewCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenHKOfflinePayViewFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenHKOfflinePayViewSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenLocationCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type OpenLocationFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenLocationSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenMapAppCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type OpenMapAppFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenMapAppSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenOfficialAccountArticleCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenOfficialAccountArticleFailCallback = ( - err: RequestVirtualPaymentFailCallbackErr - ) => void - /** 接口调用成功的回调函数 */ - type OpenOfficialAccountArticleSuccessCallback = ( - result: OpenOfficialAccountArticleSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenPrivacyContractCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenPrivacyContractFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenPrivacyContractSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenSettingCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type OpenSettingFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenSettingSuccessCallback = ( - result: OpenSettingSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenSingleStickerViewCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenSingleStickerViewFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type OpenSingleStickerViewSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenStickerIPViewCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenStickerIPViewFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenStickerIPViewSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenStickerSetViewCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenStickerSetViewFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenStickerSetViewSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type OpenSuccessCallback = (result: OpenSuccessCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenSystemBluetoothSettingCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type OpenSystemBluetoothSettingFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type OpenSystemBluetoothSettingSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type OpenVideoEditorCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type OpenVideoEditorFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type OpenVideoEditorSuccessCallback = ( - result: OpenVideoEditorSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PageScrollToCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type PageScrollToFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PageScrollToSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PauseBGMCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type PauseBGMFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PauseBGMSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PauseBackgroundAudioCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type PauseBackgroundAudioFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PauseBackgroundAudioSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PauseCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type PauseFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PauseSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PauseVoiceCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type PauseVoiceFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PauseVoiceSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PlayBGMCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type PlayBGMFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PlayBGMSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PlayBackgroundAudioCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type PlayBackgroundAudioFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PlayBackgroundAudioSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PlayCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type PlayFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PlaySuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PlayVoiceCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type PlayVoiceFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PlayVoiceSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PluginLoginCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type PluginLoginFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PluginLoginSuccessCallback = ( - result: PluginLoginSuccessCallbackResult - ) => void - /** 分包加载进度变化事件的监听函数 */ - type PreDownloadSubpackageTaskOnProgressUpdateCallback = ( - result: PreDownloadSubpackageTaskOnProgressUpdateListenerResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PreloadAssetsCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type PreloadAssetsFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PreloadAssetsSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PreloadSkylineViewCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type PreloadSkylineViewFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PreloadSkylineViewSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PreloadWebviewCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type PreloadWebviewFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PreloadWebviewSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PreviewImageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type PreviewImageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PreviewImageSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type PreviewMediaCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type PreviewMediaFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type PreviewMediaSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ReLaunchCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ReLaunchFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ReLaunchSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ReadBLECharacteristicValueCompleteCallback = ( - res: BluetoothError - ) => void - /** 接口调用失败的回调函数 */ - type ReadBLECharacteristicValueFailCallback = (res: BluetoothError) => void - /** 接口调用成功的回调函数 */ - type ReadBLECharacteristicValueSuccessCallback = ( - res: BluetoothError - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ReadCompleteCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ReadCompressedFileCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type ReadCompressedFileFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type ReadCompressedFileSuccessCallback = ( - result: ReadCompressedFileSuccessCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ReadFailCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ReadFileCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type ReadFileFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type ReadFileSuccessCallback = ( - result: ReadFileSuccessCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type ReadSuccessCallback = (result: ReadSuccessCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ReadZipEntryCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type ReadZipEntryFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type ReadZipEntrySuccessCallback = ( - result: ReadZipEntrySuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ReaddirCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type ReaddirFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type ReaddirSuccessCallback = (result: ReaddirSuccessCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ReconnectCastingCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ReconnectCastingFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ReconnectCastingSuccessCallback = (res: GeneralCallbackResult) => void - /** 录音结束事件的监听函数 */ - type RecorderManagerOnStopCallback = (result: OnStopListenerResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RedirectToCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type RedirectToFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RedirectToSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RedoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type RedoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RedoSuccessCallback = (res: GeneralCallbackResult) => void - /** 回调函数,在执行 `SelectorQuery.exec` 方法后,返回节点 Ref 对象。 */ - type RefCallback = (result: RefCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RemoveArcCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type RemoveArcFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RemoveArcSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RemoveCustomLayerCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RemoveCustomLayerFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RemoveCustomLayerSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RemoveFormatCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type RemoveFormatFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RemoveFormatSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RemoveGroundOverlayCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RemoveGroundOverlayFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RemoveGroundOverlaySuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RemoveMarkersCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type RemoveMarkersFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RemoveMarkersSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RemoveSavedFileCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type RemoveSavedFileFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type RemoveSavedFileSuccessCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RemoveServiceCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type RemoveServiceFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RemoveServiceSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RemoveStorageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type RemoveStorageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RemoveStorageSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RemoveTabBarBadgeCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RemoveTabBarBadgeFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RemoveTabBarBadgeSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RemoveVisualLayerCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RemoveVisualLayerFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RemoveVisualLayerSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RenameCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type RenameFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type RenameSuccessCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequestCommonPaymentCompleteCallback = ( - res: CommonPaymentError - ) => void - /** 接口调用失败的回调函数 */ - type RequestCommonPaymentFailCallback = ( - err: RequestCommonPaymentFailCallbackErr - ) => void - /** 接口调用成功的回调函数 */ - type RequestCommonPaymentSuccessCallback = ( - result: RequestCommonPaymentSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequestCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequestDeviceVoIPCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RequestDeviceVoIPFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RequestDeviceVoIPSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type RequestFailCallback = (err: RequestFailCallbackErr) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequestFullScreenCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RequestFullScreenFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RequestFullScreenSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequestMerchantTransferCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RequestMerchantTransferFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type RequestMerchantTransferSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequestOrderPaymentCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RequestOrderPaymentFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RequestOrderPaymentSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequestPaymentCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type RequestPaymentFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RequestPaymentSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequestPictureInPictureCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RequestPictureInPictureFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type RequestPictureInPictureSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequestPluginPaymentCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RequestPluginPaymentFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RequestPluginPaymentSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequestSubscribeDeviceMessageCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RequestSubscribeDeviceMessageFailCallback = ( - result: RequestSubscribeDeviceMessageFailCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type RequestSubscribeDeviceMessageSuccessCallback = ( - result: RequestSubscribeDeviceMessageSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequestSubscribeMessageCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RequestSubscribeMessageFailCallback = ( - result: RequestSubscribeMessageFailCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type RequestSubscribeMessageSuccessCallback = ( - result: RequestSubscribeMessageSuccessCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type RequestSuccessCallback< - T extends string | IAnyObject | ArrayBuffer = - | string - | IAnyObject - | ArrayBuffer - > = (result: RequestSuccessCallbackResult<T>) => void - /** onHeadersReceived 传入的监听函数。不传此参数则移除所有监听函数。 */ - type RequestTaskOffHeadersReceivedCallback = ( - result: RequestTaskOnHeadersReceivedListenerResult - ) => void - /** HTTP Response Header 事件的监听函数 */ - type RequestTaskOnHeadersReceivedCallback = ( - result: RequestTaskOnHeadersReceivedListenerResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequestVirtualPaymentCompleteCallback = ( - res: VirtualPaymentError - ) => void - /** 接口调用失败的回调函数 */ - type RequestVirtualPaymentFailCallback = ( - err: RequestVirtualPaymentFailCallbackErr - ) => void - /** 接口调用成功的回调函数 */ - type RequestVirtualPaymentSuccessCallback = ( - result: RequestCommonPaymentSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RequirePrivacyAuthorizeCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RequirePrivacyAuthorizeFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type RequirePrivacyAuthorizeSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RestartMiniProgramCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type RestartMiniProgramFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type RestartMiniProgramSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ResumeBGMCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ResumeBGMFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ResumeBGMSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ResumeCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ResumeFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ResumeSuccessCallback = (res: GeneralCallbackResult) => void - /** onClose 传入的监听函数。不传此参数则移除所有监听函数。 */ - type RewardedVideoAdOffCloseCallback = ( - result: RewardedVideoAdOnCloseListenerResult - ) => void - /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */ - type RewardedVideoAdOffErrorCallback = ( - result: RewardedVideoAdOnErrorListenerResult - ) => void - /** 用户点击 `关闭广告` 按钮的事件的监听函数 */ - type RewardedVideoAdOnCloseCallback = ( - result: RewardedVideoAdOnCloseListenerResult - ) => void - /** 激励视频错误事件的监听函数 */ - type RewardedVideoAdOnErrorCallback = ( - result: RewardedVideoAdOnErrorListenerResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type RmdirCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type RmdirFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type RmdirSuccessCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SaveFileCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type SaveFileFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type SaveFileSuccessCallback = ( - result: SaveFileSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SaveFileToDiskCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SaveFileToDiskFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SaveFileToDiskSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SaveImageToPhotosAlbumCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SaveImageToPhotosAlbumFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type SaveImageToPhotosAlbumSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SaveVideoToPhotosAlbumCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SaveVideoToPhotosAlbumFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type SaveVideoToPhotosAlbumSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ScanCodeCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ScanCodeFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ScanCodeSuccessCallback = ( - result: ScanCodeSuccessCallbackResult - ) => void - /** 回调函数,在执行 `SelectorQuery.exec` 方法后,节点信息会在 `callback` 中返回。 */ - type ScrollOffsetCallback = (result: ScrollOffsetCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SeekBackgroundAudioCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SeekBackgroundAudioFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SeekBackgroundAudioSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SendCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SendFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SendHCEMessageCompleteCallback = (res: NFCError) => void - /** 接口调用失败的回调函数 */ - type SendHCEMessageFailCallback = (res: NFCError) => void - /** 接口调用成功的回调函数 */ - type SendHCEMessageSuccessCallback = (res: NFCError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SendMessageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SendMessageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SendMessageSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SendSmsCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SendSmsFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SendSmsSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SendSocketMessageCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SendSocketMessageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SendSocketMessageSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SendSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetBGMVolumeCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetBGMVolumeFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetBGMVolumeSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetBLEMTUCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetBLEMTUFailCallback = (result: SetBLEMTUFailCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetBLEMTUSuccessCallback = ( - result: SetBLEMTUSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetBackgroundColorCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SetBackgroundColorFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetBackgroundColorSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetBackgroundFetchTokenCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SetBackgroundFetchTokenFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type SetBackgroundFetchTokenSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetBackgroundTextStyleCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SetBackgroundTextStyleFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type SetBackgroundTextStyleSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetBoundaryCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetBoundaryFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetBoundarySuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetCenterOffsetCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetCenterOffsetFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetCenterOffsetSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetClipboardDataCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetClipboardDataFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetClipboardDataSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetContentsCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetContentsFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetContentsSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetEnable1v1ChatCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetEnable1v1ChatFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetEnable1v1ChatSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetEnableDebugCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetEnableDebugFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetEnableDebugSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetInnerAudioOptionCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SetInnerAudioOptionFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetInnerAudioOptionSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetKeepScreenOnCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetKeepScreenOnFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetKeepScreenOnSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetLocMarkerIconCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetLocMarkerIconFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetLocMarkerIconSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetMICVolumeCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetMICVolumeFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetMICVolumeSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetNavigationBarColorCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SetNavigationBarColorFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type SetNavigationBarColorSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetNavigationBarTitleCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SetNavigationBarTitleFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type SetNavigationBarTitleSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetScreenBrightnessCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SetScreenBrightnessFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetScreenBrightnessSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetStorageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetStorageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetStorageSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetTabBarBadgeCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetTabBarBadgeFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetTabBarBadgeSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetTabBarItemCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetTabBarItemFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetTabBarItemSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetTabBarStyleCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetTabBarStyleFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetTabBarStyleSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetTimeoutCompleteCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type SetTimeoutFailCallback = (res: Nfcrwerror) => void - /** 接口调用成功的回调函数 */ - type SetTimeoutSuccessCallback = (res: Nfcrwerror) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetTopBarTextCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetTopBarTextFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetTopBarTextSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetVisualEffectOnCaptureCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SetVisualEffectOnCaptureFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type SetVisualEffectOnCaptureSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetWifiListCompleteCallback = (res: WifiError) => void - /** 接口调用失败的回调函数 */ - type SetWifiListFailCallback = (res: WifiError) => void - /** 接口调用成功的回调函数 */ - type SetWifiListSuccessCallback = (res: WifiError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetWindowSizeCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetWindowSizeFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SetWindowSizeSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SetZoomCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SetZoomFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShareFileMessageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ShareFileMessageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ShareFileMessageSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShareToWeRunCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ShareToWeRunFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ShareToWeRunSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShareVideoMessageCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ShareVideoMessageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ShareVideoMessageSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShowActionSheetCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ShowActionSheetFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ShowActionSheetSuccessCallback = ( - result: ShowActionSheetSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShowLoadingCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ShowLoadingFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ShowLoadingSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShowModalCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ShowModalFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ShowModalSuccessCallback = ( - result: ShowModalSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShowNavigationBarLoadingCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ShowNavigationBarLoadingFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type ShowNavigationBarLoadingSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShowRedPackageCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ShowRedPackageFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ShowRedPackageSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShowShareImageMenuCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type ShowShareImageMenuFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ShowShareImageMenuSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShowShareMenuCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ShowShareMenuFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ShowShareMenuSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShowTabBarCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ShowTabBarFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShowTabBarRedDotCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ShowTabBarRedDotFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ShowTabBarRedDotSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ShowTabBarSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ShowToastCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ShowToastFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ShowToastSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SnapshotCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SnapshotFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SocketTaskCloseCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SocketTaskCloseFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SocketTaskCloseSuccessCallback = (res: GeneralCallbackResult) => void - /** WebSocket 连接关闭事件的监听函数 */ - type SocketTaskOnCloseCallback = ( - result: SocketTaskOnCloseListenerResult - ) => void - /** WebSocket 接收到服务器的消息事件的监听函数 */ - type SocketTaskOnMessageCallback = ( - result: SocketTaskOnMessageListenerResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartAccelerometerCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StartAccelerometerFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StartAccelerometerSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartAdvertisingCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StartAdvertisingFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StartAdvertisingSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartBeaconDiscoveryCompleteCallback = (res: BeaconError) => void - /** 接口调用失败的回调函数 */ - type StartBeaconDiscoveryFailCallback = (res: BeaconError) => void - /** 接口调用成功的回调函数 */ - type StartBeaconDiscoverySuccessCallback = (res: BeaconError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartBluetoothDevicesDiscoveryCompleteCallback = ( - res: BluetoothError - ) => void - /** 接口调用失败的回调函数 */ - type StartBluetoothDevicesDiscoveryFailCallback = ( - res: BluetoothError - ) => void - /** 接口调用成功的回调函数 */ - type StartBluetoothDevicesDiscoverySuccessCallback = ( - res: BluetoothError - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartCastingCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StartCastingFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StartCastingSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartCompassCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StartCompassFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StartCompassSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartDeviceMotionListeningCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StartDeviceMotionListeningFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type StartDeviceMotionListeningSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartDiscoveryCompleteCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type StartDiscoveryFailCallback = (res: Nfcrwerror) => void - /** 接口调用成功的回调函数 */ - type StartDiscoverySuccessCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type StartFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartGyroscopeCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StartGyroscopeFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StartGyroscopeSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartHCECompleteCallback = (res: NFCError) => void - /** 接口调用失败的回调函数 */ - type StartHCEFailCallback = (res: NFCError) => void - /** 接口调用成功的回调函数 */ - type StartHCESuccessCallback = (res: NFCError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartLocalServiceDiscoveryCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StartLocalServiceDiscoveryFailCallback = ( - result: StartLocalServiceDiscoveryFailCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type StartLocalServiceDiscoverySuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartLocationUpdateBackgroundCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StartLocationUpdateBackgroundFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type StartLocationUpdateBackgroundSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartLocationUpdateCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StartLocationUpdateFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StartLocationUpdateSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartPreviewCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StartPreviewFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StartPreviewSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartPullDownRefreshCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StartPullDownRefreshFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StartPullDownRefreshSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartRecordCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StartRecordFailCallback = (res: GeneralCallbackResult) => void - /** 超过录制时长上限时会结束录像并触发此回调,录像异常退出时也会触发此回调 */ - type StartRecordTimeoutCallback = ( - result: StartRecordTimeoutCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartSoterAuthenticationCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StartSoterAuthenticationFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type StartSoterAuthenticationSuccessCallback = ( - result: StartSoterAuthenticationSuccessCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type StartSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StartWifiCompleteCallback = (res: WifiError) => void - /** 接口调用失败的回调函数 */ - type StartWifiFailCallback = (res: WifiError) => void - /** 接口调用成功的回调函数 */ - type StartWifiSuccessCallback = (res: WifiError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StatCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type StatFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type StatSuccessCallback = (result: StatSuccessCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopAccelerometerCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StopAccelerometerFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StopAccelerometerSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopAdvertisingCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StopAdvertisingFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StopAdvertisingSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopBGMCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StopBGMFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StopBGMSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopBackgroundAudioCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StopBackgroundAudioFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StopBackgroundAudioSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopBeaconDiscoveryCompleteCallback = (res: BeaconError) => void - /** 接口调用失败的回调函数 */ - type StopBeaconDiscoveryFailCallback = (res: BeaconError) => void - /** 接口调用成功的回调函数 */ - type StopBeaconDiscoverySuccessCallback = (res: BeaconError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopBluetoothDevicesDiscoveryCompleteCallback = ( - res: BluetoothError - ) => void - /** 接口调用失败的回调函数 */ - type StopBluetoothDevicesDiscoveryFailCallback = ( - res: BluetoothError - ) => void - /** 接口调用成功的回调函数 */ - type StopBluetoothDevicesDiscoverySuccessCallback = ( - res: BluetoothError - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopCompassCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StopCompassFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StopCompassSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopDeviceMotionListeningCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StopDeviceMotionListeningFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type StopDeviceMotionListeningSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopDiscoveryCompleteCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type StopDiscoveryFailCallback = (res: Nfcrwerror) => void - /** 接口调用成功的回调函数 */ - type StopDiscoverySuccessCallback = (res: Nfcrwerror) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopFaceDetectCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StopFaceDetectFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StopFaceDetectSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StopFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopGyroscopeCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StopGyroscopeFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StopGyroscopeSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopHCECompleteCallback = (res: NFCError) => void - /** 接口调用失败的回调函数 */ - type StopHCEFailCallback = (res: NFCError) => void - /** 接口调用成功的回调函数 */ - type StopHCESuccessCallback = (res: NFCError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopLocalServiceDiscoveryCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StopLocalServiceDiscoveryFailCallback = ( - result: StopLocalServiceDiscoveryFailCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type StopLocalServiceDiscoverySuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopLocationUpdateCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StopLocationUpdateFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StopLocationUpdateSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopPreviewCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StopPreviewFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StopPreviewSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopPullDownRefreshCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type StopPullDownRefreshFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StopPullDownRefreshSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopRecordCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StopRecordFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StopSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopVoiceCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type StopVoiceFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type StopVoiceSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type StopWifiCompleteCallback = (res: WifiError) => void - /** 接口调用失败的回调函数 */ - type StopWifiFailCallback = (res: WifiError) => void - /** 接口调用成功的回调函数 */ - type StopWifiSuccessCallback = (res: WifiError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SubscribeVoIPVideoMembersCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type SubscribeVoIPVideoMembersFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type SubscribeVoIPVideoMembersSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SwitchCameraCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SwitchCameraFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SwitchCameraSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SwitchCastingCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SwitchCastingFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SwitchCastingSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type SwitchTabCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type SwitchTabFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type SwitchTabSuccessCallback = (res: GeneralCallbackResult) => void - /** onMessage 传入的监听函数。不传此参数则移除所有监听函数。 */ - type TCPSocketOffMessageCallback = ( - result: TCPSocketOnMessageListenerResult - ) => void - /** 当接收到数据的时触发该事件的监听函数 */ - type TCPSocketOnMessageCallback = ( - result: TCPSocketOnMessageListenerResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type TakePhotoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type TakePhotoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type TakePhotoSuccessCallback = ( - result: TakePhotoSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type TakeSnapshotCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type TakeSnapshotFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type TakeSnapshotSuccessCallback = ( - result: TakeSnapshotSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ToScreenLocationCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ToScreenLocationFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ToScreenLocationSuccessCallback = ( - result: ToScreenLocationSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type ToggleTorchCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type ToggleTorchFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type ToggleTorchSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type TransceiveCompleteCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type TransceiveFailCallback = (res: Nfcrwerror) => void - /** 接口调用成功的回调函数 */ - type TransceiveSuccessCallback = ( - result: TransceiveSuccessCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type TranslateMarkerCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type TranslateMarkerFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type TranslateMarkerSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type TruncateCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type TruncateFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type TruncateSuccessCallback = (res: FileError) => void - /** onClose 传入的监听函数。不传此参数则移除所有监听函数。 */ - type UDPSocketOffCloseCallback = (res: GeneralCallbackResult) => void - /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */ - type UDPSocketOffErrorCallback = (result: GeneralCallbackResult) => void - /** onMessage 传入的监听函数。不传此参数则移除所有监听函数。 */ - type UDPSocketOffMessageCallback = ( - result: UDPSocketOnMessageListenerResult - ) => void - type UDPSocketOnCloseCallback = (res: GeneralCallbackResult) => void - type UDPSocketOnErrorCallback = (result: GeneralCallbackResult) => void - /** 收到消息的事件的监听函数 */ - type UDPSocketOnMessageCallback = ( - result: UDPSocketOnMessageListenerResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type UndoCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type UndoFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type UndoSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type UnlinkCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type UnlinkFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type UnlinkSuccessCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type UnzipCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type UnzipFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type UnzipSuccessCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type UpdateGroundOverlayCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type UpdateGroundOverlayFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type UpdateGroundOverlaySuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type UpdateShareMenuCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type UpdateShareMenuFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type UpdateShareMenuSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type UpdateVoIPChatMuteConfigCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type UpdateVoIPChatMuteConfigFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type UpdateVoIPChatMuteConfigSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type UpdateWeChatAppCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type UpdateWeChatAppFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type UpdateWeChatAppSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type UploadFileCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type UploadFileFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type UploadFileSuccessCallback = ( - result: UploadFileSuccessCallbackResult - ) => void - /** onProgressUpdate 传入的监听函数。不传此参数则移除所有监听函数。 */ - type UploadTaskOffProgressUpdateCallback = ( - result: UploadTaskOnProgressUpdateListenerResult - ) => void - /** 上传进度变化事件的监听函数 */ - type UploadTaskOnProgressUpdateCallback = ( - result: UploadTaskOnProgressUpdateListenerResult - ) => void - /** 开启会话回调 */ - type VKSessionStartCallback = ( - /** 参数 status 可选值: - * - 0: 成功; - * - 104: 用户取消授权; - * - 112: 接口未在隐私协议中声明; - * - 1025: 小程序隐私接口被封禁,[解决方案参考链接](https://developers.weixin.qq.com/community/develop/doc/00062a6d514c88baacdf52e8a56009); - * - 1026: 小游戏隐私接口被封禁,[解决方案参考链接](https://developers.weixin.qq.com/community/minigame/doc/0004c84925817819b7ffd8b2356008); - * - 2000001: 参数错误; - * - 2003000: 会话不可用; - * - 2000000: 系统错误; - * - 2000002: 设备不支持; - * - 2000003: 系统不支持; - * - 2000004: 设备不支持; - * - 2003001: 未开启系统相机权限; - * - 2003002: 未开启小程序相机权限; */ - status: - | 0 - | 104 - | 112 - | 1025 - | 1026 - | 2000001 - | 2003000 - | 2000000 - | 2000002 - | 2000003 - | 2000004 - | 2003001 - | 2003002 - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type VibrateLongCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type VibrateLongFailCallback = (res: GeneralCallbackResult) => void - /** 接口调用成功的回调函数 */ - type VibrateLongSuccessCallback = (res: GeneralCallbackResult) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type VibrateShortCompleteCallback = (res: GeneralCallbackResult) => void - /** 接口调用失败的回调函数 */ - type VibrateShortFailCallback = ( - result: VibrateShortFailCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type VibrateShortSuccessCallback = (res: GeneralCallbackResult) => void - /** 主线程/Worker 线程向当前线程发送的消息的事件的监听函数 */ - type WorkerOnMessageCallback = ( - result: WorkerOnMessageListenerResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type WriteBLECharacteristicValueCompleteCallback = ( - res: BluetoothError - ) => void - /** 接口调用失败的回调函数 */ - type WriteBLECharacteristicValueFailCallback = (res: BluetoothError) => void - /** 接口调用成功的回调函数 */ - type WriteBLECharacteristicValueSuccessCallback = ( - res: BluetoothError - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type WriteCharacteristicValueCompleteCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用失败的回调函数 */ - type WriteCharacteristicValueFailCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type WriteCharacteristicValueSuccessCallback = ( - res: GeneralCallbackResult - ) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type WriteCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type WriteFailCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type WriteFileCompleteCallback = (res: FileError) => void - /** 接口调用失败的回调函数 */ - type WriteFileFailCallback = (res: FileError) => void - /** 接口调用成功的回调函数 */ - type WriteFileSuccessCallback = (res: FileError) => void - /** 接口调用结束的回调函数(调用成功、失败都会执行) */ - type WriteNdefMessageCompleteCallback = (res: Nfcrwerror) => void - /** 接口调用失败的回调函数 */ - type WriteNdefMessageFailCallback = (res: Nfcrwerror) => void - /** 接口调用成功的回调函数 */ - type WriteNdefMessageSuccessCallback = (res: Nfcrwerror) => void - /** 接口调用成功的回调函数 */ - type WriteSuccessCallback = (result: WriteSuccessCallbackResult) => void - /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */ - type WxOffErrorCallback = (res: GeneralCallbackResult) => void - /** 小程序错误事件的监听函数 */ - type WxOnErrorCallback = ( - /** 错误 */ - error: Error - ) => void - /** 接口调用成功的回调函数 */ - type WxStartRecordSuccessCallback = ( - result: StartRecordSuccessCallbackResult - ) => void - /** 接口调用成功的回调函数 */ - type WxStopRecordSuccessCallback = (res: GeneralCallbackResult) => void -} diff --git a/typings/types/wx/lib.wx.app.d.ts b/typings/types/wx/lib.wx.app.d.ts deleted file mode 100644 index f266497..0000000 --- a/typings/types/wx/lib.wx.app.d.ts +++ /dev/null @@ -1,424 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) 2024 Tencent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -***************************************************************************** */ - -declare namespace WechatMiniprogram.App { - type SceneValues = - | 1000 - | 1001 - | 1005 - | 1006 - | 1007 - | 1008 - | 1010 - | 1011 - | 1012 - | 1013 - | 1014 - | 1017 - | 1019 - | 1020 - | 1022 - | 1023 - | 1024 - | 1025 - | 1026 - | 1027 - | 1028 - | 1029 - | 1030 - | 1031 - | 1032 - | 1034 - | 1035 - | 1036 - | 1037 - | 1038 - | 1039 - | 1042 - | 1043 - | 1044 - | 1045 - | 1046 - | 1047 - | 1048 - | 1049 - | 1052 - | 1053 - | 1054 - | 1056 - | 1057 - | 1058 - | 1059 - | 1060 - | 1064 - | 1065 - | 1067 - | 1068 - | 1069 - | 1071 - | 1072 - | 1073 - | 1074 - | 1077 - | 1078 - | 1079 - | 1081 - | 1082 - | 1084 - | 1088 - | 1089 - | 1090 - | 1091 - | 1092 - | 1095 - | 1096 - | 1097 - | 1099 - | 1100 - | 1101 - | 1102 - | 1103 - | 1104 - | 1106 - | 1107 - | 1113 - | 1114 - | 1119 - | 1120 - | 1121 - | 1124 - | 1125 - | 1126 - | 1129 - | 1131 - | 1133 - | 1135 - | 1144 - | 1145 - | 1146 - | 1148 - | 1150 - | 1151 - | 1152 - | 1153 - | 1154 - | 1155 - | 1157 - | 1158 - | 1160 - | 1167 - | 1168 - | 1169 - | 1171 - | 1173 - | 1175 - | 1176 - | 1177 - | 1178 - | 1179 - | 1181 - | 1183 - | 1184 - | 1185 - | 1186 - | 1187 - | 1189 - | 1191 - | 1192 - | 1193 - | 1194 - | 1195 - | 1196 - | 1197 - | 1198 - | 1200 - | 1201 - | 1202 - | 1203 - | 1206 - | 1207 - | 1208 - | 1212 - | 1215 - | 1216 - | 1223 - | 1228 - | 1231 - - interface LaunchShowOption { - /** 打开小程序的路径 */ - path: string - /** 打开小程序的query */ - query: IAnyObject - /** 打开小程序的场景值 - * - 1000:其他 - * - 1001:发现栏小程序主入口,「最近使用」列表(基础库 2.2.4 版本起包含「我的小程序」列表) - * - 1005:微信首页顶部搜索框的搜索结果页 - * - 1006:发现栏小程序主入口搜索框的搜索结果页 - * - 1007:单人聊天会话中的小程序消息卡片 - * - 1008:群聊会话中的小程序消息卡片 - * - 1010:收藏夹 - * - 1011:扫描二维码 - * - 1012:长按图片识别二维码 - * - 1013:扫描手机相册中选取的二维码 - * - 1014:小程序订阅消息(与 1107 相同) - * - 1017:前往小程序体验版的入口页 - * - 1019:微信钱包(微信客户端 7.0.0 版本改为支付入口) - * - 1020:公众号 profile 页相关小程序列表(已废弃) - * - 1022:聊天顶部置顶小程序入口(微信客户端 6.6.1 版本起废弃) - * - 1023:安卓系统桌面图标 - * - 1024:小程序 profile 页 - * - 1025:扫描一维码 - * - 1026:发现栏小程序主入口,「附近的小程序」列表 - * - 1027:微信首页顶部搜索框搜索结果页「使用过的小程序」列表 - * - 1028:我的卡包 - * - 1029:小程序中的卡券详情页 - * - 1030:自动化测试下打开小程序 - * - 1031:长按图片识别一维码 - * - 1032:扫描手机相册中选取的一维码 - * - 1034:微信支付完成页 - * - 1035:公众号自定义菜单 - * - 1036:App 分享消息卡片 - * - 1037:小程序打开小程序 - * - 1038:从另一个小程序返回 - * - 1039:摇电视 - * - 1042:添加好友搜索框的搜索结果页 - * - 1043:公众号模板消息 - * - 1044:带 shareTicket 的小程序消息卡片 [详情](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html) - * - 1045:朋友圈广告 - * - 1046:朋友圈广告详情页 - * - 1047:扫描小程序码 - * - 1048:长按图片识别小程序码 - * - 1049:扫描手机相册中选取的小程序码 - * - 1052:卡券的适用门店列表 - * - 1053:搜一搜的结果页 - * - 1054:顶部搜索框小程序快捷入口(微信客户端版本 6.7.4 起废弃) - * - 1056:聊天顶部音乐播放器右上角菜单 - * - 1057:钱包中的银行卡详情页 - * - 1058:公众号文章 - * - 1059:体验版小程序绑定邀请页 - * - 1060:微信支付完成页(与 1034 相同) - * - 1064:微信首页连 Wi-Fi 状态栏 - * - 1065:URL scheme [详情](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-scheme.html) - * - 1067:公众号文章广告 - * - 1068:附近小程序列表广告(已废弃) - * - 1069:移动应用通过 openSDK 进入微信,打开小程序 - * - 1071:钱包中的银行卡列表页 - * - 1072:二维码收款页面 - * - 1073:客服消息列表下发的小程序消息卡片 - * - 1074:公众号会话下发的小程序消息卡片 - * - 1077:摇周边 - * - 1078:微信连 Wi-Fi 成功提示页 - * - 1079:微信游戏中心 - * - 1081:客服消息下发的文字链 - * - 1082:公众号会话下发的文字链 - * - 1084:朋友圈广告原生页 - * - 1088:会话中查看系统消息,打开小程序 - * - 1089:微信聊天主界面下拉,「最近使用」栏(基础库 2.2.4 版本起包含「我的小程序」栏) - * - 1090:长按小程序右上角菜单唤出最近使用历史 - * - 1091:公众号文章商品卡片 - * - 1092:城市服务入口 - * - 1095:小程序广告组件 - * - 1096:聊天记录,打开小程序 - * - 1097:微信支付签约原生页,打开小程序 - * - 1099:页面内嵌插件 - * - 1100:红包封面详情页打开小程序 - * - 1101:远程调试热更新(开发者工具中,预览 -> 自动预览 -> 编译并预览) - * - 1102:公众号 profile 页服务预览 - * - 1103:发现栏小程序主入口,「我的小程序」列表(基础库 2.2.4 版本起废弃) - * - 1104:微信聊天主界面下拉,「我的小程序」栏(基础库 2.2.4 版本起废弃) - * - 1106:聊天主界面下拉,从顶部搜索结果页,打开小程序 - * - 1107:订阅消息,打开小程序 - * - 1113:安卓手机负一屏,打开小程序(三星) - * - 1114:安卓手机侧边栏,打开小程序(三星) - * - 1119:【企业微信】工作台内打开小程序 - * - 1120:【企业微信】个人资料页内打开小程序 - * - 1121:【企业微信】聊天加号附件框内打开小程序 - * - 1124:扫“一物一码”打开小程序 - * - 1125:长按图片识别“一物一码” - * - 1126:扫描手机相册中选取的“一物一码” - * - 1129:微信爬虫访问 [详情](https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/sitemap.html) - * - 1131:浮窗(8.0 版本起仅包含被动浮窗) - * - 1133:硬件设备打开小程序 [详情](https://developers.weixin.qq.com/doc/oplatform/Miniprogram_Frame/) - * - 1135:小程序 profile 页相关小程序列表,打开小程序 - * - 1144:公众号文章 - 视频贴片 - * - 1145:发现栏 - 发现小程序 - * - 1146:地理位置信息打开出行类小程序 - * - 1148:卡包-交通卡,打开小程序 - * - 1150:扫一扫商品条码结果页打开小程序 - * - 1151:发现栏 - 我的订单 - * - 1152:订阅号视频打开小程序 - * - 1153:“识物”结果页打开小程序 - * - 1154:朋友圈内打开“单页模式” - * - 1155:“单页模式”打开小程序 - * - 1157:服务号会话页打开小程序 - * - 1158:群工具打开小程序 - * - 1160:群待办 - * - 1167:H5 通过开放标签打开小程序 [详情](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html) - * - 1168:移动应用直接运行小程序 - * - 1169:发现栏小程序主入口,各个生活服务入口(例如快递服务、出行服务等) - * - 1171:微信运动记录(仅安卓) - * - 1173:聊天素材用小程序打开 [详情](https://developers.weixin.qq.com/miniprogram/dev/framework/material/support_material.html) - * - 1175:视频号主页商店入口 - * - 1176:视频号直播间主播打开小程序 - * - 1177:视频号直播商品 - * - 1178:在电脑打开手机上打开的小程序 - * - 1179:#话题页打开小程序 - * - 1181:网站应用打开 PC 小程序 - * - 1183:PC 微信 - 小程序面板 - 发现小程序 - 搜索 - * - 1184:视频号链接打开小程序 - * - 1185:群公告 - * - 1186:收藏 - 笔记 - * - 1187:浮窗(8.0 版本起) - * - 1189:表情雨广告 - * - 1191:视频号活动 - * - 1192:企业微信联系人 profile 页 - * - 1193:视频号主页服务菜单打开小程序 - * - 1194:URL Link [详情](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-link.html) - * - 1195:视频号主页商品 tab - * - 1196:个人状态打开小程序 - * - 1197:视频号主播从直播间返回小游戏 - * - 1198:视频号开播界面打开小游戏 - * - 1200:视频号广告打开小程序 - * - 1201:视频号广告详情页打开小程序 - * - 1202:企微客服号会话打开小程序卡片 - * - 1203:微信小程序压测工具的请求 - * - 1206:视频号小游戏直播间打开小游戏 - * - 1207:企微客服号会话打开小程序文字链 - * - 1208:聊天打开商品卡片 - * - 1212:青少年模式申请页打开小程序 - * - 1215:广告预约打开小程序 - * - 1216:视频号订单中心打开小程序 - * - 1223:安卓桌面 Widget 打开小程序 - * - 1228:视频号原生广告组件打开小程序 - * - 1231:动态消息提醒入口打开小程序 - */ - scene: SceneValues - /** shareTicket,详见 [获取更多转发信息]((转发#获取更多转发信息)) */ - shareTicket: string - /** 当场景为由从另一个小程序或公众号或App打开时,返回此字段 */ - referrerInfo?: ReferrerInfo - /** 打开的文件信息数组,只有从聊天素材场景打开(scene为1173)才会携带该参数 */ - forwardMaterials: ForwardMaterials[] - /** 从微信群聊/单聊打开小程序时,chatType 表示具体微信群聊/单聊类型 - * - * 可选值: - * - 1: 微信联系人单聊; - * - 2: 企业微信联系人单聊; - * - 3: 普通微信群聊; - * - 4: 企业微信互通群聊; */ - chatType?: 1 | 2 | 3 | 4 - /** 需要基础库: `2.20.0` - * - * API 类别 - * - * 可选值: - * - 'default': 默认类别; - * - 'nativeFunctionalized': 原生功能化,视频号直播商品、商品橱窗等场景打开的小程序; - * - 'browseOnly': 仅浏览,朋友圈快照页等场景打开的小程序; - * - 'embedded': 内嵌,通过打开半屏小程序能力打开的小程序; */ - apiCategory: - | 'default' - | 'nativeFunctionalized' - | 'browseOnly' - | 'embedded' - } - - interface PageNotFoundOption { - /** 不存在页面的路径 */ - path: string - /** 打开不存在页面的 query */ - query: IAnyObject - /** 是否本次启动的首个页面(例如从分享等入口进来,首个页面是开发者配置的分享页面) */ - isEntryPage: boolean - } - - interface Option { - /** 生命周期回调—监听小程序初始化 - * - * 小程序初始化完成时触发,全局只触发一次。 - */ - onLaunch(options: LaunchShowOption): void - /** 生命周期回调—监听小程序显示 - * - * 小程序启动,或从后台进入前台显示时 - */ - onShow(options: LaunchShowOption): void - /** 生命周期回调—监听小程序隐藏 - * - * 小程序从前台进入后台时 - */ - onHide(): void - /** 错误监听函数 - * - * 小程序发生脚本错误,或者 api - */ - onError(/** 错误信息,包含堆栈 */ error: string): void - /** 页面不存在监听函数 - * - * 小程序要打开的页面不存在时触发,会带上页面信息回调该函数 - * - * **注意:** - * 1. 如果开发者没有添加 `onPageNotFound` 监听,当跳转页面不存在时,将推入微信客户端原生的页面不存在提示页面。 - * 2. 如果 `onPageNotFound` 回调中又重定向到另一个不存在的页面,将推入微信客户端原生的页面不存在提示页面,并且不再回调 `onPageNotFound`。 - * - * 最低基础库: 1.9.90 - */ - onPageNotFound(options: PageNotFoundOption): void - /** - * 小程序有未处理的 Promise 拒绝时触发。也可以使用 [wx.onUnhandledRejection](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onUnhandledRejection.html) 绑定监听。注意事项请参考 [wx.onUnhandledRejection](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onUnhandledRejection.html)。 - * **参数**:与 [wx.onUnhandledRejection](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onUnhandledRejection.html) 一致 - */ - onUnhandledRejection: OnUnhandledRejectionCallback - /** - * 系统切换主题时触发。也可以使用 wx.onThemeChange 绑定监听。 - * - * 最低基础库: 2.11.0 - */ - onThemeChange: OnThemeChangeCallback - } - - type Instance<T extends IAnyObject> = Option & T - type Options<T extends IAnyObject> = Partial<Option> & - T & - ThisType<Instance<T>> - type TrivialInstance = Instance<IAnyObject> - - interface Constructor { - <T extends IAnyObject>(options: Options<T>): void - } - - interface GetAppOption { - /** 在 `App` 未定义时返回默认实现。当App被调用时,默认实现中定义的属性会被覆盖合并到App中。一般用于独立分包 - * - * 最低基础库: 2.2.4 - */ - allowDefault?: boolean - } - - interface GetApp { - <T extends IAnyObject = IAnyObject>(opts?: GetAppOption): Instance<T> - } -} - -declare let App: WechatMiniprogram.App.Constructor -declare let getApp: WechatMiniprogram.App.GetApp diff --git a/typings/types/wx/lib.wx.behavior.d.ts b/typings/types/wx/lib.wx.behavior.d.ts deleted file mode 100644 index 251c0e3..0000000 --- a/typings/types/wx/lib.wx.behavior.d.ts +++ /dev/null @@ -1,85 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) 2024 Tencent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -***************************************************************************** */ - -declare namespace WechatMiniprogram.Behavior { - - type BehaviorIdentifier< - TData extends DataOption = {}, - TProperty extends PropertyOption = {}, - TMethod extends MethodOption = {}, - TBehavior extends BehaviorOption = [] - > = string & { - [key in 'BehaviorType']?: { - data: Component.FilterUnknownType<TData> & Component.MixinData<TBehavior> - properties: Component.FilterUnknownType<TProperty> & Component.MixinProperties<TBehavior, true> - methods: Component.FilterUnknownType<TMethod> & Component.MixinMethods<TBehavior> - } - } - type Instance< - TData extends DataOption, - TProperty extends PropertyOption, - TMethod extends MethodOption, - TBehavior extends BehaviorOption, - TCustomInstanceProperty extends IAnyObject = Record<string, never> - > = Component.Instance<TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty> - type TrivialInstance = Instance<IAnyObject, IAnyObject, IAnyObject, Component.IEmptyArray> - type TrivialOption = Options<IAnyObject, IAnyObject, IAnyObject, Component.IEmptyArray> - type Options< - TData extends DataOption, - TProperty extends PropertyOption, - TMethod extends MethodOption, - TBehavior extends BehaviorOption, - TCustomInstanceProperty extends IAnyObject = Record<string, never> - > = Partial<Data<TData>> & - Partial<Property<TProperty>> & - Partial<Method<TMethod>> & - Partial<Behavior<TBehavior>> & - Partial<OtherOption> & - Partial<Lifetimes> & - ThisType<Instance<TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty>> - interface Constructor { - < - TData extends DataOption, - TProperty extends PropertyOption, - TMethod extends MethodOption, - TBehavior extends BehaviorOption, - TCustomInstanceProperty extends IAnyObject = Record<string, never> - >( - options: Options<TData, TProperty, TMethod, TBehavior, TCustomInstanceProperty> - ): BehaviorIdentifier<TData, TProperty, TMethod, TBehavior> - } - - type DataOption = Component.DataOption - type PropertyOption = Component.PropertyOption - type MethodOption = Component.MethodOption - type BehaviorOption = Component.BehaviorOption - type Data<D extends DataOption> = Component.Data<D> - type Property<P extends PropertyOption> = Component.Property<P> - type Method<M extends MethodOption> = Component.Method<M> - type Behavior<B extends BehaviorOption> = Component.Behavior<B> - - type DefinitionFilter = Component.DefinitionFilter - type Lifetimes = Component.Lifetimes - type OtherOption = Omit<Component.OtherOption, 'options'> -} -/** 注册一个 `behavior`,接受一个 `Object` 类型的参数。*/ -declare let Behavior: WechatMiniprogram.Behavior.Constructor diff --git a/typings/types/wx/lib.wx.canvas.d.ts b/typings/types/wx/lib.wx.canvas.d.ts deleted file mode 100644 index 9461db3..0000000 --- a/typings/types/wx/lib.wx.canvas.d.ts +++ /dev/null @@ -1,2623 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) 2024 Tencent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -***************************************************************************** */ - -/* eslint-disable @typescript-eslint/naming-convention */ - -declare namespace WechatMiniprogram.CanvasRenderingContext { - type CanvasDirection = 'inherit' | 'ltr' | 'rtl' - type CanvasFillRule = 'evenodd' | 'nonzero' - type CanvasFontKerning = 'auto' | 'none' | 'normal' - type CanvasFontStretch = - | 'condensed' - | 'expanded' - | 'extra-condensed' - | 'extra-expanded' - | 'normal' - | 'semi-condensed' - | 'semi-expanded' - | 'ultra-condensed' - | 'ultra-expanded' - type CanvasFontVariantCaps = - | 'all-petite-caps' - | 'all-small-caps' - | 'normal' - | 'petite-caps' - | 'small-caps' - | 'titling-caps' - | 'unicase' - type CanvasLineCap = 'butt' | 'round' | 'square' - type CanvasLineJoin = 'bevel' | 'miter' | 'round' - type CanvasTextAlign = 'center' | 'end' | 'left' | 'right' | 'start' - type CanvasTextBaseline = - | 'alphabetic' - | 'bottom' - | 'hanging' - | 'ideographic' - | 'middle' - | 'top' - type CanvasTextRendering = - | 'auto' - | 'geometricPrecision' - | 'optimizeLegibility' - | 'optimizeSpeed' - - type GlobalCompositeOperation = - | 'color' - | 'color-burn' - | 'color-dodge' - | 'copy' - | 'darken' - | 'destination-atop' - | 'destination-in' - | 'destination-out' - | 'destination-over' - | 'difference' - | 'exclusion' - | 'hard-light' - | 'hue' - | 'lighten' - | 'lighter' - | 'luminosity' - | 'multiply' - | 'overlay' - | 'saturation' - | 'screen' - | 'soft-light' - | 'source-atop' - | 'source-in' - | 'source-out' - | 'source-over' - | 'xor' - - interface CanvasCompositing { - globalAlpha: number - globalCompositeOperation: GlobalCompositeOperation - } - - type CanvasImageSource = VideoContext | Canvas | Image | OffscreenCanvas - - interface CanvasDrawImage { - drawImage(image: CanvasImageSource, dx: number, dy: number): void - drawImage( - image: CanvasImageSource, - dx: number, - dy: number, - dw: number, - dh: number - ): void - drawImage( - image: CanvasImageSource, - sx: number, - sy: number, - sw: number, - sh: number, - dx: number, - dy: number, - dw: number, - dh: number - ): void - } - - interface CanvasDrawPath { - beginPath(): void - clip(fillRule?: CanvasFillRule): void - clip(path: Path2D, fillRule?: CanvasFillRule): void - fill(fillRule?: CanvasFillRule): void - fill(path: Path2D, fillRule?: CanvasFillRule): void - isPointInPath(x: number, y: number, fillRule?: CanvasFillRule): boolean - isPointInPath( - path: Path2D, - x: number, - y: number, - fillRule?: CanvasFillRule - ): boolean - isPointInStroke(x: number, y: number): boolean - isPointInStroke(path: Path2D, x: number, y: number): boolean - stroke(): void - stroke(path: Path2D): void - } - - interface CanvasFillStrokeStyles { - fillStyle: string | CanvasGradient | CanvasPattern - strokeStyle: string | CanvasGradient | CanvasPattern - createConicGradient( - startAngle: number, - x: number, - y: number - ): CanvasGradient - createLinearGradient( - x0: number, - y0: number, - x1: number, - y1: number - ): CanvasGradient - createPattern( - image: CanvasImageSource, - repetition: string | null - ): CanvasPattern | null - createRadialGradient( - x0: number, - y0: number, - r0: number, - x1: number, - y1: number, - r1: number - ): CanvasGradient - } - - interface CanvasFilters { - filter: string - } - - /** An opaque object describing a gradient. It is returned by the methods CanvasRenderingContext2D.createLinearGradient() or CanvasRenderingContext2D.createRadialGradient(). */ - interface CanvasGradient { - /** - * Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset at one end of the gradient, 1.0 is the offset at the other end. - * - * Throws an "IndexSizeError" DOMException if the offset is out of range. Throws a "SyntaxError" DOMException if the color cannot be parsed. - */ - addColorStop(offset: number, color: string): void - } - - type PredefinedColorSpace = 'display-p3' | 'srgb' - - interface ImageDataSettings { - colorSpace?: PredefinedColorSpace - } - - interface CanvasImageData { - createImageData( - sw: number, - sh: number, - settings?: ImageDataSettings - ): ImageData - createImageData(imagedata: ImageData): ImageData - getImageData( - sx: number, - sy: number, - sw: number, - sh: number, - settings?: ImageDataSettings - ): ImageData - putImageData(imagedata: ImageData, dx: number, dy: number): void - putImageData( - imagedata: ImageData, - dx: number, - dy: number, - dirtyX: number, - dirtyY: number, - dirtyWidth: number, - dirtyHeight: number - ): void - } - - type ImageSmoothingQuality = 'high' | 'low' | 'medium' - - interface CanvasImageSmoothing { - imageSmoothingEnabled: boolean - imageSmoothingQuality: ImageSmoothingQuality - } - - interface CanvasPath { - arc( - x: number, - y: number, - radius: number, - startAngle: number, - endAngle: number, - counterclockwise?: boolean - ): void - arcTo( - x1: number, - y1: number, - x2: number, - y2: number, - radius: number - ): void - bezierCurveTo( - cp1x: number, - cp1y: number, - cp2x: number, - cp2y: number, - x: number, - y: number - ): void - closePath(): void - ellipse( - x: number, - y: number, - radiusX: number, - radiusY: number, - rotation: number, - startAngle: number, - endAngle: number, - counterclockwise?: boolean - ): void - lineTo(x: number, y: number): void - moveTo(x: number, y: number): void - quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void - rect(x: number, y: number, w: number, h: number): void - roundRect( - x: number, - y: number, - w: number, - h: number, - radii?: number | number[] - ): void - } - - interface CanvasPathDrawingStyles { - lineCap: CanvasLineCap - lineDashOffset: number - lineJoin: CanvasLineJoin - lineWidth: number - miterLimit: number - getLineDash(): number[] - setLineDash(segments: number[]): void - } - - interface DOMMatrix2DInit { - a?: number - b?: number - c?: number - d?: number - e?: number - f?: number - m11?: number - m12?: number - m21?: number - m22?: number - m41?: number - m42?: number - } - - /** An opaque object describing a pattern, based on an image, a canvas, or a video, created by the CanvasRenderingContext2D.createPattern() method. */ - interface CanvasPattern { - /** Sets the transformation matrix that will be used when rendering the pattern during a fill or stroke painting operation. */ - setTransform(transform?: DOMMatrix2DInit): void - } - - interface CanvasRect { - clearRect(x: number, y: number, w: number, h: number): void - fillRect(x: number, y: number, w: number, h: number): void - strokeRect(x: number, y: number, w: number, h: number): void - } - - interface CanvasShadowStyles { - shadowBlur: number - shadowColor: string - shadowOffsetX: number - shadowOffsetY: number - } - - interface CanvasState { - restore(): void - save(): void - } - - /** The dimensions of a piece of text in the canvas, as created by the CanvasRenderingContext2D.measureText() method. */ - interface TextMetrics { - /** Returns the measurement described below. */ - readonly actualBoundingBoxAscent: number - /** Returns the measurement described below. */ - readonly actualBoundingBoxDescent: number - /** Returns the measurement described below. */ - readonly actualBoundingBoxLeft: number - /** Returns the measurement described below. */ - readonly actualBoundingBoxRight: number - /** Returns the measurement described below. */ - readonly fontBoundingBoxAscent: number - /** Returns the measurement described below. */ - readonly fontBoundingBoxDescent: number - /** Returns the measurement described below. */ - readonly width: number - } - - interface CanvasText { - fillText(text: string, x: number, y: number, maxWidth?: number): void - measureText(text: string): TextMetrics - strokeText(text: string, x: number, y: number, maxWidth?: number): void - } - - interface CanvasTextDrawingStyles { - direction: CanvasDirection - font: string - fontKerning: CanvasFontKerning - textAlign: CanvasTextAlign - textBaseline: CanvasTextBaseline - } - - interface DOMMatrixReadOnly { - readonly a: number - readonly b: number - readonly c: number - readonly d: number - readonly e: number - readonly f: number - readonly is2D: boolean - readonly isIdentity: boolean - readonly m11: number - readonly m12: number - readonly m13: number - readonly m14: number - readonly m21: number - readonly m22: number - readonly m23: number - readonly m24: number - readonly m31: number - readonly m32: number - readonly m33: number - readonly m34: number - readonly m41: number - readonly m42: number - readonly m43: number - readonly m44: number - } - - interface CanvasTransform { - getTransform(): DOMMatrixReadOnly - resetTransform(): void - rotate(angle: number): void - scale(x: number, y: number): void - setTransform( - a: number, - b: number, - c: number, - d: number, - e: number, - f: number - ): void - setTransform(transform?: DOMMatrix2DInit): void - transform( - a: number, - b: number, - c: number, - d: number, - e: number, - f: number - ): void - translate(x: number, y: number): void - } - - interface CanvasUserInterface { - // drawFocusIfNeeded(element: Element): void; - // drawFocusIfNeeded(path: Path2D, element: Element): void; - } - - interface CanvasRenderingContext2DSettings { - alpha?: boolean - colorSpace?: PredefinedColorSpace - desynchronized?: boolean - willReadFrequently?: boolean - } - - /** The CanvasRenderingContext2D interface, part of the Canvas API, provides the 2D rendering context for the drawing surface of a <canvas> element. It is used for drawing shapes, text, images, and other objects. */ - interface CanvasRenderingContext2D - extends CanvasCompositing, - CanvasDrawImage, - CanvasDrawPath, - CanvasFillStrokeStyles, - CanvasFilters, - CanvasImageData, - CanvasImageSmoothing, - CanvasPath, - CanvasPathDrawingStyles, - CanvasRect, - CanvasShadowStyles, - CanvasState, - CanvasText, - CanvasTextDrawingStyles, - CanvasTransform, - CanvasUserInterface { - readonly canvas: Canvas - getContextAttributes(): CanvasRenderingContext2DSettings - } - - type GLbitfield = number - type GLboolean = boolean - type GLclampf = number - type GLenum = number - type GLfloat = number - type GLint = number - type GLint64 = number - type GLintptr = number - type GLsizei = number - type GLsizeiptr = number - type GLuint = number - type GLuint64 = number - - interface WEBGL_color_buffer_float { - readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: GLenum - readonly RGBA32F_EXT: GLenum - readonly UNSIGNED_NORMALIZED_EXT: GLenum - } - - interface WEBGL_compressed_texture_astc { - getSupportedProfiles(): string[] - readonly COMPRESSED_RGBA_ASTC_10x10_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_10x5_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_10x6_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_10x8_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_12x10_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_12x12_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_4x4_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_5x4_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_5x5_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_6x5_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_6x6_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_8x5_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_8x6_KHR: GLenum - readonly COMPRESSED_RGBA_ASTC_8x8_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: GLenum - } - - interface WEBGL_compressed_texture_etc { - readonly COMPRESSED_R11_EAC: GLenum - readonly COMPRESSED_RG11_EAC: GLenum - readonly COMPRESSED_RGB8_ETC2: GLenum - readonly COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: GLenum - readonly COMPRESSED_RGBA8_ETC2_EAC: GLenum - readonly COMPRESSED_SIGNED_R11_EAC: GLenum - readonly COMPRESSED_SIGNED_RG11_EAC: GLenum - readonly COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: GLenum - readonly COMPRESSED_SRGB8_ETC2: GLenum - readonly COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: GLenum - } - - interface WEBGL_compressed_texture_etc1 { - readonly COMPRESSED_RGB_ETC1_WEBGL: GLenum - } - - /** The WEBGL_compressed_texture_s3tc extension is part of the WebGL API and exposes four S3TC compressed texture formats. */ - interface WEBGL_compressed_texture_s3tc { - readonly COMPRESSED_RGBA_S3TC_DXT1_EXT: GLenum - readonly COMPRESSED_RGBA_S3TC_DXT3_EXT: GLenum - readonly COMPRESSED_RGBA_S3TC_DXT5_EXT: GLenum - readonly COMPRESSED_RGB_S3TC_DXT1_EXT: GLenum - } - - interface WEBGL_compressed_texture_s3tc_srgb { - readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: GLenum - readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: GLenum - readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: GLenum - readonly COMPRESSED_SRGB_S3TC_DXT1_EXT: GLenum - } - - /** The WEBGL_debug_renderer_info extension is part of the WebGL API and exposes two constants with information about the graphics driver for debugging purposes. */ - interface WEBGL_debug_renderer_info { - readonly UNMASKED_RENDERER_WEBGL: GLenum - readonly UNMASKED_VENDOR_WEBGL: GLenum - } - - interface WEBGL_debug_shaders { - getTranslatedShaderSource(shader: WebGLShader): string - } - - /** The WEBGL_depth_texture extension is part of the WebGL API and defines 2D depth and depth-stencil textures. */ - interface WEBGL_depth_texture { - readonly UNSIGNED_INT_24_8_WEBGL: GLenum - } - - interface WEBGL_draw_buffers { - drawBuffersWEBGL(buffers: GLenum[]): void - readonly COLOR_ATTACHMENT0_WEBGL: GLenum - readonly COLOR_ATTACHMENT10_WEBGL: GLenum - readonly COLOR_ATTACHMENT11_WEBGL: GLenum - readonly COLOR_ATTACHMENT12_WEBGL: GLenum - readonly COLOR_ATTACHMENT13_WEBGL: GLenum - readonly COLOR_ATTACHMENT14_WEBGL: GLenum - readonly COLOR_ATTACHMENT15_WEBGL: GLenum - readonly COLOR_ATTACHMENT1_WEBGL: GLenum - readonly COLOR_ATTACHMENT2_WEBGL: GLenum - readonly COLOR_ATTACHMENT3_WEBGL: GLenum - readonly COLOR_ATTACHMENT4_WEBGL: GLenum - readonly COLOR_ATTACHMENT5_WEBGL: GLenum - readonly COLOR_ATTACHMENT6_WEBGL: GLenum - readonly COLOR_ATTACHMENT7_WEBGL: GLenum - readonly COLOR_ATTACHMENT8_WEBGL: GLenum - readonly COLOR_ATTACHMENT9_WEBGL: GLenum - readonly DRAW_BUFFER0_WEBGL: GLenum - readonly DRAW_BUFFER10_WEBGL: GLenum - readonly DRAW_BUFFER11_WEBGL: GLenum - readonly DRAW_BUFFER12_WEBGL: GLenum - readonly DRAW_BUFFER13_WEBGL: GLenum - readonly DRAW_BUFFER14_WEBGL: GLenum - readonly DRAW_BUFFER15_WEBGL: GLenum - readonly DRAW_BUFFER1_WEBGL: GLenum - readonly DRAW_BUFFER2_WEBGL: GLenum - readonly DRAW_BUFFER3_WEBGL: GLenum - readonly DRAW_BUFFER4_WEBGL: GLenum - readonly DRAW_BUFFER5_WEBGL: GLenum - readonly DRAW_BUFFER6_WEBGL: GLenum - readonly DRAW_BUFFER7_WEBGL: GLenum - readonly DRAW_BUFFER8_WEBGL: GLenum - readonly DRAW_BUFFER9_WEBGL: GLenum - readonly MAX_COLOR_ATTACHMENTS_WEBGL: GLenum - readonly MAX_DRAW_BUFFERS_WEBGL: GLenum - } - - interface WEBGL_lose_context { - loseContext(): void - restoreContext(): void - } - - interface WEBGL_multi_draw { - multiDrawArraysInstancedWEBGL( - mode: GLenum, - firstsList: Int32Array | GLint[], - firstsOffset: GLuint, - countsList: Int32Array | GLsizei[], - countsOffset: GLuint, - instanceCountsList: Int32Array | GLsizei[], - instanceCountsOffset: GLuint, - drawcount: GLsizei - ): void - multiDrawArraysWEBGL( - mode: GLenum, - firstsList: Int32Array | GLint[], - firstsOffset: GLuint, - countsList: Int32Array | GLsizei[], - countsOffset: GLuint, - drawcount: GLsizei - ): void - multiDrawElementsInstancedWEBGL( - mode: GLenum, - countsList: Int32Array | GLsizei[], - countsOffset: GLuint, - type: GLenum, - offsetsList: Int32Array | GLsizei[], - offsetsOffset: GLuint, - instanceCountsList: Int32Array | GLsizei[], - instanceCountsOffset: GLuint, - drawcount: GLsizei - ): void - multiDrawElementsWEBGL( - mode: GLenum, - countsList: Int32Array | GLsizei[], - countsOffset: GLuint, - type: GLenum, - offsetsList: Int32Array | GLsizei[], - offsetsOffset: GLuint, - drawcount: GLsizei - ): void - } - - type OverSampleType = '2x' | '4x' | 'none' - - interface WebGL2RenderingContext - extends WebGL2RenderingContextBase, - WebGL2RenderingContextOverloads, - WebGLRenderingContextBase {} - - type Int32List = Int32Array | GLint[] - type Uint32List = Uint32Array | GLuint[] - - interface WebGL2RenderingContextBase { - beginQuery(target: GLenum, query: WebGLQuery): void - beginTransformFeedback(primitiveMode: GLenum): void - bindBufferBase( - target: GLenum, - index: GLuint, - buffer: WebGLBuffer | null - ): void - bindBufferRange( - target: GLenum, - index: GLuint, - buffer: WebGLBuffer | null, - offset: GLintptr, - size: GLsizeiptr - ): void - bindSampler(unit: GLuint, sampler: WebGLSampler | null): void - bindTransformFeedback( - target: GLenum, - tf: WebGLTransformFeedback | null - ): void - bindVertexArray(array: WebGLVertexArrayObject | null): void - blitFramebuffer( - srcX0: GLint, - srcY0: GLint, - srcX1: GLint, - srcY1: GLint, - dstX0: GLint, - dstY0: GLint, - dstX1: GLint, - dstY1: GLint, - mask: GLbitfield, - filter: GLenum - ): void - clearBufferfi( - buffer: GLenum, - drawbuffer: GLint, - depth: GLfloat, - stencil: GLint - ): void - clearBufferfv( - buffer: GLenum, - drawbuffer: GLint, - values: Float32List, - srcOffset?: GLuint - ): void - clearBufferiv( - buffer: GLenum, - drawbuffer: GLint, - values: Int32List, - srcOffset?: GLuint - ): void - clearBufferuiv( - buffer: GLenum, - drawbuffer: GLint, - values: Uint32List, - srcOffset?: GLuint - ): void - clientWaitSync( - sync: WebGLSync, - flags: GLbitfield, - timeout: GLuint64 - ): GLenum - compressedTexImage3D( - target: GLenum, - level: GLint, - internalformat: GLenum, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - border: GLint, - imageSize: GLsizei, - offset: GLintptr - ): void - compressedTexImage3D( - target: GLenum, - level: GLint, - internalformat: GLenum, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - border: GLint, - srcData: ArrayBufferView, - srcOffset?: GLuint, - srcLengthOverride?: GLuint - ): void - compressedTexSubImage3D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - zoffset: GLint, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - format: GLenum, - imageSize: GLsizei, - offset: GLintptr - ): void - compressedTexSubImage3D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - zoffset: GLint, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - format: GLenum, - srcData: ArrayBufferView, - srcOffset?: GLuint, - srcLengthOverride?: GLuint - ): void - copyBufferSubData( - readTarget: GLenum, - writeTarget: GLenum, - readOffset: GLintptr, - writeOffset: GLintptr, - size: GLsizeiptr - ): void - copyTexSubImage3D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - zoffset: GLint, - x: GLint, - y: GLint, - width: GLsizei, - height: GLsizei - ): void - createQuery(): WebGLQuery | null - createSampler(): WebGLSampler | null - createTransformFeedback(): WebGLTransformFeedback | null - createVertexArray(): WebGLVertexArrayObject | null - deleteQuery(query: WebGLQuery | null): void - deleteSampler(sampler: WebGLSampler | null): void - deleteSync(sync: WebGLSync | null): void - deleteTransformFeedback(tf: WebGLTransformFeedback | null): void - deleteVertexArray(vertexArray: WebGLVertexArrayObject | null): void - drawArraysInstanced( - mode: GLenum, - first: GLint, - count: GLsizei, - instanceCount: GLsizei - ): void - drawBuffers(buffers: GLenum[]): void - drawElementsInstanced( - mode: GLenum, - count: GLsizei, - type: GLenum, - offset: GLintptr, - instanceCount: GLsizei - ): void - drawRangeElements( - mode: GLenum, - start: GLuint, - end: GLuint, - count: GLsizei, - type: GLenum, - offset: GLintptr - ): void - endQuery(target: GLenum): void - endTransformFeedback(): void - fenceSync(condition: GLenum, flags: GLbitfield): WebGLSync | null - framebufferTextureLayer( - target: GLenum, - attachment: GLenum, - texture: WebGLTexture | null, - level: GLint, - layer: GLint - ): void - getActiveUniformBlockName( - program: WebGLProgram, - uniformBlockIndex: GLuint - ): string | null - getActiveUniformBlockParameter( - program: WebGLProgram, - uniformBlockIndex: GLuint, - pname: GLenum - ): any - getActiveUniforms( - program: WebGLProgram, - uniformIndices: GLuint[], - pname: GLenum - ): any - getBufferSubData( - target: GLenum, - srcByteOffset: GLintptr, - dstBuffer: ArrayBufferView, - dstOffset?: GLuint, - length?: GLuint - ): void - getFragDataLocation(program: WebGLProgram, name: string): GLint - getIndexedParameter(target: GLenum, index: GLuint): any - getInternalformatParameter( - target: GLenum, - internalformat: GLenum, - pname: GLenum - ): any - getQuery(target: GLenum, pname: GLenum): WebGLQuery | null - getQueryParameter(query: WebGLQuery, pname: GLenum): any - getSamplerParameter(sampler: WebGLSampler, pname: GLenum): any - getSyncParameter(sync: WebGLSync, pname: GLenum): any - getTransformFeedbackVarying( - program: WebGLProgram, - index: GLuint - ): WebGLActiveInfo | null - getUniformBlockIndex( - program: WebGLProgram, - uniformBlockName: string - ): GLuint - getUniformIndices( - program: WebGLProgram, - uniformNames: string[] - ): GLuint[] | null - invalidateFramebuffer(target: GLenum, attachments: GLenum[]): void - invalidateSubFramebuffer( - target: GLenum, - attachments: GLenum[], - x: GLint, - y: GLint, - width: GLsizei, - height: GLsizei - ): void - isQuery(query: WebGLQuery | null): GLboolean - isSampler(sampler: WebGLSampler | null): GLboolean - isSync(sync: WebGLSync | null): GLboolean - isTransformFeedback(tf: WebGLTransformFeedback | null): GLboolean - isVertexArray(vertexArray: WebGLVertexArrayObject | null): GLboolean - pauseTransformFeedback(): void - readBuffer(src: GLenum): void - renderbufferStorageMultisample( - target: GLenum, - samples: GLsizei, - internalformat: GLenum, - width: GLsizei, - height: GLsizei - ): void - resumeTransformFeedback(): void - samplerParameterf( - sampler: WebGLSampler, - pname: GLenum, - param: GLfloat - ): void - samplerParameteri( - sampler: WebGLSampler, - pname: GLenum, - param: GLint - ): void - texImage3D( - target: GLenum, - level: GLint, - internalformat: GLint, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - border: GLint, - format: GLenum, - type: GLenum, - pboOffset: GLintptr - ): void - texImage3D( - target: GLenum, - level: GLint, - internalformat: GLint, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - border: GLint, - format: GLenum, - type: GLenum, - source: TexImageSource - ): void - texImage3D( - target: GLenum, - level: GLint, - internalformat: GLint, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - border: GLint, - format: GLenum, - type: GLenum, - srcData: ArrayBufferView | null - ): void - texImage3D( - target: GLenum, - level: GLint, - internalformat: GLint, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - border: GLint, - format: GLenum, - type: GLenum, - srcData: ArrayBufferView, - srcOffset: GLuint - ): void - texStorage2D( - target: GLenum, - levels: GLsizei, - internalformat: GLenum, - width: GLsizei, - height: GLsizei - ): void - texStorage3D( - target: GLenum, - levels: GLsizei, - internalformat: GLenum, - width: GLsizei, - height: GLsizei, - depth: GLsizei - ): void - texSubImage3D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - zoffset: GLint, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - format: GLenum, - type: GLenum, - pboOffset: GLintptr - ): void - texSubImage3D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - zoffset: GLint, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - format: GLenum, - type: GLenum, - source: TexImageSource - ): void - texSubImage3D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - zoffset: GLint, - width: GLsizei, - height: GLsizei, - depth: GLsizei, - format: GLenum, - type: GLenum, - srcData: ArrayBufferView | null, - srcOffset?: GLuint - ): void - transformFeedbackVaryings( - program: WebGLProgram, - varyings: string[], - bufferMode: GLenum - ): void - uniform1ui(location: WebGLUniformLocation | null, v0: GLuint): void - uniform1uiv( - location: WebGLUniformLocation | null, - data: Uint32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniform2ui( - location: WebGLUniformLocation | null, - v0: GLuint, - v1: GLuint - ): void - uniform2uiv( - location: WebGLUniformLocation | null, - data: Uint32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniform3ui( - location: WebGLUniformLocation | null, - v0: GLuint, - v1: GLuint, - v2: GLuint - ): void - uniform3uiv( - location: WebGLUniformLocation | null, - data: Uint32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniform4ui( - location: WebGLUniformLocation | null, - v0: GLuint, - v1: GLuint, - v2: GLuint, - v3: GLuint - ): void - uniform4uiv( - location: WebGLUniformLocation | null, - data: Uint32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniformBlockBinding( - program: WebGLProgram, - uniformBlockIndex: GLuint, - uniformBlockBinding: GLuint - ): void - uniformMatrix2x3fv( - location: WebGLUniformLocation | null, - transpose: GLboolean, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniformMatrix2x4fv( - location: WebGLUniformLocation | null, - transpose: GLboolean, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniformMatrix3x2fv( - location: WebGLUniformLocation | null, - transpose: GLboolean, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniformMatrix3x4fv( - location: WebGLUniformLocation | null, - transpose: GLboolean, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniformMatrix4x2fv( - location: WebGLUniformLocation | null, - transpose: GLboolean, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniformMatrix4x3fv( - location: WebGLUniformLocation | null, - transpose: GLboolean, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - vertexAttribDivisor(index: GLuint, divisor: GLuint): void - vertexAttribI4i( - index: GLuint, - x: GLint, - y: GLint, - z: GLint, - w: GLint - ): void - vertexAttribI4iv(index: GLuint, values: Int32List): void - vertexAttribI4ui( - index: GLuint, - x: GLuint, - y: GLuint, - z: GLuint, - w: GLuint - ): void - vertexAttribI4uiv(index: GLuint, values: Uint32List): void - vertexAttribIPointer( - index: GLuint, - size: GLint, - type: GLenum, - stride: GLsizei, - offset: GLintptr - ): void - waitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLint64): void - readonly ACTIVE_UNIFORM_BLOCKS: GLenum - readonly ALREADY_SIGNALED: GLenum - readonly ANY_SAMPLES_PASSED: GLenum - readonly ANY_SAMPLES_PASSED_CONSERVATIVE: GLenum - readonly COLOR: GLenum - readonly COLOR_ATTACHMENT1: GLenum - readonly COLOR_ATTACHMENT10: GLenum - readonly COLOR_ATTACHMENT11: GLenum - readonly COLOR_ATTACHMENT12: GLenum - readonly COLOR_ATTACHMENT13: GLenum - readonly COLOR_ATTACHMENT14: GLenum - readonly COLOR_ATTACHMENT15: GLenum - readonly COLOR_ATTACHMENT2: GLenum - readonly COLOR_ATTACHMENT3: GLenum - readonly COLOR_ATTACHMENT4: GLenum - readonly COLOR_ATTACHMENT5: GLenum - readonly COLOR_ATTACHMENT6: GLenum - readonly COLOR_ATTACHMENT7: GLenum - readonly COLOR_ATTACHMENT8: GLenum - readonly COLOR_ATTACHMENT9: GLenum - readonly COMPARE_REF_TO_TEXTURE: GLenum - readonly CONDITION_SATISFIED: GLenum - readonly COPY_READ_BUFFER: GLenum - readonly COPY_READ_BUFFER_BINDING: GLenum - readonly COPY_WRITE_BUFFER: GLenum - readonly COPY_WRITE_BUFFER_BINDING: GLenum - readonly CURRENT_QUERY: GLenum - readonly DEPTH: GLenum - readonly DEPTH24_STENCIL8: GLenum - readonly DEPTH32F_STENCIL8: GLenum - readonly DEPTH_COMPONENT24: GLenum - readonly DEPTH_COMPONENT32F: GLenum - readonly DRAW_BUFFER0: GLenum - readonly DRAW_BUFFER1: GLenum - readonly DRAW_BUFFER10: GLenum - readonly DRAW_BUFFER11: GLenum - readonly DRAW_BUFFER12: GLenum - readonly DRAW_BUFFER13: GLenum - readonly DRAW_BUFFER14: GLenum - readonly DRAW_BUFFER15: GLenum - readonly DRAW_BUFFER2: GLenum - readonly DRAW_BUFFER3: GLenum - readonly DRAW_BUFFER4: GLenum - readonly DRAW_BUFFER5: GLenum - readonly DRAW_BUFFER6: GLenum - readonly DRAW_BUFFER7: GLenum - readonly DRAW_BUFFER8: GLenum - readonly DRAW_BUFFER9: GLenum - readonly DRAW_FRAMEBUFFER: GLenum - readonly DRAW_FRAMEBUFFER_BINDING: GLenum - readonly DYNAMIC_COPY: GLenum - readonly DYNAMIC_READ: GLenum - readonly FLOAT_32_UNSIGNED_INT_24_8_REV: GLenum - readonly FLOAT_MAT2x3: GLenum - readonly FLOAT_MAT2x4: GLenum - readonly FLOAT_MAT3x2: GLenum - readonly FLOAT_MAT3x4: GLenum - readonly FLOAT_MAT4x2: GLenum - readonly FLOAT_MAT4x3: GLenum - readonly FRAGMENT_SHADER_DERIVATIVE_HINT: GLenum - readonly FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: GLenum - readonly FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: GLenum - readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: GLenum - readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: GLenum - readonly FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: GLenum - readonly FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: GLenum - readonly FRAMEBUFFER_ATTACHMENT_RED_SIZE: GLenum - readonly FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: GLenum - readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: GLenum - readonly FRAMEBUFFER_DEFAULT: GLenum - readonly FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: GLenum - readonly HALF_FLOAT: GLenum - readonly INTERLEAVED_ATTRIBS: GLenum - readonly INT_2_10_10_10_REV: GLenum - readonly INT_SAMPLER_2D: GLenum - readonly INT_SAMPLER_2D_ARRAY: GLenum - readonly INT_SAMPLER_3D: GLenum - readonly INT_SAMPLER_CUBE: GLenum - readonly INVALID_INDEX: GLenum - readonly MAX: GLenum - readonly MAX_3D_TEXTURE_SIZE: GLenum - readonly MAX_ARRAY_TEXTURE_LAYERS: GLenum - readonly MAX_CLIENT_WAIT_TIMEOUT_WEBGL: GLenum - readonly MAX_COLOR_ATTACHMENTS: GLenum - readonly MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: GLenum - readonly MAX_COMBINED_UNIFORM_BLOCKS: GLenum - readonly MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: GLenum - readonly MAX_DRAW_BUFFERS: GLenum - readonly MAX_ELEMENTS_INDICES: GLenum - readonly MAX_ELEMENTS_VERTICES: GLenum - readonly MAX_ELEMENT_INDEX: GLenum - readonly MAX_FRAGMENT_INPUT_COMPONENTS: GLenum - readonly MAX_FRAGMENT_UNIFORM_BLOCKS: GLenum - readonly MAX_FRAGMENT_UNIFORM_COMPONENTS: GLenum - readonly MAX_PROGRAM_TEXEL_OFFSET: GLenum - readonly MAX_SAMPLES: GLenum - readonly MAX_SERVER_WAIT_TIMEOUT: GLenum - readonly MAX_TEXTURE_LOD_BIAS: GLenum - readonly MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: GLenum - readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: GLenum - readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: GLenum - readonly MAX_UNIFORM_BLOCK_SIZE: GLenum - readonly MAX_UNIFORM_BUFFER_BINDINGS: GLenum - readonly MAX_VARYING_COMPONENTS: GLenum - readonly MAX_VERTEX_OUTPUT_COMPONENTS: GLenum - readonly MAX_VERTEX_UNIFORM_BLOCKS: GLenum - readonly MAX_VERTEX_UNIFORM_COMPONENTS: GLenum - readonly MIN: GLenum - readonly MIN_PROGRAM_TEXEL_OFFSET: GLenum - readonly OBJECT_TYPE: GLenum - readonly PACK_ROW_LENGTH: GLenum - readonly PACK_SKIP_PIXELS: GLenum - readonly PACK_SKIP_ROWS: GLenum - readonly PIXEL_PACK_BUFFER: GLenum - readonly PIXEL_PACK_BUFFER_BINDING: GLenum - readonly PIXEL_UNPACK_BUFFER: GLenum - readonly PIXEL_UNPACK_BUFFER_BINDING: GLenum - readonly QUERY_RESULT: GLenum - readonly QUERY_RESULT_AVAILABLE: GLenum - readonly R11F_G11F_B10F: GLenum - readonly R16F: GLenum - readonly R16I: GLenum - readonly R16UI: GLenum - readonly R32F: GLenum - readonly R32I: GLenum - readonly R32UI: GLenum - readonly R8: GLenum - readonly R8I: GLenum - readonly R8UI: GLenum - readonly R8_SNORM: GLenum - readonly RASTERIZER_DISCARD: GLenum - readonly READ_BUFFER: GLenum - readonly READ_FRAMEBUFFER: GLenum - readonly READ_FRAMEBUFFER_BINDING: GLenum - readonly RED: GLenum - readonly RED_INTEGER: GLenum - readonly RENDERBUFFER_SAMPLES: GLenum - readonly RG: GLenum - readonly RG16F: GLenum - readonly RG16I: GLenum - readonly RG16UI: GLenum - readonly RG32F: GLenum - readonly RG32I: GLenum - readonly RG32UI: GLenum - readonly RG8: GLenum - readonly RG8I: GLenum - readonly RG8UI: GLenum - readonly RG8_SNORM: GLenum - readonly RGB10_A2: GLenum - readonly RGB10_A2UI: GLenum - readonly RGB16F: GLenum - readonly RGB16I: GLenum - readonly RGB16UI: GLenum - readonly RGB32F: GLenum - readonly RGB32I: GLenum - readonly RGB32UI: GLenum - readonly RGB8: GLenum - readonly RGB8I: GLenum - readonly RGB8UI: GLenum - readonly RGB8_SNORM: GLenum - readonly RGB9_E5: GLenum - readonly RGBA16F: GLenum - readonly RGBA16I: GLenum - readonly RGBA16UI: GLenum - readonly RGBA32F: GLenum - readonly RGBA32I: GLenum - readonly RGBA32UI: GLenum - readonly RGBA8: GLenum - readonly RGBA8I: GLenum - readonly RGBA8UI: GLenum - readonly RGBA8_SNORM: GLenum - readonly RGBA_INTEGER: GLenum - readonly RGB_INTEGER: GLenum - readonly RG_INTEGER: GLenum - readonly SAMPLER_2D_ARRAY: GLenum - readonly SAMPLER_2D_ARRAY_SHADOW: GLenum - readonly SAMPLER_2D_SHADOW: GLenum - readonly SAMPLER_3D: GLenum - readonly SAMPLER_BINDING: GLenum - readonly SAMPLER_CUBE_SHADOW: GLenum - readonly SEPARATE_ATTRIBS: GLenum - readonly SIGNALED: GLenum - readonly SIGNED_NORMALIZED: GLenum - readonly SRGB: GLenum - readonly SRGB8: GLenum - readonly SRGB8_ALPHA8: GLenum - readonly STATIC_COPY: GLenum - readonly STATIC_READ: GLenum - readonly STENCIL: GLenum - readonly STREAM_COPY: GLenum - readonly STREAM_READ: GLenum - readonly SYNC_CONDITION: GLenum - readonly SYNC_FENCE: GLenum - readonly SYNC_FLAGS: GLenum - readonly SYNC_FLUSH_COMMANDS_BIT: GLenum - readonly SYNC_GPU_COMMANDS_COMPLETE: GLenum - readonly SYNC_STATUS: GLenum - readonly TEXTURE_2D_ARRAY: GLenum - readonly TEXTURE_3D: GLenum - readonly TEXTURE_BASE_LEVEL: GLenum - readonly TEXTURE_BINDING_2D_ARRAY: GLenum - readonly TEXTURE_BINDING_3D: GLenum - readonly TEXTURE_COMPARE_FUNC: GLenum - readonly TEXTURE_COMPARE_MODE: GLenum - readonly TEXTURE_IMMUTABLE_FORMAT: GLenum - readonly TEXTURE_IMMUTABLE_LEVELS: GLenum - readonly TEXTURE_MAX_LEVEL: GLenum - readonly TEXTURE_MAX_LOD: GLenum - readonly TEXTURE_MIN_LOD: GLenum - readonly TEXTURE_WRAP_R: GLenum - readonly TIMEOUT_EXPIRED: GLenum - readonly TIMEOUT_IGNORED: GLint64 - readonly TRANSFORM_FEEDBACK: GLenum - readonly TRANSFORM_FEEDBACK_ACTIVE: GLenum - readonly TRANSFORM_FEEDBACK_BINDING: GLenum - readonly TRANSFORM_FEEDBACK_BUFFER: GLenum - readonly TRANSFORM_FEEDBACK_BUFFER_BINDING: GLenum - readonly TRANSFORM_FEEDBACK_BUFFER_MODE: GLenum - readonly TRANSFORM_FEEDBACK_BUFFER_SIZE: GLenum - readonly TRANSFORM_FEEDBACK_BUFFER_START: GLenum - readonly TRANSFORM_FEEDBACK_PAUSED: GLenum - readonly TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: GLenum - readonly TRANSFORM_FEEDBACK_VARYINGS: GLenum - readonly UNIFORM_ARRAY_STRIDE: GLenum - readonly UNIFORM_BLOCK_ACTIVE_UNIFORMS: GLenum - readonly UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: GLenum - readonly UNIFORM_BLOCK_BINDING: GLenum - readonly UNIFORM_BLOCK_DATA_SIZE: GLenum - readonly UNIFORM_BLOCK_INDEX: GLenum - readonly UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: GLenum - readonly UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: GLenum - readonly UNIFORM_BUFFER: GLenum - readonly UNIFORM_BUFFER_BINDING: GLenum - readonly UNIFORM_BUFFER_OFFSET_ALIGNMENT: GLenum - readonly UNIFORM_BUFFER_SIZE: GLenum - readonly UNIFORM_BUFFER_START: GLenum - readonly UNIFORM_IS_ROW_MAJOR: GLenum - readonly UNIFORM_MATRIX_STRIDE: GLenum - readonly UNIFORM_OFFSET: GLenum - readonly UNIFORM_SIZE: GLenum - readonly UNIFORM_TYPE: GLenum - readonly UNPACK_IMAGE_HEIGHT: GLenum - readonly UNPACK_ROW_LENGTH: GLenum - readonly UNPACK_SKIP_IMAGES: GLenum - readonly UNPACK_SKIP_PIXELS: GLenum - readonly UNPACK_SKIP_ROWS: GLenum - readonly UNSIGNALED: GLenum - readonly UNSIGNED_INT_10F_11F_11F_REV: GLenum - readonly UNSIGNED_INT_24_8: GLenum - readonly UNSIGNED_INT_2_10_10_10_REV: GLenum - readonly UNSIGNED_INT_5_9_9_9_REV: GLenum - readonly UNSIGNED_INT_SAMPLER_2D: GLenum - readonly UNSIGNED_INT_SAMPLER_2D_ARRAY: GLenum - readonly UNSIGNED_INT_SAMPLER_3D: GLenum - readonly UNSIGNED_INT_SAMPLER_CUBE: GLenum - readonly UNSIGNED_INT_VEC2: GLenum - readonly UNSIGNED_INT_VEC3: GLenum - readonly UNSIGNED_INT_VEC4: GLenum - readonly UNSIGNED_NORMALIZED: GLenum - readonly VERTEX_ARRAY_BINDING: GLenum - readonly VERTEX_ATTRIB_ARRAY_DIVISOR: GLenum - readonly VERTEX_ATTRIB_ARRAY_INTEGER: GLenum - readonly WAIT_FAILED: GLenum - } - - interface WebGL2RenderingContextOverloads { - bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum): void - bufferData( - target: GLenum, - srcData: BufferSource | null, - usage: GLenum - ): void - bufferData( - target: GLenum, - srcData: ArrayBufferView, - usage: GLenum, - srcOffset: GLuint, - length?: GLuint - ): void - bufferSubData( - target: GLenum, - dstByteOffset: GLintptr, - srcData: BufferSource - ): void - bufferSubData( - target: GLenum, - dstByteOffset: GLintptr, - srcData: ArrayBufferView, - srcOffset: GLuint, - length?: GLuint - ): void - compressedTexImage2D( - target: GLenum, - level: GLint, - internalformat: GLenum, - width: GLsizei, - height: GLsizei, - border: GLint, - imageSize: GLsizei, - offset: GLintptr - ): void - compressedTexImage2D( - target: GLenum, - level: GLint, - internalformat: GLenum, - width: GLsizei, - height: GLsizei, - border: GLint, - srcData: ArrayBufferView, - srcOffset?: GLuint, - srcLengthOverride?: GLuint - ): void - compressedTexSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - imageSize: GLsizei, - offset: GLintptr - ): void - compressedTexSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - srcData: ArrayBufferView, - srcOffset?: GLuint, - srcLengthOverride?: GLuint - ): void - readPixels( - x: GLint, - y: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - type: GLenum, - dstData: ArrayBufferView | null - ): void - readPixels( - x: GLint, - y: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - type: GLenum, - offset: GLintptr - ): void - readPixels( - x: GLint, - y: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - type: GLenum, - dstData: ArrayBufferView, - dstOffset: GLuint - ): void - texImage2D( - target: GLenum, - level: GLint, - internalformat: GLint, - width: GLsizei, - height: GLsizei, - border: GLint, - format: GLenum, - type: GLenum, - pixels: ArrayBufferView | null - ): void - texImage2D( - target: GLenum, - level: GLint, - internalformat: GLint, - format: GLenum, - type: GLenum, - source: TexImageSource - ): void - texImage2D( - target: GLenum, - level: GLint, - internalformat: GLint, - width: GLsizei, - height: GLsizei, - border: GLint, - format: GLenum, - type: GLenum, - pboOffset: GLintptr - ): void - texImage2D( - target: GLenum, - level: GLint, - internalformat: GLint, - width: GLsizei, - height: GLsizei, - border: GLint, - format: GLenum, - type: GLenum, - source: TexImageSource - ): void - texImage2D( - target: GLenum, - level: GLint, - internalformat: GLint, - width: GLsizei, - height: GLsizei, - border: GLint, - format: GLenum, - type: GLenum, - srcData: ArrayBufferView, - srcOffset: GLuint - ): void - texSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - type: GLenum, - pixels: ArrayBufferView | null - ): void - texSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - format: GLenum, - type: GLenum, - source: TexImageSource - ): void - texSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - type: GLenum, - pboOffset: GLintptr - ): void - texSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - type: GLenum, - source: TexImageSource - ): void - texSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - type: GLenum, - srcData: ArrayBufferView, - srcOffset: GLuint - ): void - uniform1fv( - location: WebGLUniformLocation | null, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniform1iv( - location: WebGLUniformLocation | null, - data: Int32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniform2fv( - location: WebGLUniformLocation | null, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniform2iv( - location: WebGLUniformLocation | null, - data: Int32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniform3fv( - location: WebGLUniformLocation | null, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniform3iv( - location: WebGLUniformLocation | null, - data: Int32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniform4fv( - location: WebGLUniformLocation | null, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniform4iv( - location: WebGLUniformLocation | null, - data: Int32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniformMatrix2fv( - location: WebGLUniformLocation | null, - transpose: GLboolean, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniformMatrix3fv( - location: WebGLUniformLocation | null, - transpose: GLboolean, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - uniformMatrix4fv( - location: WebGLUniformLocation | null, - transpose: GLboolean, - data: Float32List, - srcOffset?: GLuint, - srcLength?: GLuint - ): void - } - - /** Part of the WebGL API and represents the information returned by calling the WebGLRenderingContext.getActiveAttrib() and WebGLRenderingContext.getActiveUniform() methods. */ - interface WebGLActiveInfo { - readonly name: string - readonly size: GLint - readonly type: GLenum - } - - /** Part of the WebGL API and represents an opaque buffer object storing data such as vertices or colors. */ - interface WebGLBuffer {} - - /** Part of the WebGL API and represents a collection of buffers that serve as a rendering destination. */ - interface WebGLFramebuffer {} - - /** The WebGLProgram is part of the WebGL API and is a combination of two compiled WebGLShaders consisting of a vertex shader and a fragment shader (both written in GLSL). */ - interface WebGLProgram {} - - interface WebGLQuery {} - - /** Part of the WebGL API and represents a buffer that can contain an image, or can be source or target of an rendering operation. */ - interface WebGLRenderbuffer {} - - /** Provides an interface to the OpenGL ES 2.0 graphics rendering context for the drawing surface of an HTML <canvas> element. */ - interface WebGLRenderingContext - extends WebGLRenderingContextBase, - WebGLRenderingContextOverloads {} - - /** The ANGLE_instanced_arrays extension is part of the WebGL API and allows to draw the same object, or groups of similar objects multiple times, if they share the same vertex data, primitive count and type. */ - interface ANGLE_instanced_arrays { - drawArraysInstancedANGLE( - mode: GLenum, - first: GLint, - count: GLsizei, - primcount: GLsizei - ): void - drawElementsInstancedANGLE( - mode: GLenum, - count: GLsizei, - type: GLenum, - offset: GLintptr, - primcount: GLsizei - ): void - vertexAttribDivisorANGLE(index: GLuint, divisor: GLuint): void - readonly VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: GLenum - } - - interface EXT_blend_minmax { - readonly MAX_EXT: GLenum - readonly MIN_EXT: GLenum - } - - interface EXT_color_buffer_float {} - - interface EXT_color_buffer_half_float { - readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: GLenum - readonly RGB16F_EXT: GLenum - readonly RGBA16F_EXT: GLenum - readonly UNSIGNED_NORMALIZED_EXT: GLenum - } - - interface EXT_float_blend {} - - /** The EXT_frag_depth extension is part of the WebGL API and enables to set a depth value of a fragment from within the fragment shader. */ - interface EXT_frag_depth {} - - interface EXT_sRGB { - readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: GLenum - readonly SRGB8_ALPHA8_EXT: GLenum - readonly SRGB_ALPHA_EXT: GLenum - readonly SRGB_EXT: GLenum - } - - interface EXT_shader_texture_lod {} - - interface EXT_texture_compression_bptc { - readonly COMPRESSED_RGBA_BPTC_UNORM_EXT: GLenum - readonly COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT: GLenum - readonly COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT: GLenum - readonly COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT: GLenum - } - - interface EXT_texture_compression_rgtc { - readonly COMPRESSED_RED_GREEN_RGTC2_EXT: GLenum - readonly COMPRESSED_RED_RGTC1_EXT: GLenum - readonly COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: GLenum - readonly COMPRESSED_SIGNED_RED_RGTC1_EXT: GLenum - } - - /** The EXT_texture_filter_anisotropic extension is part of the WebGL API and exposes two constants for anisotropic filtering (AF). */ - interface EXT_texture_filter_anisotropic { - readonly MAX_TEXTURE_MAX_ANISOTROPY_EXT: GLenum - readonly TEXTURE_MAX_ANISOTROPY_EXT: GLenum - } - - interface EXT_texture_norm16 { - readonly R16_EXT: GLenum - readonly R16_SNORM_EXT: GLenum - readonly RG16_EXT: GLenum - readonly RG16_SNORM_EXT: GLenum - readonly RGB16_EXT: GLenum - readonly RGB16_SNORM_EXT: GLenum - readonly RGBA16_EXT: GLenum - readonly RGBA16_SNORM_EXT: GLenum - } - - interface KHR_parallel_shader_compile { - readonly COMPLETION_STATUS_KHR: GLenum - } - - interface OES_draw_buffers_indexed { - blendEquationSeparateiOES( - buf: GLuint, - modeRGB: GLenum, - modeAlpha: GLenum - ): void - blendEquationiOES(buf: GLuint, mode: GLenum): void - blendFuncSeparateiOES( - buf: GLuint, - srcRGB: GLenum, - dstRGB: GLenum, - srcAlpha: GLenum, - dstAlpha: GLenum - ): void - blendFunciOES(buf: GLuint, src: GLenum, dst: GLenum): void - colorMaskiOES( - buf: GLuint, - r: GLboolean, - g: GLboolean, - b: GLboolean, - a: GLboolean - ): void - disableiOES(target: GLenum, index: GLuint): void - enableiOES(target: GLenum, index: GLuint): void - } - - /** The OES_element_index_uint extension is part of the WebGL API and adds support for gl.UNSIGNED_INT types to WebGLRenderingContext.drawElements(). */ - interface OES_element_index_uint {} - - interface OES_fbo_render_mipmap {} - - /** The OES_standard_derivatives extension is part of the WebGL API and adds the GLSL derivative functions dFdx, dFdy, and fwidth. */ - interface OES_standard_derivatives { - readonly FRAGMENT_SHADER_DERIVATIVE_HINT_OES: GLenum - } - - /** The OES_texture_float extension is part of the WebGL API and exposes floating-point pixel types for textures. */ - interface OES_texture_float {} - - /** The OES_texture_float_linear extension is part of the WebGL API and allows linear filtering with floating-point pixel types for textures. */ - interface OES_texture_float_linear {} - - /** The OES_texture_half_float extension is part of the WebGL API and adds texture formats with 16- (aka half float) and 32-bit floating-point components. */ - interface OES_texture_half_float { - readonly HALF_FLOAT_OES: GLenum - } - - /** The OES_texture_half_float_linear extension is part of the WebGL API and allows linear filtering with half floating-point pixel types for textures. */ - interface OES_texture_half_float_linear {} - - interface OES_vertex_array_object { - bindVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): void - createVertexArrayOES(): WebGLVertexArrayObjectOES | null - deleteVertexArrayOES( - arrayObject: WebGLVertexArrayObjectOES | null - ): void - isVertexArrayOES( - arrayObject: WebGLVertexArrayObjectOES | null - ): GLboolean - readonly VERTEX_ARRAY_BINDING_OES: GLenum - } - - interface OVR_multiview2 { - framebufferTextureMultiviewOVR( - target: GLenum, - attachment: GLenum, - texture: WebGLTexture | null, - level: GLint, - baseViewIndex: GLint, - numViews: GLsizei - ): void - readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR: GLenum - readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR: GLenum - readonly FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR: GLenum - readonly MAX_VIEWS_OVR: GLenum - } - - type WebGLPowerPreference = 'default' | 'high-performance' | 'low-power' - - interface WebGLContextAttributes { - alpha?: boolean - antialias?: boolean - depth?: boolean - desynchronized?: boolean - failIfMajorPerformanceCaveat?: boolean - powerPreference?: WebGLPowerPreference - premultipliedAlpha?: boolean - preserveDrawingBuffer?: boolean - stencil?: boolean - } - - interface WebGLRenderingContextBase { - readonly canvas: Canvas - readonly drawingBufferHeight: GLsizei - readonly drawingBufferWidth: GLsizei - activeTexture(texture: GLenum): void - attachShader(program: WebGLProgram, shader: WebGLShader): void - bindAttribLocation( - program: WebGLProgram, - index: GLuint, - name: string - ): void - bindBuffer(target: GLenum, buffer: WebGLBuffer | null): void - bindFramebuffer( - target: GLenum, - framebuffer: WebGLFramebuffer | null - ): void - bindRenderbuffer( - target: GLenum, - renderbuffer: WebGLRenderbuffer | null - ): void - bindTexture(target: GLenum, texture: WebGLTexture | null): void - blendColor( - red: GLclampf, - green: GLclampf, - blue: GLclampf, - alpha: GLclampf - ): void - blendEquation(mode: GLenum): void - blendEquationSeparate(modeRGB: GLenum, modeAlpha: GLenum): void - blendFunc(sfactor: GLenum, dfactor: GLenum): void - blendFuncSeparate( - srcRGB: GLenum, - dstRGB: GLenum, - srcAlpha: GLenum, - dstAlpha: GLenum - ): void - checkFramebufferStatus(target: GLenum): GLenum - clear(mask: GLbitfield): void - clearColor( - red: GLclampf, - green: GLclampf, - blue: GLclampf, - alpha: GLclampf - ): void - clearDepth(depth: GLclampf): void - clearStencil(s: GLint): void - colorMask( - red: GLboolean, - green: GLboolean, - blue: GLboolean, - alpha: GLboolean - ): void - compileShader(shader: WebGLShader): void - copyTexImage2D( - target: GLenum, - level: GLint, - internalformat: GLenum, - x: GLint, - y: GLint, - width: GLsizei, - height: GLsizei, - border: GLint - ): void - copyTexSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - x: GLint, - y: GLint, - width: GLsizei, - height: GLsizei - ): void - createBuffer(): WebGLBuffer | null - createFramebuffer(): WebGLFramebuffer | null - createProgram(): WebGLProgram | null - createRenderbuffer(): WebGLRenderbuffer | null - createShader(type: GLenum): WebGLShader | null - createTexture(): WebGLTexture | null - cullFace(mode: GLenum): void - deleteBuffer(buffer: WebGLBuffer | null): void - deleteFramebuffer(framebuffer: WebGLFramebuffer | null): void - deleteProgram(program: WebGLProgram | null): void - deleteRenderbuffer(renderbuffer: WebGLRenderbuffer | null): void - deleteShader(shader: WebGLShader | null): void - deleteTexture(texture: WebGLTexture | null): void - depthFunc(func: GLenum): void - depthMask(flag: GLboolean): void - depthRange(zNear: GLclampf, zFar: GLclampf): void - detachShader(program: WebGLProgram, shader: WebGLShader): void - disable(cap: GLenum): void - disableVertexAttribArray(index: GLuint): void - drawArrays(mode: GLenum, first: GLint, count: GLsizei): void - drawElements( - mode: GLenum, - count: GLsizei, - type: GLenum, - offset: GLintptr - ): void - enable(cap: GLenum): void - enableVertexAttribArray(index: GLuint): void - finish(): void - flush(): void - framebufferRenderbuffer( - target: GLenum, - attachment: GLenum, - renderbuffertarget: GLenum, - renderbuffer: WebGLRenderbuffer | null - ): void - framebufferTexture2D( - target: GLenum, - attachment: GLenum, - textarget: GLenum, - texture: WebGLTexture | null, - level: GLint - ): void - frontFace(mode: GLenum): void - generateMipmap(target: GLenum): void - getActiveAttrib( - program: WebGLProgram, - index: GLuint - ): WebGLActiveInfo | null - getActiveUniform( - program: WebGLProgram, - index: GLuint - ): WebGLActiveInfo | null - getAttachedShaders(program: WebGLProgram): WebGLShader[] | null - getAttribLocation(program: WebGLProgram, name: string): GLint - getBufferParameter(target: GLenum, pname: GLenum): any - getContextAttributes(): WebGLContextAttributes | null - getError(): GLenum - getExtension( - extensionName: 'ANGLE_instanced_arrays' - ): ANGLE_instanced_arrays | null - getExtension(extensionName: 'EXT_blend_minmax'): EXT_blend_minmax | null - getExtension( - extensionName: 'EXT_color_buffer_float' - ): EXT_color_buffer_float | null - getExtension( - extensionName: 'EXT_color_buffer_half_float' - ): EXT_color_buffer_half_float | null - getExtension(extensionName: 'EXT_float_blend'): EXT_float_blend | null - getExtension(extensionName: 'EXT_frag_depth'): EXT_frag_depth | null - getExtension(extensionName: 'EXT_sRGB'): EXT_sRGB | null - getExtension( - extensionName: 'EXT_shader_texture_lod' - ): EXT_shader_texture_lod | null - getExtension( - extensionName: 'EXT_texture_compression_bptc' - ): EXT_texture_compression_bptc | null - getExtension( - extensionName: 'EXT_texture_compression_rgtc' - ): EXT_texture_compression_rgtc | null - getExtension( - extensionName: 'EXT_texture_filter_anisotropic' - ): EXT_texture_filter_anisotropic | null - getExtension( - extensionName: 'KHR_parallel_shader_compile' - ): KHR_parallel_shader_compile | null - getExtension( - extensionName: 'OES_element_index_uint' - ): OES_element_index_uint | null - getExtension( - extensionName: 'OES_fbo_render_mipmap' - ): OES_fbo_render_mipmap | null - getExtension( - extensionName: 'OES_standard_derivatives' - ): OES_standard_derivatives | null - getExtension( - extensionName: 'OES_texture_float' - ): OES_texture_float | null - getExtension( - extensionName: 'OES_texture_float_linear' - ): OES_texture_float_linear | null - getExtension( - extensionName: 'OES_texture_half_float' - ): OES_texture_half_float | null - getExtension( - extensionName: 'OES_texture_half_float_linear' - ): OES_texture_half_float_linear | null - getExtension( - extensionName: 'OES_vertex_array_object' - ): OES_vertex_array_object | null - getExtension(extensionName: 'OVR_multiview2'): OVR_multiview2 | null - getExtension( - extensionName: 'WEBGL_color_buffer_float' - ): WEBGL_color_buffer_float | null - getExtension( - extensionName: 'WEBGL_compressed_texture_astc' - ): WEBGL_compressed_texture_astc | null - getExtension( - extensionName: 'WEBGL_compressed_texture_etc' - ): WEBGL_compressed_texture_etc | null - getExtension( - extensionName: 'WEBGL_compressed_texture_etc1' - ): WEBGL_compressed_texture_etc1 | null - getExtension( - extensionName: 'WEBGL_compressed_texture_s3tc' - ): WEBGL_compressed_texture_s3tc | null - getExtension( - extensionName: 'WEBGL_compressed_texture_s3tc_srgb' - ): WEBGL_compressed_texture_s3tc_srgb | null - getExtension( - extensionName: 'WEBGL_debug_renderer_info' - ): WEBGL_debug_renderer_info | null - getExtension( - extensionName: 'WEBGL_debug_shaders' - ): WEBGL_debug_shaders | null - getExtension( - extensionName: 'WEBGL_depth_texture' - ): WEBGL_depth_texture | null - getExtension( - extensionName: 'WEBGL_draw_buffers' - ): WEBGL_draw_buffers | null - getExtension( - extensionName: 'WEBGL_lose_context' - ): WEBGL_lose_context | null - getExtension(extensionName: 'WEBGL_multi_draw'): WEBGL_multi_draw | null - getExtension(name: string): any - getFramebufferAttachmentParameter( - target: GLenum, - attachment: GLenum, - pname: GLenum - ): any - getParameter(pname: GLenum): any - getProgramInfoLog(program: WebGLProgram): string | null - getProgramParameter(program: WebGLProgram, pname: GLenum): any - getRenderbufferParameter(target: GLenum, pname: GLenum): any - getShaderInfoLog(shader: WebGLShader): string | null - getShaderParameter(shader: WebGLShader, pname: GLenum): any - getShaderPrecisionFormat( - shadertype: GLenum, - precisiontype: GLenum - ): WebGLShaderPrecisionFormat | null - getShaderSource(shader: WebGLShader): string | null - getSupportedExtensions(): string[] | null - getTexParameter(target: GLenum, pname: GLenum): any - getUniform(program: WebGLProgram, location: WebGLUniformLocation): any - getUniformLocation( - program: WebGLProgram, - name: string - ): WebGLUniformLocation | null - getVertexAttrib(index: GLuint, pname: GLenum): any - getVertexAttribOffset(index: GLuint, pname: GLenum): GLintptr - hint(target: GLenum, mode: GLenum): void - isBuffer(buffer: WebGLBuffer | null): GLboolean - isContextLost(): boolean - isEnabled(cap: GLenum): GLboolean - isFramebuffer(framebuffer: WebGLFramebuffer | null): GLboolean - isProgram(program: WebGLProgram | null): GLboolean - isRenderbuffer(renderbuffer: WebGLRenderbuffer | null): GLboolean - isShader(shader: WebGLShader | null): GLboolean - isTexture(texture: WebGLTexture | null): GLboolean - lineWidth(width: GLfloat): void - linkProgram(program: WebGLProgram): void - pixelStorei(pname: GLenum, param: GLint | GLboolean): void - polygonOffset(factor: GLfloat, units: GLfloat): void - renderbufferStorage( - target: GLenum, - internalformat: GLenum, - width: GLsizei, - height: GLsizei - ): void - sampleCoverage(value: GLclampf, invert: GLboolean): void - scissor(x: GLint, y: GLint, width: GLsizei, height: GLsizei): void - shaderSource(shader: WebGLShader, source: string): void - stencilFunc(func: GLenum, ref: GLint, mask: GLuint): void - stencilFuncSeparate( - face: GLenum, - func: GLenum, - ref: GLint, - mask: GLuint - ): void - stencilMask(mask: GLuint): void - stencilMaskSeparate(face: GLenum, mask: GLuint): void - stencilOp(fail: GLenum, zfail: GLenum, zpass: GLenum): void - stencilOpSeparate( - face: GLenum, - fail: GLenum, - zfail: GLenum, - zpass: GLenum - ): void - texParameterf(target: GLenum, pname: GLenum, param: GLfloat): void - texParameteri(target: GLenum, pname: GLenum, param: GLint): void - uniform1f(location: WebGLUniformLocation | null, x: GLfloat): void - uniform1i(location: WebGLUniformLocation | null, x: GLint): void - uniform2f( - location: WebGLUniformLocation | null, - x: GLfloat, - y: GLfloat - ): void - uniform2i( - location: WebGLUniformLocation | null, - x: GLint, - y: GLint - ): void - uniform3f( - location: WebGLUniformLocation | null, - x: GLfloat, - y: GLfloat, - z: GLfloat - ): void - uniform3i( - location: WebGLUniformLocation | null, - x: GLint, - y: GLint, - z: GLint - ): void - uniform4f( - location: WebGLUniformLocation | null, - x: GLfloat, - y: GLfloat, - z: GLfloat, - w: GLfloat - ): void - uniform4i( - location: WebGLUniformLocation | null, - x: GLint, - y: GLint, - z: GLint, - w: GLint - ): void - useProgram(program: WebGLProgram | null): void - validateProgram(program: WebGLProgram): void - vertexAttrib1f(index: GLuint, x: GLfloat): void - vertexAttrib1fv(index: GLuint, values: Float32List): void - vertexAttrib2f(index: GLuint, x: GLfloat, y: GLfloat): void - vertexAttrib2fv(index: GLuint, values: Float32List): void - vertexAttrib3f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat): void - vertexAttrib3fv(index: GLuint, values: Float32List): void - vertexAttrib4f( - index: GLuint, - x: GLfloat, - y: GLfloat, - z: GLfloat, - w: GLfloat - ): void - vertexAttrib4fv(index: GLuint, values: Float32List): void - vertexAttribPointer( - index: GLuint, - size: GLint, - type: GLenum, - normalized: GLboolean, - stride: GLsizei, - offset: GLintptr - ): void - viewport(x: GLint, y: GLint, width: GLsizei, height: GLsizei): void - readonly ACTIVE_ATTRIBUTES: GLenum - readonly ACTIVE_TEXTURE: GLenum - readonly ACTIVE_UNIFORMS: GLenum - readonly ALIASED_LINE_WIDTH_RANGE: GLenum - readonly ALIASED_POINT_SIZE_RANGE: GLenum - readonly ALPHA: GLenum - readonly ALPHA_BITS: GLenum - readonly ALWAYS: GLenum - readonly ARRAY_BUFFER: GLenum - readonly ARRAY_BUFFER_BINDING: GLenum - readonly ATTACHED_SHADERS: GLenum - readonly BACK: GLenum - readonly BLEND: GLenum - readonly BLEND_COLOR: GLenum - readonly BLEND_DST_ALPHA: GLenum - readonly BLEND_DST_RGB: GLenum - readonly BLEND_EQUATION: GLenum - readonly BLEND_EQUATION_ALPHA: GLenum - readonly BLEND_EQUATION_RGB: GLenum - readonly BLEND_SRC_ALPHA: GLenum - readonly BLEND_SRC_RGB: GLenum - readonly BLUE_BITS: GLenum - readonly BOOL: GLenum - readonly BOOL_VEC2: GLenum - readonly BOOL_VEC3: GLenum - readonly BOOL_VEC4: GLenum - readonly BROWSER_DEFAULT_WEBGL: GLenum - readonly BUFFER_SIZE: GLenum - readonly BUFFER_USAGE: GLenum - readonly BYTE: GLenum - readonly CCW: GLenum - readonly CLAMP_TO_EDGE: GLenum - readonly COLOR_ATTACHMENT0: GLenum - readonly COLOR_BUFFER_BIT: GLenum - readonly COLOR_CLEAR_VALUE: GLenum - readonly COLOR_WRITEMASK: GLenum - readonly COMPILE_STATUS: GLenum - readonly COMPRESSED_TEXTURE_FORMATS: GLenum - readonly CONSTANT_ALPHA: GLenum - readonly CONSTANT_COLOR: GLenum - readonly CONTEXT_LOST_WEBGL: GLenum - readonly CULL_FACE: GLenum - readonly CULL_FACE_MODE: GLenum - readonly CURRENT_PROGRAM: GLenum - readonly CURRENT_VERTEX_ATTRIB: GLenum - readonly CW: GLenum - readonly DECR: GLenum - readonly DECR_WRAP: GLenum - readonly DELETE_STATUS: GLenum - readonly DEPTH_ATTACHMENT: GLenum - readonly DEPTH_BITS: GLenum - readonly DEPTH_BUFFER_BIT: GLenum - readonly DEPTH_CLEAR_VALUE: GLenum - readonly DEPTH_COMPONENT: GLenum - readonly DEPTH_COMPONENT16: GLenum - readonly DEPTH_FUNC: GLenum - readonly DEPTH_RANGE: GLenum - readonly DEPTH_STENCIL: GLenum - readonly DEPTH_STENCIL_ATTACHMENT: GLenum - readonly DEPTH_TEST: GLenum - readonly DEPTH_WRITEMASK: GLenum - readonly DITHER: GLenum - readonly DONT_CARE: GLenum - readonly DST_ALPHA: GLenum - readonly DST_COLOR: GLenum - readonly DYNAMIC_DRAW: GLenum - readonly ELEMENT_ARRAY_BUFFER: GLenum - readonly ELEMENT_ARRAY_BUFFER_BINDING: GLenum - readonly EQUAL: GLenum - readonly FASTEST: GLenum - readonly FLOAT: GLenum - readonly FLOAT_MAT2: GLenum - readonly FLOAT_MAT3: GLenum - readonly FLOAT_MAT4: GLenum - readonly FLOAT_VEC2: GLenum - readonly FLOAT_VEC3: GLenum - readonly FLOAT_VEC4: GLenum - readonly FRAGMENT_SHADER: GLenum - readonly FRAMEBUFFER: GLenum - readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: GLenum - readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: GLenum - readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: GLenum - readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: GLenum - readonly FRAMEBUFFER_BINDING: GLenum - readonly FRAMEBUFFER_COMPLETE: GLenum - readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: GLenum - readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: GLenum - readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: GLenum - readonly FRAMEBUFFER_UNSUPPORTED: GLenum - readonly FRONT: GLenum - readonly FRONT_AND_BACK: GLenum - readonly FRONT_FACE: GLenum - readonly FUNC_ADD: GLenum - readonly FUNC_REVERSE_SUBTRACT: GLenum - readonly FUNC_SUBTRACT: GLenum - readonly GENERATE_MIPMAP_HINT: GLenum - readonly GEQUAL: GLenum - readonly GREATER: GLenum - readonly GREEN_BITS: GLenum - readonly HIGH_FLOAT: GLenum - readonly HIGH_INT: GLenum - readonly IMPLEMENTATION_COLOR_READ_FORMAT: GLenum - readonly IMPLEMENTATION_COLOR_READ_TYPE: GLenum - readonly INCR: GLenum - readonly INCR_WRAP: GLenum - readonly INT: GLenum - readonly INT_VEC2: GLenum - readonly INT_VEC3: GLenum - readonly INT_VEC4: GLenum - readonly INVALID_ENUM: GLenum - readonly INVALID_FRAMEBUFFER_OPERATION: GLenum - readonly INVALID_OPERATION: GLenum - readonly INVALID_VALUE: GLenum - readonly INVERT: GLenum - readonly KEEP: GLenum - readonly LEQUAL: GLenum - readonly LESS: GLenum - readonly LINEAR: GLenum - readonly LINEAR_MIPMAP_LINEAR: GLenum - readonly LINEAR_MIPMAP_NEAREST: GLenum - readonly LINES: GLenum - readonly LINE_LOOP: GLenum - readonly LINE_STRIP: GLenum - readonly LINE_WIDTH: GLenum - readonly LINK_STATUS: GLenum - readonly LOW_FLOAT: GLenum - readonly LOW_INT: GLenum - readonly LUMINANCE: GLenum - readonly LUMINANCE_ALPHA: GLenum - readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: GLenum - readonly MAX_CUBE_MAP_TEXTURE_SIZE: GLenum - readonly MAX_FRAGMENT_UNIFORM_VECTORS: GLenum - readonly MAX_RENDERBUFFER_SIZE: GLenum - readonly MAX_TEXTURE_IMAGE_UNITS: GLenum - readonly MAX_TEXTURE_SIZE: GLenum - readonly MAX_VARYING_VECTORS: GLenum - readonly MAX_VERTEX_ATTRIBS: GLenum - readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: GLenum - readonly MAX_VERTEX_UNIFORM_VECTORS: GLenum - readonly MAX_VIEWPORT_DIMS: GLenum - readonly MEDIUM_FLOAT: GLenum - readonly MEDIUM_INT: GLenum - readonly MIRRORED_REPEAT: GLenum - readonly NEAREST: GLenum - readonly NEAREST_MIPMAP_LINEAR: GLenum - readonly NEAREST_MIPMAP_NEAREST: GLenum - readonly NEVER: GLenum - readonly NICEST: GLenum - readonly NONE: GLenum - readonly NOTEQUAL: GLenum - readonly NO_ERROR: GLenum - readonly ONE: GLenum - readonly ONE_MINUS_CONSTANT_ALPHA: GLenum - readonly ONE_MINUS_CONSTANT_COLOR: GLenum - readonly ONE_MINUS_DST_ALPHA: GLenum - readonly ONE_MINUS_DST_COLOR: GLenum - readonly ONE_MINUS_SRC_ALPHA: GLenum - readonly ONE_MINUS_SRC_COLOR: GLenum - readonly OUT_OF_MEMORY: GLenum - readonly PACK_ALIGNMENT: GLenum - readonly POINTS: GLenum - readonly POLYGON_OFFSET_FACTOR: GLenum - readonly POLYGON_OFFSET_FILL: GLenum - readonly POLYGON_OFFSET_UNITS: GLenum - readonly RED_BITS: GLenum - readonly RENDERBUFFER: GLenum - readonly RENDERBUFFER_ALPHA_SIZE: GLenum - readonly RENDERBUFFER_BINDING: GLenum - readonly RENDERBUFFER_BLUE_SIZE: GLenum - readonly RENDERBUFFER_DEPTH_SIZE: GLenum - readonly RENDERBUFFER_GREEN_SIZE: GLenum - readonly RENDERBUFFER_HEIGHT: GLenum - readonly RENDERBUFFER_INTERNAL_FORMAT: GLenum - readonly RENDERBUFFER_RED_SIZE: GLenum - readonly RENDERBUFFER_STENCIL_SIZE: GLenum - readonly RENDERBUFFER_WIDTH: GLenum - readonly RENDERER: GLenum - readonly REPEAT: GLenum - readonly REPLACE: GLenum - readonly RGB: GLenum - readonly RGB565: GLenum - readonly RGB5_A1: GLenum - readonly RGBA: GLenum - readonly RGBA4: GLenum - readonly SAMPLER_2D: GLenum - readonly SAMPLER_CUBE: GLenum - readonly SAMPLES: GLenum - readonly SAMPLE_ALPHA_TO_COVERAGE: GLenum - readonly SAMPLE_BUFFERS: GLenum - readonly SAMPLE_COVERAGE: GLenum - readonly SAMPLE_COVERAGE_INVERT: GLenum - readonly SAMPLE_COVERAGE_VALUE: GLenum - readonly SCISSOR_BOX: GLenum - readonly SCISSOR_TEST: GLenum - readonly SHADER_TYPE: GLenum - readonly SHADING_LANGUAGE_VERSION: GLenum - readonly SHORT: GLenum - readonly SRC_ALPHA: GLenum - readonly SRC_ALPHA_SATURATE: GLenum - readonly SRC_COLOR: GLenum - readonly STATIC_DRAW: GLenum - readonly STENCIL_ATTACHMENT: GLenum - readonly STENCIL_BACK_FAIL: GLenum - readonly STENCIL_BACK_FUNC: GLenum - readonly STENCIL_BACK_PASS_DEPTH_FAIL: GLenum - readonly STENCIL_BACK_PASS_DEPTH_PASS: GLenum - readonly STENCIL_BACK_REF: GLenum - readonly STENCIL_BACK_VALUE_MASK: GLenum - readonly STENCIL_BACK_WRITEMASK: GLenum - readonly STENCIL_BITS: GLenum - readonly STENCIL_BUFFER_BIT: GLenum - readonly STENCIL_CLEAR_VALUE: GLenum - readonly STENCIL_FAIL: GLenum - readonly STENCIL_FUNC: GLenum - readonly STENCIL_INDEX8: GLenum - readonly STENCIL_PASS_DEPTH_FAIL: GLenum - readonly STENCIL_PASS_DEPTH_PASS: GLenum - readonly STENCIL_REF: GLenum - readonly STENCIL_TEST: GLenum - readonly STENCIL_VALUE_MASK: GLenum - readonly STENCIL_WRITEMASK: GLenum - readonly STREAM_DRAW: GLenum - readonly SUBPIXEL_BITS: GLenum - readonly TEXTURE: GLenum - readonly TEXTURE0: GLenum - readonly TEXTURE1: GLenum - readonly TEXTURE10: GLenum - readonly TEXTURE11: GLenum - readonly TEXTURE12: GLenum - readonly TEXTURE13: GLenum - readonly TEXTURE14: GLenum - readonly TEXTURE15: GLenum - readonly TEXTURE16: GLenum - readonly TEXTURE17: GLenum - readonly TEXTURE18: GLenum - readonly TEXTURE19: GLenum - readonly TEXTURE2: GLenum - readonly TEXTURE20: GLenum - readonly TEXTURE21: GLenum - readonly TEXTURE22: GLenum - readonly TEXTURE23: GLenum - readonly TEXTURE24: GLenum - readonly TEXTURE25: GLenum - readonly TEXTURE26: GLenum - readonly TEXTURE27: GLenum - readonly TEXTURE28: GLenum - readonly TEXTURE29: GLenum - readonly TEXTURE3: GLenum - readonly TEXTURE30: GLenum - readonly TEXTURE31: GLenum - readonly TEXTURE4: GLenum - readonly TEXTURE5: GLenum - readonly TEXTURE6: GLenum - readonly TEXTURE7: GLenum - readonly TEXTURE8: GLenum - readonly TEXTURE9: GLenum - readonly TEXTURE_2D: GLenum - readonly TEXTURE_BINDING_2D: GLenum - readonly TEXTURE_BINDING_CUBE_MAP: GLenum - readonly TEXTURE_CUBE_MAP: GLenum - readonly TEXTURE_CUBE_MAP_NEGATIVE_X: GLenum - readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: GLenum - readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: GLenum - readonly TEXTURE_CUBE_MAP_POSITIVE_X: GLenum - readonly TEXTURE_CUBE_MAP_POSITIVE_Y: GLenum - readonly TEXTURE_CUBE_MAP_POSITIVE_Z: GLenum - readonly TEXTURE_MAG_FILTER: GLenum - readonly TEXTURE_MIN_FILTER: GLenum - readonly TEXTURE_WRAP_S: GLenum - readonly TEXTURE_WRAP_T: GLenum - readonly TRIANGLES: GLenum - readonly TRIANGLE_FAN: GLenum - readonly TRIANGLE_STRIP: GLenum - readonly UNPACK_ALIGNMENT: GLenum - readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: GLenum - readonly UNPACK_FLIP_Y_WEBGL: GLenum - readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: GLenum - readonly UNSIGNED_BYTE: GLenum - readonly UNSIGNED_INT: GLenum - readonly UNSIGNED_SHORT: GLenum - readonly UNSIGNED_SHORT_4_4_4_4: GLenum - readonly UNSIGNED_SHORT_5_5_5_1: GLenum - readonly UNSIGNED_SHORT_5_6_5: GLenum - readonly VALIDATE_STATUS: GLenum - readonly VENDOR: GLenum - readonly VERSION: GLenum - readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: GLenum - readonly VERTEX_ATTRIB_ARRAY_ENABLED: GLenum - readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: GLenum - readonly VERTEX_ATTRIB_ARRAY_POINTER: GLenum - readonly VERTEX_ATTRIB_ARRAY_SIZE: GLenum - readonly VERTEX_ATTRIB_ARRAY_STRIDE: GLenum - readonly VERTEX_ATTRIB_ARRAY_TYPE: GLenum - readonly VERTEX_SHADER: GLenum - readonly VIEWPORT: GLenum - readonly ZERO: GLenum - } - - type BufferSource = ArrayBufferView | ArrayBuffer - type Float32List = Float32Array | GLfloat[] - type TexImageSource = - | Image - | ImageData - | Canvas - | OffscreenCanvas - | VideoContext - - interface WebGLRenderingContextOverloads { - bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum): void - bufferData( - target: GLenum, - data: BufferSource | null, - usage: GLenum - ): void - bufferSubData( - target: GLenum, - offset: GLintptr, - data: BufferSource - ): void - compressedTexImage2D( - target: GLenum, - level: GLint, - internalformat: GLenum, - width: GLsizei, - height: GLsizei, - border: GLint, - data: ArrayBufferView - ): void - compressedTexSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - data: ArrayBufferView - ): void - readPixels( - x: GLint, - y: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - type: GLenum, - pixels: ArrayBufferView | null - ): void - texImage2D( - target: GLenum, - level: GLint, - internalformat: GLint, - width: GLsizei, - height: GLsizei, - border: GLint, - format: GLenum, - type: GLenum, - pixels: ArrayBufferView | null - ): void - texImage2D( - target: GLenum, - level: GLint, - internalformat: GLint, - format: GLenum, - type: GLenum, - source: TexImageSource - ): void - texSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - width: GLsizei, - height: GLsizei, - format: GLenum, - type: GLenum, - pixels: ArrayBufferView | null - ): void - texSubImage2D( - target: GLenum, - level: GLint, - xoffset: GLint, - yoffset: GLint, - format: GLenum, - type: GLenum, - source: TexImageSource - ): void - uniform1fv(location: WebGLUniformLocation | null, v: Float32List): void - uniform1iv(location: WebGLUniformLocation | null, v: Int32List): void - uniform2fv(location: WebGLUniformLocation | null, v: Float32List): void - uniform2iv(location: WebGLUniformLocation | null, v: Int32List): void - uniform3fv(location: WebGLUniformLocation | null, v: Float32List): void - uniform3iv(location: WebGLUniformLocation | null, v: Int32List): void - uniform4fv(location: WebGLUniformLocation | null, v: Float32List): void - uniform4iv(location: WebGLUniformLocation | null, v: Int32List): void - uniformMatrix2fv( - location: WebGLUniformLocation | null, - transpose: GLboolean, - value: Float32List - ): void - uniformMatrix3fv( - location: WebGLUniformLocation | null, - transpose: GLboolean, - value: Float32List - ): void - uniformMatrix4fv( - location: WebGLUniformLocation | null, - transpose: GLboolean, - value: Float32List - ): void - } - - interface WebGLSampler {} - - /** The WebGLShader is part of the WebGL API and can either be a vertex or a fragment shader. A WebGLProgram requires both types of shaders. */ - interface WebGLShader {} - - /** Part of the WebGL API and represents the information returned by calling the WebGLRenderingContext.getShaderPrecisionFormat() method. */ - interface WebGLShaderPrecisionFormat { - readonly precision: GLint - readonly rangeMax: GLint - readonly rangeMin: GLint - } - - interface WebGLSync {} - - /** Part of the WebGL API and represents an opaque texture object providing storage and state for texturing operations. */ - interface WebGLTexture {} - - interface WebGLTransformFeedback {} - - /** Part of the WebGL API and represents the location of a uniform variable in a shader program. */ - interface WebGLUniformLocation {} - - interface WebGLVertexArrayObject {} - - interface WebGLVertexArrayObjectOES {} -} diff --git a/typings/types/wx/lib.wx.cloud.d.ts b/typings/types/wx/lib.wx.cloud.d.ts deleted file mode 100644 index e70be98..0000000 --- a/typings/types/wx/lib.wx.cloud.d.ts +++ /dev/null @@ -1,1016 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) 2024 Tencent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -***************************************************************************** */ - -/** - * Common interfaces and types - */ - -interface IAPIError { - errMsg: string -} - -interface IAPIParam<T = any> { - config?: ICloudConfig - success?: (res: T) => void - fail?: (err: IAPIError) => void - complete?: (val: T | IAPIError) => void -} - -interface IAPISuccessParam { - errMsg: string -} - -type IAPICompleteParam = IAPISuccessParam | IAPIError - -type IAPIFunction<T, P extends IAPIParam<T>> = (param?: P) => Promise<T> - -interface IInitCloudConfig { - env?: - | string - | { - database?: string - functions?: string - storage?: string - } - traceUser?: boolean -} - -interface ICloudConfig { - env?: string - traceUser?: boolean -} - -interface IICloudAPI { - init: (config?: IInitCloudConfig) => void - [api: string]: AnyFunction | IAPIFunction<any, any> -} - -interface ICloudService { - name: string - - getAPIs: () => { [name: string]: IAPIFunction<any, any> } -} - -interface ICloudServices { - [serviceName: string]: ICloudService -} - -interface ICloudMetaData { - session_id: string -} - -declare class InternalSymbol {} - -interface AnyObject { - [x: string]: any -} - -type AnyArray = any[] - -type AnyFunction = (...args: any[]) => any - -/** - * extend wx with cloud - */ -interface WxCloud { - init: (config?: ICloudConfig) => void - - callFunction(param: OQ<ICloud.CallFunctionParam>): void - callFunction( - param: RQ<ICloud.CallFunctionParam> - ): Promise<ICloud.CallFunctionResult> - - uploadFile(param: OQ<ICloud.UploadFileParam>): WechatMiniprogram.UploadTask - uploadFile( - param: RQ<ICloud.UploadFileParam> - ): Promise<ICloud.UploadFileResult> - - downloadFile( - param: OQ<ICloud.DownloadFileParam> - ): WechatMiniprogram.DownloadTask - downloadFile( - param: RQ<ICloud.DownloadFileParam> - ): Promise<ICloud.DownloadFileResult> - - getTempFileURL(param: OQ<ICloud.GetTempFileURLParam>): void - getTempFileURL( - param: RQ<ICloud.GetTempFileURLParam> - ): Promise<ICloud.GetTempFileURLResult> - - deleteFile(param: OQ<ICloud.DeleteFileParam>): void - deleteFile( - param: RQ<ICloud.DeleteFileParam> - ): Promise<ICloud.DeleteFileResult> - - database: (config?: ICloudConfig) => DB.Database - - CloudID: ICloud.ICloudIDConstructor - CDN: ICloud.ICDNConstructor - - callContainer(param: OQ<ICloud.CallContainerParam>): void - callContainer( - param: RQ<ICloud.CallContainerParam> - ): Promise<ICloud.CallContainerResult> - - connectContainer(param: OQ<ICloud.ConnectContainerParam>): void - connectContainer( - param: RQ<ICloud.ConnectContainerParam> - ): Promise<ICloud.ConnectContainerResult> - - services: ICloud.CloudServices -} - -declare namespace ICloud { - interface ICloudAPIParam<T = any> extends IAPIParam<T> { - config?: ICloudConfig - } - - // === API: callFunction === - type CallFunctionData = AnyObject - - interface CallFunctionResult extends IAPISuccessParam { - result: AnyObject | string | undefined - } - - interface CallFunctionParam extends ICloudAPIParam<CallFunctionResult> { - name: string - data?: CallFunctionData - slow?: boolean - } - // === end === - - // === API: container === - type CallContainerData = AnyObject - - interface CallContainerResult extends IAPISuccessParam { - data: any - statusCode: number - header: Record<string, any> - callID: string - } - - interface CallContainerParam extends ICloudAPIParam<CallContainerResult> { - path: string - service?: string - method?: string - header?: Record<string, any> - data?: any // string, object, ArrayBuffer - dataType?: string - responseType?: string - timeout?: number - verbose?: boolean - followRedirect?: boolean - } - - interface ConnectContainerResult extends IAPISuccessParam { - socketTask: WechatMiniprogram.SocketTask - } - - interface ConnectSocketOptions extends IAPIParam<void> { - header?: Record<string, string> - protocols?: string[] - tcpNoDelay?: boolean - perMessageDeflate?: boolean - timeout?: number - } - - type ConnectContainerParam = Omit< - ConnectSocketOptions, - 'success' | 'fail' | 'complete' - > & - ICloudAPIParam<ConnectContainerResult> & { - service: string - path?: string - } - // === end === - - // === API: services === - type AsyncSession<T> = T | PromiseLike<T> - interface GatewayCallOptions { - path: string - data: any - shouldSerialize?: boolean - apiVersion?: number - } - interface GatewayInstance { - call: ( - param: CallContainerParam & GatewayCallOptions - ) => Promise<CallContainerResult> - refresh: (session: AsyncSession<string>) => Promise<void> - } - interface GatewayConstructOptions { - id: string - appid?: string - domain?: string - keepalive?: boolean - prefetch?: boolean - prefetchOptions?: { - concurrent?: number - enableQuic?: boolean - enableHttp2?: boolean - } - } - interface CloudServices { - Gateway: (opts: GatewayConstructOptions) => GatewayInstance - } - // === end === - - // === API: uploadFile === - interface UploadFileResult extends IAPISuccessParam { - fileID: string - statusCode: number - } - - interface UploadFileParam extends ICloudAPIParam<UploadFileResult> { - cloudPath: string - filePath: string - header?: AnyObject - } - // === end === - - // === API: downloadFile === - interface DownloadFileResult extends IAPISuccessParam { - tempFilePath: string - statusCode: number - } - - interface DownloadFileParam extends ICloudAPIParam<DownloadFileResult> { - fileID: string - cloudPath?: string - } - // === end === - - // === API: getTempFileURL === - interface GetTempFileURLResult extends IAPISuccessParam { - fileList: GetTempFileURLResultItem[] - } - - interface GetTempFileURLResultItem { - fileID: string - tempFileURL: string - maxAge: number - status: number - errMsg: string - } - - interface GetTempFileURLParam extends ICloudAPIParam<GetTempFileURLResult> { - fileList: string[] - } - // === end === - - // === API: deleteFile === - interface DeleteFileResult extends IAPISuccessParam { - fileList: DeleteFileResultItem[] - } - - interface DeleteFileResultItem { - fileID: string - status: number - errMsg: string - } - - interface DeleteFileParam extends ICloudAPIParam<DeleteFileResult> { - fileList: string[] - } - // === end === - - // === API: CloudID === - abstract class CloudID { - constructor(cloudID: string) - } - - interface ICloudIDConstructor { - new (cloudId: string): CloudID - (cloudId: string): CloudID - } - // === end === - - // === API: CDN === - abstract class CDN { - target: string | ArrayBuffer | ICDNFilePathSpec - constructor(target: string | ArrayBuffer | ICDNFilePathSpec) - } - - interface ICDNFilePathSpec { - type: 'filePath' - filePath: string - } - - interface ICDNConstructor { - new (options: string | ArrayBuffer | ICDNFilePathSpec): CDN - (options: string | ArrayBuffer | ICDNFilePathSpec): CDN - } - // === end === -} - -// === Database === -declare namespace DB { - /** - * The class of all exposed cloud database instances - */ - class Database { - readonly config: ICloudConfig - readonly command: DatabaseCommand - readonly Geo: IGeo - readonly serverDate: () => ServerDate - readonly RegExp: IRegExpConstructor - - private constructor() - - collection(collectionName: string): CollectionReference - } - - class CollectionReference extends Query { - readonly collectionName: string - - private constructor(name: string, database: Database) - - doc(docId: string | number): DocumentReference - - add(options: OQ<IAddDocumentOptions>): void - add(options: RQ<IAddDocumentOptions>): Promise<IAddResult> - } - - class DocumentReference { - private constructor(docId: string | number, database: Database) - - field(object: Record<string, any>): this - - get(options: OQ<IGetDocumentOptions>): void - get(options?: RQ<IGetDocumentOptions>): Promise<IQuerySingleResult> - - set(options: OQ<ISetSingleDocumentOptions>): void - set(options?: RQ<ISetSingleDocumentOptions>): Promise<ISetResult> - - update(options: OQ<IUpdateSingleDocumentOptions>): void - update( - options?: RQ<IUpdateSingleDocumentOptions> - ): Promise<IUpdateResult> - - remove(options: OQ<IRemoveSingleDocumentOptions>): void - remove( - options?: RQ<IRemoveSingleDocumentOptions> - ): Promise<IRemoveResult> - - watch(options: IWatchOptions): RealtimeListener - } - - class RealtimeListener { - // "And Now His Watch Is Ended" - close: () => Promise<void> - } - - class Query { - where(condition: IQueryCondition): Query - - orderBy(fieldPath: string, order: string): Query - - limit(max: number): Query - - skip(offset: number): Query - - field(object: Record<string, any>): Query - - get(options: OQ<IGetDocumentOptions>): void - get(options?: RQ<IGetDocumentOptions>): Promise<IQueryResult> - - count(options: OQ<ICountDocumentOptions>): void - count(options?: RQ<ICountDocumentOptions>): Promise<ICountResult> - - watch(options: IWatchOptions): RealtimeListener - } - - interface DatabaseCommand { - eq(val: any): DatabaseQueryCommand - neq(val: any): DatabaseQueryCommand - gt(val: any): DatabaseQueryCommand - gte(val: any): DatabaseQueryCommand - lt(val: any): DatabaseQueryCommand - lte(val: any): DatabaseQueryCommand - in(val: any[]): DatabaseQueryCommand - nin(val: any[]): DatabaseQueryCommand - - geoNear(options: IGeoNearCommandOptions): DatabaseQueryCommand - geoWithin(options: IGeoWithinCommandOptions): DatabaseQueryCommand - geoIntersects( - options: IGeoIntersectsCommandOptions - ): DatabaseQueryCommand - - and( - ...expressions: Array<DatabaseLogicCommand | IQueryCondition> - ): DatabaseLogicCommand - or( - ...expressions: Array<DatabaseLogicCommand | IQueryCondition> - ): DatabaseLogicCommand - nor( - ...expressions: Array<DatabaseLogicCommand | IQueryCondition> - ): DatabaseLogicCommand - not(expression: DatabaseLogicCommand): DatabaseLogicCommand - - exists(val: boolean): DatabaseQueryCommand - - mod(divisor: number, remainder: number): DatabaseQueryCommand - - all(val: any[]): DatabaseQueryCommand - elemMatch(val: any): DatabaseQueryCommand - size(val: number): DatabaseQueryCommand - - set(val: any): DatabaseUpdateCommand - remove(): DatabaseUpdateCommand - inc(val: number): DatabaseUpdateCommand - mul(val: number): DatabaseUpdateCommand - min(val: number): DatabaseUpdateCommand - max(val: number): DatabaseUpdateCommand - rename(val: string): DatabaseUpdateCommand - bit(val: number): DatabaseUpdateCommand - - push(...values: any[]): DatabaseUpdateCommand - pop(): DatabaseUpdateCommand - shift(): DatabaseUpdateCommand - unshift(...values: any[]): DatabaseUpdateCommand - addToSet(val: any): DatabaseUpdateCommand - pull(val: any): DatabaseUpdateCommand - pullAll(val: any): DatabaseUpdateCommand - - project: { - slice(val: number | [number, number]): DatabaseProjectionCommand - } - - aggregate: { - __safe_props__?: Set<string> - - abs(val: any): DatabaseAggregateCommand - add(val: any): DatabaseAggregateCommand - addToSet(val: any): DatabaseAggregateCommand - allElementsTrue(val: any): DatabaseAggregateCommand - and(val: any): DatabaseAggregateCommand - anyElementTrue(val: any): DatabaseAggregateCommand - arrayElemAt(val: any): DatabaseAggregateCommand - arrayToObject(val: any): DatabaseAggregateCommand - avg(val: any): DatabaseAggregateCommand - ceil(val: any): DatabaseAggregateCommand - cmp(val: any): DatabaseAggregateCommand - concat(val: any): DatabaseAggregateCommand - concatArrays(val: any): DatabaseAggregateCommand - cond(val: any): DatabaseAggregateCommand - convert(val: any): DatabaseAggregateCommand - dateFromParts(val: any): DatabaseAggregateCommand - dateToParts(val: any): DatabaseAggregateCommand - dateFromString(val: any): DatabaseAggregateCommand - dateToString(val: any): DatabaseAggregateCommand - dayOfMonth(val: any): DatabaseAggregateCommand - dayOfWeek(val: any): DatabaseAggregateCommand - dayOfYear(val: any): DatabaseAggregateCommand - divide(val: any): DatabaseAggregateCommand - eq(val: any): DatabaseAggregateCommand - exp(val: any): DatabaseAggregateCommand - filter(val: any): DatabaseAggregateCommand - first(val: any): DatabaseAggregateCommand - floor(val: any): DatabaseAggregateCommand - gt(val: any): DatabaseAggregateCommand - gte(val: any): DatabaseAggregateCommand - hour(val: any): DatabaseAggregateCommand - ifNull(val: any): DatabaseAggregateCommand - in(val: any): DatabaseAggregateCommand - indexOfArray(val: any): DatabaseAggregateCommand - indexOfBytes(val: any): DatabaseAggregateCommand - indexOfCP(val: any): DatabaseAggregateCommand - isArray(val: any): DatabaseAggregateCommand - isoDayOfWeek(val: any): DatabaseAggregateCommand - isoWeek(val: any): DatabaseAggregateCommand - isoWeekYear(val: any): DatabaseAggregateCommand - last(val: any): DatabaseAggregateCommand - let(val: any): DatabaseAggregateCommand - literal(val: any): DatabaseAggregateCommand - ln(val: any): DatabaseAggregateCommand - log(val: any): DatabaseAggregateCommand - log10(val: any): DatabaseAggregateCommand - lt(val: any): DatabaseAggregateCommand - lte(val: any): DatabaseAggregateCommand - ltrim(val: any): DatabaseAggregateCommand - map(val: any): DatabaseAggregateCommand - max(val: any): DatabaseAggregateCommand - mergeObjects(val: any): DatabaseAggregateCommand - meta(val: any): DatabaseAggregateCommand - min(val: any): DatabaseAggregateCommand - millisecond(val: any): DatabaseAggregateCommand - minute(val: any): DatabaseAggregateCommand - mod(val: any): DatabaseAggregateCommand - month(val: any): DatabaseAggregateCommand - multiply(val: any): DatabaseAggregateCommand - neq(val: any): DatabaseAggregateCommand - not(val: any): DatabaseAggregateCommand - objectToArray(val: any): DatabaseAggregateCommand - or(val: any): DatabaseAggregateCommand - pow(val: any): DatabaseAggregateCommand - push(val: any): DatabaseAggregateCommand - range(val: any): DatabaseAggregateCommand - reduce(val: any): DatabaseAggregateCommand - reverseArray(val: any): DatabaseAggregateCommand - rtrim(val: any): DatabaseAggregateCommand - second(val: any): DatabaseAggregateCommand - setDifference(val: any): DatabaseAggregateCommand - setEquals(val: any): DatabaseAggregateCommand - setIntersection(val: any): DatabaseAggregateCommand - setIsSubset(val: any): DatabaseAggregateCommand - setUnion(val: any): DatabaseAggregateCommand - size(val: any): DatabaseAggregateCommand - slice(val: any): DatabaseAggregateCommand - split(val: any): DatabaseAggregateCommand - sqrt(val: any): DatabaseAggregateCommand - stdDevPop(val: any): DatabaseAggregateCommand - stdDevSamp(val: any): DatabaseAggregateCommand - strcasecmp(val: any): DatabaseAggregateCommand - strLenBytes(val: any): DatabaseAggregateCommand - strLenCP(val: any): DatabaseAggregateCommand - substr(val: any): DatabaseAggregateCommand - substrBytes(val: any): DatabaseAggregateCommand - substrCP(val: any): DatabaseAggregateCommand - subtract(val: any): DatabaseAggregateCommand - sum(val: any): DatabaseAggregateCommand - switch(val: any): DatabaseAggregateCommand - toBool(val: any): DatabaseAggregateCommand - toDate(val: any): DatabaseAggregateCommand - toDecimal(val: any): DatabaseAggregateCommand - toDouble(val: any): DatabaseAggregateCommand - toInt(val: any): DatabaseAggregateCommand - toLong(val: any): DatabaseAggregateCommand - toObjectId(val: any): DatabaseAggregateCommand - toString(val: any): DatabaseAggregateCommand - toLower(val: any): DatabaseAggregateCommand - toUpper(val: any): DatabaseAggregateCommand - trim(val: any): DatabaseAggregateCommand - trunc(val: any): DatabaseAggregateCommand - type(val: any): DatabaseAggregateCommand - week(val: any): DatabaseAggregateCommand - year(val: any): DatabaseAggregateCommand - zip(val: any): DatabaseAggregateCommand - } - } - - class DatabaseAggregateCommand {} - - enum LOGIC_COMMANDS_LITERAL { - AND = 'and', - OR = 'or', - NOT = 'not', - NOR = 'nor' - } - - class DatabaseLogicCommand { - and(...expressions: DatabaseLogicCommand[]): DatabaseLogicCommand - or(...expressions: DatabaseLogicCommand[]): DatabaseLogicCommand - nor(...expressions: DatabaseLogicCommand[]): DatabaseLogicCommand - not(expression: DatabaseLogicCommand): DatabaseLogicCommand - } - - enum QUERY_COMMANDS_LITERAL { - // comparison - EQ = 'eq', - NEQ = 'neq', - GT = 'gt', - GTE = 'gte', - LT = 'lt', - LTE = 'lte', - IN = 'in', - NIN = 'nin', - // geo - GEO_NEAR = 'geoNear', - GEO_WITHIN = 'geoWithin', - GEO_INTERSECTS = 'geoIntersects', - // element - EXISTS = 'exists', - // evaluation - MOD = 'mod', - // array - ALL = 'all', - ELEM_MATCH = 'elemMatch', - SIZE = 'size' - } - - class DatabaseQueryCommand extends DatabaseLogicCommand { - eq(val: any): DatabaseLogicCommand - neq(val: any): DatabaseLogicCommand - gt(val: any): DatabaseLogicCommand - gte(val: any): DatabaseLogicCommand - lt(val: any): DatabaseLogicCommand - lte(val: any): DatabaseLogicCommand - in(val: any[]): DatabaseLogicCommand - nin(val: any[]): DatabaseLogicCommand - - exists(val: boolean): DatabaseLogicCommand - - mod(divisor: number, remainder: number): DatabaseLogicCommand - - all(val: any[]): DatabaseLogicCommand - elemMatch(val: any): DatabaseLogicCommand - size(val: number): DatabaseLogicCommand - - geoNear(options: IGeoNearCommandOptions): DatabaseLogicCommand - geoWithin(options: IGeoWithinCommandOptions): DatabaseLogicCommand - geoIntersects( - options: IGeoIntersectsCommandOptions - ): DatabaseLogicCommand - } - - enum PROJECTION_COMMANDS_LITERAL { - SLICE = 'slice' - } - - class DatabaseProjectionCommand {} - - enum UPDATE_COMMANDS_LITERAL { - // field - SET = 'set', - REMOVE = 'remove', - INC = 'inc', - MUL = 'mul', - MIN = 'min', - MAX = 'max', - RENAME = 'rename', - // bitwise - BIT = 'bit', - // array - PUSH = 'push', - POP = 'pop', - SHIFT = 'shift', - UNSHIFT = 'unshift', - ADD_TO_SET = 'addToSet', - PULL = 'pull', - PULL_ALL = 'pullAll' - } - - class DatabaseUpdateCommand {} - - class Batch {} - - /** - * A contract that all API provider must adhere to - */ - class APIBaseContract< - PromiseReturn, - CallbackReturn, - Param extends IAPIParam, - Context = any - > { - getContext(param: Param): Context - - /** - * In case of callback-style invocation, this function will be called - */ - getCallbackReturn(param: Param, context: Context): CallbackReturn - - getFinalParam<T extends Param>(param: Param, context: Context): T - - run<T extends Param>(param: T): Promise<PromiseReturn> - } - - interface IGeoPointConstructor { - new (longitude: number, latitide: number): GeoPoint - new (geojson: IGeoJSONPoint): GeoPoint - (longitude: number, latitide: number): GeoPoint - (geojson: IGeoJSONPoint): GeoPoint - } - - interface IGeoMultiPointConstructor { - new (points: GeoPoint[] | IGeoJSONMultiPoint): GeoMultiPoint - (points: GeoPoint[] | IGeoJSONMultiPoint): GeoMultiPoint - } - - interface IGeoLineStringConstructor { - new (points: GeoPoint[] | IGeoJSONLineString): GeoLineString - (points: GeoPoint[] | IGeoJSONLineString): GeoLineString - } - - interface IGeoMultiLineStringConstructor { - new ( - lineStrings: GeoLineString[] | IGeoJSONMultiLineString - ): GeoMultiLineString - ( - lineStrings: GeoLineString[] | IGeoJSONMultiLineString - ): GeoMultiLineString - } - - interface IGeoPolygonConstructor { - new (lineStrings: GeoLineString[] | IGeoJSONPolygon): GeoPolygon - (lineStrings: GeoLineString[] | IGeoJSONPolygon): GeoPolygon - } - - interface IGeoMultiPolygonConstructor { - new (polygons: GeoPolygon[] | IGeoJSONMultiPolygon): GeoMultiPolygon - (polygons: GeoPolygon[] | IGeoJSONMultiPolygon): GeoMultiPolygon - } - - interface IGeo { - Point: IGeoPointConstructor - MultiPoint: IGeoMultiPointConstructor - LineString: IGeoLineStringConstructor - MultiLineString: IGeoMultiLineStringConstructor - Polygon: IGeoPolygonConstructor - MultiPolygon: IGeoMultiPolygonConstructor - } - - interface IGeoJSONPoint { - type: 'Point' - coordinates: [number, number] - } - - interface IGeoJSONMultiPoint { - type: 'MultiPoint' - coordinates: Array<[number, number]> - } - - interface IGeoJSONLineString { - type: 'LineString' - coordinates: Array<[number, number]> - } - - interface IGeoJSONMultiLineString { - type: 'MultiLineString' - coordinates: Array<Array<[number, number]>> - } - - interface IGeoJSONPolygon { - type: 'Polygon' - coordinates: Array<Array<[number, number]>> - } - - interface IGeoJSONMultiPolygon { - type: 'MultiPolygon' - coordinates: Array<Array<Array<[number, number]>>> - } - - type IGeoJSONObject = - | IGeoJSONPoint - | IGeoJSONMultiPoint - | IGeoJSONLineString - | IGeoJSONMultiLineString - | IGeoJSONPolygon - | IGeoJSONMultiPolygon - - abstract class GeoPoint { - longitude: number - latitude: number - - constructor(longitude: number, latitude: number) - - toJSON(): Record<string, any> - toString(): string - } - - abstract class GeoMultiPoint { - points: GeoPoint[] - - constructor(points: GeoPoint[]) - - toJSON(): IGeoJSONMultiPoint - toString(): string - } - - abstract class GeoLineString { - points: GeoPoint[] - - constructor(points: GeoPoint[]) - - toJSON(): IGeoJSONLineString - toString(): string - } - - abstract class GeoMultiLineString { - lines: GeoLineString[] - - constructor(lines: GeoLineString[]) - - toJSON(): IGeoJSONMultiLineString - toString(): string - } - - abstract class GeoPolygon { - lines: GeoLineString[] - - constructor(lines: GeoLineString[]) - - toJSON(): IGeoJSONPolygon - toString(): string - } - - abstract class GeoMultiPolygon { - polygons: GeoPolygon[] - - constructor(polygons: GeoPolygon[]) - - toJSON(): IGeoJSONMultiPolygon - toString(): string - } - - type GeoInstance = - | GeoPoint - | GeoMultiPoint - | GeoLineString - | GeoMultiLineString - | GeoPolygon - | GeoMultiPolygon - - interface IGeoNearCommandOptions { - geometry: GeoPoint - maxDistance?: number - minDistance?: number - } - - interface IGeoWithinCommandOptions { - geometry: GeoPolygon | GeoMultiPolygon - } - - interface IGeoIntersectsCommandOptions { - geometry: - | GeoPoint - | GeoMultiPoint - | GeoLineString - | GeoMultiLineString - | GeoPolygon - | GeoMultiPolygon - } - - interface IServerDateOptions { - offset: number - } - - abstract class ServerDate { - readonly options: IServerDateOptions - constructor(options?: IServerDateOptions) - } - - interface IRegExpOptions { - regexp: string - options?: string - } - - interface IRegExpConstructor { - new (options: IRegExpOptions): RegExp - (options: IRegExpOptions): RegExp - } - - abstract class RegExp { - readonly regexp: string - readonly options: string - constructor(options: IRegExpOptions) - } - - type DocumentId = string | number - - interface IDocumentData { - _id?: DocumentId - [key: string]: any - } - - type IDBAPIParam = IAPIParam - - interface IAddDocumentOptions extends IDBAPIParam { - data: IDocumentData - } - - type IGetDocumentOptions = IDBAPIParam - - type ICountDocumentOptions = IDBAPIParam - - interface IUpdateDocumentOptions extends IDBAPIParam { - data: IUpdateCondition - } - - interface IUpdateSingleDocumentOptions extends IDBAPIParam { - data: IUpdateCondition - } - - interface ISetDocumentOptions extends IDBAPIParam { - data: IUpdateCondition - } - - interface ISetSingleDocumentOptions extends IDBAPIParam { - data: IUpdateCondition - } - - interface IRemoveDocumentOptions extends IDBAPIParam { - query: IQueryCondition - } - - type IRemoveSingleDocumentOptions = IDBAPIParam - - interface IWatchOptions { - // server realtime data init & change event - onChange: (snapshot: ISnapshot) => void - // error while connecting / listening - onError: (error: any) => void - } - - interface ISnapshot { - id: number - docChanges: ISingleDBEvent[] - docs: Record<string, any> - type?: SnapshotType - } - - type SnapshotType = 'init' - - interface ISingleDBEvent { - id: number - dataType: DataType - queueType: QueueType - docId: string - doc: Record<string, any> - updatedFields?: Record<string, any> - removedFields?: string[] - } - - type DataType = 'init' | 'update' | 'replace' | 'add' | 'remove' | 'limit' - - type QueueType = 'init' | 'enqueue' | 'dequeue' | 'update' - - interface IQueryCondition { - [key: string]: any - } - - type IStringQueryCondition = string - - interface IQueryResult extends IAPISuccessParam { - data: IDocumentData[] - } - - interface IQuerySingleResult extends IAPISuccessParam { - data: IDocumentData - } - - interface IUpdateCondition { - [key: string]: any - } - - type IStringUpdateCondition = string - - interface IAddResult extends IAPISuccessParam { - _id: DocumentId - } - - interface IUpdateResult extends IAPISuccessParam { - stats: { - updated: number - // created: number, - } - } - - interface ISetResult extends IAPISuccessParam { - _id: DocumentId - stats: { - updated: number - created: number - } - } - - interface IRemoveResult extends IAPISuccessParam { - stats: { - removed: number - } - } - - interface ICountResult extends IAPISuccessParam { - total: number - } -} - -type Optional<T> = { [K in keyof T]+?: T[K] } - -type OQ< - T extends Optional< - Record<'complete' | 'success' | 'fail', (...args: any[]) => any> - > -> = - | (RQ<T> & Required<Pick<T, 'success'>>) - | (RQ<T> & Required<Pick<T, 'fail'>>) - | (RQ<T> & Required<Pick<T, 'complete'>>) - | (RQ<T> & Required<Pick<T, 'success' | 'fail'>>) - | (RQ<T> & Required<Pick<T, 'success' | 'complete'>>) - | (RQ<T> & Required<Pick<T, 'fail' | 'complete'>>) - | (RQ<T> & Required<Pick<T, 'fail' | 'complete' | 'success'>>) - -type RQ< - T extends Optional< - Record<'complete' | 'success' | 'fail', (...args: any[]) => any> - > -> = Pick<T, Exclude<keyof T, 'complete' | 'success' | 'fail'>> diff --git a/typings/types/wx/lib.wx.component.d.ts b/typings/types/wx/lib.wx.component.d.ts deleted file mode 100644 index 3753624..0000000 --- a/typings/types/wx/lib.wx.component.d.ts +++ /dev/null @@ -1,771 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) 2024 Tencent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -***************************************************************************** */ - -declare namespace WechatMiniprogram.Component { - type FilterUnknownType<T> = string extends keyof T ? {} : T - type Instance< - TData extends DataOption, - TProperty extends PropertyOption, - TMethod extends Partial<MethodOption>, - TBehavior extends BehaviorOption, - TCustomInstanceProperty extends IAnyObject = {}, - TIsPage extends boolean = false - > = InstanceProperties & - InstanceMethods<TData> & - TMethod & - MixinMethods<TBehavior> & - (TIsPage extends true ? Page.ILifetime : {}) & - Omit<TCustomInstanceProperty, 'properties' | 'methods' | 'data'> & { - /** 组件数据,**包括内部数据和属性值** */ - data: FilterUnknownType<TData> & MixinData<TBehavior> & - MixinProperties<TBehavior> & PropertyOptionToData<FilterUnknownType<TProperty>> - /** 组件数据,**包括内部数据和属性值**(与 `data` 一致) */ - properties: FilterUnknownType<TData> & MixinData<TBehavior> & - MixinProperties<TBehavior> & PropertyOptionToData<FilterUnknownType<TProperty>> - } - - type IEmptyArray = [] - type TrivialInstance = Instance< - IAnyObject, - IAnyObject, - IAnyObject, - IEmptyArray, - IAnyObject - > - type TrivialOption = Options<IAnyObject, IAnyObject, IAnyObject, IEmptyArray, IAnyObject> - type Options< - TData extends DataOption, - TProperty extends PropertyOption, - TMethod extends MethodOption, - TBehavior extends BehaviorOption, - TCustomInstanceProperty extends IAnyObject = {}, - TIsPage extends boolean = false - > = Partial<Data<TData>> & - Partial<Property<TProperty>> & - Partial<Method<TMethod, TIsPage>> & - Partial<Behavior<TBehavior>> & - Partial<OtherOption> & - Partial<Lifetimes> & - ThisType< - Instance< - TData, - TProperty, - TMethod, - TBehavior, - TCustomInstanceProperty, - TIsPage - > - > - interface Constructor { - < - TData extends DataOption, - TProperty extends PropertyOption, - TMethod extends MethodOption, - TBehavior extends BehaviorOption, - TCustomInstanceProperty extends IAnyObject = {}, - TIsPage extends boolean = false - >( - options: Options< - TData, - TProperty, - TMethod, - TBehavior, - TCustomInstanceProperty, - TIsPage - > - ): string - } - type DataOption = Record<string, any> - type PropertyOption = Record<string, AllProperty> - type MethodOption = Record<string, Function> - - type BehaviorOption = Behavior.BehaviorIdentifier[] - type ExtractBehaviorType<T> = T extends { BehaviorType?: infer B } ? B : never - type ExtractData<T> = T extends { data: infer D } ? D : never - type ExtractProperties<T, TIsBehavior extends boolean = false> = T extends { properties: infer P } ? - TIsBehavior extends true ? P : PropertyOptionToData<P extends PropertyOption ? P : {}> : never - type ExtractMethods<T> = T extends { methods: infer M } ? M : never - type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never - type MixinData<T extends any[]> = UnionToIntersection<ExtractData<ExtractBehaviorType<T[number]>>> - type MixinProperties<T extends any[], TIsBehavior extends boolean = false> = UnionToIntersection<ExtractProperties<ExtractBehaviorType<T[number]>, TIsBehavior>> - type MixinMethods<T extends any[]> = UnionToIntersection<ExtractMethods<ExtractBehaviorType<T[number]>>> - - interface Behavior<B extends BehaviorOption> { - /** 类似于mixins和traits的组件间代码复用机制,参见 [behaviors](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/behaviors.html) */ - behaviors?: B - } - - interface Data<D extends DataOption> { - /** 组件的内部数据,和 `properties` 一同用于组件的模板渲染 */ - data?: D - } - interface Property<P extends PropertyOption> { - /** 组件的对外属性,是属性名到属性设置的映射表 */ - properties: P - } - interface Method<M extends MethodOption, TIsPage extends boolean = false> { - /** 组件的方法,包括事件响应函数和任意的自定义方法,关于事件响应函数的使用,参见 [组件间通信与事件](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html) */ - methods: M & (TIsPage extends true ? Partial<Page.ILifetime> : {}) - } - type PropertyType = - | StringConstructor - | NumberConstructor - | BooleanConstructor - | ArrayConstructor - | ObjectConstructor - | null - type ValueType<T extends PropertyType> = T extends null - ? any - : T extends StringConstructor - ? string - : T extends NumberConstructor - ? number - : T extends BooleanConstructor - ? boolean - : T extends ArrayConstructor - ? any[] - : T extends ObjectConstructor - ? IAnyObject - : never - type FullProperty<T extends PropertyType> = { - /** 属性类型 */ - type: T - /** 属性初始值 */ - value?: ValueType<T> - /** 属性值被更改时的响应函数 */ - observer?: - | string - | (( - newVal: ValueType<T>, - oldVal: ValueType<T>, - changedPath: Array<string | number> - ) => void) - /** 属性的类型(可以指定多个) */ - optionalTypes?: ShortProperty[] - } - type AllFullProperty = - | FullProperty<StringConstructor> - | FullProperty<NumberConstructor> - | FullProperty<BooleanConstructor> - | FullProperty<ArrayConstructor> - | FullProperty<ObjectConstructor> - | FullProperty<null> - type ShortProperty = - | StringConstructor - | NumberConstructor - | BooleanConstructor - | ArrayConstructor - | ObjectConstructor - | null - type AllProperty = AllFullProperty | ShortProperty - type PropertyToData<T extends AllProperty> = T extends ShortProperty - ? ValueType<T> - : FullPropertyToData<Exclude<T, ShortProperty>> - type ArrayOrObject = ArrayConstructor | ObjectConstructor - type FullPropertyToData<T extends AllFullProperty> = T['type'] extends ArrayOrObject ? unknown extends T['value'] ? ValueType<T['type']> : T['value'] : ValueType<T['type']> - type PropertyOptionToData<P extends PropertyOption> = { - [name in keyof P]: PropertyToData<P[name]> - } - - interface Router { - switchTab: Wx['switchTab'] - reLaunch: Wx['reLaunch'] - redirectTo: Wx['redirectTo'] - navigateTo: Wx['navigateTo'] - navigateBack: Wx['navigateBack'] - } - - interface InstanceProperties { - /** 组件的文件路径 */ - is: string - /** 节点id */ - id: string - /** 节点dataset */ - dataset: Record<string, string> - /** 上一次退出前 onSaveExitState 保存的数据 */ - exitState: any - /** 相对于当前自定义组件的 Router 对象 */ - router: Router - /** 相对于当前自定义组件所在页面的 Router 对象 */ - pageRouter: Router - /** 渲染当前组件的渲染后端 */ - renderer: 'webview' | 'skyline' - } - - interface InstanceMethods<D extends DataOption> { - /** `setData` 函数用于将数据从逻辑层发送到视图层 - *(异步),同时改变对应的 `this.data` 的值(同步)。 - * - * **注意:** - * - * 1. **直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致**。 - * 1. 仅支持设置可 JSON 化的数据。 - * 1. 单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。 - * 1. 请不要把 data 中任何一项的 value 设为 `undefined` ,否则这一项将不被设置并可能遗留一些潜在问题。 - */ - setData( - /** 这次要改变的数据 - * - * 以 `key: value` 的形式表示,将 `this.data` 中的 `key` 对应的值改变成 `value`。 - * - * 其中 `key` 可以以数据路径的形式给出,支持改变数组中的某一项或对象的某个属性,如 `array[2].message`,`a.b.c.d`,并且不需要在 this.data 中预先定义。 - */ - data: Partial<D> & IAnyObject, - /** setData引起的界面更新渲染完毕后的回调函数,最低基础库: `1.5.0` */ - callback?: () => void - ): void - - /** 检查组件是否具有 `behavior` (检查时会递归检查被直接或间接引入的所有behavior) */ - hasBehavior(behavior: Behavior.BehaviorIdentifier): void - /** 触发事件,参见组件事件 */ - triggerEvent<DetailType = any>( - name: string, - detail?: DetailType, - options?: TriggerEventOption - ): void - /** 创建一个 SelectorQuery 对象,选择器选取范围为这个组件实例内 */ - createSelectorQuery(): SelectorQuery - /** 创建一个 IntersectionObserver 对象,选择器选取范围为这个组件实例内 */ - createIntersectionObserver( - options: CreateIntersectionObserverOption - ): IntersectionObserver - /** 创建一个 MediaQueryObserver 对象 */ - createMediaQueryObserver(): MediaQueryObserver - /** 使用选择器选择组件实例节点,返回匹配到的第一个组件实例对象(会被 `wx://component-export` 影响) */ - selectComponent(selector: string): TrivialInstance - /** 使用选择器选择组件实例节点,返回匹配到的全部组件实例对象组成的数组 */ - selectAllComponents(selector: string): TrivialInstance[] - /** - * 选取当前组件节点所在的组件实例(即组件的引用者),返回它的组件实例对象(会被 `wx://component-export` 影响) - * - * 最低基础库版本:[`2.8.2`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - **/ - selectOwnerComponent(): TrivialInstance - /** 获取这个关系所对应的所有关联节点,参见 组件间关系 */ - getRelationNodes(relationKey: string): TrivialInstance[] - /** - * 立刻执行 callback ,其中的多个 setData 之间不会触发界面绘制(只有某些特殊场景中需要,如用于在不同组件同时 setData 时进行界面绘制同步) - * - * 最低基础库版本:[`2.4.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - **/ - groupSetData(callback?: () => void): void - /** - * 返回当前页面的 custom-tab-bar 的组件实例 - * - * 最低基础库版本:[`2.6.2`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - **/ - getTabBar(): TrivialInstance - /** - * 返回页面标识符(一个字符串),可以用来判断几个自定义组件实例是不是在同一个页面内 - * - * 最低基础库版本:[`2.7.1`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - **/ - getPageId(): string - /** - * 执行关键帧动画,详见[动画](https://developers.weixin.qq.com/miniprogram/dev/framework/view/animation.html) - * - * 最低基础库版本:[`2.9.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - **/ - animate( - selector: string, - keyFrames: KeyFrame[], - duration: number, - callback?: () => void - ): void - /** - * 执行关键帧动画,详见[动画](https://developers.weixin.qq.com/miniprogram/dev/framework/view/animation.html) - * - * 最低基础库版本:[`2.9.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - **/ - animate( - selector: string, - keyFrames: ScrollTimelineKeyframe[], - duration: number, - scrollTimeline: ScrollTimelineOption - ): void - /** - * 清除关键帧动画,详见[动画](https://developers.weixin.qq.com/miniprogram/dev/framework/view/animation.html) - * - * 最低基础库版本:[`2.9.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - **/ - clearAnimation(selector: string, callback: () => void): void - /** - * 清除关键帧动画,详见[动画](https://developers.weixin.qq.com/miniprogram/dev/framework/view/animation.html) - * - * 最低基础库版本:[`2.9.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - **/ - clearAnimation( - selector: string, - options?: ClearAnimationOptions, - callback?: () => void - ): void - /** - * 当从另一页面跳转到该页面时,获得与来源页面实例通信当事件通道,详见 [wx.navigateTo]((wx.navigateTo)) - * - * 最低基础库版本:[`2.7.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - getOpenerEventChannel(): EventChannel - /** - * 绑定由 worklet 驱动的样式到相应的节点,详见 [worklet 动画](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/skyline/worklet.html) - * - * 最低基础库版本:[`2.29.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - applyAnimatedStyle( - selector: string, - updater: () => Record<string, string>, - userConfig?: { immediate: boolean, flush: 'sync' | 'async' }, - callback?: (res: { styleId: number }) => void - ): void - /** - * 清除节点上 worklet 驱动样式的绑定关系 - * - * 最低基础库版本:[`2.30.1`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - clearAnimatedStyle( - selector: string, - styleIds: number[], - callback?: () => void - ): void - /** - * 获取更新性能统计信息,详见 [获取更新性能统计信息]((custom-component/update-perf-stat)) - * - * - * 最低基础库版本:[`2.12.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - setUpdatePerformanceListener<WithDataPath extends boolean = false>( - options: SetUpdatePerformanceListenerOption<WithDataPath>, - callback?: UpdatePerformanceListener<WithDataPath> - ): void - - /** - * 在运行时获取页面或组件所在页面 `touch` 相关事件的 passive 配置,详见 [enablePassiveEvent]((configuration/app#enablePassiveEvent)) - * - * 最低基础库版本:[`2.25.1`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - getPassiveEvent(callback: (config: PassiveConfig) => void): void - /** - * 在运行时切换页面或组件所在页面 `touch` 相关事件的 passive 配置,详见 [enablePassiveEvent]((configuration/app#enablePassiveEvent)) - * - * 最低基础库版本:[`2.25.1`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - setPassiveEvent(config: PassiveConfig): void - } - - interface ComponentOptions { - /** - * [启用多slot支持](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html#组件wxml的slot) - */ - multipleSlots?: boolean - /** - * [组件样式隔离](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html#组件样式隔离) - */ - addGlobalClass?: boolean - /** - * [组件样式隔离](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html#组件样式隔离) - */ - styleIsolation?: - | 'isolated' - | 'apply-shared' - | 'shared' - | 'page-isolated' - | 'page-apply-shared' - | 'page-shared' - /** - * [纯数据字段](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/pure-data.html) 是一些不用于界面渲染的 data 字段,可以用于提升页面更新性能。从小程序基础库版本 2.8.2 开始支持。 - */ - pureDataPattern?: RegExp - /** - * [虚拟化组件节点](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html#%E8%99%9A%E6%8B%9F%E5%8C%96%E7%BB%84%E4%BB%B6%E8%8A%82%E7%82%B9) 使自定义组件内部的第一层节点由自定义组件本身完全决定。从小程序基础库版本 [`2.11.2`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 开始支持 */ - virtualHost?: boolean - } - - interface TriggerEventOption { - /** 事件是否冒泡 - * - * 默认值: `false` - */ - bubbles?: boolean - /** 事件是否可以穿越组件边界,为false时,事件将只能在引用组件的节点树上触发,不进入其他任何组件内部 - * - * 默认值: `false` - */ - composed?: boolean - /** 事件是否拥有捕获阶段 - * - * 默认值: `false` - */ - capturePhase?: boolean - } - - interface RelationOption { - /** 目标组件的相对关系 */ - type: 'parent' | 'child' | 'ancestor' | 'descendant' - /** 关系生命周期函数,当关系被建立在页面节点树中时触发,触发时机在组件attached生命周期之后 */ - linked?(target: TrivialInstance): void - /** 关系生命周期函数,当关系在页面节点树中发生改变时触发,触发时机在组件moved生命周期之后 */ - linkChanged?(target: TrivialInstance): void - /** 关系生命周期函数,当关系脱离页面节点树时触发,触发时机在组件detached生命周期之后 */ - unlinked?(target: TrivialInstance): void - /** 如果这一项被设置,则它表示关联的目标节点所应具有的behavior,所有拥有这一behavior的组件节点都会被关联 */ - target?: string - } - - interface PageLifetimes { - /** 页面生命周期回调—监听页面显示 - * - * 页面显示/切入前台时触发。 - */ - show(): void - /** 页面生命周期回调—监听页面隐藏 - * - * 页面隐藏/切入后台时触发。 如 `navigateTo` 或底部 `tab` 切换到其他页面,小程序切入后台等。 - */ - hide(): void - /** 页面生命周期回调—监听页面尺寸变化 - * - * 所在页面尺寸变化时执行 - */ - resize(size: Page.IResizeOption): void - /** 页面生命周期回调—监听页面路由动画完成 - * - * 所在页面路由动画完成时执行 - */ - routeDone(): void - } - - type DefinitionFilter = <T extends TrivialOption>( - /** 使用该 behavior 的 component/behavior 的定义对象 */ - defFields: T, - /** 该 behavior 所使用的 behavior 的 definitionFilter 函数列表 */ - definitionFilterArr?: DefinitionFilter[] - ) => void - - interface Lifetimes { - /** 组件生命周期声明对象,组件的生命周期:`created`、`attached`、`ready`、`moved`、`detached` 将收归到 `lifetimes` 字段内进行声明,原有声明方式仍旧有效,如同时存在两种声明方式,则 `lifetimes` 字段内声明方式优先级最高 - * - * 最低基础库: `2.2.3` */ - lifetimes: Partial<{ - /** - * 在组件实例刚刚被创建时执行,注意此时不能调用 `setData` - * - * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - created(): void - /** - * 在组件实例进入页面节点树时执行 - * - * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - attached(): void - /** - * 在组件在视图层布局完成后执行 - * - * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - ready(): void - /** - * 在组件实例被移动到节点树另一个位置时执行 - * - * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - moved(): void - /** - * 在组件实例被从页面节点树移除时执行 - * - * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - detached(): void - /** - * 每当组件方法抛出错误时执行 - * - * 最低基础库版本:[`2.4.1`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - error(err: Error): void - }> - /** - * @deprecated 旧式的定义方式,基础库 `2.2.3` 起请在 lifetimes 中定义 - * - * 在组件实例刚刚被创建时执行 - * - * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - created(): void - /** - * @deprecated 旧式的定义方式,基础库 `2.2.3` 起请在 lifetimes 中定义 - * - * 在组件实例进入页面节点树时执行 - * - * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - attached(): void - /** - * @deprecated 旧式的定义方式,基础库 `2.2.3` 起请在 lifetimes 中定义 - * - * 在组件在视图层布局完成后执行 - * - * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - ready(): void - /** - * @deprecated 旧式的定义方式,基础库 `2.2.3` 起请在 lifetimes 中定义 - * - * 在组件实例被移动到节点树另一个位置时执行 - * - * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - moved(): void - /** - * @deprecated 旧式的定义方式,基础库 `2.2.3` 起请在 lifetimes 中定义 - * - * 在组件实例被从页面节点树移除时执行 - * - * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - detached(): void - /** - * @deprecated 旧式的定义方式,基础库 `2.2.3` 起请在 lifetimes 中定义 - * - * 每当组件方法抛出错误时执行 - * - * 最低基础库版本:[`2.4.1`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - error(err: Error): void - } - - interface OtherOption { - /** - * 组件数据字段监听器,用于监听 properties 和 data 的变化,参见 [数据监听器](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/observer.html) - * - * 最低基础库版本:[`2.6.1`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) - */ - observers: Record<string, (...args: any[]) => any> - /** 组件间关系定义,参见 [组件间关系](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/lifetimes.html) */ - relations: { - [componentName: string]: RelationOption - } - /** 组件接受的外部样式类,参见 [外部样式类](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html) */ - externalClasses?: string[] - /** 组件所在页面的生命周期声明对象,参见 [组件生命周期](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/lifetimes.html) - * - * 最低基础库版本: [`2.2.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) */ - pageLifetimes?: Partial<PageLifetimes> - /** 一些选项(文档中介绍相关特性时会涉及具体的选项设置,这里暂不列举) */ - options: ComponentOptions - - /** 定义段过滤器,用于自定义组件扩展,参见 [自定义组件扩展](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/extend.html) - * - * 最低基础库版本: [`2.2.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) */ - definitionFilter?: DefinitionFilter - /** - * 组件自定义导出,当使用 `behavior: wx://component-export` 时,这个定义段可以用于指定组件被 selectComponent 调用时的返回值,参见 [组件间通信与事件](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html) - * 最低基础库版本: [`2.2.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) */ - export: () => IAnyObject - } - - interface KeyFrame { - /** 关键帧的偏移,范围[0-1] */ - offset?: number - /** 动画缓动函数 */ - ease?: string - /** 基点位置,即 CSS transform-origin */ - transformOrigin?: string - /** 背景颜色,即 CSS background-color */ - backgroundColor?: string - /** 底边位置,即 CSS bottom */ - bottom?: number | string - /** 高度,即 CSS height */ - height?: number | string - /** 左边位置,即 CSS left */ - left?: number | string - /** 宽度,即 CSS width */ - width?: number | string - /** 不透明度,即 CSS opacity */ - opacity?: number | string - /** 右边位置,即 CSS right */ - right?: number | string - /** 顶边位置,即 CSS top */ - top?: number | string - /** 变换矩阵,即 CSS transform matrix */ - matrix?: number[] - /** 三维变换矩阵,即 CSS transform matrix3d */ - matrix3d?: number[] - /** 旋转,即 CSS transform rotate */ - rotate?: number - /** 三维旋转,即 CSS transform rotate3d */ - rotate3d?: number[] - /** X 方向旋转,即 CSS transform rotateX */ - rotateX?: number - /** Y 方向旋转,即 CSS transform rotateY */ - rotateY?: number - /** Z 方向旋转,即 CSS transform rotateZ */ - rotateZ?: number - /** 缩放,即 CSS transform scale */ - scale?: number[] - /** 三维缩放,即 CSS transform scale3d */ - scale3d?: number[] - /** X 方向缩放,即 CSS transform scaleX */ - scaleX?: number - /** Y 方向缩放,即 CSS transform scaleY */ - scaleY?: number - /** Z 方向缩放,即 CSS transform scaleZ */ - scaleZ?: number - /** 倾斜,即 CSS transform skew */ - skew?: number[] - /** X 方向倾斜,即 CSS transform skewX */ - skewX?: number - /** Y 方向倾斜,即 CSS transform skewY */ - skewY?: number - /** 位移,即 CSS transform translate */ - translate?: Array<number | string> - /** 三维位移,即 CSS transform translate3d */ - translate3d?: Array<number | string> - /** X 方向位移,即 CSS transform translateX */ - translateX?: number | string - /** Y 方向位移,即 CSS transform translateY */ - translateY?: number | string - /** Z 方向位移,即 CSS transform translateZ */ - translateZ?: number | string - } - interface ClearAnimationOptions { - /** 基点位置,即 CSS transform-origin */ - transformOrigin?: boolean - /** 背景颜色,即 CSS background-color */ - backgroundColor?: boolean - /** 底边位置,即 CSS bottom */ - bottom?: boolean - /** 高度,即 CSS height */ - height?: boolean - /** 左边位置,即 CSS left */ - left?: boolean - /** 宽度,即 CSS width */ - width?: boolean - /** 不透明度,即 CSS opacity */ - opacity?: boolean - /** 右边位置,即 CSS right */ - right?: boolean - /** 顶边位置,即 CSS top */ - top?: boolean - /** 变换矩阵,即 CSS transform matrix */ - matrix?: boolean - /** 三维变换矩阵,即 CSS transform matrix3d */ - matrix3d?: boolean - /** 旋转,即 CSS transform rotate */ - rotate?: boolean - /** 三维旋转,即 CSS transform rotate3d */ - rotate3d?: boolean - /** X 方向旋转,即 CSS transform rotateX */ - rotateX?: boolean - /** Y 方向旋转,即 CSS transform rotateY */ - rotateY?: boolean - /** Z 方向旋转,即 CSS transform rotateZ */ - rotateZ?: boolean - /** 缩放,即 CSS transform scale */ - scale?: boolean - /** 三维缩放,即 CSS transform scale3d */ - scale3d?: boolean - /** X 方向缩放,即 CSS transform scaleX */ - scaleX?: boolean - /** Y 方向缩放,即 CSS transform scaleY */ - scaleY?: boolean - /** Z 方向缩放,即 CSS transform scaleZ */ - scaleZ?: boolean - /** 倾斜,即 CSS transform skew */ - skew?: boolean - /** X 方向倾斜,即 CSS transform skewX */ - skewX?: boolean - /** Y 方向倾斜,即 CSS transform skewY */ - skewY?: boolean - /** 位移,即 CSS transform translate */ - translate?: boolean - /** 三维位移,即 CSS transform translate3d */ - translate3d?: boolean - /** X 方向位移,即 CSS transform translateX */ - translateX?: boolean - /** Y 方向位移,即 CSS transform translateY */ - translateY?: boolean - /** Z 方向位移,即 CSS transform translateZ */ - translateZ?: boolean - } - interface ScrollTimelineKeyframe { - composite?: 'replace' | 'add' | 'accumulate' | 'auto' - easing?: string - offset?: number | null - [property: string]: string | number | null | undefined - } - interface ScrollTimelineOption { - /** 指定滚动元素的选择器(只支持 scroll-view),该元素滚动时会驱动动画的进度 */ - scrollSource: string - /** 指定滚动的方向。有效值为 horizontal 或 vertical */ - orientation?: string - /** 指定开始驱动动画进度的滚动偏移量,单位 px */ - startScrollOffset: number - /** 指定停止驱动动画进度的滚动偏移量,单位 px */ - endScrollOffset: number - /** 起始和结束的滚动范围映射的时间长度,该时间可用于与关键帧动画里的时间 (duration) 相匹配,单位 ms */ - timeRange: number - } - - interface SetUpdatePerformanceListenerOption<WithDataPath> { - /** 是否返回变更的 data 字段信息 */ - withDataPaths?: WithDataPath - } - interface UpdatePerformanceListener<WithDataPath> { - (res: UpdatePerformance<WithDataPath>): void - } - interface UpdatePerformance<WithDataPath> { - /** 此次更新过程的 ID */ - updateProcessId: number - /** 对于子更新,返回它所属的更新过程 ID */ - parentUpdateProcessId?: number - /** 是否是被合并更新,如果是,则 updateProcessId 表示被合并到的更新过程 ID */ - isMergedUpdate: boolean - /** 此次更新的 data 字段信息,只有 withDataPaths 设为 true 时才会返回 */ - dataPaths: WithDataPath extends true ? string[] : undefined - /** 此次更新进入等待队列时的时间戳 */ - pendingStartTimestamp: number - /** 更新运算开始时的时间戳 */ - updateStartTimestamp: number - /** 更新运算结束时的时间戳 */ - updateEndTimestamp: number - } - - type PassiveConfig = - | { - /** 是否设置 touchmove 事件为 passive,默认为 `false` */ - touchmove?: boolean - /** 是否设置 touchstart 事件为 passive,默认为 `false` */ - touchstart?: boolean - /** 是否设置 wheel 事件为 passive,默认为 `false` */ - wheel?: boolean - } - | boolean -} -/** Component构造器可用于定义组件,调用Component构造器时可以指定组件的属性、数据、方法等。 - * - * * 使用 `this.data` 可以获取内部数据和属性值,但不要直接修改它们,应使用 `setData` 修改。 - * * 生命周期函数无法在组件方法中通过 `this` 访问到。 - * * 属性名应避免以 data 开头,即不要命名成 `dataXyz` 这样的形式,因为在 WXML 中, `data-xyz=""` 会被作为节点 dataset 来处理,而不是组件属性。 - * * 在一个组件的定义和使用时,组件的属性名和 data 字段相互间都不能冲突(尽管它们位于不同的定义段中)。 - * * 从基础库 `2.0.9` 开始,对象类型的属性和 data 字段中可以包含函数类型的子字段,即可以通过对象类型的属性字段来传递函数。低于这一版本的基础库不支持这一特性。 - * * `bug` : 对于 type 为 Object 或 Array 的属性,如果通过该组件自身的 `this.setData` 来改变属性值的一个子字段,则依旧会触发属性 observer ,且 observer 接收到的 `newVal` 是变化的那个子字段的值, `oldVal` 为空, `changedPath` 包含子字段的字段名相关信息。 - */ -declare let Component: WechatMiniprogram.Component.Constructor diff --git a/typings/types/wx/lib.wx.event.d.ts b/typings/types/wx/lib.wx.event.d.ts deleted file mode 100644 index 72f852c..0000000 --- a/typings/types/wx/lib.wx.event.d.ts +++ /dev/null @@ -1,1436 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) 2024 Tencent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -***************************************************************************** */ - -declare namespace WechatMiniprogram { - interface Target<DataSet extends IAnyObject = IAnyObject> { - /** 事件组件的 id */ - id: string - /** 当前组件的类型 */ - tagName?: string - /** 事件组件上由 `data-` 开头的自定义属性组成的集合 */ - dataset: DataSet - /** 距离页面顶部的偏移量 */ - offsetTop: number - /** 距离页面左边的偏移量 */ - offsetLeft: number - } - - /** 基础事件参数 */ - interface BaseEvent< - Mark extends IAnyObject = IAnyObject, - CurrentTargetDataset extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = CurrentTargetDataset - > { - /** 事件类型 */ - type: string - /** 页面打开到触发事件所经过的毫秒数 */ - timeStamp: number - /** 事件冒泡路径上所有由 `mark:` 开头的自定义属性组成的集合 */ - mark?: Mark - /** 触发事件的源组件 */ - target: Target<TargetDataset> - /** 事件绑定的当前组件 */ - currentTarget: Target<CurrentTargetDataset> - } - - /** 自定义事件 */ - interface CustomEvent< - Detail extends IAnyObject = IAnyObject, - Mark extends IAnyObject = IAnyObject, - CurrentTargetDataset extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = CurrentTargetDataset - > extends BaseEvent<Mark, CurrentTargetDataset, TargetDataset> { - /** 额外的信息 */ - detail: Detail - } - - /** Touch 对象 */ - interface TouchDetail { - /** 距离页面可显示区域 (屏幕除去导航条) 左上角距离,横向为 X 轴 */ - clientX: number - /** 距离页面可显示区域 (屏幕除去导航条) 左上角距离,纵向为 Y 轴 */ - clientY: number - /** 触摸点的标识符 */ - identifier: number - /** 距离文档左上角的距离,文档的左上角为原点,横向为 X 轴 */ - pageX: number - /** 距离文档左上角的距离,文档的左上角为原点,纵向为 Y 轴 */ - pageY: number - } - - /** canvas Touch 对象 */ - interface TouchCanvasDetail { - /** 触摸点的标识符 */ - identifier: number - /** 距离 Canvas 左上角的距离,Canvas 的左上角为原点 ,横向为X轴 */ - x: number - /** 距离 Canvas 左上角的距离,Canvas 的左上角为原点 纵向为Y轴 */ - y: number - } - - /** 触摸事件 */ - interface Touch< - Detail extends IAnyObject = IAnyObject, - T extends TouchDetail | TouchCanvasDetail = TouchDetail, - Mark extends IAnyObject = IAnyObject, - CurrentTargetDataset extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = CurrentTargetDataset - > extends CustomEvent<Detail, Mark, CurrentTargetDataset, TargetDataset> { - /** 触摸事件,当前停留在屏幕中的触摸点信息的数组 */ - touches: T[] - /** 触摸事件,当前变化的触摸点信息的数组 */ - changedTouches: T[] - } - - /** 触摸事件响应 */ - type TouchEvent< - Detail extends IAnyObject = IAnyObject, - Mark extends IAnyObject = IAnyObject, - CurrentTargetDataset extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = CurrentTargetDataset - > = Touch<Detail, TouchDetail, Mark, CurrentTargetDataset, TargetDataset> - - /** canvas 触摸事件响应 */ - interface TouchCanvas< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > extends Touch<never, TouchCanvasDetail, Mark, never, TargetDataset> { - // canvas 中的触摸事件不可冒泡,所以没有 currentTarget。 - currentTarget: never - } - - /** - * 图片加载成功时触发 - * - * 最低基础库: 2.1.0 - */ - type CoverImageLoad< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** 图片宽度 */ - width: number - /** 图片高度 */ - height: number - }, - Mark, - TargetDataset - > - - /** - * 图片加载失败时触发 - * - * 最低基础库: 2.1.0 - */ - type CoverImageError = CustomEvent<GeneralCallbackResult> - - /** - * 拖动过程中触发的事件,event.detail = {x, y, source} - * - * 最低基础库: 1.9.90 - */ - type MovableViewChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - x: number - y: number - /** - * 产生移动的原因 - * - * - `touch` 拖动 - * - `touch-out-of-bounds` 超出移动范围 - * - `out-of-bounds` 超出移动范围后的回弹 - * - `friction` 惯性 - * - `空字符串` setData - */ - source: - | 'touch' - | 'touch-out-of-bounds' - | 'out-of-bounds' - | 'friction' - | '' - }, - Mark, - TargetDataset - > - - /** - * 缩放过程中触发的事件 - * - * event.detail = {x, y, scale} - * - * x 和 y 字段在 2.1.0 之后支持 - * - * 最低基础库: 1.9.90 - */ - type MovableViewScale< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** 最低基础库: 2.1.0 */ - x: number - /** 最低基础库: 2.1.0 */ - y: number - scale: number - }, - Mark, - TargetDataset - > - - /** - * 滑动开始事件 (同时开启 enhanced 属性后生效) - * - * detail { scrollTop, scrollLeft } - * - * 最低基础库: 2.12.0 - */ - type ScrollViewDragStart< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - scrollTop: number - scrollLeft: number - }, - Mark, - TargetDataset - > - - /** - * 滑动事件 (同时开启 enhanced 属性后生效) - * - * detail { scrollTop, scrollLeft } - * - * 最低基础库: 2.12.0 - */ - type ScrollViewDragging< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - scrollTop: number - scrollLeft: number - }, - Mark, - TargetDataset - > - - /** - * 滑动结束事件 (同时开启 enhanced 属性后生效) - * - * detail { scrollTop, scrollLeft } - * - * 最低基础库: 2.12.0 - */ - type ScrollViewDragEnd< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - scrollTop: number - scrollLeft: number - }, - Mark, - TargetDataset - > - - /** 滚动到顶部/左边时触发 */ - type ScrollViewScrollToUpper< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - direction: 'top' | 'left' - }, - Mark, - TargetDataset - > - - /** 滚动到底部/右边时触发 */ - type ScrollViewScrollToLower< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - direction: 'bottom' | 'right' - }, - Mark, - TargetDataset - > - - /** - * 滚动时触发 - * - * event.detail = {scrollLeft, scrollTop, scrollHeight, scrollWidth, deltaX, deltaY} - */ - type ScrollViewScroll< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - scrollLeft: number - scrollTop: number - scrollHeight: number - scrollWidth: number - deltaX: number - deltaY: number - }, - Mark, - TargetDataset - > - - type ScrollViewRefresherPulling< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent<never, Mark, TargetDataset> - - type ScrollViewRefresherRefresh< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent<never, Mark, TargetDataset> - - type ScrollViewRefresherRestore< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent<never, Mark, TargetDataset> - - type ScrollViewRefresherAbort< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent<never, Mark, TargetDataset> - - /** - * current 改变时会触发 change 事件 - * - * event.detail = {current, source} - * - * **Tip**: 如果在 bindchange 的事件回调函数中使用 setData 改变 current 值,则有可能导致 setData 被不停地调用,因而通常情况下请在改变 current 值前检测 source 字段来判断是否是由于用户触摸引起。 - */ - type SwiperChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - current: number - /** - * 表示导致变更的原因 - * - * - `autoplay` 自动播放导致 swiper 变化; - * - `touch` 用户划动引起 swiper 变化; - * - 其它原因将用空字符串表示。 - * - * 最低基础库: 1.4.0 - */ - source: '' | 'autoplay' | 'touch' - /** 该 swiper-item 的标识符 */ - currentItemId: string - }, - Mark, - TargetDataset - > - - /** - * swiper-item 的位置发生改变时会触发 transition 事件 - * - * event.detail = {dx: dx, dy: dy} - * - * 最低基础库: 2.4.3 - */ - type SwiperTransition< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - dx: number - dy: number - }, - Mark, - TargetDataset - > - - /** - * 动画结束时会触发 animationfinish 事件 - * - * 最低基础库: 1.9.0 - */ - type SwiperAnimationFinish< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = SwiperChange<Mark, TargetDataset> - - /** - * progress 动画完成事件 - * - * 最低基础库 2.4.1 - */ - type ProgressActiveEnd< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - curPercent: number - }, - Mark, - TargetDataset - > - - /** - * 用户点击该按钮时,会返回获取到的用户信息,回调的 detail 数据与 `wx. getUserInfo` 返回的一致,`open-type="getUserInfo"` 时有效 - * - * 最低基础库: 1.3.0 - */ - type ButtonGetUserInfo = CustomEvent< - GeneralCallbackResult & GetUserInfoSuccessCallbackResult - > - - /** - * 客服消息回调,`open-type="contact"` 时有效 - * - * 最低基础库: 1.5.0 - */ - type ButtonContact = CustomEvent<GeneralCallbackResult> - - /** - * 获取用户手机号回调,`open-type=getPhoneNumber` 时有效 - * - * 最低基础库: 1.2.0 - */ - type ButtonGetPhoneNumber = CustomEvent< - GeneralCallbackResult & - Partial<GetWeRunDataSuccessCallbackResult> & { - code: string - } - > - - /** - * 当使用开放能力时,发生错误的回调,`open-type=launchApp` 时有效 - * - * 最低基础库: 1.9.5 - */ - type ButtonError = CustomEvent<GeneralCallbackResult> - - /** - * 在打开授权设置页后回调,`open-type=openSetting` 时有效 - * - * 最低基础库: 2.0.7 - */ - type ButtonOpenSetting = CustomEvent< - GeneralCallbackResult & OpenSettingSuccessCallbackResult - > - - /** - * 打开 APP 成功的回调,`open-type=launchApp` 时有效 - * - * 最低基础库: 2.4.4 - */ - type ButtonLaunchApp = CustomEvent<GeneralCallbackResult> - - /** - * checkbox-group 中选中项发生改变时触发 change 事件 - * - * detail = { value: ['选中的checkbox 的 value 的数组'] } - */ - type CheckboxGroupChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** 选中的 checkbox 的 value 的数组 */ - value: string[] - }, - Mark, - TargetDataset - > - - /** - * 编辑器初始化完成时触发 - * - * 最低基础库: 2.7.0 - */ - type EditorReady< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent<never, Mark, TargetDataset> - - /** - * 编辑器聚焦时触发 - * - * event.detail = {html, text, delta} - * - * 最低基础库: 2.7.0 - */ - type EditorFocus< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - html: string - text: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any - delta: any[] - }, - Mark, - TargetDataset - > - - /** - * 编辑器失去焦点时触发 - * - * detail = {html, text, delta} - * - * 最低基础库: 2.7.0 - */ - type EditorBlur< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = EditorFocus<Mark, TargetDataset> - - /** - * 编辑器内容改变时触发 - * - * detail = {html, text, delta} - * - * 最低基础库: 2.7.0 - */ - type EditorInput< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = EditorFocus<Mark, TargetDataset> - - /** - * 通过 Context 方法改变编辑器内样式时触发,返回选区已设置的样式 - * - * 最低基础库: 2.7.0 - */ - type EditorStatusChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - Partial<{ - align: 'left' | 'center' | 'right' | 'justify' - bold: 'strong' - italic: 'em' - underline: true - strike: 'del' - lineHeight: string - letterSpacing: string - marginTop: string - marginBottom: string - fontFamily: string - fontSize: string - color: string - backgroundColor: string - list: 'checked' | 'unchecked' | 'ordered' | 'bullet' - indent: number - header: number - script: 'sub' | 'super' - direction: 'rtl' - }>, - Mark, - TargetDataset - > - - /** - * 携带 form 中的数据触发 submit 事件 - * - * event.detail = {value : {'name': 'value'} , formId: ''} - */ - type FormSubmit< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - formId?: unknown - target: Target - /** 表单中的数据,需要在表单组件中加上 name 来作为 key。 */ - value: IAnyObject - }, - Mark, - TargetDataset - > - - /** 表单重置时会触发 reset 事件 */ - type FormReset< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - target: Target - }, - Mark, - TargetDataset - > - - /** 键盘输入时触发 - * - * event.detail = {value, cursor, keyCode} - * - * 处理函数可以直接 return 一个字符串,将替换输入框的内容。 - */ - type Input< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** 输入框内容 */ - value: string - /** 光标位置 */ - cursor: number - /** keyCode 为键值 (目前工具还不支持返回keyCode参数) `2.1.0` 起支持 */ - keyCode?: number - }, - Mark, - TargetDataset - > - - /** - * 输入框聚焦时触发 - * - * event.detail = { value, height } - */ - type InputFocus< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** 输入框内容 */ - value: string - /** 键盘高度, 在基础库 `1.9.90` 起支持 */ - height: number - }, - Mark, - TargetDataset - > - - /** - * 输入框失去焦点时触发 - * - * event.detail = {value: value} - */ - type InputBlur< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** 输入框内容 */ - value: string - }, - Mark, - TargetDataset - > - - /** - * 点击完成按钮时触发 - * - * event.detail = {value: value} - */ - type InputConfirm< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** 输入框内容 */ - value: string - }, - Mark, - TargetDataset - > - - /** - * 键盘高度发生变化的时候触发此事件 - * - * event.detail = {height: height, duration: duration} - * - * **tip**: 键盘高度发生变化,keyboardheightchange 事件可能会多次触发,开发者对于相同的 height 值应该忽略掉 - * - * 最低基础库: `2.7.0` - */ - type InputKeyboardHeightChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** 键盘高度 */ - height: number - duration: number - }, - Mark, - TargetDataset - > - - /** - * 取消选择时触发 - * - * 最低基础库: 1.9.90 - */ - type PickerCancel< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent<never, Mark, TargetDataset> - - /** - * value 改变时触发 change 事件 - * - * event.detail = {value} - * - * 当 mode = region 时 (最低基础库: 1.4.0) - * - * value 改变时触发 change 事件,event.detail = {value, code, postcode},其中字段 code 是统计用区划代码,postcode 是邮政编码 - */ - type PickerChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** - * 当 mode = selector 时, 返回当前选择的 value - * - * 当 mode = multiSelector 时, 返回一个索引数组 - * - * 当 mode = time | date 时, 返回 `"12:01"` | `"2016-09-01"` - * - * 当 mode = region 时, 返回 `["广东省", "广州市", "海珠区"]` - */ - value: string | number[] | [string, string, string] - /** 统计用区划代码 当 mode = region 时有效 (最低基础库: 1.4.0) */ - code: [string, string, string] - /** 邮政编码 当 mode = region 时有效 (最低基础库: 1.4.0) */ - postcode: string - }, - Mark, - TargetDataset - > - - /** 列改变时触发 当 `mode = multiSelector` 时有效 */ - type PickerColumnChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** 修改的列 */ - column: number - value: number - }, - Mark, - TargetDataset - > - - /** - * 滚动选择时触发 change 事件 - * - * event.detail = {value} - */ - type PickerViewChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** value 为数组,表示 picker-view 内的 picker-view-column 当前选择的是第几项 (下标从 0 开始) */ - value: number[] - }, - Mark, - TargetDataset - > - - /** - * 当滚动选择开始时候触发事件 - * - * 最低基础库: 2.3.1 - */ - type PickerViewPickStart< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent<never, Mark, TargetDataset> - - /** - * 当滚动选择结束时候触发事件 - * - * 最低基础库: 2.3.1 - */ - type PickerViewPickEnd< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent<never, Mark, TargetDataset> - - /** radio-group 切换事件 */ - type RadioGroupChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - /** radio-group 中选中项的 value */ - { - value: string - }, - Mark, - TargetDataset - > - - /** - * 完成一次拖动后触发的事件 - * - * event.detail = {value} - */ - type SliderChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** slider 的数值 0 - 100 */ - value: number - }, - Mark, - TargetDataset - > - - /** - * 拖动过程中触发的事件 - * - * event.detail = {value} - * - * 最低基础库: 1.7.0 - */ - type SliderChanging< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = SliderChange<Mark, TargetDataset> - - /** - * checked 改变时触发 change 事件 - * - * event.detail={ value} - */ - type SwitchChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - value: boolean - }, - Mark, - TargetDataset - > - - /** - * 输入框聚焦时触发 - * - * event.detail = { value, height },height 为键盘高度 - * - * 在基础库 1.9.90 起支持 - */ - type TextareaFocus< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = InputFocus<Mark, TargetDataset> - - /** - * 输入框失去焦点时触发 - * - * event.detail = {value, cursor} - * - * **tip**: textarea 的 blur 事件会晚于页面上的 tap 事件,如果需要在 button 的点击事件获取 textarea,可以使用 form 的 bindsubmit。 - */ - type TextareaBlur< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = InputBlur<Mark, TargetDataset> - - /** - * 输入框行数变化时调用 - * - * event.detail = {height: 0, heightRpx: 0, lineCount: 0} - */ - type TextareaLineChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = CustomEvent< - { - /** 输入框高度(px) */ - height: number - /** 输入框高度(rpx) */ - heightRpx: number - /** 行数 */ - lineCount: number - /** 行高 */ - lineHeight: number - }, - Mark, - TargetDataset - > - - /** - * 当键盘输入时,触发 input 事件 - * - * event.detail = {value, cursor, keyCode} - * - * keyCode 为键值,目前工具还不支持返回 keyCode 参数。 - * - * **tip**: 不建议在多行文本上对用户的输入进行修改,所以 **bindinput 处理函数的返回值并不会反映到 textarea 上** - */ - type TextareaInput< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = Input<Mark, TargetDataset> - - /** - * 点击完成时, 触发 confirm 事件 - * - * event.detail = {value: value} - */ - type TextareaConfirm< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = InputConfirm<Mark, TargetDataset> - - /** - * 键盘高度发生变化的时候触发此事件 - * - * event.detail = {height: height, duration: duration} - * - * **tip**: 键盘高度发生变化,keyboardheightchange事件可能会多次触发,开发者对于相同的height值应该忽略掉 - * - * 最低基础库: 2.7.0 - */ - type TextareaKeyboardHeightChange< - Mark extends IAnyObject = IAnyObject, - TargetDataset extends IAnyObject = IAnyObject - > = InputKeyboardHeightChange<Mark, TargetDataset> - - /** - * 功能页返回,且操作成功时触发, detail 格式与具体功能页相关 - * - * 最低基础库: 2.1.0 - */ - type FunctionalNavigatorSuccess<Detail extends IAnyObject = IAnyObject> = - CustomEvent<Detail, never, never> - - /** - * 功能页返回,且操作失败时触发, detail 格式与具体功能页相关 - * - * 最低基础库: 2.1.0 - */ - type FunctionalNavigatorFail<Detail extends IAnyObject = IAnyObject> = - CustomEvent<Detail, never, never> - - /** - * 当 `target="miniProgram"` 时有效,跳转小程序成功 - * - * 最低基础库: 2.0.7 - */ - type NavigatorSuccess = CustomEvent - /** - * 当 `target="miniProgram"` 时有效,跳转小程序失败 - * - * `tips`: 需要用户确认跳转 从 2.3.0 版本开始,在跳转至其他小程序前,将统一增加弹窗,询问是否跳转,用户确认后才可以跳转其他小程序。如果用户点击取消,则回调 fail cancel。 - * - * 最低基础库: 2.0.7 - */ - type NavigatorFail = CustomEvent - /** - * 当 `target="miniProgram"` 时有效,跳转小程序完成 - * - * 最低基础库: 2.0.7 - */ - type NavigatorComplete = CustomEvent - - /** - * 当发生错误时触发 error 事件 - * - * detail = {errMsg:MediaError.code} - */ - type AudioError = CustomEvent<{ - /** - * MediaError.code - * - * - 1 获取资源被用户禁止 - * - 2 网络错误 - * - 3 解码错误 - * - 4 不合适资源 - */ - errMsg: 1 | 2 | 3 | 4 - }> - - /** 当开始/继续播放时触发play事件 */ - type AudioPlay = CustomEvent - - /** 当暂停播放时触发 pause 事件 */ - type AudioPause = CustomEvent - - /** - * 当播放进度改变时触发 timeupdate 事件 - * - * detail = {currentTime, duration} - */ - type AudioTimeUpdate = CustomEvent<{ - currentTime: number - duration: number - }> - - /** 当播放到末尾时触发 ended 事件 */ - type AudioEnded = CustomEvent - - /** 摄像头在非正常终止时触发,如退出后台等情况 */ - type CameraStop = CustomEvent - - /** 用户不允许使用摄像头时触发 */ - type CameraError = CustomEvent - - /** - * 相机初始化完成时触发 - * - * 最低基础库: 2.7.0 - */ - type CameraInitDone = CustomEvent - - /** - * 在扫码识别成功时触发,仅在 mode="scanCode" 时生效 - * - * 最低基础库: 2.1.0 - */ - type CameraScanCode = CustomEvent - - /** 当错误发生时触发,event.detail = {errMsg} */ - type ImageError = CoverImageError - /** 当图片载入完毕时触发,event.detail = {height, width} */ - type ImageLoad = CoverImageLoad - - /** - * 播放状态变化事件,detail = {code} - * - * 最低基础库 1.7.0 - */ - type LivePlayerStateChange = CustomEvent<{ - /** - * 状态码 - * - * - `2001` 已经连接服务器 - * - `2002` 已经连接服务器,开始拉流 - * - `2003` 网络接收到首个视频数据包(IDR) - * - `2004` 视频播放开始 - * - `2005` 视频播放进度 - * - `2006` 视频播放结束 - * - `2007` 视频播放Loading - * - `2008` 解码器启动 - * - `2009` 视频分辨率改变 - * - `-2301` 网络断连,且经多次重连抢救无效,更多重试请自行重启播放 - * - `-2302` 获取加速拉流地址失败 - * - `2101` 当前视频帧解码失败 - * - `2102` 当前音频帧解码失败 - * - `2103` 网络断连, 已启动自动重连 - * - `2104` 网络来包不稳: 可能是下行带宽不足,或由于主播端出流不均匀 - * - `2105` 当前视频播放出现卡顿 - * - `2106` 硬解启动失败,采用软解 - * - `2107` 当前视频帧不连续,可能丢帧 - * - `2108` 当前流硬解第一个I帧失败,SDK自动切软解 - * - `3001` RTMP -DNS解析失败 - * - `3002` RTMP服务器连接失败 - * - `3003` RTMP服务器握手失败 - * - `3005` RTMP 读/写失败 - */ - code: number - }> - - /** - * 全屏变化事件,detail = {direction, fullScreen} - * - * 最低基础库 1.7.0 - */ - type LivePlayerFullScreenChange = CustomEvent<{ - direction: 'vertical' | 'horizontal' - fullScreen: boolean - }> - - /** - * 网络状态通知,detail = {info} - * - * 最低基础库 1.9.0 - */ - type LivePlayerNetStatus = CustomEvent<{ - /** - * 网络状态数据 - * - * - * - `videoBitrate` 当前视频编/码器输出的比特率,单位 kbps - * - `audioBitrate` 当前音频编/码器输出的比特率,单位 kbps - * - `videoFPS` 当前视频帧率 - * - `videoGOP` 当前视频 GOP,也就是每两个关键帧(I帧)间隔时长,单位 s - * - `netSpeed` 当前的发送/接收速度 - * - `netJitter` 网络抖动情况,抖动越大,网络越不稳定 - * - `videoWidth` 视频画面的宽度 - * - `videoHeight` 视频画面的高度 - */ - info: - | 'videoBitrate' - | 'audioBitrate' - | 'videoFPS' - | 'videoGOP' - | 'netSpeed' - | 'netJitter' - | 'videoWidth' - | 'videoHeight' - }> - - /** - * 状态变化事件,detail = {code} - * - * 最低基础库: 1.7.0 - */ - type LivePusherStateChange = CustomEvent<{ - /** - * 状态码 - * - * - `1001` 已经连接推流服务器 - * - `1002` 已经与服务器握手完毕,开始推流 - * - `1003` 打开摄像头成功 - * - `1004` 录屏启动成功 - * - `1005` 推流动态调整分辨率 - * - `1006` 推流动态调整码率 - * - `1007` 首帧画面采集完成 - * - `1008` 编码器启动 - * - `-1301` 打开摄像头失败 - * - `-1302` 打开麦克风失败 - * - `-1303` 视频编码失败 - * - `-1304` 音频编码失败 - * - `-1305` 不支持的视频分辨率 - * - `-1306` 不支持的音频采样率 - * - `-1307` 网络断连,且经多次重连抢救无效,更多重试请自行重启推流 - * - `-1308` 开始录屏失败,可能是被用户拒绝 - * - `-1309` 录屏失败,不支持的Android系统版本,需要5.0以上的系统 - * - `-1310` 录屏被其他应用打断了 - * - `-1311` Android Mic打开成功,但是录不到音频数据 - * - `-1312` 录屏动态切横竖屏失败 - * - `1101` 网络状况不佳: 上行带宽太小,上传数据受阻 - * - `1102` 网络断连, 已启动自动重连 - * - `1103` 硬编码启动失败,采用软编码 - * - `1104` 视频编码失败 - * - `1105` 新美颜软编码启动失败,采用老的软编码 - * - `1106` 新美颜软编码启动失败,采用老的软编码 - * - `3001` RTMP -DNS解析失败 - * - `3002` RTMP服务器连接失败 - * - `3003` RTMP服务器握手失败 - * - `3004` RTMP服务器主动断开,请检查推流地址的合法性或防盗链有效期 - * - `3005` RTMP 读/写失败 - */ - code: number - }> - - /** - * 网络状态通知,detail = {info} - * - * 最低基础库: 1.9.0 - */ - type LivePusherNetStatus = CustomEvent<{ - /** - * 网络状态数据 - * - * -`videoBitrate` 当前视频编/码器输出的比特率,单位 kbps - * -`audioBitrate` 当前音频编/码器输出的比特率,单位 kbps - * -`videoFPS` 当前视频帧率 - * -`videoGOP` 当前视频 GOP,也就是每两个关键帧(I帧)间隔时长,单位 s - * -`netSpeed` 当前的发送/接收速度 - * -`netJitter` 网络抖动情况,抖动越大,网络越不稳定 - * -`videoWidth` 视频画面的宽度 - * -`videoHeight` 视频画面的高度 - */ - info: - | 'videoBitrate' - | 'audioBitrate' - | 'videoFPS' - | 'videoGOP' - | 'netSpeed' - | 'netJitter' - | 'videoWidth' - | 'videoHeight' - }> - - /** - * 渲染错误事件,detail = {errMsg, errCode} - * - * `tip`: 开发者工具上暂不支持 live-pusher - * - * 最低基础库: 1.7.4 - */ - type LivePusherError = CustomEvent<{ - errMsg: string - /** - * 错误码 - * - * - `10001` 用户禁止使用摄像头 - * - `10002` 用户禁止使用录音 - * - `10003` 背景音资源 (BGM) 加载失败 - * - `10004` 等待画面资源 (waiting-image) 加载失败 - */ - errCode: number - }> - - /** - * 背景音开始播放时触发 - * - * 最低基础库: 2.4.0 - */ - type LivePusherBgmStart = CustomEvent - - /** - * 背景音进度变化时触发,detail = {progress, duration} - * - * 最低基础库: 2.4.0 - */ - type LivePusherBgmProgress = CustomEvent<{ - progress: number - duration: number - }> - - /** - * 背景音播放完成时触发 - * - * 最低基础库: 2.4.0 - */ - type LivePusherBgmComplete = CustomEvent - - /** 当开始/继续播放时触发play事件 */ - type VideoPlay = CustomEvent - - /** 当暂停播放时触发 pause 事件 */ - type VideoPause = CustomEvent - - /** 当播放到末尾时触发 ended 事件 */ - type VideoEnded = CustomEvent - - /** 播放进度变化时触发,event.detail = {currentTime, duration} 。触发频率 250ms 一次 */ - type VideoTimeUpdate = CustomEvent<{ - currentTime: number - duration: number - }> - - /** - * 视频进入和退出全屏时触发,event.detail = {fullScreen, direction} - * - * 最低基础库: 1.4.0 - */ - type VideoFullScreenChange = CustomEvent<{ - fullScreen: boolean - direction: 'vertical' | 'horizontal' - }> - - /** - * 视频出现缓冲时触发 - * - * 最低基础库: 1.7.0 - */ - type VideoWaiting = CustomEvent - - /** - * 视频播放出错时触发 - * - * 最低基础库: 1.7.0 - */ - type VideoError = CustomEvent - - /** - * 加载进度变化时触发,只支持一段加载。 - * - * 最低基础库: 2.4.0 - */ - type VideoPregress = CustomEvent<{ - /** 百分比 */ - buffered: number - }> - - /** - * 加载进度变化时触发,只支持一段加载。 - * - * 最低基础库: 2.4.0 - */ - type VoipRoomError = CustomEvent - - /** - * 点击地图时触发 - * - * 2.9.0 起返回经纬度信息 - */ - type MapTap = CustomEvent<{ - /** 经度,最低基础库 2.9.0 */ - longitude: number - /** 纬度,最低基础库 2.9.0 */ - latitude: number - }> - - /** - * 点击标记点时触发 - * - * e.detail = {markerId} - */ - type MarkerTap = CustomEvent<{ - /** 标记点 ID */ - markerId: number - }> - - /** - * 点击 label 时触发 - * - * e.detail = {markerId} - * - * 最低基础库: 2.9.0 - */ - type LabelTap = MarkerTap - - /** - * 点击控件时触发 - * - * e.detail = {controlId} - */ - type ControlTap = CustomEvent<{ - /** 控件 ID */ - controlId: number - }> - - /** - * 点击 label 时触发 - * - * e.detail = {markerId} - * - * 最低基础库: 1.2.0 - */ - type CalloutTap = MarkerTap - - /** - * 在地图渲染更新完成时触发 - * - * 最低基础库: 1.6.0 - */ - type MapUpdated = CustomEvent - - /** - * 在地图渲染更新完成时触发 - * - * 最低基础库: 1.6.0 - */ - type RegionChange = CustomEvent<{ - /** 旋转程度,最低基础库 2.3.0 */ - rotate: number - /** 缩放程度,最低基础库 2.3.0 */ - skew: number - }> & - ( - | { - /** - * 视野变化开始、结束时触发 - * - * 视野变化开始为 `begin` - */ - type: 'begin' - /** - * 导致视野变化的原因 - * - * - gesture: 用户手势 - * - update: 调用接口导致 - */ - causedBy: 'gesture' | 'update' - } - | { - /** - * 视野变化结束时触发 - * - * 视野变化结束为 `end` - */ - type: 'end' - /** - * 导致视野变化的原因 - * - * - drag: 拖动地图导致 - * - scale: 缩放导致 - * - update: 调用接口导致 - */ - causedBy: 'drag' | 'scale' | 'update' - } - ) - - /** - * 广告加载成功的回调 - * - * 最低基础库: 2.2.1 - */ - type AdLoad = CustomEvent - - /** - * 广告加载失败的回调,event.detail = {errCode: 1002} - * - * `tip`: 监听到error回调后,开发者可以针对性的处理,比如隐藏广告组件的父容器,以保证用户体验,但不要移除广告组件,否则将无法收到bindload的回调。 - * - * 最低基础库: 2.2.1 - */ - type AdError = CustomEvent<{ - /** - * 错误码 - * - * - `1000` 后端错误调用失败 该项错误不是开发者的异常情况 一般情况下忽略一段时间即可恢复。 - * - `1001` 参数错误 使用方法错误 可以前往developers.weixin.qq.com 确认具体教程 (小程序和小游戏分别有各自的教程,可以在顶部选项中,“设计”一栏的右侧进行切换)。 - * - `1002` 广告单元无效 可能是拼写错误、或者误用了其他APP的广告ID 请重新前往mp.weixin.qq.com确认广告位ID。 - * - `1003` 内部错误 该项错误不是开发者的异常情况 一般情况下忽略一段时间即可恢复。 - * - `1004` 无适合的广告 广告不是每一次都会出现,这次没有出现可能是由于该用户不适合浏览广告 属于正常情况,且开发者需要针对这种情况做形态上的兼容。 - * - `1005` 广告组件审核中 你的广告正在被审核,无法展现广告 请前往mp.weixin.qq.com确认审核状态,且开发者需要针对这种情况做形态上的兼容。 - * - `1006` 广告组件被驳回 你的广告审核失败,无法展现广告 请前往mp.weixin.qq.com确认审核状态,且开发者需要针对这种情况做形态上的兼容。 - * - `1007` 广告组件被驳回 你的广告能力已经被封禁,封禁期间无法展现广告 请前往mp.weixin.qq.com确认小程序广告封禁状态。 - * - `1008` 广告单元已关闭 该广告位的广告能力已经被关闭 请前往mp.weixin.qq.com重新打开对应广告位的展现。 - */ - errCode: number - }> - - /** - * 广告关闭的回调 - * - * 最低基础库: 2.6.5 - */ - type AdClose = CustomEvent - - /** - * 网页向小程序 postMessage 时,会在特定时机 (小程序后退、组件销毁、分享) 触发并收到消息。e.detail = { data } - * - * 最低基础库: 1.6.4 - */ - type WebviewMessage = CustomEvent<{ - /** 多次 postMessage 的参数组成的数组 */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - data: any[] - }> - - /** - * 网页加载成功时候触发此事件。e.detail = { src } - * - * 最低基础库: 1.6.4 - */ - type WebviewLoad = CustomEvent<{ - src: string - }> - - /** - * 网页加载失败的时候触发此事件。e.detail = { src } - * - * 最低基础库: 1.6.4 - */ - type WebviewError = CustomEvent<{ - src: string - }> -} diff --git a/typings/types/wx/lib.wx.page.d.ts b/typings/types/wx/lib.wx.page.d.ts deleted file mode 100644 index 2d6cf47..0000000 --- a/typings/types/wx/lib.wx.page.d.ts +++ /dev/null @@ -1,299 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) 2024 Tencent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -***************************************************************************** */ - -declare namespace WechatMiniprogram.Page { - type Instance< - TData extends DataOption, - TCustom extends CustomOption - > = OptionalInterface<ILifetime> & - InstanceProperties & - InstanceMethods<TData> & - Data<TData> & - TCustom - type Options< - TData extends DataOption, - TCustom extends CustomOption - > = (TCustom & - Partial<Data<TData>> & - Partial<ILifetime> & { - options?: Component.ComponentOptions - }) & - ThisType<Instance<TData, TCustom>> - type TrivialInstance = Instance<IAnyObject, IAnyObject> - interface Constructor { - <TData extends DataOption, TCustom extends CustomOption>( - options: Options<TData, TCustom> - ): void - } - interface ILifetime { - /** 生命周期回调—监听页面加载 - * - * 页面加载时触发。一个页面只会调用一次,可以在 onLoad 的参数中获取打开当前页面路径中的参数。 - */ - onLoad( - /** 打开当前页面路径中的参数 */ - query: Record<string, string | undefined> - ): void | Promise<void> - /** 生命周期回调—监听页面显示 - * - * 页面显示/切入前台时触发。 - */ - onShow(): void | Promise<void> - /** 生命周期回调—监听页面初次渲染完成 - * - * 页面初次渲染完成时触发。一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。 - * - - * 注意:对界面内容进行设置的 API 如`wx.setNavigationBarTitle`,请在`onReady`之后进行。 - */ - onReady(): void | Promise<void> - /** 生命周期回调—监听页面隐藏 - * - * 页面隐藏/切入后台时触发。 如 `navigateTo` 或底部 `tab` 切换到其他页面,小程序切入后台等。 - */ - onHide(): void | Promise<void> - /** 生命周期回调—监听页面卸载 - * - * 页面卸载时触发。如`redirectTo`或`navigateBack`到其他页面时。 - */ - onUnload(): void | Promise<void> - /** 生命周期回调—监听路由动画完成 - * - * 路由动画完成时触发。如 wx.navigateTo 页面完全推入后 或 wx.navigateBack 页面完全恢复时。 - */ - onRouteDone(): void | Promise<void> - /** 监听用户下拉动作 - * - * 监听用户下拉刷新事件。 - * - 需要在`app.json`的`window`选项中或页面配置中开启`enablePullDownRefresh`。 - * - 可以通过`wx.startPullDownRefresh`触发下拉刷新,调用后触发下拉刷新动画,效果与用户手动下拉刷新一致。 - * - 当处理完数据刷新后,`wx.stopPullDownRefresh`可以停止当前页面的下拉刷新。 - */ - onPullDownRefresh(): void | Promise<void> - /** 页面上拉触底事件的处理函数 - * - * 监听用户上拉触底事件。 - * - 可以在`app.json`的`window`选项中或页面配置中设置触发距离`onReachBottomDistance`。 - * - 在触发距离内滑动期间,本事件只会被触发一次。 - */ - onReachBottom(): void | Promise<void> - /** 用户点击右上角转发 - * - * 监听用户点击页面内转发按钮(`<button>` 组件 `open-type="share"`)或右上角菜单“转发”按钮的行为,并自定义转发内容。 - * - * **注意:只有定义了此事件处理函数,右上角菜单才会显示“转发”按钮** - * - * 此事件需要 return 一个 Object,用于自定义转发内容 - */ - onShareAppMessage( - /** 分享发起来源参数 */ - options: IShareAppMessageOption - ): - | ICustomShareContent - | IAsyncCustomShareContent - | Promise<ICustomShareContent> - | void - | Promise<void> - /** - * 监听右上角菜单“分享到朋友圈”按钮的行为,并自定义分享内容 - * - * 本接口为 Beta 版本,暂只在 Android 平台支持,详见 [分享到朋友圈 (Beta)](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share-timeline.html) - * - * 基础库 2.11.3 开始支持,低版本需做兼容处理。 - */ - onShareTimeline(): ICustomTimelineContent | void - - /** 页面滚动触发事件的处理函数 - * - * 监听用户滑动页面事件。 - */ - onPageScroll( - /** 页面滚动参数 */ - options: IPageScrollOption - ): void | Promise<void> - - /** 当前是 tab 页时,点击 tab 时触发,最低基础库: `1.9.0` */ - onTabItemTap( - /** tab 点击参数 */ - options: ITabItemTapOption - ): void | Promise<void> - - /** 窗口尺寸改变时触发,最低基础库:`2.4.0` */ - onResize( - /** 窗口尺寸参数 */ - options: IResizeOption - ): void | Promise<void> - - /** - * 监听用户点击右上角菜单“收藏”按钮的行为,并自定义收藏内容。 - * 基础库 2.10.3,安卓 7.0.15 版本起支持,iOS 暂不支持 - */ - onAddToFavorites(options: IAddToFavoritesOption): IAddToFavoritesContent - - /** 每当小程序可能被销毁之前会被调用,可以进行退出状态的保存。最低基础库: `2.7.4` */ - onSaveExitState(): ISaveExitState - } - interface InstanceProperties { - /** 页面的文件路径 */ - is: string - - /** 到当前页面的路径 */ - route: string - - /** 打开当前页面路径中的参数 */ - options: Record<string, string | undefined> - - /** 上一次退出前 onSaveExitState 保存的数据 */ - exitState: any - - /** 相对于当前页面的 Router 对象 */ - router: Component.Router - - /** 相对于当前页面的 Router 对象 */ - pageRouter: Component.Router - - /** 渲染当前页面的渲染后端 */ - renderer: 'webview' | 'skyline' - } - - type DataOption = Record<string, any> - type CustomOption = Record<string, any> - - type InstanceMethods<D extends DataOption> = Component.InstanceMethods<D> - - interface Data<D extends DataOption> { - /** 页面的初始数据 - * - * `data` 是页面第一次渲染使用的**初始数据**。 - * - * 页面加载时,`data` 将会以`JSON`字符串的形式由逻辑层传至渲染层,因此`data`中的数据必须是可以转成`JSON`的类型:字符串,数字,布尔值,对象,数组。 - * - * 渲染层可以通过 `WXML` 对数据进行绑定。 - */ - data: D - } - - interface ICustomShareContent { - /** 转发标题。默认值:当前小程序名称 */ - title?: string - /** 转发路径,必须是以 / 开头的完整路径。默认值:当前页面 path */ - path?: string - /** 自定义图片路径,可以是本地文件路径、代码包文件路径或者网络图片路径。支持PNG及JPG。显示图片长宽比是 5:4,最低基础库: `1.5.0`。默认值:使用默认截图 */ - imageUrl?: string - } - - interface IAsyncCustomShareContent extends ICustomShareContent { - promise: Promise<ICustomShareContent> - } - - interface ICustomTimelineContent { - /** 自定义标题,即朋友圈列表页上显示的标题。默认值:当前小程序名称 */ - title?: string - /** 自定义页面路径中携带的参数,如 `path?a=1&b=2` 的 “?” 后面部分 默认值:当前页面路径携带的参数 */ - query?: string - /** 自定义图片路径,可以是本地文件路径、代码包文件路径或者网络图片路径。支持 PNG 及 JPG。显示图片长宽比是 1:1。默认值:默认使用小程序 Logo*/ - imageUrl?: string - } - - interface IPageScrollOption { - /** 页面在垂直方向已滚动的距离(单位px) */ - scrollTop: number - } - - interface IShareAppMessageOption { - /** 转发事件来源。 - * - * 可选值: - * - `button`:页面内转发按钮; - * - `menu`:右上角转发菜单。 - * - * 最低基础库: `1.2.4` - */ - from: 'button' | 'menu' - /** 如果 `from` 值是 `button`,则 `target` 是触发这次转发事件的 `button`,否则为 `undefined` - * - * 最低基础库: `1.2.4` */ - target: any - /** 页面中包含`<web-view>`组件时,返回当前`<web-view>`的url - * - * 最低基础库: `1.6.4` - */ - webViewUrl?: string - } - - interface ITabItemTapOption { - /** 被点击tabItem的序号,从0开始,最低基础库: `1.9.0` */ - index: string - /** 被点击tabItem的页面路径,最低基础库: `1.9.0` */ - pagePath: string - /** 被点击tabItem的按钮文字,最低基础库: `1.9.0` */ - text: string - } - - interface IResizeOption { - size: { - /** 变化后的窗口宽度,单位 px */ - windowWidth: number - /** 变化后的窗口高度,单位 px */ - windowHeight: number - } - } - - interface IAddToFavoritesOption { - /** 页面中包含web-view组件时,返回当前web-view的url */ - webviewUrl?: string - } - - interface IAddToFavoritesContent { - /** 自定义标题,默认值:页面标题或账号名称 */ - title?: string - /** 自定义图片,显示图片长宽比为 1:1,默认值:页面截图 */ - imageUrl?: string - /** 自定义query字段,默认值:当前页面的query */ - query?: string - } - - interface ISaveExitState { - /** 需要保存的数据(只能是 JSON 兼容的数据) */ - data: any - /** 超时时刻,在这个时刻后,保存的数据保证一定被丢弃,默认为 (当前时刻 + 1 天) */ - expireTimeStamp?: number - } - - interface GetCurrentPages { - (): Array<Instance<IAnyObject, IAnyObject>> - } -} - -/** - * 注册小程序中的一个页面。接受一个 `Object` 类型参数,其指定页面的初始数据、生命周期回调、事件处理函数等。 - */ -declare let Page: WechatMiniprogram.Page.Constructor -/** - * 获取当前页面栈。数组中第一个元素为首页,最后一个元素为当前页面。 - - * __注意:__ - - * - __不要尝试修改页面栈,会导致路由以及页面状态错误。__ - * - 不要在 `App.onLaunch` 的时候调用 `getCurrentPages()`,此时 `page` 还没有生成。 - */ -declare let getCurrentPages: WechatMiniprogram.Page.GetCurrentPages diff --git a/typings/types/wx/lib.wx.phys3D.d.ts b/typings/types/wx/lib.wx.phys3D.d.ts deleted file mode 100644 index dcc8e5f..0000000 --- a/typings/types/wx/lib.wx.phys3D.d.ts +++ /dev/null @@ -1,409 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) 2024 Tencent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -***************************************************************************** */ - -declare namespace phys3D { - // pvd调试配置 - export interface PhysicsDebugConfig { - isNetwork: boolean // 采用网络的方式 - ip?: string // 如果isNetwork为true,调试信息会通过tcp转发的方式转发到打开了pvd调试软件的电脑,需要注意的是,防火墙要对pvd打开 - port?: 5425 // pvd默认接口 - timeout?: 1000 // 默认耗时 - path?: string // 如果isNetwork为false,调试信息会通过写本地文件的方式落地,文件名建议为xxx.pxd2,导入pvd调试即可 - } - - export enum QueryTriggerInteraction { - UseGlobal = 0, - Ignore = 1, - Collide = 2 - } - - export class PhysSystem { - constructor(config?: PhysicsDebugConfig) - gravity: RawVec3f - bounceThreshold: number - defaultMaxAngularSpeed: number - defaultSolverIterations: number - defaultSolverVelocityIterations: number - sleepThreshold: number - defaultContactOffset: number - destroyScene: () => void - createScene: () => number - Simulate: (step: number) => void - SyncFromTransforms: (() => void) | undefined // added in 2021.06 - SetCollisionMask: (mask: ArrayBuffer) => void - Raycast: ( - origin: RawVec3f, - unitDir: RawVec3f, - distance: number, - hit: RaycastHit, - layerMask?: number, - queryTriggerInteraction?: QueryTriggerInteraction - ) => boolean - RaycastAll: ( - origin: RawVec3f, - unitDir: RawVec3f, - distance: number, - layerMask?: number, - queryTriggerInteraction?: QueryTriggerInteraction - ) => RaycastHit[] - CapsuleCast( - p1: RawVec3f, - p2: RawVec3f, - radius: number, - direction: RawVec3f, - hit: RaycastHit, - maxDistance: number, - layerMask?: number, - queryTriggerInteraction?: QueryTriggerInteraction - ): void - CapsuleCastAll: ( - p1: RawVec3f, - p2: RawVec3f, - radius: number, - direction: RawVec3f, - maxDistance: number, - layerMask?: number, - queryTriggerInteraction?: QueryTriggerInteraction - ) => RaycastHit[] - BoxCast( - center: RawVec3f, - halfExt: RawVec3f, - direction: RawVec3f, - hit: RaycastHit, - orientation: RawQuaternion, - maxDistance: number, - layerMask?: number, - queryTriggerInteraction?: QueryTriggerInteraction - ): void - BoxCastAll: ( - center: RawVec3f, - halfExt: RawVec3f, - direction: RawVec3f, - orientation: RawQuaternion, - maxDistance: number, - layerMask?: number, - queryTriggerInteraction?: QueryTriggerInteraction - ) => RaycastHit[] - OverlapBox: ( - center: RawVec3f, - halfExt: RawVec3f, - orientation: RawQuaternion, - layermask?: number, - queryTriggerInteraction?: QueryTriggerInteraction - ) => Collider[] - OverlapCapsule: ( - p1: RawVec3f, - p2: RawVec3f, - radius: number, - layermask?: number, - queryTriggerInteraction?: QueryTriggerInteraction - ) => Collider[] - } - - export class Rigidbody { - constructor(system: PhysSystem) - enabled?: boolean // since 2021.06 - position: RawVec3f - rotation: RawQuaternion - AttachToEntity: (pollObj: any, id: number) => void - Remove(): void - Detach(): void - IsAttached(): boolean - } - - export enum CollisionDetectionMode { - Discrete = 0, - Continuous = 1, - ContinuousDynamic = 2, - ContinuousSpeculative = 3 - } - - export enum RigidbodyConstraints { - None = 0, - FreezePositionX = 1 << 0, - FreezePositionY = 1 << 1, - FreezePositionZ = 1 << 2, - FreezeRotationX = 1 << 3, - FreezeRotationY = 1 << 4, - FreezeRotationZ = 1 << 5, - FreezePosition = FreezePositionX | FreezePositionY | FreezePositionZ, - FreezeRotation = FreezeRotationX | FreezeRotationY | FreezeRotationZ, - FreezeAll = FreezePosition | FreezeRotation - } - - export enum ForceMode { - kForceModeForce = 0, - kForceModeImpulse = 1 << 0, - kForceModeVelocityChange = 1 << 1, - kForceModeAcceleration = 1 << 2 - } - - export enum CombineMode { - eAverage = 0, - eMin, - eMultiply, - eMax - } - - export enum CookingFlag { - None = 0, - CookForFasterSimulation = 1 << 0, - EnableMeshCleaning = 1 << 1, - WeldColocatedVertices = 1 << 2 - } - - export enum CollisionFlags { - None = 0, - Sides = 1 << 0, - Above = 1 << 1, - Below = 1 << 2 - } - - export class RawVec3f { - constructor() - constructor(x: number, y: number, z: number) - x: number - y: number - z: number - } - - export class RawQuaternion { - constructor() - constructor(x: number, y: number, z: number, w: number) - x: number - y: number - z: number - w: number - } - - export class Collider { - attachedRigidbody: Rigidbody - bounds: Bounds - name: string - contactOffset: number - enabled: boolean - isTrigger: boolean - scale: RawVec3f - material?: Material - sharedMateiral?: Material - ClosestPoint: (raw: RawVec3f) => RawVec3f - ClosestPointOnBounds: (raw: RawVec3f) => RawVec3f - - onCollisionEnter?: (collision: Collision) => void - onCollisionExit?: (collision: Collision) => void - onCollisionStay?: (collision: Collision) => void - onTriggerEnter?: (collision: Collision) => void - onTriggerExit?: (collision: Collision) => void - onTriggerStay?: (collision: Collision) => void - - dettachRigidbody?: () => void - - userData?: unknown - layer: number - } - - export class BoxCollider extends Collider { - constructor(system: PhysSystem, center: RawVec3f, size: RawVec3f) - center: RawVec3f - size: RawVec3f - } - - export class SphereCollider extends Collider { - constructor(system: PhysSystem, center: RawVec3f, radius: number) - center: RawVec3f - radius: number - } - - export class CapsuleCollider extends Collider { - constructor( - system: PhysSystem, - center: RawVec3f, - height: number, - radius: number - ) - center: RawVec3f - height: number - radius: number - } - - export class MeshCollider extends Collider { - constructor( - system: PhysSystem, - convex: boolean, - cookingOptions: number, - sharedMesh: PhysMesh - ) - cookingOptions: number - sharedMesh: PhysMesh | null - convex: boolean - } - - export class CharacterController extends Collider { - constructor(system: PhysSystem) - position: RawVec3f - center: RawVec3f - collisionFlags: CollisionFlags - detectCollisions: boolean - enableOverlapRecovery: boolean - height: number - isGrounded: boolean - minMoveDistance: number - radius: number - skinWidth: number - slopeLimit: number - stepOffset: number - velocity: RawVec3f - - Move: (movement: RawVec3f) => CollisionFlags - SimpleMove: (speed: RawVec3f) => boolean - AttachToEntity: (pollObj: any, id: number) => void - - OnControllerColliderHit?: (hit: ControllerColliderHit) => void - } - - export interface ContactPoint { - normal: RawVec3f - this_collider: Collider - other_collider: Collider - point: RawVec3f - separation: number - } - - export interface Collision { - collider: Collider - contacts: ContactPoint[] - impulse: RawVec3f - relative_velocity: RawVec3f - } - - export interface ControllerColliderHit { - collider: Collider - controller: CharacterController - moveDirection: RawVec3f - normal: RawVec3f - moveLength: number - point: RawVec3f - } - - export class Bounds { - constructor(center: RawVec3f, size: RawVec3f) - - center: RawVec3f - extents: RawVec3f - max: RawVec3f - min: RawVec3f - size: RawVec3f - - ClosestPoint: (point: RawVec3f) => RawVec3f - Contains: (point: RawVec3f) => boolean - Expand: (amount: number) => void - Intersects: (bounds: Bounds) => boolean - SetMinMax: (min: RawVec3f, max: RawVec3f) => void - SqrDistance: (point: RawVec3f) => number - } - - export class Material { - constructor(system: PhysSystem) - dynamicFriction: number - staticFriction: number - bounciness: number - frictionCombine: CombineMode - bounceCombine: CombineMode - id: number - } - - export class DynamicRigidbody extends Rigidbody { - mass: number - angularDamping: number - angularVelocity: RawVec3f - centerOfMass: RawVec3f - collisionDetectionMode: CollisionDetectionMode - constraints: number - detectCollisions: boolean - linearDamping: number - freezeRotation: boolean - inertiaTensor: number - // inertiaTensorRotation - // interpolation - isKinematic: boolean - maxAngularVelocity: number - maxDepenetrationVelocity: number - sleepThreshold: number - solverIterations: number - solverVelocityIterations: number - useGravity: boolean - velocity: RawVec3f - userData?: unknown - - GetWorldCenterOfMass: () => RawVec3f - AddForce: (force: RawVec3f, mode: ForceMode) => void - AddTorque: (torque: RawVec3f, mode: ForceMode) => void - IsSleeping: () => boolean - Sleep: () => void - WakeUp: () => void - AddExplosionForce: ( - explosionForce: number, - explosionPosition: RawVec3f, - explosionRadius: number, - upwardsModifier: number, - mode: ForceMode - ) => void - AddForceAtPosition: ( - force: RawVec3f, - position: RawVec3f, - mode: ForceMode - ) => void - AddRelativeForce: (force: RawVec3f, mode: ForceMode) => void - AddRelativeTorque: (torque: RawVec3f, mode: ForceMode) => void - ClosestPointOnBounds: (position: RawVec3f) => RawVec3f - GetPointVelocity: (worldPoint: RawVec3f) => RawVec3f - GetRelativePointVelocity: (relativePoint: RawVec3f) => RawVec3f - MovePosition: (position: RawVec3f) => void - MoveRotation: (rotation: RawQuaternion) => void - ResetCenterOfMass: () => void - ResetInertiaTensor: () => void - SetDensity: (density: number) => void - // SweepTest: () => void; - // SweepTestAll: () => void; - } - - export class PhysMesh { - constructor(system: PhysSystem) - // set vertices - SetVertices: (buffer: Float32Array, count: number) => void - // set indices - SetTriangles: ( - buffer: Uint16Array | Uint32Array, - count: number, - useUint16: boolean - ) => void - } - - export class RaycastHit { - constructor() - collider: Collider - distance: number - normal: RawVec3f - point: RawVec3f - rigidbody: Rigidbody - } -} diff --git a/typings/types/wx/lib.wx.wasm.d.ts b/typings/types/wx/lib.wx.wasm.d.ts deleted file mode 100644 index 37b56b5..0000000 --- a/typings/types/wx/lib.wx.wasm.d.ts +++ /dev/null @@ -1,152 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) 2024 Tencent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -***************************************************************************** */ - -/** [WXWebAssembly](https://developers.weixin.qq.com/miniprogram/dev/framework/performance/wasm.html) - * - * WXWebAssembly */ -declare namespace WXWebAssembly { - type BufferSource = ArrayBufferView | ArrayBuffer - - type CompileError = Error - - const CompileError: { - prototype: CompileError - new (message?: string): CompileError - (message?: string): CompileError - } - - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance) */ - interface Instance { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance/exports) */ - readonly exports: Exports - } - - const Instance: { - prototype: Instance - new (module: Module, importObject?: Imports): Instance - } - - type LinkError = Error - - const LinkError: { - prototype: LinkError - new (message?: string): LinkError - (message?: string): LinkError - } - - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory) */ - interface Memory { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory/buffer) */ - readonly buffer: ArrayBuffer - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory/grow) */ - grow(delta: number): number - } - - const Memory: { - prototype: Memory - new (descriptor: MemoryDescriptor): Memory - } - - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module) */ - interface Module {} - - const Module: { - prototype: Module - new (bytes: BufferSource): Module - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/customSections) */ - customSections(moduleObject: Module, sectionName: string): ArrayBuffer[] - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/exports) */ - exports(moduleObject: Module): ModuleExportDescriptor[] - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/imports) */ - imports(moduleObject: Module): ModuleImportDescriptor[] - } - - interface RuntimeError extends Error {} - - const RuntimeError: { - prototype: RuntimeError - new (message?: string): RuntimeError - (message?: string): RuntimeError - } - - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table) */ - interface Table { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/length) */ - readonly length: number - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/get) */ - get(index: number): any - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/grow) */ - grow(delta: number, value?: any): number - /** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/set) */ - set(index: number, value?: any): void - } - - const Table: { - prototype: Table - new (descriptor: TableDescriptor, value?: any): Table - } - - interface MemoryDescriptor { - initial: number - maximum?: number - shared?: boolean - } - - interface ModuleExportDescriptor { - kind: ImportExportKind - name: string - } - - interface ModuleImportDescriptor { - kind: ImportExportKind - module: string - name: string - } - - interface TableDescriptor { - element: TableKind - initial: number - maximum?: number - } - - type ImportExportKind = 'function' | 'global' | 'memory' | 'table' - type TableKind = 'anyfunc' | 'externref' - type ValueType = - | 'anyfunc' - | 'externref' - | 'f32' - | 'f64' - | 'i32' - | 'i64' - | 'v128' - // eslint-disable-next-line @typescript-eslint/ban-types - type ExportValue = Function | Memory | Table - type Exports = Record<string, ExportValue> - type ImportValue = ExportValue | number - type Imports = Record<string, ModuleImports> - type ModuleImports = Record<string, ImportValue> - /** [WXWebAssembly](https://developers.weixin.qq.com/miniprogram/dev/framework/performance/wasm.html) */ - function instantiate( - path: string, - importObject?: Imports - ): Promise<Instance> -} diff --git a/typings/types/wx/lib.wx.xr-frame.d.ts b/typings/types/wx/lib.wx.xr-frame.d.ts deleted file mode 100644 index c864585..0000000 --- a/typings/types/wx/lib.wx.xr-frame.d.ts +++ /dev/null @@ -1,16379 +0,0 @@ -/*! ***************************************************************************** -Copyright (c) 2024 Tencent, Inc. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -***************************************************************************** */ - -/// <reference path="./lib.wx.phys3D.d.ts" /> -declare type HTMLCanvasElement = any -declare type ImageData = any -declare type HTMLImageElement = any - -declare module 'XrFrame' { - import * as xrFrameSystem from 'XrFrame/xrFrameSystem' - import { IComponentSchema, IEntityComponents } from 'XrFrame/xrFrameSystem' - - export { - IComponentSchema, - IEntityComponents, - IEffectAsset, - IRenderStates, - ISubMesh, - IVideoTextureOptions, - IRenderTarget, - IRenderTextureOptions, - IGLTFModelOptions, - IEnvDataOptions, - IKeyframeAnimationData, - IKeyframeAnimationInfo, - IKeyframeAnimationOptions, - IAtlasOptions, - IAtlasCreationOptions, - IPostProcessOptions, - IDataValueHandler, - ITextureWrapper, - ITextureOptions, - IEngineSettings, - IHandle, - IVertexLayoutOptions, - IVertexDataDescriptorOptions, - IUniformDescriptorOptions, - IImage, - IRealDownloader, - IDownloader, - IFontSetting, - IFeatures, - IRect, - IViewAction, - IView, - IAttachment, - IRenderPassDescriptor, - IGlyphInfo, - IEventBridge, - INativeMap, - ILongIntNativeMap, - ITransformData, - IAssetsData, - ICameraData, - IGLTFData, - ILightData, - IAssetMaterialData, - IMeshData, - ITextData, - IAssetRenderTextureData, - IEnvData, - IAnimatorData, - IAnimationPlayOptions, - IAnimatorAutoPlay, - ICameraOrbitControlData, - IARTrackerData, - IARTrackerRawData, - IShapeData, - ISphereShapeData, - IMeshShapeData, - ICapsuleShapeData, - ICubeShapeData, - IRigidbodyData, - IShapeInteractData, - IShapeGizmosData, - IAssetPostProcessData, - IParticleData, - IAssetsSystemData, - INodeSystemData, - ITickSystemData, - IAnimationSystemData, - IVideoSystemData, - IRenderSystemData, - IPhysicsSystemData, - IShapeDragEvent, - IShapeTouchEvent, - IARSystemData, - IARRawData, - IShareSystemData, - IShareCaptureOptions, - IShareRecordOptions, - IGizmoSystemData, - ILoaderOptionsSchema, - ITextureLoaderOptions, - IImageLoaderOptions, - ICubeTextureLoaderOptions, - IVideoTextureLoaderOptions, - IEnvDataLoaderOptions, - IGLTFLoaderOptions, - IKeyframeLoaderOptions, - IRawLoaderOptions, - IAtlasLoaderOptions, - TEventCallback, - TDirection, - Texture, - UniformDescriptor, - UniformBlock, - VertexLayout, - TCameraBackground, - TTrackMode, - EVideoState, - EVertexFormat, - EVertexStep, - EIndexType, - ETextureType, - ETextureFormat, - EWrapMode, - EFilterMode, - EUniformType, - ECullMode, - EFaceWinding, - ECompareFunc, - EStencilOp, - EBlendFactor, - EBlendEquation, - EColorMask, - EPixelType, - ELoadAction, - EDataModelType, - EMeshRenderType, - EPrimitiveType, - EShadowMode, - EShadowFitMode, - EVertexLayoutUsage, - EVertexBatchOperator, - EAnimationBlendType, - EUseDefaultAddedAction, - EUseDefaultRetainedAction, - EUseDefaultRemovedAction, - EEventType, - EARTrackerState, - EShapeType, - ECapsuleShapeDirection, - EShareRecordState - } from 'XrFrame/xrFrameSystem' - - export type Component<IData> = xrFrameSystem.Component<IData> - export type Element = xrFrameSystem.Element - export type EventManager = xrFrameSystem.EventManager - export type Effect = xrFrameSystem.Effect - export type Geometry = xrFrameSystem.Geometry - export type Material = xrFrameSystem.Material - export type VideoTexture = xrFrameSystem.VideoTexture - export type RenderTexture = xrFrameSystem.RenderTexture - export type GLTFModel = xrFrameSystem.GLTFModel - export type EnvData = xrFrameSystem.EnvData - export type Animation = xrFrameSystem.Animation - export type KeyframeAnimation = xrFrameSystem.KeyframeAnimation - export type Atlas = xrFrameSystem.Atlas - export type PostProcess = xrFrameSystem.PostProcess - export type Vector2 = xrFrameSystem.Vector2 - export type Vector3 = xrFrameSystem.Vector3 - export type Vector4 = xrFrameSystem.Vector4 - export type Quaternion = xrFrameSystem.Quaternion - export type Matrix3 = xrFrameSystem.Matrix3 - export type Matrix4 = xrFrameSystem.Matrix4 - export type Color = xrFrameSystem.Color - export type OBB = xrFrameSystem.OBB - export type BoundBall = xrFrameSystem.BoundBall - export type BoundBox = xrFrameSystem.BoundBox - export type Spherical = xrFrameSystem.Spherical - export type Transform = xrFrameSystem.Transform - export type AssetLoad = xrFrameSystem.AssetLoad - export type Assets = xrFrameSystem.Assets - export type Camera = xrFrameSystem.Camera - export type GLTF = xrFrameSystem.GLTF - export type Light = xrFrameSystem.Light - export type AssetMaterial = xrFrameSystem.AssetMaterial - export type Mesh = xrFrameSystem.Mesh - export type Text = xrFrameSystem.Text - export type Particle = xrFrameSystem.Particle - export type AssetRenderTexture = xrFrameSystem.AssetRenderTexture - export type Env = xrFrameSystem.Env - export type Animator = xrFrameSystem.Animator - export type CameraOrbitControl = xrFrameSystem.CameraOrbitControl - export type ARTracker = xrFrameSystem.ARTracker - export type Shape = xrFrameSystem.Shape - export type SphereShape = xrFrameSystem.SphereShape - export type MeshShape = xrFrameSystem.MeshShape - export type CapsuleShape = xrFrameSystem.CapsuleShape - export type CubeShape = xrFrameSystem.CubeShape - export type Rigidbody = xrFrameSystem.Rigidbody - export type ShapeInteract = xrFrameSystem.ShapeInteract - export type ShapeGizmos = xrFrameSystem.ShapeGizmos - export type AssetPostProcess = xrFrameSystem.AssetPostProcess - export type Scene = xrFrameSystem.Scene - export type XRNode = xrFrameSystem.XRNode - export type XRShadow = xrFrameSystem.XRShadow - export type XRCamera = xrFrameSystem.XRCamera - export type XRMesh = xrFrameSystem.XRMesh - export type XRLight = xrFrameSystem.XRLight - export type XRGLTF = xrFrameSystem.XRGLTF - export type XRMaterial = xrFrameSystem.XRMaterial - export type XRAssetRenderTexture = xrFrameSystem.XRAssetRenderTexture - export type XRAssetLoad = xrFrameSystem.XRAssetLoad - export type XRAssets = xrFrameSystem.XRAssets - export type XREnv = xrFrameSystem.XREnv - export type XRARTracker = xrFrameSystem.XRARTracker - export type XRText = xrFrameSystem.XRText - export type XRParticle = xrFrameSystem.XRParticle - export type XRAssetPostProcess = xrFrameSystem.XRAssetPostProcess - export type AssetsSystem = xrFrameSystem.AssetsSystem - export type NodeSystem = xrFrameSystem.NodeSystem - export type TickSystem = xrFrameSystem.TickSystem - export type AnimationSystem = xrFrameSystem.AnimationSystem - export type VideoSystem = xrFrameSystem.VideoSystem - export type RenderSystem = xrFrameSystem.RenderSystem - export type PhysicsSystem = xrFrameSystem.PhysicsSystem - export type ARSystem = xrFrameSystem.ARSystem - export type ShareSystem = xrFrameSystem.ShareSystem - export type GizmoSystem = xrFrameSystem.GizmoSystem - export type AssetLoader<T, ILoadOptions> = xrFrameSystem.AssetLoader< - T, - ILoadOptions - > - export type TextureLoader = xrFrameSystem.TextureLoader - export type ImageLoader = xrFrameSystem.ImageLoader - export type CubeTextureLoader = xrFrameSystem.CubeTextureLoader - export type VideoTextureLoader = xrFrameSystem.VideoTextureLoader - export type EnvDataLoader = xrFrameSystem.EnvDataLoader - export type GLTFLoader = xrFrameSystem.GLTFLoader - export type KeyframeLoader = xrFrameSystem.KeyframeLoader - export type RawLoader = xrFrameSystem.RawLoader - export type AtlasLoader = xrFrameSystem.AtlasLoader - - export interface IXrFrameSystem { - registerComponent: typeof xrFrameSystem.registerComponent - registerElement: typeof xrFrameSystem.registerElement - registerDataValue: typeof xrFrameSystem.registerDataValue - isTextureWrapper: typeof xrFrameSystem.isTextureWrapper - genLspMeta: typeof xrFrameSystem.genLspMeta - registerEffect: typeof xrFrameSystem.registerEffect - registerGeometry: typeof xrFrameSystem.registerGeometry - registerTexture: typeof xrFrameSystem.registerTexture - registerMaterial: typeof xrFrameSystem.registerMaterial - registerUniformDesc: typeof xrFrameSystem.registerUniformDesc - registerVertexDataDesc: typeof xrFrameSystem.registerVertexDataDesc - registerVertexLayout: typeof xrFrameSystem.registerVertexLayout - // EDracoDataType: typeof xrFrameSystem.// EDracoDataType; - // EDracoDecodeType: typeof xrFrameSystem.// EDracoDecodeType; - // EDracoErrorCode: typeof xrFrameSystem.// EDracoErrorCode; - // EDracoGeometryType: typeof xrFrameSystem.// EDracoGeometryType; - // DracoDecoded: typeof xrFrameSystem.// DracoDecoded; - registerAssetLoader: typeof xrFrameSystem.registerAssetLoader - Component: typeof xrFrameSystem.Component - Element: typeof xrFrameSystem.Element - EventManager: typeof xrFrameSystem.EventManager - Effect: typeof xrFrameSystem.Effect - Geometry: typeof xrFrameSystem.Geometry - Material: typeof xrFrameSystem.Material - VideoTexture: typeof xrFrameSystem.VideoTexture - RenderTexture: typeof xrFrameSystem.RenderTexture - GLTFModel: typeof xrFrameSystem.GLTFModel - EnvData: typeof xrFrameSystem.EnvData - Animation: typeof xrFrameSystem.Animation - KeyframeAnimation: typeof xrFrameSystem.KeyframeAnimation - Atlas: typeof xrFrameSystem.Atlas - PostProcess: typeof xrFrameSystem.PostProcess - Vector2: typeof xrFrameSystem.Vector2 - Vector3: typeof xrFrameSystem.Vector3 - Vector4: typeof xrFrameSystem.Vector4 - Quaternion: typeof xrFrameSystem.Quaternion - Matrix3: typeof xrFrameSystem.Matrix3 - Matrix4: typeof xrFrameSystem.Matrix4 - Color: typeof xrFrameSystem.Color - OBB: typeof xrFrameSystem.OBB - BoundBall: typeof xrFrameSystem.BoundBall - BoundBox: typeof xrFrameSystem.BoundBox - Spherical: typeof xrFrameSystem.Spherical - Transform: typeof xrFrameSystem.Transform - AssetLoad: typeof xrFrameSystem.AssetLoad - Assets: typeof xrFrameSystem.Assets - Camera: typeof xrFrameSystem.Camera - GLTF: typeof xrFrameSystem.GLTF - Light: typeof xrFrameSystem.Light - AssetMaterial: typeof xrFrameSystem.AssetMaterial - Mesh: typeof xrFrameSystem.Mesh - Text: typeof xrFrameSystem.Text - Particle: typeof xrFrameSystem.Particle - AssetRenderTexture: typeof xrFrameSystem.AssetRenderTexture - Env: typeof xrFrameSystem.Env - Animator: typeof xrFrameSystem.Animator - CameraOrbitControl: typeof xrFrameSystem.CameraOrbitControl - ARTracker: typeof xrFrameSystem.ARTracker - Shape: typeof xrFrameSystem.Shape - SphereShape: typeof xrFrameSystem.SphereShape - MeshShape: typeof xrFrameSystem.MeshShape - CapsuleShape: typeof xrFrameSystem.CapsuleShape - CubeShape: typeof xrFrameSystem.CubeShape - Rigidbody: typeof xrFrameSystem.Rigidbody - ShapeInteract: typeof xrFrameSystem.ShapeInteract - ShapeGizmos: typeof xrFrameSystem.ShapeGizmos - AssetPostProcess: typeof xrFrameSystem.AssetPostProcess - Scene: typeof xrFrameSystem.Scene - XRNode: typeof xrFrameSystem.XRNode - XRShadow: typeof xrFrameSystem.XRShadow - XRCamera: typeof xrFrameSystem.XRCamera - XRMesh: typeof xrFrameSystem.XRMesh - XRLight: typeof xrFrameSystem.XRLight - XRGLTF: typeof xrFrameSystem.XRGLTF - XRMaterial: typeof xrFrameSystem.XRMaterial - XRAssetRenderTexture: typeof xrFrameSystem.XRAssetRenderTexture - XRAssetLoad: typeof xrFrameSystem.XRAssetLoad - XRAssets: typeof xrFrameSystem.XRAssets - XREnv: typeof xrFrameSystem.XREnv - XRARTracker: typeof xrFrameSystem.XRARTracker - XRText: typeof xrFrameSystem.XRText - XRParticle: typeof xrFrameSystem.XRParticle - XRAssetPostProcess: typeof xrFrameSystem.XRAssetPostProcess - AssetsSystem: typeof xrFrameSystem.AssetsSystem - NodeSystem: typeof xrFrameSystem.NodeSystem - TickSystem: typeof xrFrameSystem.TickSystem - AnimationSystem: typeof xrFrameSystem.AnimationSystem - VideoSystem: typeof xrFrameSystem.VideoSystem - RenderSystem: typeof xrFrameSystem.RenderSystem - PhysicsSystem: typeof xrFrameSystem.PhysicsSystem - ARSystem: typeof xrFrameSystem.ARSystem - ShareSystem: typeof xrFrameSystem.ShareSystem - GizmoSystem: typeof xrFrameSystem.GizmoSystem - AssetLoader: typeof xrFrameSystem.AssetLoader - TextureLoader: typeof xrFrameSystem.TextureLoader - ImageLoader: typeof xrFrameSystem.ImageLoader - CubeTextureLoader: typeof xrFrameSystem.CubeTextureLoader - VideoTextureLoader: typeof xrFrameSystem.VideoTextureLoader - EnvDataLoader: typeof xrFrameSystem.EnvDataLoader - GLTFLoader: typeof xrFrameSystem.GLTFLoader - KeyframeLoader: typeof xrFrameSystem.KeyframeLoader - RawLoader: typeof xrFrameSystem.RawLoader - AtlasLoader: typeof xrFrameSystem.AtlasLoader - EVideoState: typeof xrFrameSystem.EVideoState - EVertexFormat: typeof xrFrameSystem.EVertexFormat - EVertexStep: typeof xrFrameSystem.EVertexStep - EIndexType: typeof xrFrameSystem.EIndexType - ETextureType: typeof xrFrameSystem.ETextureType - ETextureFormat: typeof xrFrameSystem.ETextureFormat - EWrapMode: typeof xrFrameSystem.EWrapMode - EFilterMode: typeof xrFrameSystem.EFilterMode - EUniformType: typeof xrFrameSystem.EUniformType - ECullMode: typeof xrFrameSystem.ECullMode - EFaceWinding: typeof xrFrameSystem.EFaceWinding - ECompareFunc: typeof xrFrameSystem.ECompareFunc - EStencilOp: typeof xrFrameSystem.EStencilOp - EBlendFactor: typeof xrFrameSystem.EBlendFactor - EBlendEquation: typeof xrFrameSystem.EBlendEquation - EColorMask: typeof xrFrameSystem.EColorMask - EPixelType: typeof xrFrameSystem.EPixelType - ELoadAction: typeof xrFrameSystem.ELoadAction - EDataModelType: typeof xrFrameSystem.EDataModelType - EMeshRenderType: typeof xrFrameSystem.EMeshRenderType - EPrimitiveType: typeof xrFrameSystem.EPrimitiveType - EShadowMode: typeof xrFrameSystem.EShadowMode - EShadowFitMode: typeof xrFrameSystem.EShadowFitMode - EVertexLayoutUsage: typeof xrFrameSystem.EVertexLayoutUsage - EVertexBatchOperator: typeof xrFrameSystem.EVertexBatchOperator - EAnimationBlendType: typeof xrFrameSystem.EAnimationBlendType - EUseDefaultAddedAction: typeof xrFrameSystem.EUseDefaultAddedAction - EUseDefaultRetainedAction: typeof xrFrameSystem.EUseDefaultRetainedAction - EUseDefaultRemovedAction: typeof xrFrameSystem.EUseDefaultRemovedAction - EEventType: typeof xrFrameSystem.EEventType - EARTrackerState: typeof xrFrameSystem.EARTrackerState - EShapeType: typeof xrFrameSystem.EShapeType - ECapsuleShapeDirection: typeof xrFrameSystem.ECapsuleShapeDirection - EShareRecordState: typeof xrFrameSystem.EShareRecordState - useParamsEaseFuncs: typeof xrFrameSystem.useParamsEaseFuncs - noneParamsEaseFuncs: typeof xrFrameSystem.noneParamsEaseFuncs - TransformSchema: IComponentSchema - AssetLoadSchema: IComponentSchema - AssetsSchema: IComponentSchema - CameraSchema: IComponentSchema - GLTFSchema: IComponentSchema - LightSchema: IComponentSchema - AssetMaterialSchema: IComponentSchema - MeshSchema: IComponentSchema - TextSchema: IComponentSchema - AssetRenderTextureSchema: IComponentSchema - EnvSchema: IComponentSchema - AnimatorSchema: IComponentSchema - CameraOrbitControlSchema: IComponentSchema - ARTrackSchema: IComponentSchema - SphereShapeSchema: IComponentSchema - MeshShapeSchema: IComponentSchema - CapsuleShapeSchema: IComponentSchema - CubeShapeSchema: IComponentSchema - RigidbodySchema: IComponentSchema - ShapeInteractSchema: IComponentSchema - ParticleSchema: IComponentSchema - RenderSystemSchema: IComponentSchema - ARSystemSchema: IComponentSchema - BasicDefaultComponents: IEntityComponents - SceneDefaultComponents: IEntityComponents - NodeDefaultComponents: IEntityComponents - ShadowDefaultComponents: IEntityComponents - CameraDefaultComponents: IEntityComponents - MeshDefaultComponents: IEntityComponents - LightDefaultComponents: IEntityComponents - GLTFDefaultComponents: IEntityComponents - AssetMaterialDefaultComponents: IEntityComponents - AssetRenderTextureDefaultComponents: IEntityComponents - AssetsDefaultComponents: IEntityComponents - EnvDefaultComponents: IEntityComponents - ARTrackerDefaultComponents: IEntityComponents - TextDefaultComponents: IEntityComponents - ParticleDefaultComponents: IEntityComponents - AssetPostProcessDefaultComponents: IEntityComponents - BasicDataMapping: { [key: string]: string[] } - SceneDataMapping: { [key: string]: string[] } - NodeDataMapping: { [key: string]: string[] } - ShadowDataMapping: { [key: string]: string[] } - CameraDataMapping: { [key: string]: string[] } - MeshDataMapping: { [key: string]: string[] } - LightDataMapping: { [key: string]: string[] } - GLTFDataMapping: { [key: string]: string[] } - AssetMaterialDataMapping: { [key: string]: string[] } - AssetRenderTextureDataMapping: { [key: string]: string[] } - AssetLoadDataMapping: { [key: string]: string[] } - EnvDataMapping: { [key: string]: string[] } - ARTrackerDataMapping: { [key: string]: string[] } - TextDataMapping: { [key: string]: string[] } - ParticleDataMapping: { [key: string]: string[] } - AssetPostProcessDataMapping: { [key: string]: string[] } - } -} - -declare module 'XrFrame/xrFrameSystem' { - /** - * xrFrameSystem.ts - * - * * @Date : 4/28/2022, 5:02:28 PM - */ - import { Kanata } from 'XrFrame/ext' - export { - default as Component, - registerComponent, - IComponentSchema - } from 'XrFrame/core/Component' - export { - default as Element, - registerElement, - IEntityComponents, - BasicDefaultComponents, - BasicDataMapping - } from 'XrFrame/core/Element' - export { - registerDataValue, - IDataValueHandler, - ITextureWrapper, - isTextureWrapper - } from 'XrFrame/core/DataValue' - export { - default as EventManager, - TEventCallback - } from 'XrFrame/core/EventManager' - export { genLspMeta } from 'XrFrame/genLspMeta' - export * from 'XrFrame/components' - export * from 'XrFrame/elements' - export * from 'XrFrame/systems' - export * from 'XrFrame/loader' - export { - default as Effect, - IEffectAsset, - IRenderStates - } from 'XrFrame/assets/Effect' - export { default as Geometry, ISubMesh } from 'XrFrame/assets/Geometry' - export { default as Material } from 'XrFrame/assets/Material' - export { - default as VideoTexture, - IVideoTextureOptions, - EVideoState - } from 'XrFrame/assets/VideoTexture' - export { - default as RenderTexture, - IRenderTarget, - IRenderTextureOptions - } from 'XrFrame/assets/RenderTexture' - export { - default as GLTFModel, - IGLTFModelOptions - } from 'XrFrame/assets/GLTFModel' - export { default as EnvData, IEnvDataOptions } from 'XrFrame/assets/EnvData' - export { - default as Animation, - TDirection - } from 'XrFrame/animation/Animation' - export { - default as KeyframeAnimation, - IKeyframeAnimationData, - IKeyframeAnimationInfo, - IKeyframeAnimationOptions - } from 'XrFrame/animation/KeyframeAnimation' - export { - default as Atlas, - IAtlasOptions, - IAtlasCreationOptions - } from 'XrFrame/assets/Atlas' - export { - default as PostProcess, - IPostProcessOptions - } from 'XrFrame/assets/PostProcess' - export { - registerEffect, - registerGeometry, - registerTexture, - registerMaterial, - registerUniformDesc, - registerVertexDataDesc, - registerVertexLayout - } from 'XrFrame/assets/factories' - export { - useParamsEaseFuncs, - noneParamsEaseFuncs - } from 'XrFrame/assets/easeFunctions' - export * from 'XrFrame/physics/exports' - export { default as Vector2 } from 'XrFrame/math/vector2' - export { default as Vector3 } from 'XrFrame/math/vector3' - export { default as Vector4 } from 'XrFrame/math/vector4' - export { default as Quaternion } from 'XrFrame/math/quaternion' - export { default as Matrix3 } from 'XrFrame/math/matrix3' - export { default as Matrix4 } from 'XrFrame/math/matrix4' - export { default as Color } from 'XrFrame/math/color' - export { default as OBB } from 'XrFrame/math/OBB' - export { default as BoundBall } from 'XrFrame/math/boundBall' - export { default as BoundBox } from 'XrFrame/math/boundBox' - export { default as Spherical } from 'XrFrame/math/Spherical' - export { - ITextureOptions, - IEngineSettings, - EVertexFormat, - EVertexStep, - EIndexType, - ETextureType, - ETextureFormat, - EWrapMode, - EFilterMode, - EUniformType, - ECullMode, - EFaceWinding, - ECompareFunc, - EStencilOp, - EBlendFactor, - EBlendEquation, - EColorMask, - EPixelType, - ELoadAction, - EDataModelType, - EMeshRenderType, - EPrimitiveType, - EShadowMode, - EShadowFitMode, - EVertexLayoutUsage, - EVertexBatchOperator, - EAnimationBlendType, - EUseDefaultAddedAction, - EUseDefaultRetainedAction, - EUseDefaultRemovedAction, - IHandle, - IVertexLayoutOptions, - IVertexDataDescriptorOptions, - IUniformDescriptorOptions, - IImage, - IRealDownloader, - IDownloader, - IFontSetting, - IFeatures, - IRect, - IViewAction, - IView, - IAttachment, - IRenderPassDescriptor, - EEventType, - IGlyphInfo, - IEventBridge, - INativeMap, - ILongIntNativeMap - } from 'XrFrame/kanata/lib/kanata' - export type Texture = Kanata.Texture - export type UniformDescriptor = Kanata.UniformDescriptor - export type UniformBlock = Kanata.UniformBlock - export type VertexLayout = Kanata.VertexLayout -} - -declare module 'XrFrame/ext' { - /** - * ext.ts - * - * * @Date : 2022/3/17下午1:43:48 - */ - import * as Kanata from 'XrFrame/kanata/lib/kanata' - const exparser: any - type Scene = import('XrFrame/core/Scene').default - const _wx: any - const Phys3D: any - function addKanata(scene: Scene, kanata: Kanata.IKanataInstance): void - function removeKanata(scene: Scene): void - function getKanata(scene: Scene): Kanata.IKanataInstance - function __getKanataSuperHackDontUseIt(): Kanata.IKanataInstance - export { - Kanata, - exparser, - Phys3D, - _wx, - addKanata, - removeKanata, - getKanata, - __getKanataSuperHackDontUseIt - } -} - -declare module 'XrFrame/core/Component' { - type Element = import('XrFrame/core/Element').default - /** - * `Component`属性的注解接口。 - * - * `key`是可以写在组件对应于`xml`中的属性的名字。 - * `type`是属性的类型,由{@link registerDataValue}注册。 - * 可选的`defaultValue`可以定义默认值。 - */ - export interface IComponentSchema { - [key: string]: { - type: string - defaultValue?: any - } - } - /** - * 组件,系统核心之一。 - * - * 组件就是`wxml`的标签上写的那些`attribute`,比如`<xr-element transform="position: 1 1 1" />`中,`transform`就是一个组件,`position`是它的一个属性。 - * 这些属性可以在`schema`中被定义,变化时会触发对应的生命周期。 - * 自定义组件最后使用{@link registerComponent},组件的属性可以使用代理规则来简化,比如以上的标签可以简化为`<xr-element position="1 1 1" />`,详见{@link Element}。 - * - * @template IData 组件数据的类型,应当和`schema`中一致,用于TS类型推断。 - */ - export default class Component<IData> { - /** - * @internal - */ - static TYPE: string - static EVENTS: string[] - /** - * @internal - */ - static SPLIT_DATA(dataStr: string): { - [key: string]: string - } - /** - * 自定义组件的`schema`。 - */ - readonly schema: IComponentSchema - /** - * 自定义组件的更新优先级。 - */ - readonly priority: number - __DATA_TYPE: IData - protected _version: number - protected _currentData: IData - /** - * 挂载的元素。 - */ - get el(): import('XrFrame/core/Element').default - /** - * 当前场景。 - */ - get scene(): import('XrFrame/core/Scene').default - /** - * 当前版本,每次有数据更新都会增加,可以用作和其他组件合作的依据。 - */ - get version(): number - /** - * 不通过`xml`而是直接设置`data`,注意值的类型需要和`schema`中一致。 - */ - setData(data: Partial<IData>): void - /** - * 设置一个数据。 - */ - setDataOne<T extends keyof IData>(key: T, value: IData[T]): void - /** - * 获取一个当前值。 - */ - getData<T extends keyof IData>(key: T): IData[T] - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - * 仅针对某些hack情况! - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * 所挂载的`element`被挂载到场景时触发的回调。 - */ - onAdd(parent: Element, data: IData): void - /** - * 数据更新时触发的回调。 - */ - onUpdate(data: IData, preData: IData): void - /** - * 渲染每帧触发的回调。 - * @param deltaTime 单位为毫秒(ms)。 - */ - onTick(deltaTime: number, data: IData): void - /** - * 所挂载的`element`从父节点`parent`被移除时,或者自己从`element`上被移除时,触发的回调。 - * 一般用于消除功能的运作。 - * **如果一个组件的元素直接被销毁了,那这个组件就不会经历onRemove而是直接进入onRelease。** - */ - onRemove(parent: Element, data: IData): void - /** - * 从被挂载的`element`上被移除,或是`element`被销毁时,触发的回调。 - * 一般用于释放持有的资源。 - */ - onRelease(data: IData): void - } - export const TABLE: { - [type: string]: new () => Component<any> - } - /** - * @internal - */ - export function getComponent(type: string): new () => Component<any> - /** - * 向系统中注册一个组件,然后可以在`xml`中使用。 - */ - export function registerComponent( - type: string, - clz: new () => Component<any> - ): void - export {} -} - -declare module 'XrFrame/core/Element' { - /** - * Element.ts - * - * * @Date : 2022/4/1上午10:34:06 - */ - import Component from 'XrFrame/core/Component' - import EventManager, { - TFrameworkEventTrigger - } from 'XrFrame/core/EventManager' - /** - * `Element`的默认组件集接口。 - * - * `name`是组件注册时的名字,`key`是要默认设置的组件的属性名字,值是默认值,但应当和`xml`中一致,为**字符串**。 - */ - export interface IEntityComponents { - [name: string]: { - [key: string]: string - } - } - /** - * 空的默认组件集。 - */ - export const BasicDefaultComponents: IEntityComponents - /** - * 空的默认组件映射。 - */ - export const BasicDataMapping: { - [key: string]: string[] - } - /** - * 元素,系统核心之一。 - * - * 本质上就是对应于`xml`中标签,所有的标签的实现都是继承自`Element`的,其一般不包含逻辑,仅仅是通过`defaultComponents`和`dataMapping`定义组件的集合与映射。 - * 自定义元素最后使用{#@link registerElement}。 - */ - export default class Element { - static TYPE: string - /** - * `Element`的默认组件集合,详见{@link IEntityComponents}。 - */ - readonly defaultComponents: IEntityComponents - /** - * `Element`的数据映射。它是为了给组件的属性提供一个方便的用法,比如: - * ```ts - * { - * position: [transform, position] - * } - * ``` - * 就是将`xml`中写在这个`Element`的`position`直接映射到了`transform`组件的`position`属性上。 - * - * **通常来讲,所有的驼峰如`nodeId`都会被映射为小写加中划线`node-id`**。 - */ - readonly dataMapping: { - [key: string]: string[] - } - /** - * @internal - */ - readonly neverTick: boolean - /** - * 名字,写在`xml`上的那个`name`,不唯一。 - */ - get name(): string - set name(value: string) - /** - * @internal - */ - /** - * 元素是否在`xml`中,若是`xr-shadow`下的节点,则为`false`。 - */ - get inXML(): boolean - /** - * 场景实例。 - */ - get scene(): import('XrFrame/core/Scene').default - /** - * 父元素。 - */ - get parent(): Element - /** - * 事件管理器。 - */ - get event(): EventManager - constructor(_type: string, triggerEvent: TFrameworkEventTrigger) - /** - * 获取第`index`个子元素。 - */ - getChildAtIndex<T extends Element = Element>(index: number): T - /** - * 通过`filter`获取子元素。 - */ - getChildByFilter<T extends Element = Element>( - filter: (child: Element) => boolean - ): T - /** - * 通过`filter`获取子元素列表。 - */ - getChildrenByFilter(filter: (child: Element) => boolean): Element[] - /** - * 通过元素的类获取子元素。 - */ - getChildByClass<T extends Element = Element>( - clz: new (...args: any[]) => T - ): T - /** - * 通过元素的名字`name`获取子元素。 - */ - getChildByName<T extends Element = Element>(name: string): T - /** - * 通过元素的名字`name`获取子元素们。 - */ - getChildrenByName(name: string): Element[] - /** - * 递归遍历元素的所有子孙节点。 - */ - dfs<T extends any>( - callback: (element: Element, params?: T) => T, - defaultParams?: T, - excludeRoot?: boolean, - stop?: (element: Element, params?: T) => boolean - ): void - /** - * 手动添加一个`Component`。 - */ - addComponent<T extends Component<any>>( - clz: new () => T, - options?: T['__DATA_TYPE'] - ): T - /** - * 获取一个`Component`,可以使用类或者名字获取。 - */ - getComponent<T extends Component<any>>(clzName: string): T - getComponent<T extends Component<any>>(clz: new () => T): T - /** - * 手动移除一个`Component`,注意保证其不在`xml`上。 - */ - removeComponent(clz: new () => Component<any>): void - /** - * 设置一个属性,对应于`xml`标签中的那些属性,值为字符串。 - * **一般建议使用`component`的`setData`方法**!!! - */ - setAttribute(name: string, value: string): void - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - _associateValue(_v: any): void - /** - * 手动添加一个子节点,**注意需要保证当前节点是`xr-shadow`或其子节点**。 - */ - addChild(child: Element): void - /** - * 手动移除一个子节点,**注意需要保证当前节点是`xr-shadow`或其子节点**。 - * **只调用removeChild没有办法走进子节点的onRelease里**,需要手动调用子节点的release才行。 - */ - removeChild(child: Element): void - /** - * 仅限自己创建的节点使用,否则后果自负。 - */ - setId(id: string): void - /** - * 仅限自己创建的节点使用,否则后果自负。 - */ - release(): void - /** - * @internal - */ - _appendChild(_child: Element, custom?: boolean): void - /** - * @internal - */ - _removeChild(_child: Element, _index?: number, custom?: boolean): void - /** - * @internal - */ - _insertBefore(_child: Element, _before?: Element, _index?: number): void - /** - * @internal - */ - _replaceChild( - _child: Element, - _oldChild?: Element, - _index?: number - ): void - /** - * @internal - */ - _spliceBefore( - _before: number | Element, - _deleteCount: number, - _list: Element - ): void - /** - * @internal - */ - _spliceAppend(_list: Element): void - /** - * @internal - */ - _spliceRemove(_before: Element, _deleteCount: number): void - /** - * @internal - */ - _setId(_id: string): void - /** - * @internal - */ - _setStyleScope(_styleScope: number): void - /** - * @internal - */ - _setStyle(_styleText: string): void - /** - * @internal - */ - _addClass(_elementClass: string, _styleScope?: number): void - /** - * @internal - */ - _removeClass(_elementClass: string, _styleScope?: number): void - /** - * @internal - */ - /** - * @internal - */ - _setAttribute(_name: string, _value: string): void - _removeAttribute(_name: string): void - _setText(_content: string): void - } - export const TABLE: { - [type: string]: typeof Element - } - export function getElement(type: string): typeof Element - /** - * 注册一个自定义元素。 - * 注意注册的`type`在`xml`中使用时需要加上`xr-`前缀,比如注册`custom`类型的元素,使用时需要时`xr-custom`。 - */ - export function registerElement(type: string, clz: typeof Element): void -} - -declare module 'XrFrame/core/DataValue' { - /** - * DataValue.ts - * - * * @Date : 2022/3/17下午2:22:19 - */ - import { Kanata } from 'XrFrame/ext' - import Scene from 'XrFrame/core/Scene' - /** - * 详见{@link registerDataValue}。 - */ - export interface IDataValueHandler<TDataValue> { - create(value: string, defaultValue: any, scene: Scene): TDataValue - } - export interface ITextureWrapper { - texture: Kanata.Texture - } - export function isTextureWrapper(value: any): value is ITextureWrapper - export function isDataValueHandlerExisted(type: string): boolean - /** - * 为组件在`xml`中写的属性值按类型注册解析器,由于`xml`传入的值全部都是字符串,所以需要解析,比如: - * ```ts - * registerDataValue('number', {create: (value: string, defaultValue: any, scene: Scene) => { - * return value === undefined ? defaultValue : parseFloat(value)); - * }}); - * ``` - * 就是注册了`number`类型,后续在组件的`schema`中写的`number`类型数据,就会走这个解析器。 - * **注意最后一个参数`scene`可以用于获取资源等,比如`scene.assets.getAssetWithState(type, value, defaultValue)`。** - * **如果是被资源加载器加载的资源,则会在资源加载器注册时自动注册数据类型,详见{@link AssetLoader}**。 - * - * 已经注册的类型可见[组件数据解析](../../../component/xr-frame/core/data-values)。 - */ - export function registerDataValue<TDataValue>( - type: string, - handler: IDataValueHandler<TDataValue> - ): void - export function parseDataValue<TDataValue>( - type: string, - value: string, - defaultValue: any, - scene: Scene - ): TDataValue -} - -declare module 'XrFrame/core/EventManager' { - /** - * EventManager.ts - * - * * @Date : 2022/3/17下午3:54:03 - */ - import Observable from 'XrFrame/core/Observable' - type Element = import('XrFrame/core/Element').default - /** - * 事件管理器的回调。 - */ - export type TEventCallback<TParams> = ( - params: TParams, - sender: Element - ) => void - export type TFrameworkEventTrigger = ( - name: string, - details: any, - options: { - bubbles?: boolean - composed?: boolean - capturePhase?: boolean - } - ) => void - /** - * 事件管理器。 - * - * 每个`Element`都有自己的事件管理器,通过参数可以触发到`xml`。 - */ - export default class EventManager { - isEventManager: boolean - protected _observables: { - [type: string]: Observable - } - protected _caches: { - [type: string]: { - value: any - toXML: boolean - bubbles: boolean - } - } - protected _wxmlBind: { - [type: string]: boolean - } - constructor(_el: Element, _triggerElementEvent: TFrameworkEventTrigger) - /** - * 添加一个事件监听器。 - */ - add<TEvent = any>( - type: string, - callback: TEventCallback<TEvent>, - priority?: number - ): this - /** - * 添加一个事件监听器,触发一次后自动移除。 - */ - addOnce<TEvent = any>( - type: string, - callback: TEventCallback<TEvent>, - priority?: number - ): this - /** - * 移除一个事件监听器。 - */ - remove<TEvent = any>( - type: string, - callback: TEventCallback<TEvent> - ): this - /** - * 判断一个事件是否被注册。 - * 注册是指用户绑定过了至少一个事件处理器,无论是来自于wxml还是JS。 - */ - has(type: string): boolean - /** - * 获取一个事件监听者数量。 - * @internal - */ - getCount(type: string): number - /** - * 清空某事件的所有监听器。 - */ - clear(type: string): this - /** - * 触发一个事件。 - * - * @param type 要触发的事件类型。 - * @param event 事件的值。 - * @param immediately 是否要将事件立即分发,如果不则会先缓存,之后在每一帧更新前统一分发,避免不必要的分发。 - * @param toXML 是否要派发到`xml`绑定的事件中。 - * @param bubbles 是否要进行事件冒泡。 - */ - trigger<TEvent = any>( - type: string, - event?: TEvent, - immediately?: boolean, - toXML?: boolean, - bubbles?: boolean - ): this - /** - * 分发某个缓存的事件,一般不需要自行触发。 - */ - flush(type: string): this - /** - * 分发所有缓存的事件,一般不需要自行触发。 - */ - flushAll(): this - } - export {} -} - -declare module 'XrFrame/genLspMeta' { - import { Scene } from 'XrFrame/elements' - export interface IXRFrameMeta { - elements: { - name: string[] - meta: { - [name: string]: IXRFrameElement - } - } - components: { - name: string[] - meta: { - [name: string]: IXRFrameComponent - } - } - } - export interface IXRFrameElement { - defaultComps: string[] - mappings: { - name: string[] - meta: { - [name: string]: string[] - } - } - events: string[] - limitComps?: string[] - } - export interface IXRFrameComponent { - keys: string[] - meta: { - [key: string]: IXRFrameData - } - events: string[] - } - export interface IXRFrameData { - type: string - defaultValue: any - map?: IXRFrameMap - enum?: IXRFrameEnum - } - export interface IXRFrameMap { - keys: string[] - meta: { - [key: string]: { - type: string - defaultValue?: string | number - enum?: IXRFrameEnum - } - } - } - export interface IXRFrameEnum { - values: Array<{ - value: string | number - desc?: string - }> - } - export function genLspMeta(scene: Scene): IXRFrameMeta -} - -declare module 'XrFrame/components' { - export { - default as Transform, - ITransformData, - TransformSchema - } from 'XrFrame/components/Transform' - export { - default as AssetLoad, - AssetLoadSchema - } from 'XrFrame/components/AssetLoad' - export { - default as Assets, - IAssetsData, - AssetsSchema - } from 'XrFrame/components/Assets' - export { - default as Camera, - ICameraData, - CameraSchema, - TCameraBackground - } from 'XrFrame/components/Camera' - export { - default as GLTF, - IGLTFData, - GLTFSchema - } from 'XrFrame/components/GLTF' - export { - default as Light, - ILightData, - LightSchema - } from 'XrFrame/components/Light' - export { - default as AssetMaterial, - IAssetMaterialData, - AssetMaterialSchema - } from 'XrFrame/components/AssetMaterial' - export { - default as Mesh, - IMeshData, - MeshSchema - } from 'XrFrame/components/Mesh' - export { - default as Text, - ITextData, - TextSchema - } from 'XrFrame/components/text/Text' - export { default as Particle } from 'XrFrame/components/particle/Particle' - export { - IParticleData, - ParticleSchema - } from 'XrFrame/components/particle/BasicParticle' - export { - default as AssetRenderTexture, - IAssetRenderTextureData, - AssetRenderTextureSchema - } from 'XrFrame/components/AssetRenderTexture' - export { default as Env, IEnvData, EnvSchema } from 'XrFrame/components/Env' - export { - default as Animator, - IAnimatorData, - AnimatorSchema, - IAnimationPlayOptions, - IAnimatorAutoPlay - } from 'XrFrame/components/Animator' - export { - default as CameraOrbitControl, - ICameraOrbitControlData, - CameraOrbitControlSchema - } from 'XrFrame/components/CameraOrbitControl' - export { - default as ARTracker, - IARTrackerData, - ARTrackSchema, - TTrackMode, - EARTrackerState, - IARTrackerRawData - } from 'XrFrame/components/ARTracker' - export { - default as Shape, - IShapeData, - EShapeType - } from 'XrFrame/components/physics/Shape' - export { - default as SphereShape, - ISphereShapeData, - SphereShapeSchema - } from 'XrFrame/components/physics/SphereShape' - export { - default as MeshShape, - IMeshShapeData, - MeshShapeSchema - } from 'XrFrame/components/physics/MeshShape' - export { - default as CapsuleShape, - ICapsuleShapeData, - CapsuleShapeSchema, - ECapsuleShapeDirection - } from 'XrFrame/components/physics/CapsuleShape' - export { - default as CubeShape, - ICubeShapeData, - CubeShapeSchema - } from 'XrFrame/components/physics/CubeShape' - export { - default as Rigidbody, - IRigidbodyData, - RigidbodySchema - } from 'XrFrame/components/physics/Rigidbody' - export { - default as ShapeInteract, - IShapeInteractData, - ShapeInteractSchema - } from 'XrFrame/components/physics/ShapeInteract' - export { - default as ShapeGizmos, - IShapeGizmosData - } from 'XrFrame/components/gizmo/ShapeGizmos' - export { - default as AssetPostProcess, - IAssetPostProcessData - } from 'XrFrame/components/AssetPostProcess' -} - -declare module 'XrFrame/elements' { - export { - default as Scene, - SceneDataMapping, - SceneDefaultComponents - } from 'XrFrame/core/Scene' - export { - default as XRNode, - NodeDataMapping, - NodeDefaultComponents - } from 'XrFrame/elements/xr-node' - export { - default as XRShadow, - ShadowDataMapping, - ShadowDefaultComponents - } from 'XrFrame/elements/xr-shadow' - export { - default as XRCamera, - CameraDataMapping, - CameraDefaultComponents - } from 'XrFrame/elements/xr-camera' - export { - default as XRMesh, - MeshDataMapping, - MeshDefaultComponents - } from 'XrFrame/elements/xr-mesh' - export { - default as XRLight, - LightDataMapping, - LightDefaultComponents - } from 'XrFrame/elements/xr-light' - export { - default as XRGLTF, - GLTFDataMapping, - GLTFDefaultComponents - } from 'XrFrame/elements/xr-gltf' - export { - default as XRMaterial, - AssetMaterialDataMapping, - AssetMaterialDefaultComponents - } from 'XrFrame/elements/xr-asset-material' - export { - default as XRAssetRenderTexture, - AssetRenderTextureDataMapping, - AssetRenderTextureDefaultComponents - } from 'XrFrame/elements/xr-asset-render-texture' - export { - default as XRAssetLoad, - AssetLoadDataMapping - } from 'XrFrame/elements/xr-asset-load' - export { - default as XRAssets, - AssetsDefaultComponents - } from 'XrFrame/elements/xr-assets' - export { - default as XREnv, - EnvDataMapping, - EnvDefaultComponents - } from 'XrFrame/elements/xr-env' - export { - default as XRARTracker, - ARTrackerDataMapping, - ARTrackerDefaultComponents - } from 'XrFrame/elements/xr-ar-tracker' - export { - default as XRText, - TextDataMapping, - TextDefaultComponents - } from 'XrFrame/elements/xr-text' - export { - default as XRParticle, - ParticleDataMapping, - ParticleDefaultComponents - } from 'XrFrame/elements/xr-particle' - export { - default as XRAssetPostProcess, - AssetPostProcessDataMapping, - AssetPostProcessDefaultComponents - } from 'XrFrame/elements/xr-asset-post-process' -} - -declare module 'XrFrame/systems' { - export { - default as AssetsSystem, - IAssetsSystemData - } from 'XrFrame/systems/AssetsSystem' - export { - default as NodeSystem, - INodeSystemData - } from 'XrFrame/systems/NodeSystem' - export { - default as TickSystem, - ITickSystemData - } from 'XrFrame/systems/TickSystem' - export { - default as AnimationSystem, - IAnimationSystemData - } from 'XrFrame/systems/AnimationSystem' - export { - default as VideoSystem, - IVideoSystemData - } from 'XrFrame/systems/VideoSystem' - export { - default as RenderSystem, - IRenderSystemData, - RenderSystemSchema - } from 'XrFrame/systems/RenderSystem' - export { - default as PhysicsSystem, - IPhysicsSystemData, - IShapeDragEvent, - IShapeTouchEvent - } from 'XrFrame/systems/PhysicsSystem' - export { - default as ARSystem, - IARSystemData, - ARSystemSchema, - IARRawData - } from 'XrFrame/systems/ARSystem' - export { - default as ShareSystem, - IShareSystemData, - IShareCaptureOptions, - IShareRecordOptions, - EShareRecordState - } from 'XrFrame/systems/ShareSystem' - export { - default as GizmoSystem, - IGizmoSystemData - } from 'XrFrame/systems/GizmoSystem' -} - -declare module 'XrFrame/loader' { - export { - default as AssetLoader, - ILoaderOptionsSchema, - registerAssetLoader - } from 'XrFrame/loader/AssetLoader' - export { - default as TextureLoader, - ITextureLoaderOptions - } from 'XrFrame/loader/TextureLoader' - export { - default as ImageLoader, - IImageLoaderOptions - } from 'XrFrame/loader/ImageLoader' - export { - default as CubeTextureLoader, - ICubeTextureLoaderOptions - } from 'XrFrame/loader/CubeTextureLoader' - export { - default as VideoTextureLoader, - IVideoTextureLoaderOptions - } from 'XrFrame/loader/VideoTextureLoader' - export { - default as EnvDataLoader, - IEnvDataLoaderOptions - } from 'XrFrame/loader/EnvDataLoader' - export { - default as GLTFLoader, - IGLTFLoaderOptions - } from 'XrFrame/loader/GlTFLoader' - export { - default as KeyframeLoader, - IKeyframeLoaderOptions - } from 'XrFrame/loader/KeyframeLoader' - export { - default as RawLoader, - IRawLoaderOptions - } from 'XrFrame/loader/RawLoader' - export { - default as AtlasLoader, - IAtlasLoaderOptions - } from 'XrFrame/loader/AtlasLoader' -} - -declare module 'XrFrame/assets/Effect' { - /** - * Effect.ts - * - * * @Date : 2022/3/16下午4:44:48 - */ - import { ITextureWrapper } from 'XrFrame/core/DataValue' - import { Kanata } from 'XrFrame/ext' - import { IAssetWithState } from 'XrFrame/loader/types' - type Scene = import('XrFrame/core/Scene').default - /** - * 支持定制的渲染状态。 - * - * 大部分状态会定制的开发者应该看名字就懂,就不详细说明了。 - */ - export interface IRenderStates { - /** - * 渲染队列,大于等于`2500`为透明物体,否则为非透明物体。 - */ - renderQueue?: number - blendOn?: boolean - /** - * 不要使用,使用`blendSrcRGB`。 - */ - blendSrc?: Kanata.EBlendFactor - blendSrcRGB?: Kanata.EBlendFactor - blendSrcAlpha?: Kanata.EBlendFactor - /** - * 不要使用,使用`blendDstRGB`。 - */ - blendDst?: Kanata.EBlendFactor - blendDstRGB?: Kanata.EBlendFactor - blendDstAlpha?: Kanata.EBlendFactor - blendFunc?: Kanata.EBlendEquation - cullOn?: boolean - cullFace?: Kanata.ECullMode - depthWrite?: boolean - depthTestOn?: boolean - depthTestComp?: Kanata.ECompareFunc - /** - * 在基础库版本`v2.31.1`以上支持。 - */ - colorWrite?: number - stencilWriteMask?: number - stencilTestOn?: boolean - stencilRef?: number - stencilReadMask?: number - stencilComp?: Kanata.ECompareFunc - stencilPass?: Kanata.EStencilOp - stencilFail?: Kanata.EStencilOp - stencilZFail?: Kanata.EStencilOp - primitiveType?: Kanata.EPrimitiveType - } - /** - * `Effect`资源的参数接口。 - */ - export interface IEffectAsset { - /** - * 名字,应当和`registerEffect`时的名字一致。 - */ - name: string - /** - * 属性,传给UniformBlock的一部分。 - */ - properties?: Array<{ - /** - * 属性名字。 - */ - key: string - /** - * 属性类型。 - */ - type: Kanata.EUniformType - /** - * 如果属性是一个数组,比如`FLOAT4`数组,可以指定数组大小。 - */ - num?: number - /** - * 属性默认值,需要和类型匹配。 - */ - default: number[] - /** - * 属性对应的宏,当默认值被覆盖时,此宏开关会被开启,注意一定要有`WX_`前缀! - */ - macro?: string - }> - /** - * 纹理资源,传给UniformBlock的另一部分。 - */ - images?: Array<{ - /** - * 属性名字。 - */ - key: string - /** - * 属性默认值,是`Texture`类型资源的`asset-id`。 - */ - default: string - /** - * 属性对应的宏,当默认值被覆盖时,此宏开关会被开启,注意一定要有`WX_`前缀! - */ - macro?: string - }> - /** - * 使用该`Effect`的`Material`的默认渲染队列。 - * 透明物体需要大于`2500`! - */ - defaultRenderQueue: number - /** - * 渲染时的`passes`,渲染时指定的`lightMode`的每个`pass`都会被按顺序绘制。 - */ - passes: Array<{ - /** - * 渲染的光照模式。 - */ - lightMode: - | 'ForwardBase' - | 'ForwardAdd' - | 'ShadowCaster' - | 'PostProcess' - | 'Skybox' - | string - /** - * 这个pass的渲染状态是否可以被`Material`覆盖。 - */ - useMaterialRenderStates: boolean - /** - * 这个pass的默认渲染状态。 - */ - renderStates?: IRenderStates - /** - * 这个pass的使用的`shader`在`shaders`中的索引,第一个是顶点着色器,第二个是片段着色器。 - */ - shaders: [number, number] - }> - /** - * 所有的`shader`列表。 - */ - shaders: string[] - } - /** - * 特效资源,定义了渲染所需的大部分参数,被{@link Material}所引用。 - */ - export default class Effect { - protected _scene: Scene - readonly description: IEffectAsset - /** - * 获取名称。 - */ - get name(): string - /** - * 获取场景实例。 - */ - get scene(): import('XrFrame/core/Scene').default - /** - * Backend对应的对象。 - * @internal - */ - get kanataEffect(): import('XrFrame/kanata/lib/index').Effect - /** - * 有几个Pass。 - */ - get passCount(): number - /** - * 正在加载中的纹理。 - * @internal - */ - get loadingTextures(): { - [key: string]: IAssetWithState< - import('XrFrame/kanata/lib/index').Texture | ITextureWrapper - > - } - /** - * 用于UniformBlock构建时传入 - * @internal - */ - _shaderUniformBlockDesc?: Kanata.UniformDescriptor - /** - * 是否没有properties。 - * @internal - */ - _isNoProperties: boolean - /** - * 是否没有images。 - * @internal - */ - _isNoImages: boolean - /** - * 根据特效配置生成特效资源。 - * **注意,不建议自己创建,请使用`scene.createEffect`。** - * - * @param description 配置。 - */ - constructor(_scene: Scene, description: IEffectAsset) - /** - * 材质调用方法,拷贝默认UniformBlock。 - * @internal - */ - /** - * @internal - */ - /** - * 预编译 - */ - warmUp(): boolean - } - export {} -} - -declare module 'XrFrame/assets/Geometry' { - import { Kanata } from 'XrFrame/ext' - import BoundBall from 'XrFrame/math/boundBall' - import BoundBox from 'XrFrame/math/boundBox' - import Vector3 from 'XrFrame/math/vector3' - type Scene = import('XrFrame/core/Scene').default - /** - * `Geometry`中的Submesh定义。 - */ - export interface ISubMesh { - /** - * 子mesh的顶点偏移。 - */ - offset: number - /** - * 子mesh的顶点数量。 - */ - length: number - /** - * 子mesh的材质索引。 - */ - materialIndex: number - } - /** - * 几何资源,用于定义渲染中的图元数据。 - */ - export default class Geometry { - protected _scene: Scene - /** - * @internal - */ - static readonly RAWLENGTH = 10 - /** - * @internal - * 从 96 切换到 76 个,换取多余的 uniform 上限 - */ - static readonly MAX_BONECOUNT = 76 - /** - * @internal - */ - /** - * 获取IndexBuffer。 - */ - get indexBuffer(): import('XrFrame/kanata/lib/index').IndexBuffer - /** - * 获取VertexBuffer。 - */ - get vertexBuffer(): import('XrFrame/kanata/lib/index').VertexBuffer - /** - * 获取IndexData。 - * 这种类型的索引数据用于合批,只对于开启了`dynamicBatch`的Renderer有效。 - * 注意如果已经获取过`indexBuffer`,将无效。 - */ - get indexData(): import('XrFrame/kanata/lib/index').IndexData - /** - * 获取VertexData。 - * 这种类型的顶点数据用于合批,只对于开启了`dynamicBatch`的Renderer有效。 - * 注意如果已经获取过`vertexBuffer`,将无效。 - */ - get vertexData(): import('XrFrame/kanata/lib/index').VertexData - /** - * 该mesh是否有效,有些情况可能会造成这种现象,例如vertexLayout和buffer数量不匹配 - * 渲染时应该对该值做检查以防护 - * @internal - */ - get valid(): boolean - /** - * 包围球,只读。 - */ - get boundBall(): BoundBall - /** - * 包围盒,只读。 - */ - get boundBox(): BoundBox - /** - * 获取所有的SubMesh,不要修改。 - * @internal - */ - get subMeshes(): ISubMesh[] - /** - * 构造一个`Geometry`。 - */ - constructor( - _scene: Scene, - vertexLayout: Kanata.VertexLayout, - vBuffer: ArrayBufferView, - iBuffer: ArrayBufferView, - indexType?: Kanata.EIndexType - ) - /** - * 更新VertexBuffer和IndexBuffer。 - * @internal - */ - uploadBufferData( - vBufferOffset: number, - vBufferLength: number, - iBufferOffset: number, - iBufferLength: number - ): void - /** - * 更新VertexBuffer。 - * 仅在获取了`vertexBuffer`后有效。 - */ - uploadVertexBuffer(offset: number, buffer: ArrayBufferView): void - /** - * 更新IndexBuffer。 - * 仅在获取了`indexBuffer`后有效。 - */ - uploadIndexBuffer( - offset: number, - buffer: Uint16Array | Uint32Array - ): void - /** - * 获取当前mesh有多少subMesh - */ - getSubMeshCount(): number - /** - * 获取指定序号的subMesh的索引起始点 - * - * @returns {number} 索引起始点,返回-1代表SubMesh不存在 - */ - getIndiceStart(subMeshIndex: number): number - /** - * 获取指定序号的subMesh的索引长度 - * - * @returns {number} 索引长度,返回-1代表SubMesh不存在 - */ - getIndiceLength(subMeshIndex: number): number - /** - * 获取指定序号的subMesh的材质序号 - * - * @returns {number} 材质序号,返回-1代表subMesh不存在 - */ - getMaterialIndex(subMeshIndex: number): number - /** - * 获取VertexLayout。 - */ - getVertexLayout(): Kanata.VertexLayout - /** - * 修改subMesh。 - * - * @param length 索引长度 - * @param offset 索引起始偏移 - */ - modifySubMesh( - subMeshIndex: number, - length: number, - offset: number - ): boolean - /** - * 增加subMesh。 - * - * @param length 索引长度 - * @param offset 索引起始偏移 - */ - addSubMesh(length: number, offset: number, materialIndex?: number): void - /** - * 动态更新包围盒,默认会自动计算包围球。 - */ - setBoundBox( - center: Vector3, - size: Vector3, - autoUpdateBall?: boolean - ): void - /** - * 动态更新包围球。 - */ - setBoundBall(center: Vector3, radius: number): void - /** - * 获取第一个顶点Buffer原始数据,可能没有值。 - * @internal - */ - /** - * 获取索引Buffer原始数据。 - * @internal - */ - } - export {} -} - -declare module 'XrFrame/assets/Material' { - /** - * Material.ts - * - * * @Date : 2022/3/24上午11:21:54 - */ - import { Kanata } from 'XrFrame/ext' - import Effect, { IRenderStates } from 'XrFrame/assets/Effect' - import Vector2 from 'XrFrame/math/vector2' - import Vector3 from 'XrFrame/math/vector3' - import Vector4 from 'XrFrame/math/vector4' - import Matrix3 from 'XrFrame/math/matrix3' - import Matrix4 from 'XrFrame/math/matrix4' - import EnvData from 'XrFrame/assets/EnvData' - type Scene = import('XrFrame/core/Scene').default - /** - * 材质资源,一般被代理到{@link XRMaterial}元素。 - */ - export default class Material { - /** - * @internal - */ - get kanataMaterial(): import('XrFrame/kanata/lib/index').Material - /** - * @internal - */ - get uniforms(): import('XrFrame/kanata/lib/index').UniformBlock - set alphaMode(value: 'OPAQUE' | 'BLEND' | 'MASK') - set alphaCutOff(value: number) - /** - * 透明物体需要大于`2500`! - */ - get renderQueue(): number - set renderQueue(value: number) - constructor(_scene: Scene) - /** - * 通过效果初始化材质。 - */ - initByEffect( - effect: Effect, - defaultUniforms?: { - [key: string]: ArrayLike<number> | number | Kanata.Texture - } - ): void - /** - * 获取一个Float - */ - getFloat(key: string): number - /** - * 设置一个Float - * - * @returns 是否设置成功 - */ - setFloat(key: string, value: number): boolean - /** - * 设置一个Vector。 - * - * @returns 是否设置成功。 - */ - setVector(key: string, value: Vector2 | Vector3 | Vector4): boolean - /** - * 获取一个Vector值的拷贝。 - */ - getVector(key: string): Vector2 | Vector3 | Vector4 - /** - * 设置一个Matrix - * - * @returns 是否设置成功 - */ - setMatrix(key: string, value: Matrix3 | Matrix4): boolean - /** - * 获取一个Vector值的拷贝。 - */ - getMatrix(key: string): Matrix3 | Matrix4 - /** - * 设置一张贴图。 - * - * @returns 是否设置成功。 - */ - setTexture(key: string, value: Kanata.Texture): boolean - /** - * 设置一张贴图。 - * - * @returns 是否设置成功。 - */ - setTextureAsset(key: string, assetId: string): boolean - resetTexture(key: string): import('XrFrame/kanata/lib/index').Texture - /** - * 直接通过Backend纹理ID设置纹理,注意需要自己持有纹理引用。 - * @internal - * - * @returns 是否设置成功。 - */ - setFontTexture(key: string, id: number): boolean - /** - * 获取材质中已设置的贴图。 - */ - getTexture(key: string): Kanata.Texture - /** - * 设置渲染状态。 - * 只有标记了`useMaterialRenderStates`的Pass会受到影响 - */ - setRenderState<TKey extends keyof IRenderStates>( - key: TKey, - value: IRenderStates[TKey] - ): boolean - /** - * 批量设置渲染状态。 - * 只有标记了`useMaterialRenderStates`的Pass会受到影响。 - */ - setRenderStates(states: IRenderStates): boolean - /** - * 清除渲染状态。 - * 清除材质的渲染状态,转而从effect中使用默认值。 - */ - clearRenderState<TKey extends keyof IRenderStates>(key: TKey): boolean - /** - * 批量清除渲染状态。 - * 清除材质的渲染状态,转而从effect中使用默认值。 - */ - clearRenderStates(states: { [key: string]: any }): boolean - /** - * 获取渲染状态。 - */ - getRenderState(key: string): number | boolean - /** - * 设置宏。 - */ - setMacro(key: string, value: boolean | number): void - /** - * 批量设置宏。 - */ - setMacros(marcos: { [key: string]: number | boolean }): void - /** - * 获取宏。 - */ - getMacro(key: string): boolean - /** - * 拷贝自身,生成一份新的材质数据。 - */ - clone(): Material - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - } - export {} -} - -declare module 'XrFrame/assets/VideoTexture' { - import { Kanata } from 'XrFrame/ext' - type Scene = import('XrFrame/core/Scene').default - /** - * 视频纹理{@link VideoTexture}的创建参数。 - */ - export interface IVideoTextureOptions { - /** - * 视频地址。 - */ - src: string - /** - * 视频未加载成功时,可选的首帧图片地址。 - */ - placeHolder?: Kanata.IImage - /** - * 是否要在加载完毕后自动播放。 - */ - autoPlay?: boolean - /** - * 是否要循环播放。 - */ - loop?: boolean - /** - * 是否禁止音频,默认禁止。 - */ - abortAudio?: boolean - /** - * 是否在小程序压后台时自动暂停,默认暂停。 - */ - autoPause?: boolean - } - export enum EVideoState { - Idle = 0, - WaitPlay = 1, - Playing = 2, - Paused = 3, - Released = 4 - } - /** - * 视频纹理。 - */ - export default class VideoTexture { - onEnd?: () => void - get texture(): import('XrFrame/kanata/lib/index').Texture - get width(): number - get height(): number - get autoPause(): boolean - /** - * 当前视频纹理播放状态。 - */ - get state(): EVideoState - /** - * @param onReady 创建成功时的回调。 - * @param onEnd 播放结束时的回调。 - */ - constructor( - scene: Scene, - options: IVideoTextureOptions, - onReady: (vt: VideoTexture, error?: Error) => void, - onEnd?: () => void - ) - /** - * @internal - */ - /** - * 播放视频。 - */ - play(): Promise<void> - /** - * 从某处开始播放。 - * - * @param pos 事件,单位为s - */ - seek(pos: number): Promise<any> - /** - * 暂停当前播放的视频。 - * 需要在基础库`v2.33.0`及以上支持。 - */ - pause(): Promise<void> - /** - * 唤醒已暂停的视频。 - * 需要在基础库`v2.33.0`及以上支持。 - */ - resume(): Promise<void> - /** - * 停止播放视频。 - */ - stop(): void - /** - * 释放视频。 - */ - release(): void - } - export {} -} - -declare module 'XrFrame/assets/RenderTexture' { - import { Kanata } from 'XrFrame/ext' - type Scene = import('XrFrame/core/Scene').default - export interface IRenderTarget { - width: number - height: number - renderPass: Kanata.RenderPass - } - /** - * `RenderTexture`资源参数接口。 - */ - export interface IRenderTextureOptions { - width: number - height: number - isHDR?: boolean - } - /** - * 渲染纹理组件,可作为{@link Camera.renderTarget}。 - */ - export default class RenderTexture { - static IS(obj: any): obj is RenderTexture - readonly isRenderTexture: boolean - /** - * 获取深度模板纹理。 - * @internal - */ - get depthStencil(): import('XrFrame/kanata/lib/index').Texture - /** - * 获取第一个色彩纹理。 - * @internal - */ - get texture(): import('XrFrame/kanata/lib/index').Texture - /** - * 获取深度纹理。 - * @internal - */ - get depthTexture(): import('XrFrame/kanata/lib/index').Texture - /** - * 获取Backend实例。 - * @internal - */ - get renderPass(): import('XrFrame/kanata/lib/index').RenderPass - /** - * 贴图高。 - */ - get height(): number - /** - * 贴图宽。 - */ - get width(): number - get id(): number - constructor(_scene: Scene, options: IRenderTextureOptions) - } - export {} -} - -declare module 'XrFrame/assets/GLTFModel' { - /** - * GlTF.ts - * - * * @Date : 2022/4/1下午3:34:15 - */ - import NativeAnimation from 'XrFrame/animation/NativeAnimation' - import Mesh from 'XrFrame/components/Mesh' - import Element from 'XrFrame/core/Element' - import { Kanata } from 'XrFrame/ext' - import { GLTFRootLoaded } from 'XrFrame/loader/glTF/GLTFRootNode' - import { GLTFTreeNode } from 'XrFrame/loader/glTF/scenes/GLTFNodesNode' - import { IGLTFLoaderOptions } from 'XrFrame/loader/GlTFLoader' - import Vector3 from 'XrFrame/math/vector3' - import Quaternion from 'XrFrame/math/quaternion' - type Scene = import('XrFrame/core/Scene').default - /** - * 收集glTF实例化过程中创建的对象,避免其GC。 - * @deprecated - */ - export class GLTFInstanceResourceCollector { - add(res: Kanata.IHandle): void - release(): void - } - /** - * 在{@link GLTFModel.instantiate}中传入的设置项。 - */ - export interface IGLTFModelOptions { - /** - * 是否投射阴影。 - */ - castShadow: boolean - /** - * 是否接受阴影。 - */ - receiveShadow: boolean - /** - * 是否**不**参与剔除。 - */ - neverCull: boolean - } - export type TQS = [pos: Vector3, quat: Quaternion, scale: Vector3] - /** - * 加载完毕的GLTF模型,可以在节点下创建{@link GLTF | GLTF组件}来将其实例化。 - */ - export default class GLTFModel { - /** - * 如果IGLTFLoaderOptions里开启了preserveRaw,则会将原始json保存下来。 - */ - readonly jsonRaw: object | undefined - constructor(_scene: Scene, model: GLTFRootLoaded) - /** - * 使用GLB文件加载而成的buffer,来生成GLTF模型。 - */ - static createFromBuffer( - scene: Scene, - buffer: ArrayBuffer, - options: IGLTFLoaderOptions - ): Promise<GLTFModel> - /** - * 实例化一个GLTF模型,将其加入到指定节点下,并返回一系列得到的物件。 - * @internal - * - * @returns subRoots GLTF场景的根节点对应的元素,因为一个GLTF可能有多个场景,所以可能有多个根节点。 - * @returns treeNodeMap GLTF节点对应到元素的映射表。 - * @returns animations 实例化产生的动画片段,需要手动将其加入{@link Animator}组件。 - * @returns meshes 实例化产生的所有{@link Mesh}组件。 - */ - instantiate( - parent: Element, - options: IGLTFModelOptions - ): [ - subRoots: Element[], - treeNodeMap: Map<GLTFTreeNode, Element>, - animations: NativeAnimation[], - meshes: Array<[mesh: Mesh, transform: TQS]> - ] - } - export {} -} - -declare module 'XrFrame/assets/EnvData' { - /** - * EnvData.ts - * - * * @Date : 5/11/2022, 4:07:41 PM - */ - import { Kanata } from 'XrFrame/ext' - /** - * `EnvData`的参数接口。 - */ - export interface IEnvDataOptions { - /** - * 天空盒。 - */ - skybox?: { - /** - * 是否只使用贴图的上半部分,一般在和`specular`共用贴图的时候为`true`。 - */ - half: boolean - /** - * 贴图。 - */ - map: Kanata.Texture - } - /** - * 环境漫反射部分。 - */ - diffuse?: { - /** - * 球谐系数SH9。 - */ - coefficients: Float32Array - } - /** - * 环境高光反射部分。 - */ - specular?: { - /** - * 贴图类型,目前只支持2D。 - */ - type: '2D' - /** - * 是否使用`rgbd`编码来。 - */ - rgbd: boolean - /** - * 是否使用mipmap。 - */ - mipmaps: boolean - /** - * 使用的mipmap级数。 - */ - mipmapCount?: number - /** - * 贴图。 - */ - map: Kanata.Texture - } - } - /** - * 环境数据资源,一般用[xr-frame-cli](https://github.com/wechat-miniprogram/xr-frame-cli)生成。 - */ - export default class EnvData { - get useHalfSkyMap(): boolean - get skyboxMap(): import('XrFrame/kanata/lib/index').Texture - get hasDiffuse(): boolean - get diffuseSH(): Float32Array - get hasSpecular(): boolean - get specularRGBD(): boolean - get specularMipmaps(): boolean - get specularMipmapCount(): number - get specularMap(): import('XrFrame/kanata/lib/index').Texture - constructor(options: IEnvDataOptions) - destroy(): void - } -} - -declare module 'XrFrame/animation/Animation' { - /** - * Animation.ts - * - * * @Date : 6/17/2022, 3:17:12 PM - */ - type Scene = import('XrFrame/core/Scene').default - type Element = import('XrFrame/core/Element').default - /** - * 动画播放的方向,如果是`both`,则会在`loop`开启时的每次循环中自动反转。 - */ - export type TDirection = 'forwards' | 'backwards' | 'both' - /** - * 动画资源基类,被{@link Animator}使用,可以继承它来实现具体的动画。 - * - * @template IData 动画初始化接受的数据。 - * @template IOptions 动画播放时接受的额外追加选项。 - */ - export default class Animation<IData = any, IOptions = any> { - __DATA_TYPE: IData - __OPTIONS_TYPE: IOptions - /** - * 动画所有的片段名字,必须在`onInit`中被初始化。 - */ - clipNames: string[] - /** - * 场景实例。 - */ - get scene(): import('XrFrame/core/Scene').default - /** - * @param _scene 场景实例。 - * @param data 初始化动画数据。 - */ - constructor(_scene: Scene, data: IData) - /** - * 动画初始化时执行的生命周期,只会执行一次。 - * - * @param data 初始化动画数据。 - */ - onInit(data: IData): void - /** - * 动画开始播放时执行的生命周期。 - * - * @param el 本次播放作用于的`element`,一个动画可能作用于多个`element`,可以在这里区分。 - * @param clipName 本次播放的片段名字。 - * @param options 本次播放时的附加选项。 - * - * @returns 返回本次播放片段的参数,必须包括时长`duration`(s),可选循环次数`loop`、延迟`delay`和方向`direction`。 - */ - onPlay( - el: Element, - clipName: string, - options: IOptions - ): { - duration: number - loop?: number - delay?: number - direction?: TDirection - } - /** - * 在动画更新时执行的回调。 - * - * @param el 本次播放作用于的`element`。 - * @param progress 播放进度,范围为线性的`0~1`。 - * @param reverse 本次播放是否反向。 - */ - onUpdate(el: Element, progress: number, reverse: boolean): void - /** - * 在动画暂停时执行的回调。 - * - * @param el 本次播放作用于的`element`。 - */ - onPause(el: Element): void - /** - * 在动画从暂停状态唤醒时执行的回调。 - * - * @param el 本次播放作用于的`element`。 - */ - onResume(el: Element): void - /** - * 在动画停止时执行的回调。 - * - * @param el 本次播放作用于的`element`。 - */ - onStop(el: Element): void - } - export {} -} - -declare module 'XrFrame/animation/KeyframeAnimation' { - import Animation, { TDirection } from 'XrFrame/animation/Animation' - type Element = import('XrFrame/core/Element').default - /** - * `Keyframe`动画数据的动画部分。 - */ - export interface IKeyframeAnimationInfo { - /** - * 指定动画使用的Keyframe。 - */ - keyframe: string - /** - * 动画长度(s)。 - */ - duration: number - /** - * 动画插值方式,详见{@link noneParamsEaseFuncs}和{@link useParamsEaseFuncs}。 - */ - ease: string - /** - * 如果是可以接受参数的插值方式,指定参数。 - */ - easeParams?: number[] - /** - * 循环次数,`0`为不循环,`-1`为永远循环。 - */ - loop?: number - /** - * 播放延迟。 - */ - delay?: number - /** - * 播放方向。 - */ - direction?: TDirection - } - /** - * `Keyframe`动画数据的动画部分。 - */ - export interface IKeyframeAnimationData { - /** - * 关键帧定义部分,可以参考[basic-animation](https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/doc/basic-animation.json)。 - * - * `name`为关键帧名字。 - * `key`为`0~100`的进度。 - * `prop`为属性序列,其规则为`[componentName].[prop1].[prop2].[prop3]...`,但是有一些特殊的缩写: - * `position`、`scale`、`rotation`是`transform`组件下对应的属性,`material.u_xxx`则是设置材质的uniform。 - * `prop`的值,可以是数字或者数字数组。 - */ - keyframe: { - [name: string]: { - [key: string]: { - [prop: string]: number | number[] - } - } - } - /** - * 动画部分。 - */ - animation: { - [name: string]: IKeyframeAnimationInfo - } - } - export enum EKeyframeAnimationPropType { - Default = 0, - Math = 1, - Uniform = 2, - ComponentData = 3 - } - /** - * `Keyframe`动画的追加播放参数。 - */ - export interface IKeyframeAnimationOptions { - /** - * 改变插值方式。 - */ - ease?: string - /** - * 改变插值系数。 - */ - easeParams?: number[] - } - /** - * 解析完的`Keyframe`部分实例,准备好数据以备正式播放。 - * - * 开发者不需要关心,内部使用。 - */ - export class Keyframe { - /** - * @internal - */ - get times(): number[] - constructor(options: IKeyframeAnimationData['keyframe']['name']) - start(el: Element): (p: number) => void - } - /** - * `Keyframe`动画。 - */ - export default class KeyframeAnimation extends Animation< - IKeyframeAnimationData, - IKeyframeAnimationOptions - > { - onInit(data: IKeyframeAnimationData): void - onPlay( - el: Element, - clipName: string, - options: IKeyframeAnimationOptions - ): IKeyframeAnimationInfo - onUpdate(el: Element, progress: number, reverse: boolean): void - onPause(el: Element): void - onResume(el: Element): void - onStop(el: Element): void - } - export {} -} - -declare module 'XrFrame/assets/Atlas' { - /** - * Atlas.ts - * - * * @Date : 10/12/2022, 5:23:59 PM - */ - import { Kanata } from 'XrFrame/ext' - import Matrix3 from 'XrFrame/math/matrix3' - import Vector4 from 'XrFrame/math/vector4' - type Scene = import('XrFrame/core/Scene').default - /** - * `Atlas`的初始化参数类型。 - */ - export interface IAtlasOptions { - /** - * 图片。 - */ - image?: Kanata.IImage - /** - * 也可以直接传入一张纹理。 - */ - texture?: Kanata.Texture - /** - * 帧定义,若不指定`uv`则会自动按比例计算。 - */ - frames: { - [key: string]: { - /** - * 帧的区块信息。 - */ - frame: { - x: number - y: number - w: number - h: number - } - /** - * 会自动生成,开发者无需关心。 - * - * @hidden - */ - uvMatrix?: Matrix3 - /** - * 会自动生成,开发者无需关心。 - * - * @hidden - */ - uvST?: Vector4 - } - } - /** - * 原信息,主要定义图片尺寸。 - */ - meta: { - size: { - w: number - h: number - } - } - } - /** - * 图集资源创建参数。 - */ - export interface IAtlasCreationOptions { - /** - * 单元宽度。 - */ - cellWidth?: number - /** - * 单元高度。 - */ - cellHeight?: number - /** - * 单元间的间隙。 - */ - space?: number - /** - * 每行有多少帧(单元)。 - */ - framesPerLine: number - /** - * 需要从哪一帧开始。 - */ - frameStart?: number - /** - * 需要几帧。 - */ - frameCount?: number - } - /** - * 图集资源。 - * @version 2.27.1 - * - * 一般通过{@link AtlasLoader}加载自动生成。 - * 推荐使用[Shoebox](https://www.renderhjs.net/shoebox/)等工具生成。 - */ - export default class Atlas { - isAtlas: boolean - protected _AUTO_ID: number - protected _image: Kanata.IImage - protected _texture: Kanata.Texture - protected _frames: IAtlasOptions['frames'] - protected _meta: IAtlasOptions['meta'] - protected _updatable: boolean - protected _root: string - protected _area: number - protected _needReBuild: boolean - /** - * 根据宽高和行数、列数来创建一个空的图集。 - * 这个图集将被行列分成若干个格子帧,开发者可以根据实际状况去使用`updateFrame`更新这些格子。 - * 自动生成的帧的名字为`${row}${col}`,比如第一行第一列为`'11'`。 - * - * @param onUpdate 初始化时的回调,可以用于一开始绘制图像 - */ - static CREATE_FROM_GRIDS( - scene: Scene, - options: { - width: number - height: number - rows: number - cols: number - space?: number - }, - onUpdate?: ( - texture: Kanata.Texture, - region: { - col: number - row: number - x: number - y: number - w: number - h: number - }, - frameName: string - ) => void - ): Atlas - /** - * 根据纹理和配置,来通过纹理创建一个不可修改的图集。通常用于精灵动画。 - * 这个图集将被行列分成若干个格子帧,每一帧的名字为`0`、`1`、`2`...... - */ - static CREATE_FROM_TEXTURE( - scene: Scene, - texture: Kanata.Texture, - options: IAtlasCreationOptions - ): Atlas - /** - * 获取元信息。 - */ - get meta(): { - size: { - w: number - h: number - } - } - /** - * 获取帧集合。 - */ - get frames(): { - [key: string]: { - /** - * 帧的区块信息。 - */ - frame: { - x: number - y: number - w: number - h: number - } - /** - * 会自动生成,开发者无需关心。 - * - * @hidden - */ - uvMatrix?: Matrix3 - /** - * 会自动生成,开发者无需关心。 - * - * @hidden - */ - uvST?: Vector4 - } - } - /** - * 获取整体的纹理。 - */ - get texture(): import('XrFrame/kanata/lib/index').Texture - /** - * 构建一个图集。 - * - * @param options 初始化参数。 - */ - constructor(_scene: Scene, options: IAtlasOptions) - /** - * 获取某一帧的数据。 - */ - getFrame(frameName: string): { - x: number - y: number - w: number - h: number - } - /** - * 获取某一帧的uv变换矩阵。 - */ - getUVMatrix(frameName: string): Matrix3 - protected _buildUVMatrix(frame: { - x: number - y: number - w: number - h: number - }): Matrix3 - /** - * 获取某一帧的uvST。 - * [sx, sy, tx, ty]。 - */ - getUVST(frameName: string): Vector4 - protected _buildUVST(frame: { - x: number - y: number - w: number - h: number - }): Vector4 - /** - * 更新某一frame,通过`onUpdate`方法参数中的`texture`和`region`来更新上此帧所占据区域内的图像。 - */ - updateFrame( - frameName: string, - onUpdate: ( - texture: Kanata.Texture, - region: { - x: number - y: number - w: number - h: number - }, - frameName: string - ) => void - ): void - } - export {} -} - -declare module 'XrFrame/assets/PostProcess' { - /** - * PostProcess.ts - * - * * @Date : 10/14/2022, 4:34:55 PM - */ - type Scene = import('XrFrame/core/Scene').default - /** - * 后处理资源初始化参数。 - */ - export interface IPostProcessOptions { - /** - * 类型,目前支持的类型请见[内置后处理资源](https://developers.weixin.qq.com/miniprogram/dev/component/xr-frame/builtin/post-process)。 - */ - type: string - /** - * 是否开启HDR。 - */ - isHDR?: boolean - /** - * 对应类型的数据。 - */ - data?: { - [key: string]: any - } - } - /** - * 后处理资源。 - * - * 一般由{@link AssetPostProcess}加载。 - */ - export default class PostProcess { - /** - * 类型。 - */ - get type(): string - /** - * 是否开启了HDR。 - */ - get isHDR(): boolean - /** - * 数据,可以修改。 - */ - get data(): { - [key: string]: any - } - constructor(_scene: Scene, options: IPostProcessOptions) - } - export {} -} - -declare module 'XrFrame/assets/factories' { - /** - * factories.ts - * - * * @Date : 2022/3/23下午4:04:18 - */ - import Scene from 'XrFrame/core/Scene' - import Effect from 'XrFrame/assets/Effect' - import Geometry from 'XrFrame/assets/Geometry' - import Material from 'XrFrame/assets/Material' - export const TABLE: { - [type: string]: { - [id: string]: (scene: Scene) => any - } - } - /** - * @internal - */ - export function getAssetFactory<T = any>( - type: string, - id: string - ): (scene: Scene) => T - /** - * 注册`Geometry`资源。 - */ - export const registerGeometry: ( - id: string, - factory: (scene: Scene) => Geometry - ) => void - /** - * 注册`Effect`资源。 - */ - export const registerEffect: ( - id: string, - factory: (scene: Scene) => Effect - ) => void - /** - * 注册`Texture`资源。 - */ - export const registerTexture: ( - id: string, - factory: (scene: Scene) => import('XrFrame/kanata/lib/index').Texture - ) => void - /** - * 注册`TextureCube`资源。 - */ - export const registerTextureCube: ( - id: string, - factory: (scene: Scene) => import('XrFrame/kanata/lib/index').Texture - ) => void - /** - * 注册`VertexDataDescriptor`资源。 - */ - export const registerVertexDataDesc: ( - id: string, - factory: ( - scene: Scene - ) => import('XrFrame/kanata/lib/index').VertexDataDescriptor - ) => void - /** - * 注册`UniformDescriptor`资源。 - */ - export const registerUniformDesc: ( - id: string, - factory: ( - scene: Scene - ) => import('XrFrame/kanata/lib/index').UniformDescriptor - ) => void - /** - * 注册`VertexLayout`资源。 - */ - export const registerVertexLayout: ( - id: string, - factory: ( - scene: Scene - ) => import('XrFrame/kanata/lib/index').VertexLayout - ) => void - /** - * 注册`Material`资源。 - */ - export const registerMaterial: ( - id: string, - factory: (scene: Scene) => Material - ) => void -} - -declare module 'XrFrame/assets/easeFunctions' { - /** - * easeFunctions.ts - * - * * @Date : 6/21/2022, 11:24:27 AM - */ - type TEaseFunction = (progress: number) => number - /** - * 可以自定义参数的插值函数。 - */ - export const useParamsEaseFuncs: { - /** - * 二次贝塞尔曲线。 - * - * @param params p1x, p1y, p2x, p2y。 - * @returns 最终的插值函数。 - */ - 'cubic-bezier': ( - times: number[], - params: number[] - ) => (x: number) => number - /** - * 步进插值曲线。 - * - * @param params 一个参数,总步数。 - * @returns 最终的插值函数。 - */ - steps: (times: number[], params: number[]) => (x: number) => number - } - /** - * 不需要自定义参数的一些内置插值曲线。 - */ - export const noneParamsEaseFuncs: { - linear: (x: any) => any - 'ease-in': (x: number) => number - 'ease-out': (x: number) => number - 'ease-in-out': (x: number) => number - 'ease-in-quad': (x: any) => number - 'ease-out-quad': (x: any) => number - 'ease-in-out-quad': (x: any) => number - 'ease-in-cubic': (x: any) => number - 'ease-out-cubic': (x: any) => number - 'ease-in-out-cubic': (x: any) => number - 'ease-in-quart': (x: any) => number - 'ease-out-quart': (x: any) => number - 'ease-in-out-quart': (x: any) => number - 'ease-in-quint': (x: any) => number - 'ease-out-quint': (x: any) => number - 'ease-in-out-quint': (x: any) => number - 'ease-in-sine': (x: any) => number - 'ease-out-sine': (x: any) => number - 'ease-in-out-sine': (x: any) => number - 'ease-in-expo': (x: any) => number - 'ease-out-expo': (x: any) => number - 'ease-in-out-expo': (x: any) => number - 'ease-in-circ': (x: any) => number - 'ease-out-circ': (x: any) => number - 'ease-in-out-circ': (x: any) => number - 'ease-in-back': (x: any) => number - 'ease-out-back': (x: any) => number - 'ease-in-out-back': (x: any) => number - 'ease-in-elastic': (x: any) => number - 'ease-out-elastic': (x: any) => number - 'ease-in-out-elastic': (x: any) => number - 'ease-in-bounce': (x: any) => number - 'ease-out-bounce': TEaseFunction - 'ease-in-out-bounce': (x: any) => number - } - export {} -} - -declare module 'XrFrame/physics/exports' { - export { default as RaycastHit } from 'XrFrame/physics/RaycastHit' - export { ICollideEvent, IOverlapEvent } from 'XrFrame/physics/Collision' - export { IContactPoint } from 'XrFrame/physics/ContactPoint' - export { RaycastDesc } from 'XrFrame/physics/raycast' -} - -declare module 'XrFrame/math/vector2' { - export default class Vector2 { - /** - * x值 - * - * @type {number} - * @memberof Vector2 - */ - get x(): number - set x(val: number) - /** - * y值 - * - * @type {number} - * @memberof Vector2 - */ - get y(): number - set y(val: number) - /** - * 零向量,不要对该对象进行修改 - * - * @readonly - * @static - * @type {V3ReadOnly} - * @memberof Vector3 - */ - static readonly ZERO: Vector2 - /** - * 一向量,不要对该对象进行修改 - * - * @readonly - * @static - * @type {V3ReadOnly} - * @memberof Vector3 - */ - static readonly ONE: Vector2 - _raw: Float32Array - /** - * 使用一个数组创建 - * 此操作会拷贝一份数组 - * - * @static - * @param {number[]} array 数据源,长度必须为2,否则会抛出异常 - * @returns {Vector2} 创建出来的向量 - * @memberof Vector2 - */ - static createFromArray(array: number[]): Vector2 - /** - * 使用某个已有的typedArray创建 - * 此操作不会拷贝数据,而是在原来的内存区域上操作 - * - * @static - * @param {Float32Array} array 数据源 - * @param {number} [offset=0] 数据源中的偏移 - * @returns {Vector2} 创建出来的向量 - * @memberof Vector2 - */ - static createFromTypedArray( - array: Float32Array, - offset?: number - ): Vector2 - /** - * 返回向量数据 - * - * @returns {number[]} 矩阵数据,以JSArray返回 - * @memberof Vector2 - */ - toArray(): number[] - /** - * 判断与目标向量的值是否相等 - * - * @param {V2ReadOnly} v 目标向量 - * @returns {boolean} 是否相等,这里误差小于10^-6视为相等 - * @memberof Vector2 - */ - equal(v: Vector2): boolean - /** - * 拷贝目标向量的值到该向量 - * - * @param {V2ReadOnly} val 目标向量 - * @returns {Vector2} 自身 - * @memberof Vector2 - */ - set(val: Vector2): Vector2 - /** - * 设置向量的值 - * - * @param {number} x x值 - * @param {number} y y值 - * @returns {Vector2} 自身 - * @memberof Vector2 - */ - setValue(x: number, y: number): Vector2 - /** - * 向量加法 - * - * @param {V2ReadOnly} v 目标向量 - * @param {Vector2} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector2} 计算结果 - * @memberof Vector2 - */ - add(v: Vector2, dst?: Vector2): Vector2 - /** - * 向量减法 - * - * @param {V2ReadOnly} v 目标向量 - * @param {Vector2} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector2} 计算结果 - * @memberof Vector2 - */ - sub(v: Vector2, dst?: Vector2): Vector2 - /** - * 向量归一化,如该向量为零向量,则结果依然为零向量 - * - * @param {Vector2} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector2} 计算结果 - * @memberof Vector2 - */ - normalize(dst?: Vector2): Vector2 - /** - * 向量缩放 - * - * @param {number} f 缩放比 - * @param {Vector2} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector2} 计算结果 - * @memberof Vector2 - */ - scale(f: number, dst?: Vector2): Vector2 - /** - * 在该向量与目标向量之间计算插值 - * - * @param {V2ReadOnly} v 目标向量 - * @param {number} f 插值系数 - * @param {Vector2} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector2} 计算结果 - * @memberof Vector2 - */ - lerp(v: Vector2, f: number, dst?: Vector2): Vector2 - /** - * 取反 - * @returns - */ - negate(): this - /** - * 向量点乘 - * - * @param {V2ReadOnly} v 目标向量 - * @returns {number} 计算结果 - * @memberof Vector2 - */ - dot(v: Vector2): number - /** - * 向量的模 - * - * @returns {number} 计算结果 - * @memberof Vector2 - */ - length(): number - /** - * 拷贝该向量 - * - * @returns {Vector2} 拷贝出来的对象 - * @memberof Vector2 - */ - clone(): Vector2 - /** - * 是否为零向量 - * - * @returns {boolean} - * @memberof Vector2 - */ - isZero(): boolean - /** - * 获取向量旋转角,以角度表示 - * - * @returns {number} 旋转角,以角度表示 - * @memberof Vector2 - */ - getAngle(): number - setArray(value: ArrayLike<number>, offset?: number): Vector2 - } -} - -declare module 'XrFrame/math/vector3' { - import QuatReadOnly from 'XrFrame/math/quaternion' - import M4ReadOnly from 'XrFrame/math/matrix4' - export default class Vector3 { - /** - * x值 - * - * @type {number} - * @memberof Vector3 - */ - get x(): number - set x(val: number) - /** - * y值 - * - * @type {number} - * @memberof Vector3 - */ - get y(): number - set y(val: number) - /** - * z值 - * - * @type {number} - * @memberof Vector3 - */ - get z(): number - set z(val: number) - /** - * 零向量,不要对该对象进行修改 - * - * @readonly - * @static - * @type {Vector3} - * @memberof Vector3 - */ - static readonly ZERO: Vector3 - /** - * 一向量,不要对该对象进行修改 - * - * @readonly - * @static - * @type {Vector3} - * @memberof Vector3 - */ - static readonly ONE: Vector3 - /** - * 上方向,不要对该对象进行修改 - * - * @static - * @type {Vector3} - * @memberof Vector3 - */ - static readonly Up: Vector3 - /** - * 前方向,基于左手坐标系,不要对该对象进行修改 - * - * @static - * @type {Vector3} - * @memberof Vector3 - */ - static readonly ForwardLH: Vector3 - _raw: Float32Array - /** - * 使用一个数组创建 - * 此操作会拷贝一份数组 - * - * @static - * @param {number[]} array 数据源,长度必须为3,否则会抛出异常 - * @returns {Vector3} 创建出来的向量 - * @memberof Vector3 - */ - static createFromArray(array: number[]): Vector3 - /** - * 使用某个已有的typedArray创建 - * 此操作不会拷贝数据,而是在原来的内存区域上操作 - * - * @static - * @param {Float32Array} array 数据源 - * @param {number} [offset=0] 数据源中的偏移 - * @returns {Vector3} - * @memberof Vector3 - */ - static createFromTypedArray( - array: Float32Array, - offset?: number - ): Vector3 - /** - * 使用四元数进行向量旋转 - * - * @static - * @param {Vector3} source 源向量 - * @param {QuatReadOnly} rotation 用于旋转的四元数 - * @param {Vector3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector3} 计算结果 - * @memberof Vector3 - */ - static transformQuat( - source: Vector3, - rotation: QuatReadOnly, - dst?: Vector3 - ): Vector3 - static transformCoordinate( - coordinate: Vector3, - transform: M4ReadOnly, - dst?: Vector3 - ): Vector3 - /** - * 返回向量数据 - * - * @returns {number[]} 矩阵数据,以JSArray返回 - * @memberof Vector3 - */ - toArray(): [number, number, number] - /** - * 判断与目标向量的值是否相等 - * - * @param {Vector3} v 目标向量 - * @returns {boolean} 是否相等,这里误差小于10^-6视为相等 - * @memberof Vector3 - */ - equal(v: Vector3): boolean - /** - * 拷贝目标向量的值到该向量 - * - * @param {Vector3} val 目标向量 - * @returns {Vector3} 自身 - * @memberof Vector3 - */ - set(v: Vector3): Vector3 - /** - * 设置向量的值 - * - * @param {number} x x - * @param {number} y y - * @param {number} z z - * @returns {Vector3} 自身 - * @memberof Vector3 - */ - setValue(x: number, y: number, z: number): Vector3 - setFromArray(xyz: number[]): Vector3 - /** - * 向量加法 - * - * @param {Vector3} v 目标向量 - * @param {Vector3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector3} 计算结果 - * @memberof Vector3 - */ - add(v: Vector3, dst?: Vector3): Vector3 - /** - * 向量减法 - * - * @param {Vector3} v 目标向量 - * @param {Vector3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector3} 计算结果 - * @memberof Vector3 - */ - sub(v: Vector3, dst?: Vector3): Vector3 - /** - * 向量叉乘 - * - * @param {Vector3} v 目标向量 - * @param {Vector3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector3} 计算结果 - * @memberof Vector3 - */ - cross(v: Vector3, dst?: Vector3): Vector3 - /** - * 向量归一化 - * - * @param {Vector3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector3} 计算结果 - * @memberof Vector3 - */ - normalize(dst?: Vector3): Vector3 - /** - * 向量缩放 - * - * @param {number} f 缩放比 - * @param {Vector3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector3} 计算结果 - * @memberof Vector3 - */ - scale(f: number, dst?: Vector3): Vector3 - /** - * 向量缩放 - * - * @param {number} x x缩放比 - * @param {number} y y缩放比 - * @param {number} z z缩放比 - * @param {Vector3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector3} 计算结果 - * @memberof Vector3 - */ - scaleXYZ(x: number, y: number, z: number, dst?: Vector3): Vector3 - /** - * 在该向量与目标向量之间计算插值 - * - * @param {Vector3} v 目标向量 - * @param {number} f 插值系数 - * @param {Vector3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector3} 计算结果 - * @memberof Vector3 - */ - lerp(v: Vector3, f: number, dst?: Vector3): Vector3 - /** - * 取反 - * @returns - */ - negate(): this - abs(): this - /** - * 向量点乘 - * - * @param {Vector3} v 目标向量 - * @returns {number} 计算结果 - * @memberof Vector3 - */ - dot(v: Vector3): number - /** - * 向量的模 - * - * @returns {number} 计算结果 - * @memberof Vector3 - */ - length(): number - /** - * 拷贝该向量 - * - * @returns {Vector3} 拷贝出来的对象 - * @memberof Vector3 - */ - clone(): Vector3 - /** - * 是否为零向量 - * - * @returns {boolean} - * @memberof Vector3 - */ - isZero(): boolean - /** - * 获取到目标点的距离 - * - * @param {Vector3} p 目标点 - * @returns {number} 计算结果 - * @memberof Vector3 - */ - distanceTo(p: Vector3): number - /** - * 获取到目标点的角度 - * - * @param {Vector3} location 目标点 - * @returns {number} 计算结果 - * @memberof Vector3 - */ - angleTo(location: Vector3, dst?: Vector3): Vector3 - setFromMatrixColumn(m: M4ReadOnly, index: number): Vector3 - fromArray(array: Float32Array, offset: number): Vector3 - setFromMatrixScale(m: M4ReadOnly): Vector3 - /** - * create by janzen - * Sets this vector to the position elements of the transformation matrix - */ - setFromMatrixPosition(worldMatrix: M4ReadOnly): Vector3 - /** - * create by janzen - * Multiplies this vector (with an implicit 1 in the 4th dimension) and m, and divides by perspective. - */ - applyMatrix4(m: M4ReadOnly): Vector3 - /** - * create by roamye - * Multiplies this vector (with an implicit 1 in the 4th dimension) and m, and divides by perspective. - */ - applyMatrix4Raw(m: Float32Array): this - applyQuaternion(q: QuatReadOnly): this - /** - * create by janzen - * Transforms the direction of this vector by a matrix (the upper left 3 x 3 subset of a m) and then normalizes the result. - */ - transformDirection(m: M4ReadOnly): Vector3 - /** - * create by roamye - * Transforms the direction of this vector by a matrix (the upper left 3 x 3 subset of a m) and then normalizes the result. - */ - transformDirectionRaw(raw: Float32Array): Vector3 - /** - * created by shanexyzhou - * 从物理引擎内的RawVec3f生成Vector3 - */ - static fromPhysics(v: any): Vector3 - fromPhysics(v: any): Vector3 - static Phys3D?: typeof phys3D - static clearPhysicsPool(): void - /** - * created by shanexyzhou - * 生成物理引擎内的RawVec3f - */ - toPhysics(): any - setArray(value: ArrayLike<number>, offset?: number): Vector3 - print(): void - } - export class Vector3ReadOnly extends Vector3 { - get x(): number - set x(v: number) - get y(): number - set y(v: number) - get z(): number - set z(v: number) - constructor(array?: Float32Array, offset?: number) - set(): this - setValue(): this - } -} - -declare module 'XrFrame/math/vector4' { - export default class Vector4 { - /** - * x值 - * - * @type {number} - * @memberof Vector4 - */ - get x(): number - set x(val: number) - /** - * y值 - * - * @type {number} - * @memberof Vector4 - */ - get y(): number - set y(val: number) - /** - * z值 - * - * @type {number} - * @memberof Vector4 - */ - get z(): number - set z(val: number) - /** - * w值 - * - * @type {number} - * @memberof Vector4 - */ - get w(): number - set w(val: number) - /** - * 零向量,不要对该对象进行修改 - * - * @static - * @readonly - * @type {Vector4} - * @memberof Vector4 - */ - static readonly ZERO: Vector4 - /** - * 一向量,不要对该对象进行修改 - * - * @readonly - * @static - * @type {V3ReadOnly} - * @memberof Vector3 - */ - static readonly ONE: Vector4 - _raw: Float32Array - /** - * 使用一个数组创建 - * 此操作会拷贝一份数组 - * - * @static - * @param {number[]} array 数据源,长度必须为4,否则会抛出异常 - * @returns {Vector4} 创建出来的向量 - * @memberof Vector4 - */ - static createFromArray(array: number[]): Vector4 - /** - * 使用某个已有的typedArray创建 - * 此操作不会拷贝数据,而是在原来的内存区域上操作 - * - * @static - * @param {Float32Array} array 数据源 - * @param {number} [offset=0] 数据源中的偏移 - * @returns {Vector4} - * @memberof Vector4 - */ - static createFromTypedArray( - array: Float32Array, - offset?: number - ): Vector4 - /** - * 返回向量数据 - * - * @returns {number[]} 矩阵数据,以JSArray返回 - * @memberof Vector4 - */ - toArray(): number[] - /** - * 判断与目标向量的值是否相等 - * - * @param {Vector4} v 目标向量 - * @returns {boolean} 是否相等,这里误差小于10^-6视为相等 - * @memberof Vector4 - */ - equal(v: Vector4): boolean - /** - * 拷贝目标向量的值到该向量 - * - * @param {Vector4} val 目标向量 - * @returns {Vector4} 自身 - * @memberof Vector4 - */ - set(v: Vector4): Vector4 - /** - * 设置向量的值 - * - * @param {number} x x值 - * @param {number} y y值 - * @param {number} z z值 - * @param {number} w w值 - * @returns {Vector4} 自身 - * @memberof Vector4 - */ - setValue(x: number, y: number, z: number, w: number): Vector4 - /** - * 向量加法 - * - * @param {Vector4} v 目标向量 - * @param {Vector4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector4} 计算结果 - * @memberof Vector4 - */ - add(v: Vector4, dst?: Vector4): Vector4 - /** - * 向量减法 - * - * @param {Vector4} v 目标向量 - * @param {Vector4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector4} 计算结果 - * @memberof Vector4 - */ - sub(v: Vector4, dst?: Vector4): Vector4 - /** - * 向量缩放 - * - * @param {number} f 缩放比 - * @param {Vector4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector4} 计算结果 - * @memberof Vector4 - */ - scale(f: number, dst?: Vector4): Vector4 - /** - * 在该向量与目标向量之间计算插值 - * - * @param {Vector4} v 目标向量 - * @param {number} f 插值系数 - * @param {Vector4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector4} 计算结果 - * @memberof Vector4 - */ - lerp(v: Vector4, f: number, dst?: Vector4): Vector4 - /** - * 取反 - * @returns - */ - negate(): this - /** - * 向量点乘 - * - * @param {Vector4} v 目标向量 - * @returns {number} 计算结果 - * @memberof Vector4 - */ - dot(v: Vector4): number - /** - * 是否为零向量 - * - * @returns {boolean} - * @memberof Vector4 - */ - isZero(): boolean - /** - * 拷贝该向量 - * - * @returns {Vector4} 拷贝出来的对象 - * @memberof Vector4 - */ - clone(): Vector4 - setArray(value: ArrayLike<number>, offset?: number): Vector4 - } -} - -declare module 'XrFrame/math/quaternion' { - import Vector3 from 'XrFrame/math/vector3' - import V3ReadOnly from 'XrFrame/math/vector3' - import QuatReadOnly from 'XrFrame/math/quaternion' - import M4ReadOnly from 'XrFrame/math/matrix4' - /** - * @public - */ - export default class Quaternion { - set x(val: number) - /** - * y值 - * - * @type {number} - * @memberof Quaternion - */ - get y(): number - set y(val: number) - /** - * z值 - * - * @type {number} - * @memberof Quaternion - */ - get z(): number - set z(val: number) - /** - * w值 - * - * @type {number} - * @memberof Quaternion - */ - get w(): number - set w(val: number) - /** - * 默认四元数,不要对该对象进行修改 - * - * @readonly - * @static - * @type {QuatReadOnly} - * @memberof Quaternion - */ - static readonly DEFAULT: QuatReadOnly - _raw: Float32Array - /** - * 从旋转矩阵创建 - * - * @static - * @param {Matrix4} mat - * @param {Quaternion} [dst] - * @returns {Quaternion} - * @memberof Quaternion - */ - static createFromMatrix4(mat: M4ReadOnly, dst?: Quaternion): Quaternion - /** - * 从轴向旋转创建 - * - * @static - * @param {V3ReadOnly} axis 旋转轴 - * @param {number} rad 旋转幅度 - * @param {Quaternion} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Quaternion} 计算结果 - * @memberof Quaternion - */ - static createFromAxisAngle( - axis: V3ReadOnly, - rad: number, - dst?: Quaternion - ): Quaternion - /** - * 由视角方向创建四元数 - * - * @static - * @param {V3ReadOnly} forward 前方向 - * @param {V3ReadOnly} up 上方向 - * @param {Quaternion} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Quaternion} 计算结果 - * @memberof Quaternion - */ - static lookRotation( - forward: V3ReadOnly, - up: V3ReadOnly, - dst?: Quaternion - ): Quaternion - /** - * 使用数值创建 - * - * @static - * @param {number} x x - * @param {number} y y - * @param {number} z z - * @param {number} w w - * @returns {Quaternion} 创建出来的四元数 - * @memberof Quaternion - */ - static createFromNumber( - x: number, - y: number, - z: number, - w: number - ): Quaternion - /** - * 使用一个数组创建 - * 此操作会拷贝一份数组 - * - * @static - * @param {number[]} array 数据源,长度必须为4,否则会抛出异常 - * @returns {Quaternion} - * @memberof Quaternion - */ - static createFromArray(array: number[]): Quaternion - /** - * 使用某个已有的typedArray创建 - * 此操作不会拷贝数据,而是在原来的内存区域上操作 - * - * @static - * @param {Float32Array} array 数据源 - * @param {number} [offset=0] 数据源中的偏移 - * @returns {Quaternion} - * @memberof Quaternion - */ - static createFromTypedArray( - array: Float32Array, - offset?: number - ): Quaternion - /** - * 通过俩个向量创建四元数 - * @param vFrom - * @param vTo - * @returns - */ - static createFromUnitVectors(vFrom: Vector3, vTo: Vector3): QuatReadOnly - /** - * 拷贝目标四元数的值到自身 - * - * @param {Quaternion} quat 目标四元数 - * @returns {Quaternion} 自身 - * @memberof Quaternion - */ - set(quat: Quaternion): Quaternion - /** - * 设置四元数的值 - * - * @param {number} x - * @param {number} y - * @param {number} z - * @param {number} w - * @returns {Quaternion} 自身 - * @memberof Quaternion - */ - setValue(x: number, y: number, z: number, w: number): Quaternion - /** - * 球面插值 - * - * @param {Quaternion} right 目标四元数 - * @param {number} t 插值系数,越接近 1 则结果越接近目标 - * @param {Quaternion} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Quaternion} 计算结果 - * @memberof Quaternion - */ - slerp(right: QuatReadOnly, t: number, dst?: Quaternion): Quaternion - /** - * 四元数反转 - * - * @param {Quaternion} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Quaternion} 计算结果 - * @memberof Quaternion - */ - invert(dst?: Quaternion): Quaternion - /** - * 四元数相加 - * - * @param {Quaternion} quat 目标四元数 - * @param {Quaternion} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Quaternion} 计算结果 - * @memberof Quaternion - */ - add(quat: QuatReadOnly, dst?: Quaternion): Quaternion - /** - * 四元数相减 - * - * @param {Quaternion} quat 目标四元数 - * @param {Quaternion} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Quaternion} 计算结果 - * @memberof Quaternion - */ - sub(quat: QuatReadOnly, dst?: Quaternion): Quaternion - /** - * 四元数相乘 - * - * @param {Quaternion} quat 目标四元数 - * @param {Quaternion} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Quaternion} 计算结果 - * @memberof Quaternion - */ - multiply(quat: QuatReadOnly, dst?: Quaternion): Quaternion - premultiply(q: QuatReadOnly): QuatReadOnly - /** - * 点乘 - * @param q - */ - dot(q: QuatReadOnly): number - length(): number - normalize(): this - setFromUnitVectors(vFrom: any, vTo: any): this - setFromYawRollPitch(yaw: number, roll: number, pitch: number): void - setFromEulerAngles(euler: Vector3): void - /** - * 相对角度 - * @param q - */ - angleTo(q: QuatReadOnly): number - /** - * 转向对应的角度 - * @param q - * @param step - */ - rotateTowards(q: any, step: any): QuatReadOnly - /** - * 拷贝四元数 - * - * @returns {Quaternion} 拷贝后的对象 - * @memberof Quaternion - */ - clone(): Quaternion - /** - * 四元数是否为默认四元数(表示零旋转) - * - * @returns {boolean} - * @memberof Quaternion - */ - isDefault(): boolean - /** - * 将该四元数转换成欧拉角,x代表Pitch,y代表Yaw,z代表Roll - * 旋转的顺序为YXZ - * - * @param {Vector3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector3} 计算结果 - * @memberof Quaternion - */ - toEulerAngles(dst?: Vector3): Vector3 - /** - * 判断与目标四元数的值是否相等 - * - * @param {QuatReadOnly} quat 目标四元数 - * @returns {boolean} - * @memberof Quaternion - */ - equal(quat: QuatReadOnly): boolean - /** - * created by shanexyzhou - * 从物理引擎内的RawQuaternion生成Quaternion - */ - static fromPhysics(v: phys3D.RawQuaternion): Quaternion - fromPhysics(v: phys3D.RawQuaternion): Quaternion - static Phys3D?: typeof phys3D - static clearPhysicsPool(): void - /** - * created by shanexyzhou - * 生成物理引擎内的RawQuaternion - */ - toPhysics(): phys3D.RawQuaternion - setArray(value: ArrayLike<number>, offset?: number): Quaternion - transformVector3(vec: Vector3): Vector3 - /** - * 对[1,1,1]向量进行转换。 - */ - toAxisUnit(): Vector3 - } -} - -declare module 'XrFrame/math/matrix3' { - import Vector2 from 'XrFrame/math/vector2' - import V2ReadOnly from 'XrFrame/math/vector2' - export default class Matrix3 { - get raw(): Float32Array - _raw: Float32Array - /** - * 使用一个数组创建 - * 此操作会拷贝一份数组 - * - * @static - * @param {number[]} array 数据源,长度必须为9,否则会抛出异常 - * @returns {Matrix3} 创建出来的矩阵 - * @memberof Matrix3 - */ - static createFromArray(array: number[]): Matrix3 - /** - * 使用某个已有的typedArray创建 - * 此操作不会拷贝数据,而是在原来的内存区域上操作 - * - * @static - * @param {Float32Array} array 数据源 - * @param {number} [offset=0] 数据源中的偏移 - * @returns {Matrix3} 创建出来的矩阵 - * @memberof Matrix3 - */ - static createFromTypedArray( - array: Float32Array, - offset?: number - ): Matrix3 - /** - * 返回矩阵数据 - * - * @returns {number[]} 矩阵数据,以JSArray返回 - * @memberof Matrix3 - */ - toArray(): number[] - /** - * 将该矩阵进行位移变换 - * - * @param {number} tx x轴位移 - * @param {number} ty y轴位移 - * @param {Matrix3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix3} 计算结果 - * @memberof Matrix3 - */ - translate(tx: number, ty: number, dst?: Matrix3): Matrix3 - /** - * 将该矩阵进行缩放变换 - * - * @param {number} sx x轴缩放 - * @param {number} sy y轴缩放 - * @param {Matrix3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix3} 计算结果 - * @memberof Matrix3 - */ - scale(sx: number, sy: number, dst?: Matrix3): Matrix3 - /** - * 将该矩阵进行旋转变换 - * - * @param {number} radians 旋转幅度,用弧度表示 - * @param {Matrix3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix3} 计算结果 - * @memberof Matrix3 - */ - rotate(radians: number, dst?: Matrix3): Matrix3 - /** - * 求该矩阵的逆 - * - * @param {Matrix3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix3} 计算结果 - * @memberof Matrix3 - */ - inverse(dst?: Matrix3): Matrix3 - /** - * 将该矩阵与另一个矩阵相乘 - * - * @param {Matrix3} m 右乘矩阵 - * @param {Matrix3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix3} 计算结果 - * @memberof Matrix3 - */ - multiply(m: Matrix3, dst?: Matrix3): Matrix3 - /** - * 矩阵变换作用于点 - * - * @param {Vector2} v 点 - * @param {Vector2} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector2} 计算结果 - * @memberof Matrix3 - */ - transformPoint(v: V2ReadOnly, dst?: Vector2): Vector2 - setArray(value: ArrayLike<number>, offset?: number): Matrix3 - } -} - -declare module 'XrFrame/math/matrix4' { - import Vector3 from 'XrFrame/math/vector3' - import Vector4 from 'XrFrame/math/vector4' - import V3ReadOnly from 'XrFrame/math/vector3' - import V4ReadOnly from 'XrFrame/math/vector4' - import QuatReadOnly from 'XrFrame/math/quaternion' - import M3ReadOnly from 'XrFrame/math/matrix3' - /** - * @public - */ - export default class Matrix4 { - _raw: Float32Array - /** - * 构造相机矩阵 - * - * @static - * @param {Vector3} position 相机位置 - * @param {Vector3} target 相机目标位置 - * @param {Vector3} up 上方向 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - static lookAt( - position: V3ReadOnly, - target: V3ReadOnly, - up: V3ReadOnly, - dst?: Matrix4 - ): Matrix4 - /** - * 构造透视投影矩阵 - * - * @static - * @param {number} fieldOfViewRadians 视野大小,用弧度表示 - * @param {number} aspect 宽高比 - * @param {number} near 近平面 - * @param {number} far 远平面 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - static perspective( - fieldOfViewRadians: number, - aspect: number, - near: number, - far: number, - dst?: Matrix4 - ): Matrix4 - /** - * 构造正交投影矩阵 - * - * @static - * @param {number} left 左平面 - * @param {number} right 右平面 - * @param {number} bottom 上平面 - * @param {number} top 下平面 - * @param {number} near 近平面 - * @param {number} far 远平面 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - static orthographic( - left: number, - right: number, - bottom: number, - top: number, - near: number, - far: number, - dst?: Matrix4 - ): Matrix4 - /** - * 将四元数转换为旋转矩阵 - * - * @static - * @param {Quaternion} quat 四元数 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - static fromQuaternion(quat: QuatReadOnly, dst?: Matrix4): Matrix4 - /** - * 使用一个数组创建 - * 此操作会拷贝一份数组 - * - * @static - * @param {number[]} array 数据源,长度必须为16,否则会抛出异常 - * @returns {Matrix4} 创建出来的矩阵 - * @memberof Matrix4 - */ - static createFromArray(array: number[]): Matrix4 - /** - * 使用某个已有的typedArray创建 - * 此操作不会拷贝数据,而是在原来的内存区域上操作 - * - * @static - * @param {Float32Array} array 数据源 - * @param {number} [offset=0] 数据源中的偏移 - * @returns {Matrix4} 创建出来的矩阵 - * @memberof Matrix4 - */ - static createFromTypedArray( - array: Float32Array, - offset?: number - ): Matrix4 - /** - * 创建绕X轴旋转的矩阵 - * - * @static - * @param {number} rad 旋转幅度,用弧度表示 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - static createRotationX(rad: number, dst?: Matrix4): Matrix4 - /** - * 创建绕Y轴旋转的矩阵 - * - * @static - * @param {number} rad 旋转幅度,用弧度表示 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - static createRotationY(rad: number, dst?: Matrix4): Matrix4 - /** - * 创建绕Z轴旋转的矩阵 - * - * @static - * @param {number} rad 旋转轴 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - static createRotationZ(rad: number, dst?: Matrix4): Matrix4 - /** - * 创建绕指定轴旋转的矩阵 - * - * @static - * @param {Vector3} axis 旋转轴 - * @param {number} angleInRadians 旋转幅度,用弧度表示 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - static createRotationAxis( - axis: V3ReadOnly, - angleInRadians: number, - dst?: Matrix4 - ): Matrix4 - /** - * 将位移旋转缩放合成一个RST矩阵,旋转用矩阵表示 - * - * @static - * @param {V3ReadOnly} translation 位移向量 - * @param {M4ReadOnly} rotation 旋转矩阵 - * @param {V3ReadOnly} scale 缩放向量 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - static composeTRS( - translation: V3ReadOnly, - rotation: Matrix4, - scale: V3ReadOnly, - dst?: Matrix4 - ): Matrix4 - /** - * 将位移旋转缩放合成一个RST矩阵,旋转用四元数表示 - * - * @static - * @param {V3ReadOnly} translation 位移向量 - * @param {QuatReadOnly} rotation 旋转四元数 - * @param {V3ReadOnly} scale 缩放向量 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - static composeTQS( - translation: V3ReadOnly, - rotation: QuatReadOnly, - scale: V3ReadOnly, - dst?: Matrix4 - ): Matrix4 - /** - * 从二维RST矩阵扩展到三维RST矩阵 - * - * @static - * @param {Matrix3} m3 二维RST矩阵 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - static composeFromRST3(m3: M3ReadOnly, dst?: Matrix4): Matrix4 - /** - * 返回矩阵数据 - * - * @returns {number[]} 矩阵数据,以JSArray返回 - * @memberof Matrix4 - */ - toArray(): number[] - /** - * 将该矩阵进行位移变换 - * - * @param {number} tx x轴位移 - * @param {number} ty y轴位移 - * @param {number} tz z轴位移 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - translate(tx: number, ty: number, tz: number, dst?: Matrix4): Matrix4 - /** - * 将该矩阵进行缩放变换 - * - * @param {number} sx x轴缩放 - * @param {number} sy y轴缩放 - * @param {number} sz z轴缩放 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - scale(sx: number, sy: number, sz: number, dst?: Matrix4): Matrix4 - /** - * 将该矩阵绕x轴旋转 - * - * @param {number} rx 旋转幅度,用弧度表示 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - xRotate(rx: number, dst?: Matrix4): Matrix4 - /** - * 将该矩阵绕y轴旋转 - * - * @param {number} ry 旋转幅度,用弧度表示 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - yRotate(ry: number, dst?: Matrix4): Matrix4 - /** - * 将该矩阵绕z轴旋转 - * - * @param {number} rz 旋转幅度,用弧度表示 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - zRotate(rz: number, dst?: Matrix4): Matrix4 - /** - * 将该矩阵绕指定轴旋转 - * - * @param {Vector3} axis 轴向量 - * @param {number} angleInRadians 旋转幅度,用弧度表示 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - axisRotate( - axis: V3ReadOnly, - angleInRadians: number, - dst?: Matrix4 - ): Matrix4 - /** - * 将该矩阵使用指定四元数旋转 - * - * @param {Quaternion} quaternion 四元数 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - rotateByQuaternion(quaternion: QuatReadOnly, dst?: Matrix4): Matrix4 - /** - * 求该矩阵的逆 - * - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - inverse(dst?: Matrix4): Matrix4 - /** - * 求该矩阵的转置 - * - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - transpose(dst?: Matrix4): Matrix4 - /** - * 将该矩阵与另一个矩阵相乘 - * - * @param {Matrix4} m 右乘矩阵 - * @param {Matrix4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Matrix4} 计算结果 - * @memberof Matrix4 - */ - multiply(m: Matrix4, dst?: Matrix4): Matrix4 - /** - * 矩阵变换作用于向量 - * - * @param {Vector4} v 向量 - * @param {Vector4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector4} 计算结果 - * @memberof Matrix4 - */ - transformVector(v: V4ReadOnly, dst?: Vector4): Vector4 - /** - * 矩阵变换作用于方向 - * - * @param {Vector3} dir 方向 - * @param {Vector3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector3} 计算结果 - * @memberof Matrix4 - */ - transformDirection(dir: V3ReadOnly, dst?: Vector3): Vector3 - /** - * 矩阵变换作用于点 - * - * @param {Vector3} p 点 - * @param {Vector3} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector3} 计算结果 - * @memberof Matrix4 - */ - transformPoint(p: V3ReadOnly, dst?: Vector3): Vector3 - /** - * 拷贝目标矩阵的值到该矩阵 - * - * @param {M4ReadOnly} val 目标 - * @returns {Matrix4} 自身 - * @memberof Matrix4 - */ - set(val: Matrix4): Matrix4 - /** - * 拷贝该矩阵 - * - * @returns {Matrix4} 拷贝出来的对象 - * @memberof Matrix4 - */ - clone(): Matrix4 - /** - * 分解RTS矩阵为位移、旋转、缩放向量,返回是否成功 - * - * @param {Vector3} dstTranslation 目标位移向量 - * @param {Matrix4} dstRotationMatrix 目标旋转矩阵 - * @param {Vector3} dstScale 目标缩放分量 - * @returns {boolean} 分解是否成功,如不成功,可能是缩放分量为0 - * @memberof Matrix4 - */ - decomposeTransRotMatScale( - dstTranslation: Vector3, - dstRotationMatrix: Matrix4, - dstScale: Vector3 - ): boolean - /** - * 设置该矩阵某行某列的值 - * - * @param {number} value 值 - * @param {number} column 列数 - * @param {number} row 行数 - * @returns {Matrix4} 自身 - * @memberof Matrix4 - */ - setValue(value: number, column: number, row: number): Matrix4 - /** - * 获取矩阵某行某列的值 - * - * - * @param {number} column 列数 - * @param {number} row 行数 - * @returns {number} 自身 - * @memberof Matrix4 - */ - getValue(column: number, row: number): number - /** - * 设置矩阵某列 - * - * @param {V4ReadOnly} vec 列向量 - * @param {number} column 列数 - * @returns {Matrix4} 自身 - * @memberof Matrix4 - */ - setColumn(vec: V4ReadOnly, column: number): Matrix4 - /** - * 获取矩阵某列 - * - * @param {number} column 列数 - * @param {Vector4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector4} 该列数据 - * @memberof Matrix4 - */ - getColumn(column: number, dst?: Vector4): Vector4 - /** - * 设置矩阵某行 - * - * @param {V4ReadOnly} vec 行向量 - * @param {number} row 行数 - * @returns {Matrix4} 自身 - * @memberof Matrix4 - */ - setRow(vec: V4ReadOnly, row: number): Matrix4 - /** - * 获取矩阵某行 - * - * @param {number} row 行数 - * @param {Vector4} [dst] 计算结果输出到的目标对象,如不传则新建一个 - * @returns {Vector4} 该行数据 - * @memberof Matrix4 - */ - getRow(row: number, dst?: Vector4): Vector4 - setArray(value: ArrayLike<number>, offset?: number): Matrix4 - print(): void - } -} - -declare module 'XrFrame/math/color' { - import Vector3 from 'XrFrame/math/vector3' - export enum BlendType { - Alpha = 0, - RGB = 1, - RGBA = 2, - None = 3 - } - export const GetColorFromHex: (str: any) => number - /** - * @public - */ - export default class Color { - get r(): number - set r(val: number) - get g(): number - set g(val: number) - get b(): number - set b(val: number) - get a(): number - set a(val: number) - static get WHITE(): Color - static get BLACK(): Color - static get TRANSPARENT(): Color - static BlendType: typeof BlendType - static blendColorHex( - colorHexA: number, - colorHexB: number, - type?: BlendType - ): number - static multiplyColorHex( - colorHexA: number, - colorHexB: number, - type?: BlendType - ): number - static getValue32FromRGBA( - r: number, - g: number, - b: number, - a: number - ): number - static getValue32FromHSVA(): void - static percentRoundFn(num: number): number - static diffc(v: number, c: number, diff: number): number - static rgb2hsv(r: number, g: number, b: number, dst?: Vector3): Vector3 - static hsvV2rgb(h: number, s: number, v: number, dst?: Vector3): Vector3 - static randomMix( - colorHexA: number, - colorHexB: number, - randomSeed?: number - ): number - static fromHex(hex: number): Color - static fromHexString(hexString: string): Color - static fromFloatArray(arr: number[]): Color - equals(target: Color): boolean - set(val: Color): void - setRGBA(r: number, g: number, b: number, a: number): void - setValue32(v32: number): void - toNormalizedArray(): [number, number, number, number] - toRGBAString(): string - mix(color: Color, dst?: Color): Color - } -} - -declare module 'XrFrame/math/OBB' { - import Vector3 from 'XrFrame/math/vector3' - export default class OBB { - constructor() - setValues( - cenX: number, - cenY: number, - cenZ: number, - forward: Vector3, - w: number, - h: number, - d: number - ): void - get center(): Vector3 - set center(pos: Vector3) - get width(): number - set width(w: number) - get height(): number - set height(h: number) - get depth(): number - set depth(d: number) - setForward(forward: Vector3): void - get AxisX(): Vector3 - get AxisY(): Vector3 - get AxisZ(): Vector3 - } -} - -declare module 'XrFrame/math/boundBall' { - import Vector3 from 'XrFrame/math/vector3' - import V3ReadOnly from 'XrFrame/math/vector3' - export default class BoundBall { - static readonly OFFSETS: Readonly<{ - center: number - radius: number - }> - /** - * 包围球中心 - * - * @type {V3ReadOnly} - * @memberof BoundBall - */ - get center(): V3ReadOnly - set center(val: V3ReadOnly) - /** - * 包围球半径 - * - * @type {number} - * @memberof BoundBall - */ - get radius(): number - set radius(val: number) - _raw: Float32Array - _offset: number - protected _center?: Vector3 - constructor(raw?: Float32Array, offset?: number) - /** - * 使用中心和半径创建包围球 - * - * @static - * @param {V3ReadOnly} center - * @param {number} radius - * @returns {BoundBall} - * @memberof BoundBall - */ - static createFromCenterAndRadius( - center: V3ReadOnly, - radius: number - ): BoundBall - /** - * 设置值 - * - * @param {V3ReadOnly} center - * @param {number} radius - * @returns {BoundBall} - * @memberof BoundBall - */ - setValue(center: V3ReadOnly, radius: number): BoundBall - /** - * 使用一系列点初始化 - * - * @param {V3ReadOnly[]} points - * @returns {BoundBall} 自身 - * @memberof BoundBall - */ - initByPoints(points: V3ReadOnly[]): BoundBall - initByPointRadius(center: V3ReadOnly, radius: number): void - } -} - -declare module 'XrFrame/math/boundBox' { - import Vector3 from 'XrFrame/math/vector3' - import V3ReadOnly from 'XrFrame/math/vector3' - export default class BoundBox { - static readonly OFFSETS: Readonly<{ - center: number - size: number - }> - /** - * 包围盒中心 - * - * @type {Vector3} - * @memberof BoundBox - */ - get center(): V3ReadOnly - set center(val: V3ReadOnly) - /** - * 包围盒尺寸 - * - * @memberof BoundBox - */ - get size(): V3ReadOnly - set size(val: V3ReadOnly) - _raw: Float32Array - _offset: number - protected _center?: Vector3 - protected _size?: Vector3 - constructor(raw?: Float32Array, offset?: number) - /** - * 使用中心和尺寸创建包围球 - * - * @static - * @param {V3ReadOnly} center 中心 - * @param {V3ReadOnly} size 尺寸 - * @returns {BoundBall} - * @memberof BoundBall - */ - static createFromCenterAndSize( - center: V3ReadOnly, - size: V3ReadOnly - ): BoundBox - /** - * 设置值 - * - * @param {V3ReadOnly} center - * @param {V3ReadOnly} size - * @returns {BoundBox} - * @memberof BoundBox - */ - setValue(center: V3ReadOnly, size: V3ReadOnly): BoundBox - initByPoints(points: Vector3[], length?: number): void - startInitByPoints(): void - addPoint(corner: Vector3): void - endInitByPoints(): void - } -} - -declare module 'XrFrame/math/Spherical' { - /** - * Spherical.ts - * - * * @Date : 2022/1/14下午4:49:50 - */ - import Vector3 from 'XrFrame/math/vector3' - /** - * 球面坐标系。 - */ - export default class Spherical { - static EPS: number - isSpherical: boolean - /** - * 球面半径。 - */ - radius: number - /** - * 点在球面上的横向旋转角度。 - */ - phi: number - /** - * 点在球面上的纵向旋转角度。 - */ - theta: number - /** - * 球面球心。 - */ - center: Vector3 - constructor(radius?: number, phi?: number, theta?: number) - set(radius: number, phi: number, theta: number): this - clone(): Spherical - copy(other: Spherical): this - /** - * restrict phi to be between EPS and PI-EPS。 - */ - makeSafe(): this - /** - * 从笛卡尔坐标系的Vector3转换。 - */ - setFromVector3(vector: Vector3): this - /** - * 从笛卡尔坐标系的x、y、z转换。 - */ - setFromCartesianCoords(x: number, y: number, z: number): this - /** - * 转换到笛卡尔坐标系的Vector3。 - */ - toVector3(vector?: Vector3): Vector3 - } -} - -declare module 'XrFrame/kanata/lib/kanata' { - import * as IKanata from 'XrFrame/kanata/lib/frontend' - import { IEngineSettings } from 'XrFrame/kanata/lib/backend/interface' - - export * from 'XrFrame/kanata/lib/backend/interface' - export { - ITextureOptions, - IRenderPassDescriptor - } from 'XrFrame/kanata/lib/index' - - export type AnimatorComponent = IKanata.AnimatorComponent - export type CameraComponent = IKanata.CameraComponent - export type LightCameraComponent = IKanata.LightCameraComponent - export type CullingComponent = IKanata.CullingComponent - export type MeshRendererComponent = IKanata.MeshRendererComponent - export type SkinnedSkeletonComponent = IKanata.SkinnedSkeletonComponent - export type DynamicBonesComponent = IKanata.DynamicBonesComponent - export type Entity2D = IKanata.Entity2D - export type Entity3D = IKanata.Entity3D - export type AnimationClipModel = IKanata.AnimationClipModel - export type AnimationClipBinding = IKanata.AnimationClipBinding - export type AnimatorControllerModel = IKanata.AnimatorControllerModel - export type AnimatorControllerStateModel = - IKanata.AnimatorControllerStateModel - export type DataBuffer = IKanata.DataBuffer - export type DataModel = IKanata.DataModel - export type Effect = IKanata.Effect - export type Material = IKanata.Material - export type SkeletonBoneInverseModel = IKanata.SkeletonBoneInverseModel - export type UniformBlock = IKanata.UniformBlock - export type UniformDescriptor = IKanata.UniformDescriptor - export type IndexBuffer = IKanata.IndexBuffer - export type IndexData = IKanata.IndexData - export type VertexBuffer = IKanata.VertexBuffer - export type VertexData = IKanata.VertexData - export type VertexLayout = IKanata.VertexLayout - export type VertexDataDescriptor = IKanata.VertexDataDescriptor - export type View = IKanata.View - export type ScalableList = IKanata.ScalableList - export type RenderPass = IKanata.RenderPass - export type Texture = IKanata.Texture - export type RenderEnv = IKanata.RenderEnv - - export interface IKanataInstance { - Image: typeof IKanata.Image - Downloader: typeof IKanata.Downloader - IS_VALID: typeof IKanata.IS_VALID - GET_MAIN_CANVAS: typeof IKanata.GET_MAIN_CANVAS - Phys3D: typeof IKanata.Phys3D - AnimatorComponent: typeof IKanata.AnimatorComponent - CameraComponent: typeof IKanata.CameraComponent - LightCameraComponent: typeof IKanata.LightCameraComponent - CullingComponent: typeof IKanata.CullingComponent - MeshRendererComponent: typeof IKanata.MeshRendererComponent - SkinnedSkeletonComponent: typeof IKanata.SkinnedSkeletonComponent - DynamicBonesComponent: typeof IKanata.DynamicBonesComponent - Entity2D: typeof IKanata.Entity2D - Entity3D: typeof IKanata.Entity3D - AnimationClipModel: typeof IKanata.AnimationClipModel - AnimationClipBinding: typeof IKanata.AnimationClipBinding - AnimatorControllerModel: typeof IKanata.AnimatorControllerModel - AnimatorControllerStateModel: typeof IKanata.AnimatorControllerStateModel - DataBuffer: typeof IKanata.DataBuffer - DataModel: typeof IKanata.DataModel - Effect: typeof IKanata.Effect - Material: typeof IKanata.Material - SkeletonBoneInverseModel: typeof IKanata.SkeletonBoneInverseModel - UniformBlock: typeof IKanata.UniformBlock - UniformDescriptor: typeof IKanata.UniformDescriptor - IndexBuffer: typeof IKanata.IndexBuffer - IndexData: typeof IKanata.IndexData - VertexBuffer: typeof IKanata.VertexBuffer - VertexData: typeof IKanata.VertexData - VertexLayout: typeof IKanata.VertexLayout - VertexDataDescriptor: typeof IKanata.VertexDataDescriptor - View: typeof IKanata.View - ScalableList: typeof IKanata.ScalableList - crossContext: typeof IKanata.crossContext - RenderPass: typeof IKanata.RenderPass - Texture: typeof IKanata.Texture - RenderEnv: typeof IKanata.RenderEnv - renderEnv: typeof IKanata.renderEnv - createWeakRef: typeof IKanata.createWeakRef - createWeakRefSentry: typeof IKanata.createWeakRefSentry - createNativeUUMap: typeof IKanata.createNativeUUMap - createNativeSUMap: typeof IKanata.createNativeSUMap - createNativeULUMap: typeof IKanata.createNativeULUMap - loadTTFFont: typeof IKanata.loadTTFFont - getGlyphInfo: typeof IKanata.getGlyphInfo - refreshNodesWorldTransform: typeof IKanata.refreshNodesWorldTransform - setGlobalPhysicSystem: typeof IKanata.setGlobalPhysicSystem - bindRigidBodyToNode: typeof IKanata.bindRigidBodyToNode - bindCCTToNode: typeof IKanata.bindCCTToNode - unbindRigidBody: typeof IKanata.unbindRigidBody - unbindCCT: typeof IKanata.unbindCCT - decodeBase64: typeof IKanata.decodeBase64 - initDraco: typeof IKanata.initDraco - decodeDraco: typeof IKanata.decodeDraco - setNodeName: typeof IKanata.setNodeName - setRenderComponentName: typeof IKanata.setRenderComponentName - debugPrint: typeof IKanata.debugPrint - eventBridge: typeof IKanata.eventBridge - destroy: typeof IKanata.destroy - update: typeof IKanata.update - } - - export function CREATE_INSTANCE( - MAIN_CANVAS: HTMLCanvasElement, - ENGINE_SETTINGS: IEngineSettings, - ENGINE_MODE: 'Game' | 'Editor', - IS_SUB_CONTEXT: boolean, - HOST: string, - FIX_INSTANCE: boolean - ): IKanataInstance - export function RELEASE_INSTANCE(MAIN_CANVAS: HTMLCanvasElement): void -} - -declare module 'XrFrame/core/Scene' { - /** - * Scene.ts - * - * * @Date : 2022/3/16下午3:32:57 - */ - import Transform from 'XrFrame/components/Transform' - import { Kanata } from 'XrFrame/ext' - import AssetsSystem from 'XrFrame/systems/AssetsSystem' - import RenderSystem from 'XrFrame/systems/RenderSystem' - import Element, { IEntityComponents } from 'XrFrame/core/Element' - import Material from 'XrFrame/assets/Material' - import RenderTexture, { - IRenderTextureOptions - } from 'XrFrame/assets/RenderTexture' - import Effect, { IEffectAsset } from 'XrFrame/assets/Effect' - import Geometry from 'XrFrame/assets/Geometry' - import AnimationSystem from 'XrFrame/systems/AnimationSystem' - import PhysicsSystem from 'XrFrame/systems/PhysicsSystem' - import ARSystem from 'XrFrame/systems/ARSystem' - import { XRShadow } from 'XrFrame/elements' - import { GizmoSystem, ShareSystem, VideoSystem } from 'XrFrame/systems' - import VideoTexture, { - IVideoTextureOptions - } from 'XrFrame/assets/VideoTexture' - import PostProcess, { - IPostProcessOptions - } from 'XrFrame/assets/PostProcess' - /** - * 场景的默认组件,均为系统。 - */ - export const SceneDefaultComponents: IEntityComponents - /** - * 场景的默认映射。 - */ - export const SceneDataMapping: { - [key: string]: string[] - } - export interface TDict<T> { - [key: string]: T - } - /** - * 场景,系统核心之一。 - * - * `Scene`是元素的一种,对应于`xr-scene`标签。 - * 作为整个`xr-frame`组件的根节点,它提供了整个组件运作的一些基本能力,挂在了各大系统,驱动生命周期循环。 - */ - export default class Scene extends Element { - readonly defaultComponents: IEntityComponents - readonly isScene: boolean - /** - * 场景是否已经就绪。 - */ - get ready(): boolean - /** - * 自身。 - */ - get scene(): this - /** - * 一个可以用于快速挂载自己创建的`Element`的`shadow`节点。 - */ - get rootShadow(): XRShadow - /** - * 资源系统。 - */ - get assets(): AssetsSystem - /** - * 渲染系统。 - */ - get render(): RenderSystem - /** - * 动画系统。 - */ - get animation(): AnimationSystem - /** - * 视频系统。 - */ - get video(): VideoSystem - /** - * 物理系统。 - */ - get physics(): PhysicsSystem - /** - * AR系统。 - */ - get ar(): ARSystem - /** - * Gizmo系统。 - */ - get gizmo(): GizmoSystem - /** - * 分享系统。 - */ - get share(): ShareSystem - /** - * 渲染分辨率宽,一般物理点击事件之类的都是参考这个。 - */ - get width(): number - /** - * 渲染分辨率高,一般物理点击事件之类的都是参考这个。 - */ - get height(): number - /** - * 显示分辨率宽。 - */ - get frameWidth(): number - /** - * 显示分辨率高。 - */ - get frameHeight(): number - /** - * 当前时间戳(ms)。 - */ - get timestamp(): number - /** - * @internal - */ - get renderPass(): Kanata.RenderPass - /** - * @internal - */ - get rootNode(): import('XrFrame/kanata/lib/index').Entity3D - /** - * @internal - */ - get backendVersion(): number[] - /** - * @internal - */ - versionBefore(major: number, minor: number): boolean - /** - * @internal - */ - get backendCommit(): string - /** - * @internal - */ - get backendUsePuppetSokol(): boolean - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * 创建一个`Element`,但注意**其只能作为`xr-shadow`的子孙节点**,否则可能会出错! - * - * @param attributes 初始化的属性,同于`xml`中对应的标签属性。 - */ - createElement<T extends Element>( - clz: new (...args: any) => T, - attributes?: { - [name: string]: string - } - ): T - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * 通过在`wxml`的元素上设置的`id`索引一个元素,`id`是唯一的。 - */ - getElementById(id: string): Element - /** - * 通过在`wxml`的元素上设置的`node-id`索引一个`Transform`组件,`node-id`是唯一的。 - */ - getNodeById(nodeId: string): Transform - /** - * @internal - */ - /** - * 手动创建一个`Image`资源。 - * - * @param autoRelease 此图片在第一次时候后是否释放原始数据,默认释放。 - */ - createImage(autoRelease?: boolean): Kanata.IImage - /** - * 手动创建一个`Texture`资源。 - */ - createTexture(options: Kanata.ITextureOptions): Kanata.Texture - /** - * 手动创建一个`Effect`资源。 - */ - createEffect(description: IEffectAsset): Effect - /** - * 手动创建一个`UniformBlockDescriptor`资源。 - */ - createUniformBlockDesc( - options: Kanata.IUniformDescriptorOptions - ): Kanata.UniformDescriptor - /** - * 手动创建一个`UniformBlock`资源。 - */ - createUniformBlock( - descriptor: Kanata.UniformDescriptor - ): Kanata.UniformBlock - /** - * 手动创建一个`Material`资源。 - */ - createMaterial( - effect: Effect, - defaultUniforms?: { - [key: string]: number | ArrayLike<number> | Kanata.Texture - } - ): Material - /** - * 手动创建一个`VertexLayout`资源。 - */ - createVertexLayout( - options: Kanata.IVertexLayoutOptions - ): Kanata.VertexLayout - /** - * 手动创建一个`Geometry`资源。 - */ - createGeometry( - vertexLayout: Kanata.VertexLayout, - vBuffer: ArrayBufferView, - iBuffer: ArrayBufferView, - indexType?: Kanata.EIndexType - ): Geometry - /** - * 手动创建一个`RenderTexture`资源。 - */ - createRenderTexture(options?: IRenderTextureOptions): RenderTexture - /** - * 手动创建一个`VideoTexture`资源。 - */ - createVideoTexture( - options?: IVideoTextureOptions - ): Promise<VideoTexture> - /** - * 手动创建一个`PostProcess`资源。 - */ - createPostProcess(options: IPostProcessOptions): PostProcess - } -} - -declare module 'XrFrame/core/Observable' { - export default class Observable<TParams = any, TSender = any> { - isObservable: boolean - /** - * 拥有的监听者数量。 - */ - get count(): number - /** - * 添加一个回调到队列中。 - */ - add( - callback: (params: TParams, sender?: TSender) => void | boolean, - priority?: number, - isOnce?: boolean - ): this - /** - * 添加一个回调到队列中,并再被触发执行一次后自动移除。 - */ - addOnce( - callback: (params: TParams, sender?: TSender) => void | boolean, - priority?: number - ): this - /** - * 清空队列。 - */ - clear(): this - /** - * 从队列中移除一个回调。 - */ - remove( - callback: (params: TParams, sender?: TSender) => void | boolean - ): this - /** - * 通过一个参数触发一次广播,调用所有回调。 - */ - notify(params: TParams, sender?: TSender): this - } -} - -declare module 'XrFrame/components/Transform' { - /** - * Transform.ts - * - * * @Date : 2022/3/16下午3:48:05 - */ - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import Matrix4 from 'XrFrame/math/matrix4' - import Quaternion from 'XrFrame/math/quaternion' - import Vector3 from 'XrFrame/math/vector3' - /** - * {@link Transform}组件数据接口。 - */ - export interface ITransformData { - /** - * 设置一个唯一的节点Id,区别于`xml`上的那个`id`。 - * `xml`中的数据类型为`string`。 - */ - nodeId: string - /** - * 节点的位移。 - * `xml`中的数据类型为`number-array`,默认为`0 0 0`。 - */ - position: number[] - /** - * 节点的旋转,注意此处为**角度**。 - * `xml`中的数据类型为`number-array`,默认为`0 0 0`。 - */ - rotation: number[] - /** - * 节点的位缩放。 - * `xml`中的数据类型为`number-array`,默认为`1 1 1`。 - */ - scale: number[] - /** - * 节点的可见性,可以控制该节点以及所有子节点是否可见。 - * `xml`中的数据类型为`boolean`,默认为`true`。 - */ - visible?: boolean - /** - * 节点的层级,作为控制节点以及子节点是否可见的一部分,配合{@link Camera.cullMask}使用。 - * 判定规则为自顶层节点向下,只有全部通过了判定才能显示。 - * `xml`中的数据类型为`number`,默认为`0`。 - */ - layer?: number - } - /** - * {@link Transform}的`schema`,详见{@link ITransformData}。 - */ - export const TransformSchema: IComponentSchema - /** - * 3D变换组件,作为场景中3D节点的根基,一般被代理到{@link XRNode}元素。 - */ - export default class Transform extends Component<ITransformData> { - /** - * 详见{@link TransformSchema}。 - */ - readonly schema: IComponentSchema - readonly priority: number - get node(): import('XrFrame/kanata/lib/index').Entity3D - /** - * 获取世界矩阵,**注意不可修改**。 - */ - get worldMatrix(): Matrix4 - /** - * 获取世界绝对位移,**注意不可修改**。 - */ - get worldPosition(): Vector3 - /** - * 获取世界绝对旋转,**注意不可修改**。 - */ - get worldQuaternion(): Quaternion - /** - * 获取世界绝对缩放,**注意不可修改**。 - */ - get worldScale(): Vector3 - /** - * 获取世界前向向量,**注意不可修改**。 - */ - get worldForward(): Vector3 - /** - * 获取世界上向向量,**注意不可修改**。 - */ - get worldUp(): Vector3 - /** - * 获取世界右向向量,**注意不可修改**。 - */ - get worldRight(): Vector3 - get position(): Vector3 - /** - * 注意如果这里直接修改,使用**弧度**。 - */ - get rotation(): Vector3 - get quaternion(): Quaternion - get scale(): Vector3 - get visible(): boolean - set visible(value: boolean) - get layer(): number - set layer(value: number) - /** - * @internal - */ - /** - * 直接设置本地矩阵。 - */ - setLocalMatrix(mat: Matrix4): void - onAdd(parent: Element, data: ITransformData): void - onUpdate(data: ITransformData, preData: ITransformData): void - onRemove(parent: Element, data: ITransformData): void - onRelease(data: ITransformData): void - } -} - -declare module 'XrFrame/components/AssetLoad' { - /** - * AssetLoad.ts - * - * * @Date : 2022/3/31下午4:56:14 - */ - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import { IAssetLoadData } from 'XrFrame/loader/types' - /** - * {@link AssetLoad}的`schema`,详见{@link IAssetLoadData}。 - */ - export const AssetLoadSchema: IComponentSchema - /** - * 用于加载资源的组件,一般被代理到{@link XRAssetLoad}元素。 - */ - export default class AssetLoad extends Component<IAssetLoadData> { - /** - * 详见{@link AssetLoadSchema}。 - */ - readonly schema: IComponentSchema - /** - * @internal - */ - get loadParams(): IAssetLoadData<any> - onAdd(parent: Element, data: IAssetLoadData): void - onUpdate(data: IAssetLoadData, preData: IAssetLoadData): void - onRemove(parent: Element, data: IAssetLoadData<any>): void - } -} - -declare module 'XrFrame/components/Assets' { - /** - * Assets.ts - * - * * @Date : 2022/3/24下午3:18:14 - */ - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import { IAssetLoadData } from 'XrFrame/loader/types' - export interface IAssetsData {} - export const AssetsSchema: IComponentSchema - /** - * 资源加载组组件,会统计作为其子节点的{@link AssetLoad}组件的加载状态,派发事件。 - * 一般被代理到{@link XRAssets}元素。 - * - * 事件`progress`会在资源加载进度更新时触发,值为`{progress: number, asset: IAssetLoadData}`。 - * 事件`loaded`会在所有资源加载完成是触发,值为`{assets: {[key: string]: IAssetLoadData}, errors: {[key: string]: Error}}`。 - * 详见{@link IAssetLoadData}。 - */ - export default class Assets extends Component<IAssetsData> { - static EVENTS: string[] - readonly schema: IComponentSchema - } -} - -declare module 'XrFrame/components/Camera' { - /** - * Camera.ts - * - * * @Date : 2022/3/17下午5:25:34 - */ - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import { Kanata } from 'XrFrame/ext' - import Vector3 from 'XrFrame/math/vector3' - import Matrix4 from 'XrFrame/math/matrix4' - import RenderTexture, { IRenderTarget } from 'XrFrame/assets/RenderTexture' - import Transform from 'XrFrame/components/Transform' - import Light from 'XrFrame/components/Light' - import PostProcess from 'XrFrame/assets/PostProcess' - /** - * 相机背景渲染模式。 - * - * `default`模式只执行默认清屏。 - * `skybox`模式配合{@link Env}组件使用。 - * `ar`模式配合{@link ARSystem}使用。 - */ - export type TCameraBackground = 'default' | 'skybox' | 'ar' - /** - * {@link Camera}组件数据接口。 - */ - export interface ICameraData { - /** - * 相机对准的目标节点,如果不设置则为自由模式。 - * `xml`中的数据类型为节点对应的`nodeId`。 - */ - target?: Transform - /** - * 相机的渲染目标,如果不设置则渲染到屏幕。 - * `xml`中的数据类型为`render-texture`资源。 - */ - renderTarget?: RenderTexture - /** - * 深度,决定在多相机时的渲染顺序。 - * `xml`中的数据类型为`number`。 - */ - depth: number - /** - * 掩码,一般和{@link Transform.layer}一起使用,决定那些节点要被渲染。 - * `xml`中的数据类型为`number`。 - */ - cullMask: number - /** - * 是否为透视相机。 - * `xml`中的数据类型为`boolean`,默认为`true`。 - */ - isPerspective: boolean - /** - * 视场角。 - * `xml`中的数据类型为`number`,默认为`60`。 - */ - fov: number - /** - * 近平面。 - * `xml`中的数据类型为`number`,默认为`0.1`。 - */ - near: number - /** - * 远平面。 - * `xml`中的数据类型为`number`,默认为`100`。 - */ - far: number - /** - * 非透视模式,即正交模式时,可视范围大小。 - * `xml`中的数据类型为`number`,默认为`4`。 - */ - orthSize: number - /** - * 背景清屏模式。 - * `xml`中的数据类型为`string`,默认为`default`。 - */ - background: TCameraBackground - /** - * 是否为AR相机,配合{@link ARSystem}使用。 - * `xml`中的数据类型为`boolean`,默认为`false`。 - * **非常需要注意当设置为`true`时不能同时设置`target`数据!** - */ - isARCamera: boolean - /** - * 清屏是否要清深度。 - * `xml`中的数据类型为`boolean`,默认为`true`。 - */ - isClearDepth: boolean - /** - * 清屏是否要清模板值。 - * `xml`中的数据类型为`boolean`,默认为`true`。 - */ - isClearStencil: boolean - /** - * 清屏是否要清颜色。 - * `xml`中的数据类型为`boolean`,默认为`true`。 - */ - isClearColor: boolean - /** - * 清屏深度。 - * `xml`中的数据类型为`number`,默认为`1`。 - */ - clearDepth: number - /** - * 清屏模板值。 - * `xml`中的数据类型为`number`,默认为`0`。 - */ - clearStencil: number - /** - * 清屏颜色。 - * `xml`中的数据类型为`color`,默认为`0 0 0 1`。 - */ - clearColor: number[] - /** - * 后处理,一个后处理资源id的数组。 - * `xml`中的数据类型为`array`,默认为空。 - */ - postProcess: string[] - /** - * 允许的渲染标记,配合{@link RenderSystem}的`changeFeatures`一起使用。 - * `xml`中的数据类型为`array`,默认为空。 - */ - allowFeatures: string[] - } - /** - * {@link Camera}的`schema`,详见{@link ICameraData}。 - */ - export const CameraSchema: IComponentSchema - /** - * 相机组件,一般被代理到{@link XRCamera}元素。 - */ - export default class Camera extends Component<ICameraData> { - /** - * 详见{@link CameraSchema}。 - */ - readonly schema: IComponentSchema - readonly priority: number - /** - * 相机深度。 - */ - get depth(): number - /** - * @internal - */ - get renderTarget(): IRenderTarget - /** - * @internal - */ - get view(): import('XrFrame/kanata/lib/index').View - /** - * @internal - */ - get id(): number - /** - * @internal。 - */ - get bgStates(): { - [key: string]: any - } - /** - * @internal。 - */ - get bgStatesClear(): boolean - get background(): TCameraBackground - get target(): Transform - get near(): number - get far(): number - get cullMask(): number - get postProcess(): PostProcess[] - get hdr(): boolean - get allowFeatures(): string[] - /** - * 当前渲染特性集合。 - */ - get features(): { - [key: string]: string | number | boolean - } - /** - * @internal - */ - cull(cullResult: Kanata.ScalableList, lightMode: string): void - /** - * @internal - */ - clear(): void - /** - * @internal - */ - draw(renderList: Kanata.ScalableList, lightMode: string): void - /** - * @internal - */ - drawLight( - light: Light, - renderList: Kanata.ScalableList, - lightMode: string - ): void - /** - * 将世界坐标系位置转换到齐次裁剪空间。 - */ - convertWorldPositionToClip(worldPos: Vector3, dst?: Vector3): Vector3 - /** - * 将齐次裁剪空间转换到世界坐标系位置。 - */ - convertClipPositionToWorld(clipPos: Vector3, dst?: Vector3): Vector3 - /** - * 修改viewMatrix的设置类型。 - * - * @param manual 是否要设置为手动模式。 - * @param mat4 手动模式下,要设置的值。 - */ - changeViewMatrix(manual: boolean, mat4?: Matrix4 | Float32Array): void - /** - * 修改projectMatrix的设置类型。 - * - * @param manual 是否要设置为手动模式。 - * @param mat4 手动模式下,要设置的值。 - */ - changeProjectMatrix( - manual: boolean, - mat4?: Matrix4 | Float32Array - ): void - /** - * 修改相机背景的渲染状态。 - * - * @param states 同{@link Material.setRenderStates} - */ - setBackgroundRenderStates(states: { [key: string]: any }): void - /** - * 清空相机背景渲染状态。 - */ - clearBackgroundRenderStates(): void - onAdd(parent: Element, data: ICameraData): void - onUpdate(data: ICameraData, preData: ICameraData): void - onTick(deltaTime: number, data: ICameraData): void - onRemove(parent: Element, data: ICameraData): void - onRelease(data: ICameraData): void - protected _processData(data: ICameraData, preData: ICameraData): void - } -} - -declare module 'XrFrame/components/GLTF' { - import GLTFModel, { TQS } from 'XrFrame/assets/GLTFModel' - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import BoundBox from 'XrFrame/math/boundBox' - import Mesh from 'XrFrame/components/Mesh' - /** - * @see {@link GLTF} - */ - export interface IGLTFData { - /** - * 已加载完毕的GLTF模型。 - */ - model: GLTFModel - /** - * 是否投射阴影,默认false。 - */ - castShadow?: boolean - /** - * 是否接受阴影,默认false。 - */ - receiveShadow?: boolean - /** - * 是否不参与剔除,默认false(即参与剔除)。 - */ - neverCull?: boolean - /** - * 修改GLTF的默认renderStates。 - */ - states?: Array<[string, string]> - } - export const GLTFSchema: IComponentSchema - interface ElementGLTFInfo { - el: Element - hasMesh: boolean - meshName?: string - meshes?: Mesh[] - } - /** - * 将一个{@link GLTFModel | GLTF模型}实例化并渲染出来。 - * {@link XRGLTF | xr-gltf}标签会自动生成该组件。 - * - * > 会在当前元素下新建一系列子元素,作为GLTF模型的每个场景的根节点。 - * > 会在当前元素上新建{@link Animator}组件,并向其添加实例化生成的动画片段。 - * - * @see {@link IGLTFData} - */ - export default class GLTFComponent extends Component<IGLTFData> { - static EVENTS: string[] - readonly schema: IComponentSchema - readonly priority: number - _subRoots: Element[] - _nodeMap: Map<string, ElementGLTFInfo> - onUpdate(data: IGLTFData, preData: IGLTFData): void - onRemove(parent: Element, data: IGLTFData): void - onRelease(data: IGLTFData): void - /** - * 根据GLTF模型中节点的`name`字段来获取内部元素。 - */ - getInternalNodeByName(name: string): Element | undefined - /** - * @internal - */ - /** - * 获取GLTF模型实例化过程中生成的所有{@link Mesh}组件。 - */ - get meshes(): Mesh[] - /** - * 计算GLTF模型整体的包围盒,返回**模型空间**内的计算结果。 - * 每次调用都会重新计算。 - */ - calcTotalBoundBox(): BoundBox - /** - * 根据GLTF模型中**引用**了Mesh的**Node节点**的`name`字段,来获取对应Mesh下的所有Primitive。 - * 一个GLTF模型中的Primitive节点对应返回中的一个`xr-frame Mesh组件`实例。 - * **如果没有该名字的节点,或者节点未引用Mesh,会返回空数组。* - * @param name Node节点的`name`(而非Mesh节点) - */ - getPrimitivesByNodeName(name: string): Mesh[] - /** - * 根据GLTF模型中Mesh节点的`name`字段,来获取引用了该Mesh的**所有**Node节点下的所有Primitive。 - * 在xr-frame实现中,每个引用了该Mesh的GLTFNode节点拥有**独立**的一份Primitives副本,**每个**Node节点下的**每个**Primitive对应一个`xr-frame Mesh组件`。 - * **如果没有引用了该Mesh的Node节点,会返回空数组。* - * @param name Mesh节点的`name` - * @returns 一个数组,数组中的一个元素对应一个引用了该Mesh的GLTFNode节点,元素中nodeName为GLTFNode节点的`name`字段。 - */ - getPrimitivesByMeshName(name: string): Array<{ - nodeName: string - primitives: Mesh[] - }> - } - export {} -} - -declare module 'XrFrame/components/Light' { - /** - * Light.ts - * - * * @Date : 2022/3/16下午4:45:56 - */ - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import { Kanata } from 'XrFrame/ext' - /** - * 光照类型枚举。 - */ - export enum ELightType { - /** - * 环境光,默认只有一个生效。 - */ - Ambient = 'ambient', - /** - * 平行光,默认第一个会成为主平行光。 - */ - Directional = 'directional', - /** - * 点光。 - */ - Point = 'point', - /** - * 聚光。 - */ - Spot = 'spot' - } - /** - * {@link Light}组件数据接口。 - */ - export interface ILightData { - /** - * 类型。 - * `xml`中的数据类型`string`,默认为`directional`。 - */ - type: ELightType - /** - * 颜色。 - * `xml`中的数据类型`color`,默认为`[1, 1, 1, 1]`。 - */ - color: number[] - /** - * 强度。 - * `xml`中的数据类型`number`,默认为`1`。 - */ - intensity: number - /** - * 范围,仅在点光和聚光有效。 - * `xml`中的数据类型`number`,默认为`1`。 - */ - range: number - /** - * 仅在聚光有效。 - * `xml`中的数据类型`number`,默认为`1`。 - */ - innerConeAngle: number - /** - * 仅在聚光有效。 - * `xml`中的数据类型`number`,默认为`1`。 - */ - outerConeAngle: number - /** - * 是否要产生阴影,仅对平行光有效。 - * `xml`中的数据类型`boolean`,默认为`false`。 - */ - castShadow?: boolean - /** - * 产生阴影的最大距离,仅对平行光有效。 - * `xml`中的数据类型`number`,默认为`10`。 - */ - shadowDistance?: number - /** - * 阴影采样时的容许偏移,仅对平行光有效。 - * `xml`中的数据类型`number`,默认为`0.002`。 - */ - shadowBias?: number - } - /** - * {@link Light}的`schema`,详见{@link ILightData}。 - */ - export const LightSchema: IComponentSchema - /** - * 灯光组件,一般被代理到{@link XRLight}元素。 - * - * 注意整个场景只能存在一个`ambient`光源,第一个`directional`光源将会成为主光源,也只有这个光源能够产生阴影。 - * 目前最多支持四个追加光源。 - */ - export default class Light extends Component<ILightData> { - /** - * 详见{@link LightSchema}。 - */ - readonly schema: IComponentSchema - readonly priority: number - get type(): ELightType - get color(): number[] - get intensity(): number - get range(): number - get innerConeAngle(): number - get outerConeAngle(): number - get castShadow(): boolean - get shadowDistance(): number - get shadowBias(): number - /** - * @internal - */ - get lightCamera(): import('XrFrame/kanata/lib/index').LightCameraComponent - /** - * @internal - */ - onAdd(parent: Element, data: ILightData): void - onUpdate(data: ILightData, preData: ILightData): void - onTick(deltaTime: number, data: ILightData): void - onRemove(parent: Element, data: ILightData): void - onRelease(data: ILightData): void - /** - * @internal - */ - } -} - -declare module 'XrFrame/components/AssetMaterial' { - import Effect from 'XrFrame/assets/Effect' - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import EnvData from 'XrFrame/assets/EnvData' - /** - * `AssetMaterial`数据接口。 - */ - export interface IAssetMaterialData { - /** - * 被引用时的资源Id。 - * `xml`中的数据类型为`string`。 - */ - assetId: string - /** - * 基于的效果。 - * `xml`中的数据类型为`effect`资源,默认为`simple`。 - */ - effect: Effect - /** - * 初始要写入的`uniforms`,类型根据`effect`中的定义决定。 - * `xml`中的数据类型为`map`。 - */ - uniforms: Array<[string, string]> - /** - * 初始要写入的渲染状态`states`。 - * `xml`中的数据类型为`map`。 - * 目前支持`renderQueue`、`cullOn`、`depthTestOn`、`depthTestWrite`、`alphaMode`、`alphaCutOff`。 - * `alphaMode`和`alphaCutOff`遵循glTF标准。 - */ - states: Array<[string, string]> - /** - * 要覆盖的渲染顺序。 - * `xml`中的数据类型为`number`,无默认值。 - * 大于等于`2500`视为透明物体。 - */ - renderQueue: number - /** - * 用于覆盖全局的、材质维度的环境数据。 - */ - envData?: EnvData - } - /** - * {@link AssetMaterial}的`schema`,详见{@link IAssetMaterialData}。 - */ - export const AssetMaterialSchema: IComponentSchema - /** - * 材质资源创建组件,为了在`xml`中创建{@link Material}资源,一般被代理到{@link XRAssetMaterial}元素。 - */ - export default class AssetMaterial extends Component<IAssetMaterialData> { - /** - * 详见{@link AssetMaterialSchema}。 - */ - readonly schema: IComponentSchema - onAdd(parent: Element, data: IAssetMaterialData): void - onUpdate(data: IAssetMaterialData, preData: IAssetMaterialData): void - onRemove(parent: Element, data: IAssetMaterialData): void - } -} - -declare module 'XrFrame/components/Mesh' { - /** - * Model.ts - * - * * @Date : 2022/3/16下午4:48:09 - */ - import Geometry from 'XrFrame/assets/Geometry' - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import { Kanata } from 'XrFrame/ext' - import Material from 'XrFrame/assets/Material' - import Transform from 'XrFrame/components/Transform' - import EnvData from 'XrFrame/assets/EnvData' - /** - * `Mesh`数据接口。 - */ - export interface IMeshData { - /** - * 是否强制不被剔除。 - * `xml`中的数据类型为`boolean`,默认为`false`。 - */ - neverCull?: boolean - /** - * 在主光源产生阴影开启阴影时,是否要产生阴影。 - * `xml`中的数据类型为`boolean`,默认为`false`。 - */ - castShadow?: boolean - /** - * 在主光源产生阴影开启阴影时,是否要接受阴影。 - * `xml`中的数据类型为`boolean`,默认为`false`。 - */ - receiveShadow?: boolean - /** - * 渲染使用的几何数据。 - * `xml`中的数据类型为`geometry`资源。 - */ - geometry: Geometry - /** - * 渲染使用的材质数据。 - * `xml`中的数据类型为`material`资源。 - */ - material?: Material - /** - * 覆盖`material`中的默认`uniforms`,如果覆盖了,则会先创建一个材质副本。 - * `xml`中同{@link IAssetMaterialData.uniforms}。 - */ - uniforms?: Array<[string, string]> - /** - * 覆盖`material`中的默认`states`,如果覆盖了,则会先创建一个材质副本。 - * `xml`中同{@link IAssetMaterialData.states}。 - */ - states?: Array<[string, string]> - /** - * 用于覆盖`material`中的,全局的、材质维度的环境数据。 - * * `xml`中同{@link IAssetMaterialData.envData}。 - */ - envData?: EnvData - } - /** - * {@link Mesh}的`schema`,详见{@link IMeshData}。 - */ - export const MeshSchema: IComponentSchema - /** - * Mesh组件,整合{@link Geometry}和{@link Material}进行渲染,一般被代理到{@link XRMesh}元素。 - */ - export default class Mesh extends Component<IMeshData> { - /** - * 详见{@link MeshSchema}。 - */ - readonly schema: IComponentSchema - readonly priority: number - protected _cull: Kanata.CullingComponent - protected _mesh: Kanata.MeshRendererComponent - protected _sourceMaterial: Material - protected _geometry: Geometry - protected _material: Material - protected _trs: Transform - /** - * 几何数据。 - */ - get geometry(): Geometry - /** - * 材质。 - */ - get material(): Material - set material(value: Material) - /** - * MorphTargets的权重,最多32个,可以获取后直接修改。 - */ - get morphWeights(): Float32Array - /** - * @internal - */ - get id(): number - /** - * @internal - */ - onAdd(parent: Element, data: IMeshData): void - onTick(deltaTime: number, data: IMeshData): void - onUpdate(data: IMeshData, preData: IMeshData): void - onRemove(parent: Element, data: IMeshData): void - onRelease(data: IMeshData): void - /** - * @internal - */ - protected _getMarcos(geometry: Geometry): {} - /** - * @internal - */ - protected _getUniformDesc(): Kanata.UniformDescriptor - /** - * @internal - */ - protected _getMeshType(): Kanata.EMeshRenderType - } -} - -declare module 'XrFrame/components/text/Text' { - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import { Kanata } from 'XrFrame/ext' - import Material from 'XrFrame/assets/Material' - import Transform from 'XrFrame/components/Transform' - import { - IRenderData, - EHorzAlignment, - EVertAlignment - } from 'XrFrame/components/text/types' - import { IGlyph } from 'XrFrame/glyph' - import { Typesetting } from 'XrFrame/components/text/typesetting' - import { FillRenderData } from 'XrFrame/components/text/fillRenderData' - /** - * `Text`数据接口。 - */ - export interface ITextData { - /** - * 文本内容 - * `xml`中的数据类型为`string` - */ - value?: string - /** - * 文本大小 - * `xml`中的数据类型为`number` - */ - size?: number - /** - * 文本颜色 - * `xml`中的数据类型为`number-array`,默认为`0 0 0 1`。 - */ - color?: number[] - /** - * 文本轴点 - * `xml`中的数据类型为`number-array`,默认为`0 1`。 - */ - anchor?: number[] - /** - * 文本框宽度 - * `xml`中的数据类型为`number` - */ - width?: number - /** - * 文本框高度 - * `xml`中的数据类型为`number` - */ - height?: number - /** - * 文本框行高,为比例 - * `xml`中的数据类型为`number` - */ - lineHeight?: number - /** - * 文本内边距 - * `xml`中的数据类型为`number-array`,默认为`0 0 0`。 - */ - padding?: number[] - /** - * 文本水平定位 - * `xml`中的数据类型为`string`,默认为`left`。 - */ - horzAlign?: string - /** - * 文本垂直定位 - * `xml`中的数据类型为`string`,默认为`top`。 - */ - vertAlign?: string - /** - * 是否不参与剔除,默认false(即参与剔除)。 - */ - neverCull?: boolean - /** - * 覆盖`material`中的默认`uniforms`,如果覆盖了,则会先创建一个材质副本。 - * `xml`中同{@link IMaterialData.uniforms}。 - */ - uniforms?: Array<[string, string]> - /** - * 覆盖`material`中的默认`states`,如果覆盖了,则会先创建一个材质副本。 - * `xml`中同{@link IMaterialData.states}。 - */ - states?: Array<[string, string]> - } - export const TextSchema: IComponentSchema - export const textAttributes: Array<{ - name: string - format: number - offset: number - usage: number - }> - export const textStride = 32 - export const textVertexSize = 8 - export default class Text extends Component<ITextData> { - readonly schema: IComponentSchema - readonly priority: number - protected _cull: Kanata.CullingComponent - protected _mesh: Kanata.MeshRendererComponent - protected _sourceMaterial: Material - protected _material: Material - protected _trs: Transform - protected _value: string - protected _size: number - protected _color: number[] - protected _anchor: number[] - protected _width: number | undefined - protected _height: number | undefined - protected _lineHeight: number - protected _padding: number[] - protected _horzAlign: EHorzAlignment - protected _vertAlign: EVertAlignment - protected _glyphs: IGlyph[] - protected _renderDatas: IRenderData[] - static QueryGlyphs: ( - scene: import('XrFrame/core/Scene').default, - characters: string, - italic: boolean, - bold: boolean, - fontSize: number, - fontFamily: string - ) => IGlyph[] - static Typesetting: typeof Typesetting - static FillRenderData: typeof FillRenderData - get id(): number - onAdd(parent: Element, data: ITextData): void - onTick(deltaTime: number, data: ITextData): void - onUpdate(data: ITextData, preData: ITextData): void - onRemove(parent: Element, data: ITextData): void - onRelease(data: ITextData): void - protected _getUniformDesc(): Kanata.UniformDescriptor - protected _getMeshType(): Kanata.EMeshRenderType - protected _getVertexLayout(): Kanata.VertexLayout - } -} - -declare module 'XrFrame/components/particle/Particle' { - import Element from 'XrFrame/core/Element' - import Material from 'XrFrame/assets/Material' - import BasicParticle, { - IParticleData - } from 'XrFrame/components/particle/BasicParticle' - import ParticleInstance from 'XrFrame/components/particle/ParticleInstance' - import { BasicShapeEmitter } from 'XrFrame/components/emitter/BasicShapeEmitter' - export default class Particle extends BasicParticle { - static EVENTS: string[] - readonly priority: number - subEmitters: any - get material(): Material - set material(value: Material) - get id(): number - get data(): IParticleData - set data(value: IParticleData) - get particleEmitter(): BasicShapeEmitter - /** - * 粒子系统开始播放。 - * - * @param delay 设定粒子延时几秒后再播放。 - */ - start(delay?: number): void - /** - * 停止粒子系统与其子发射器的播放。 - */ - stop(): void - /** - * @internal - */ - onAdd(parent: Element, data: IParticleData): void - /** - * 设置粒子系统的内置粒子effect。 - */ - protected createMaterial(): Material - /** - * 初始化粒子系统的状态。 - */ - initParticle(data: IParticleData): void - /** - * 重置粒子系统的状态。 - */ - resetParticle(): void - /** - * @internal - */ - protected _prepareSubEmitterArray(): void - /** - * 停止所有粒子子系统的发射状态。 - */ - protected stopSubEmitters(): void - /** - * 粒子子发射系统从依附的粒子系统中剥离。 - */ - protected removeFromRoot(): void - /** - * @internal - */ - onTick(deltaTime: number, data: IParticleData): void - /** - * @internal - */ - onUpdate(data: IParticleData, preData: IParticleData): void - /** - * @internal - */ - onRemove(parent: Element, data: IParticleData): void - /** - * @internal - */ - onRelease(data: IParticleData): void - /** - * @internal - */ - protected _updateRenderData( - deltaTime: number, - isPreWarm?: boolean - ): void - /** - * 创建一个粒子实例。 - */ - protected createParticle(): ParticleInstance - /** - * 启动处于END状态的粒子子发射器。 - * @param {ParticleInstance} instance 粒子实例 - */ - protected particleSubEmitter(instance: ParticleInstance): void - /** - * 回收当前粒子实例,并放入储备粒子队列。 - * @param {ParticleInstance} particle 粒子实例 - */ - protected recycleParticle(particle: ParticleInstance): void - /** - * 更新每一个粒子的状态。 - * @param {number} instancesSum 新生成的粒子数 - */ - protected update(instancesSum: number): void - /** - * 初始化粒子实例。 - * @param {ParticleInstance} instance 需要初始化的粒子实例 - */ - protected initInstanceProperty(instance: ParticleInstance): void - /** - * 更新运动过程中粒子实例的各项属性以及子发射器状态。 - * @param {Array} instances 粒子实例数组 - */ - protected updateInstanceProperty(instances: any): void - /** - * 更新粒子实例的各项属性。 - * @param {ParticleInstance} instance 待更新的粒子实例 - */ - protected processInstance(instance: ParticleInstance): void - } -} - -declare module 'XrFrame/components/particle/BasicParticle' { - import Material from 'XrFrame/assets/Material' - import Component from 'XrFrame/core/Component' - import { IComponentSchema } from 'XrFrame/core/Component' - import { - BoxShapeEmitter, - PointShapeEmitter, - SphereShapeEmitter - } from 'XrFrame/components/emitter' - import { Kanata } from 'XrFrame/ext' - import Transform from 'XrFrame/components/Transform' - import { BasicShapeEmitter } from 'XrFrame/components/emitter/BasicShapeEmitter' - import Vector3 from 'XrFrame/math/vector3' - import Particle from 'XrFrame/components/particle/Particle' - import { Scene } from 'XrFrame/elements' - import { SubEmitter } from 'XrFrame/components/emitter/SubEmitter' - import ParticleInstance from 'XrFrame/components/particle/ParticleInstance' - import Atlas from 'XrFrame/assets/Atlas' - import Vector4 from 'XrFrame/math/vector4' - import Geometry from 'XrFrame/assets/Geometry' - /** - * {@link Particle}组件数据接口。 - */ - export interface IParticleData { - neverCull?: boolean - /** - * 渲染模式。 - */ - renderMode?: string - uniforms?: Array<[string, string]> - states?: Array<[string, string]> - /** - * 纹理信息。 - */ - texture?: Kanata.Texture - /** - * 最大粒子数目。 - */ - capacity?: number - /** - * 每秒粒子发射数。 - */ - emitRate?: number - /** - * 初始角度。 - */ - angle?: number[] - /** - * 粒子系统启动延时秒数。 - */ - delay?: number - /** - * y轴方向上的每秒位移。 - */ - gravity?: number - /** - * 初始大小。 - */ - size?: number[] - /** - * 粒子在x轴方向上的大小尺度。 - */ - scaleX?: number[] - /** - * 粒子在y轴方向上的大小尺度。 - */ - scaleY?: number[] - /** - * 速度。 - */ - speed?: number[] - /** - * 生命周期时长。 - */ - lifeTime?: number[] - /** - * 粒子初始颜色左区间。 - */ - startColor?: number[] - /** - * 粒子初始颜色右区间。 - */ - startColor2?: number[] - /** - * 粒子结束时颜色。 - */ - endColor?: number[] - /** - * 角速度。 - */ - angularSpeed?: number[] - /** - * 发射器类型。 - */ - emitterType?: string - /** - * 发射器属性配置。 - */ - emitterProps?: Array<[string, string]> - /** - * 粒子系统生命周期时长。 - */ - stopDuration?: number - /** - * 粒子预渲染周期数。 - */ - prewarmCycles?: number - /** - * 速度阻尼系数。 - */ - speedDampen?: number - /** - * 动画图集信息。 - */ - atlas?: Atlas - /** - * 图集切换速度。 - */ - atlasSpeed?: number - /** - * 是否随机播放图集。 - */ - atlasRandom?: boolean - /** - * 是否循环播放图集。 - */ - atlasLoop?: boolean - /** - * 指定图集帧名。 - */ - atlasFrames?: string[] - /** - * 网格信息。 - */ - mesh?: Geometry - sizeChange?: Array<[string, string]> - colorChange?: Array<[string, string]> - speedChange?: Array<[string, string]> - burstCount?: number - burstTime?: number - burstCycle?: number - burstInterval?: number - } - /** - * {@link Particle}的`schema`定义。 - * @see 解析后的接口详见 {@link IParticleData} - */ - export const ParticleSchema: IComponentSchema - /** - * BillBoard渲染模式。 - */ - export const enum BillBoardMode { - BILLBOARDMODE_DEFAULT = 0, - BILLBOARDMODE_Y = 1, - BILLBOARDMODE_STRETCHED = 2 - } - export default class BasicParticle extends Component<IParticleData> { - /** - * 详见{@link ParticleSchema}。 - */ - readonly schema: IComponentSchema - protected static count: number - protected _systemId: number - protected _data: IParticleData - protected particleScene: Scene - protected particleEl: any - protected _instances: ParticleInstance[] - protected _stockInstances: ParticleInstance[] - protected _capacity: number - protected _delay: number - protected _updateSpeed: number - protected _stopDuration: number - protected _emitRate: number - protected _gravity: number - protected _preWarmCycles: number - protected _preWarmStepOffset: number - protected _particleEmitterType: string - protected _particleEmitter: BasicShapeEmitter - protected _particleEmitterProperties: any - protected particleStride: number - protected particleVertexSize: number - protected byteStride: number - protected ParticleAttributes: any - protected _burstCount: number - protected _burstTime: number - protected _burstCycle: number - protected _burstInterval: number - protected _burstCountTime: number - protected _burstCountCycle: number - protected _burstCountInterval: number - protected _minLifeTime: number - protected _maxLifeTime: number - protected _minScaleX: number - protected _maxScaleX: number - protected _minScaleY: number - protected _maxScaleY: number - protected _minSize: number - protected _maxSize: number - protected _minSpeed: number - protected _maxSpeed: number - protected _particleLengthScale: number - protected _startColor: number[] - protected _startColor2: number[] - protected _endColor: number[] - protected _sizeGradients: any - protected _alphaGradients: any - protected _colorRemapGradients: any - protected _speedScaleGradients: any - protected _limitSpeedGradients: any - protected _speedDampenFactor: number - protected _dragGradients: any - protected _useSpriteSheet: boolean - protected _startSpriteCellIndex: number - protected _endSpriteCellIndex: number - protected _useRandomSpriteCellIndex: boolean - protected _useSpriteCellLoop: boolean - protected _spriteChangeSpeed: number - protected _spriteFrameInfo: Vector4[] - protected _spriteNameToCellIndex: Map<string, number> - protected _textureData: Kanata.Texture - protected _atlasObj: Atlas - protected _atlasTexture: Kanata.Texture - protected _cull: Kanata.CullingComponent - protected _mesh: Kanata.MeshRendererComponent - protected _sourceMaterial: Material - protected _material: Material - protected _trs: Transform - protected _vertexBuffer: Kanata.VertexBuffer - protected _indexBuffer: Kanata.IndexBuffer - protected _renderMesh: Geometry - protected _vertexCount: number - protected _vertexData: Float32Array - protected _eachIndexSize: number - protected _indexSize: number - protected _vertexSize: number - protected _useBillboard: boolean - protected _useRenderMesh: boolean - protected _billboardMode: number - protected _useRampGradients: boolean - protected _rampGradients: any - protected _rampGradientsTexture: Kanata.Texture - protected _colorGradients: any - protected _vertexLayoutDirty: boolean - protected _startAngle: number - protected _startAngle2: number - protected _minAngularSpeed: number - protected _maxAngularSpeed: number - protected _subEmitters: any[] - protected _emitterPosition: Vector3 - get material(): Material - /** - * @internal - */ - get useBillboard(): boolean - set useBillboard(value: boolean) - get useRampGradients(): boolean - set useRampGradients(value: boolean) - get billboardMode(): number - set billboardMode(value: number) - get useSpriteSheet(): boolean - set useSpriteSheet(value: boolean) - get useRandomSpriteCellIndex(): boolean - get useSpriteCellLoop(): boolean - get spriteChangeSpeed(): number - get emitterPosition(): Vector3 - set emitterPosition(value: Vector3) - /** - * @internal - */ - protected _parseAttribute(): void - /** - * 获取一个拷贝的粒子系统。 - */ - clone(): Particle - /** - * 获取一个粒子子发射器。 - */ - createSubEmitter(data: IParticleData): SubEmitter - /** - * 创建一个点发射器。 - * @param {Vector3} direction1 粒子运动方向左区间 - * @param {Vector3} direction2 粒子运动方向右区间 - * @return {PointShapeEmitter} 点发射器 - */ - createPointEmitter( - direction1: Vector3, - direction2: Vector3 - ): PointShapeEmitter - /** - * 创建一个箱形发射器。 - * @param {Vector3} direction1 粒子运动方向左区间 - * @param {Vector3} direction2 粒子运动方向右区间 - * @param {Vector3} minEmitBox 粒子生成位置最小允许坐标 - * @param {Vector3} maxEmitBox 粒子生成位置最大允许坐标 - * @return {BoxShapeEmitter} 箱形发射器 - */ - createBoxEmitter( - direction1: Vector3, - direction2: Vector3, - minEmitBox: Vector3, - maxEmitBox: Vector3 - ): BoxShapeEmitter - /** - * 创建一个球形发射器。 - * @param {number} radius 球形半径 - * @param {number} radiusRange 球形区域内的覆盖范围[0-1] - * @param {number} arc 粒子在球形内生成的角度区间[0-360] - * @param {number} randomizeDirection 粒子运动方向偏离程度[0-1] - * @return {SphereShapeEmitter} 球形发射器 - */ - createSphereEmitter( - radius: number, - radiusRange: number, - arc: number, - randomizeDirection: number - ): SphereShapeEmitter - protected _parseProperties(data: IParticleData): void - protected _chooseEmitterProcess(): void - protected _createVertexBuffers(): void - protected _createIndexBuffer(): void - protected _appendParticleVertices( - offset: any, - instance?: ParticleInstance - ): void - protected _appendParticleVertex( - index: any, - instance: ParticleInstance, - offsetX: any, - offsetY: any, - offsetZ: any, - u: any, - v: any - ): void - protected _rebuildMesh(neverCull: boolean): void - protected _getUniformDesc(): Kanata.UniformDescriptor - protected _getMeshType(): Kanata.EMeshRenderType - protected _getVertexLayout( - attributes: any, - stride: any - ): Kanata.VertexLayout - protected _setMeshData( - material: Material, - uniforms?: Array<[string, string]>, - states?: Array<[string, string]> - ): void - /** - * 添加粒子运动过程中的颜色变化规则。 - * @param {number} gradient 指定所处粒子生命周期的阶段 - * @param {Vector4} color1 指定粒子颜色的左区间 - * @param {Vector4} color2 指定粒子颜色的右区间 - */ - addColorGradient( - gradient: number, - color1: Vector4, - color2?: Vector4 - ): void - /** - * 添加粒子运动过程中的速度变化规则。 - * @param {number} gradient 指定所处粒子生命周期的阶段 - * @param {Vector4} speed 指定粒子速度的左区间 - * @param {Vector4} speed2 指定粒子速度的右区间 - */ - addSpeedScaleGradient( - gradient: number, - speed: number, - speed2?: number - ): void - /** - * 添加粒子运动过程中的速度限制规则。 - * @param {number} gradient 指定所处粒子生命周期的阶段 - * @param {number} limitSpeed 指定粒子限制速度的左区间 - * @param {number} limitSpeed2 指定粒子限制速度的右区间 - */ - addLimitSpeedGradient( - gradient: number, - limitSpeed: number, - limitSpeed2?: number - ): void - /** - * 添加粒子运动过程中的阻力规则。 - * @param {number} gradient 指定所处粒子生命周期的阶段 - * @param {number} speed 指定粒子受到的阻力大小的左区间[0-1] - * @param {number} speed2 指定粒子受到的阻力大小的右区间[0-1] - */ - addDragGradient(gradient: number, drag: number, drag2?: number): void - /** - * 添加粒子运动过程中的透明度变化规则。 - * @param {number} gradient 指定所处粒子生命周期的阶段 - * @param {number} alpha 指定粒子颜色透明度的左区间[0-1] - * @param {number} alpha2 指定粒子颜色透明度的右区间[0-1] - */ - addAlphaGradient(gradient: number, alpha: number, alpha2?: number): void - /** - * 添加粒子运动过程中的尺寸变化规则。 - * @param {number} gradient 指定所处粒子生命周期的阶段 - * @param {number} size 指定粒子尺寸的左区间 - * @param {number} size2 指定粒子尺寸的右区间 - */ - addSizeGradient(gradient: number, size: number, size2?: number): void - /** - * 添加粒子运动过程中的透明度变化范围。 - * @param {number} gradient 指定所处粒子生命周期的阶段 - * @param {number} min 指定粒子透明度值的左区间 - * @param {number} max 指定粒子透明度值的右区间 - */ - addColorRemapGradient(gradient: number, min: number, max?: number): void - /** - * 将存储不同时间段相关属性系数的数组按时间点从小到大进行排序。 - * @param {Array} factorGradients 存储不同时间段相关属性系数的数组 - * @param {number} gradient 一般代表粒子所处生命周期的阶段 - * @param {number} factor 左区间值 - * @param {number} factor2 右区间值 - */ - protected addFactorGradient( - factorGradients: any, - gradient: any, - factor: any, - factor2: any - ): void - /** - * 添加粒子运动过程中的根据透明度影响的颜色变化规则,将通过颜色变化图纹理进行采样。 - * @param {number} gradient 指定粒子颜色变化图的具体位置,对应具体值应为(1-alpha) - * @param {number} color 指定该位置的颜色 - */ - addRampGradient(gradient: any, color: any): void - /** - * 根据颜色变化数组,生成对应的颜色变化纹理 - */ - protected createRampGradientTexture(): void - /** - * @internal - */ - protected lerpNumberArrayToVector( - vector: any, - numberArray1: any, - numberArray2: any, - step: any, - length?: number - ): void - } -} - -declare module 'XrFrame/components/AssetRenderTexture' { - /** - * AssetRenderTexture.ts - * - * * @Date : 8/29/2022, 11:27:00 AM - */ - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - /** - * `AssetRenderTexture`资源数据接口。 - */ - export interface IAssetRenderTextureData { - assetId?: string - width: number - height: number - isHDR?: boolean - } - /** - * {@link AssetRenderTexture}的`schema`,详见{@link IAssetRenderTextureData}。 - */ - export const AssetRenderTextureSchema: IComponentSchema - /** - * 渲染纹理创建组件,用于在`xml`中创建{@link RenderTexture}资源,一般被代理到{@link XRAssetRenderTexture}元素。 - */ - export default class AssetRenderTexture extends Component<IAssetRenderTextureData> { - /** - * 详见{@link AssetRenderTextureSchema}。 - */ - readonly schema: IComponentSchema - readonly isAssetRenderTexture: boolean - onAdd(parent: Element, data: IAssetRenderTextureData): void - /** - * 移除AssetRenderTexture。 - */ - onRemove(parent: Element, data: IAssetRenderTextureData): void - } -} - -declare module 'XrFrame/components/Env' { - /** - * Env.ts - * - * * @Date : 5/11/2022, 5:21:48 PM - */ - import { Kanata } from 'XrFrame/ext' - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import EnvData from 'XrFrame/assets/EnvData' - import Element from 'XrFrame/core/Element' - import { ITextureWrapper } from 'XrFrame/core/DataValue' - /** - * {@link Env}组件数据接口。 - */ - export interface IEnvData { - /** - * 要使用的环境数据资源。 - * `xml`中的数据类型为`env-data`资源。 - */ - envData?: EnvData - /** - * 可以用于覆盖`envData`中的`skybox`。 - * `xml`中的数据类型为`texture`资源。 - */ - skyMap?: Kanata.Texture | ITextureWrapper - /** - * 是否用2D模式渲染天空盒,此时必须为`skyMap`必须**不**为`CubeTexture`。 - */ - isSky2D?: boolean - /** - * 环境旋转角度。 - * `xml`中的数据类型为`number`,默认为`0`。 - */ - rotation: number - /** - * 漫反射部分曝光。 - * `xml`中的数据类型为`number`,默认为`1`。 - */ - diffuseExp: number - /** - * 镜面反射部分曝光。 - * `xml`中的数据类型为`number`,默认为`1`。 - */ - specularExp: number - } - /** - * {@link Env}的`schema`,详见{@link IEnvData}。 - */ - export const EnvSchema: IComponentSchema - /** - * 一般被代理到{@link XRARTracker}元素。 - */ - export default class Env extends Component<IEnvData> { - /** - * 详见{@link EnvSchema}。 - */ - readonly schema: IComponentSchema - get useHalfSkyMap(): boolean - get skyMap(): import('XrFrame/kanata/lib/index').Texture - get isSky2D(): boolean - get isSkyRT(): boolean - get rotation(): number - get hasDiffuse(): boolean - get diffuseSH(): Float32Array - get diffuseExp(): number - get hasSpecular(): boolean - get specularRGBD(): boolean - get specularMipmaps(): boolean - get specularMipmapCount(): number - get specularMap(): import('XrFrame/kanata/lib/index').Texture - get specularExp(): number - onAdd(parent: Element, data: IEnvData): void - onUpdate(data: IEnvData, preData: IEnvData): void - onRemove(parent: Element, data: IEnvData): void - } -} - -declare module 'XrFrame/components/Animator' { - /** - * Animator.ts - * - * * @Date : 6/17/2022, 2:52:44 PM - */ - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Animation from 'XrFrame/animation/Animation' - import Element from 'XrFrame/core/Element' - type Scene = import('XrFrame/core/Scene').default - /** - * 使用`Animator`播放动画时可以传入的默认选项。 - */ - export interface IAnimationPlayOptions { - /** - * 播放速度,默认为`1`。 - */ - speed?: number - /** - * 循环次数,默认为`0`。 - */ - loop?: number - /** - * 播放延迟,默认为`0`。 - */ - delay?: number - /** - * 播放方向,默认为`forwards`。 - */ - direction?: 'forwards' | 'backwards' | 'both' - } - export enum EAnimationPlayState { - Playing = 0, - Paused = 1, - Stopt = 2 - } - /** - * 自动播放配置。 - */ - export interface IAnimatorAutoPlay { - /** - * 片段名称。 - */ - clip?: string - /** - * 速度。 - */ - speed?: string - /** - * 循环次数。 - */ - loop?: string - /** - * 延迟。 - */ - delay?: string - /** - * 方向。 - */ - direction?: 'forwards' | 'backwards' | 'both' - /** - * 其他追加配置。 - */ - [key: string]: string | undefined - } - /** - * {@link Animator}组件数据接口。 - */ - export interface IAnimatorData { - /** - * 默认的`Keyframe`动画资源。 - * `xml`中为资源id。 - */ - keyframe: Animation - /** - * 默认的片段名字映射,由于一个动画可以有多个片段,所以能通过映射由`Animator`中播放的名字 -> 动画资源中片段的名字。 - * `xml`中为`dict`数据。 - */ - clipMap?: { - [key: string]: string - } - /** - * 默认自动播放的参数,详见{@Link IAnimatorAutoPlay}。 - * `xml`中为`dict`数据。 - */ - autoPlay?: IAnimatorAutoPlay - } - /** - * {@link Animator}的`schema`定义。 - * @see 解析后的接口详见 {@link IAnimatorData} - */ - export const AnimatorSchema: { - keyframe: { - type: string - } - clipMap: { - type: string - } - autoPlay: { - type: string - } - } - export default class Animator extends Component<IAnimatorData> { - static EVENTS: string[] - /** - * 详见{@link AnimatorSchema}。 - */ - readonly schema: IComponentSchema - readonly priority: number - onAdd(parent: Element, data: IAnimatorData): void - onUpdate(data: IAnimatorData, preData: IAnimatorData): void - onRemove(parent: Element, data: IAnimatorData): void - onRelease(data: IAnimatorData): void - /** - * 手动添加一个动画。 - * - * @param clipMap 可选的动画片段名字映射。 - */ - addAnimation<T extends Animation>( - anim: T, - clipMap?: { - [name: string]: string - } - ): T - /** - * 直接通过类`clz`和初始化数据`data`创建一个动画并添加到自身内。 - */ - createAnimation<T extends Animation>( - clz: new (scene: Scene, data: T['__DATA_TYPE']) => T, - data: T['__DATA_TYPE'], - clipMap?: { - [name: string]: string - } - ): T - /** - * 移除一个动画 - */ - removeAnimation(anim: Animation): void - /** - * @internal - */ - /** - * 播放一个动画片段,**可以同时播放多个片段**。 - * - * @param name 动画片段名称。 - * @param options 播放选项。 - */ - play( - name: string, - options?: IAnimationPlayOptions & { - [key: string]: any - } - ): void - /** - * 播放动画片段到某一进度并停下。 - * - * @param name 片段名称。 - * @param progress 停到的某个进度,0~1。 - */ - pauseToFrame(name: string, progress: number): void - /** - * 暂停播放。 - * - * @param name 需要暂停的片段,如果不填则暂停所有正在播放的片段。 - */ - pause(name?: string): void - /** - * 唤醒暂停的动画。 - * - * @param name 需要唤醒的片段,如果不填则唤醒所有暂停的片段。 - */ - resume(name?: string): void - /** - * 停止播放。 - * - * @param name 需要停止的片段,如果不填则停止所有正在播放的片段。 - */ - stop(name?: string): void - } - export {} -} - -declare module 'XrFrame/components/CameraOrbitControl' { - /** - * CameraOrbitControl.ts - * - * * @Date : 5/19/2022, 1:22:59 PM - */ - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import Vector3 from 'XrFrame/math/vector3' - /** - * {@link CameraOrbitControl}组件数据接口。 - */ - export interface ICameraOrbitControlData { - /** - * 是否锁定横向旋转。 - */ - isLockX: boolean - /** - * 是否锁定纵向旋转。 - */ - isLockY: boolean - /** - * 是否锁定缩放。 - */ - isLockZoom: boolean - /** - * 是否锁定旋转。 - */ - isLockRotate: boolean - /** - * 是否锁定移动。 - */ - isLockMove: boolean - /** - * 允许的最大缩放值。 - */ - zoomMax: number - /** - * 允许的最小缩放值。 - */ - zoomMin: number - /** - * 平移速度。 - */ - panSpeed: number - /** - * 旋转速度。 - */ - rotateSpeed: number - /** - * 缩放速度。 - */ - zoomSpeed: number - /** - * 开启阻尼缓动。 - */ - enableDamping: boolean - /** - * 阻尼系数。 - */ - dampingFactor: number - } - /** - * {@link CameraOrbitControl}的`schema`,详见{@link ICameraOrbitControlData}。 - */ - export const CameraOrbitControlSchema: IComponentSchema - export default class CameraOrbitControl extends Component<ICameraOrbitControlData> { - /** - * 详见{@link CameraOrbitControlSchema}。 - */ - readonly schema: IComponentSchema - /** - * 是否锁定横向旋转。 - */ - isLockX: boolean - /** - * 是否锁定纵向旋转。 - */ - isLockY: boolean - /** - * 是否锁定缩放。 - */ - isLockZoom: boolean - /** - * 是否锁定旋转。 - */ - isLockRotate: boolean - /** - * 是否锁定移动。 - */ - isLockMove: boolean - /** - * 是否已经开启。 - */ - isEnabled: boolean - /** - * 允许的最大缩放值。 - */ - zoomMax: number - /** - * 允许的最小缩放值。 - */ - zoomMin: number - /** - * 允许的最大平移边界。 - */ - panMax: Vector3 - /** - * 允许的最小平移边界。 - */ - panMin: Vector3 - /** - * 平移速度。 - */ - panSpeed: number - /** - * 旋转速度。 - */ - rotateSpeed: number - /** - * 缩放速度。 - */ - zoomSpeed: number - /** - * 开启阻尼缓动。 - */ - enableDamping: boolean - /** - * 阻尼系数。 - */ - dampingFactor: number - /** - * 当前是否正在缓动。 - */ - get damping(): boolean - /** - * 获取当前目标。 - */ - get target(): Vector3 - /** - * 添加到世界,继承请先`super.onAdd()`。 - */ - onAdd(parent: Element, data: ICameraOrbitControlData): void - /** - * 每一帧更新,继承请先`super.onUpdate()`。 - */ - onUpdate(data: ICameraOrbitControlData): void - onTick(deltaTime: number, data: ICameraOrbitControlData): void - /** - * 销毁,继承请先`super.onUpdate()`。 - */ - onRemove(): void - /** - * 启动控制器。 - */ - enable(): void - /** - * 关闭控制器。 - */ - disable(): void - } -} - -declare module 'XrFrame/components/ARTracker' { - /** - * ARTracker.ts - * - * * @Date : 6/24/2022, 11:35:30 AM - */ - import { Kanata } from 'XrFrame/ext' - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import Vector3 from 'XrFrame/math/vector3' - /** - * {@link ARSystem}和{@link ARTracker}的跟踪模式。 - * 其中`threeDof`需要基础库`2.30.4`以上支持。 - */ - export type TTrackMode = - | 'Plane' - | 'Marker' - | 'OSD' - | 'Face' - | 'Hand' - | 'Body' - | 'threeDof' - /** - * {@link ARTracker}的识别状态。 - * @version v2.29.1 - */ - export enum EARTrackerState { - Init = 0, - Detecting = 1, - Detected = 2, - Error = 3 - } - /** - * `Face`/`Body`/`Hand`模式下,{@link ARTracker}存储的原始数据类型。 - */ - export interface IARTrackerRawData { - /** - * 原点,屏幕空间。 - */ - origin: { - x: number - y: number - } - /** - * 尺寸,屏幕空间。 - */ - size: { - width: number - height: number - } - /** - * 置信度。 - */ - score: number - /** - * 在`Hand`模式下,手势分类,正常`0~18`,无效为`-1`。 - */ - gesture?: number - /** - * 在`Face`模式下,人脸旋转角度。 - */ - angle?: { - pitch: number - roll: number - yaw: number - z_score: number - } - /** - * 关键点置信度。 - */ - confidence: number[] - /** - * 关键点,屏幕空间。 - */ - points: Array<{ - x: number - y: number - }> - /** - * 支持3D时,3D关键点,世界空间。 - */ - points3d: Array<{ - x: number - y: number - z: number - }> - } - /** - * {@link ARTracker}组件数据接口。 - */ - export interface IARTrackerData { - /** - * 跟踪模式,必须在{@link ARSystem}已开启的模式列表中。 - * `xml`中数据为`string`类型。 - */ - mode: TTrackMode - /** - * 要追踪的图片资源,优先使用。 - * `xml`中数据为`image`类型。 - */ - image?: Kanata.IImage - /** - * 要追踪的图片地址,如果`image`没有定义,则使用这个。 - * `xml`中数据为`string`类型。 - */ - src?: string - /** - * 在`Face`模式下,给定一个**特征点索引**列表,详见官网对应文档。 - * 系统会自动同步位置和缩放到`ARTracker`下对应的顺序的子节点。 - * `-1`代表不同步位置,只同步缩放。 - */ - autoSync?: number[] - } - /** - * {@link ARTracker}的`schema`,详见{@link IARTrackerData}。 - */ - export const ARTrackSchema: { - mode: { - type: string - } - image: { - type: string - } - src: { - type: string - } - autoSync: { - type: string - } - } - /** - * AR追踪组件,配合{@link ARSystem}和{@link Camera}的`isARCamera`属性一起使用。 - * 一般被代理到{@link XRARTracker}元素。 - * - * 其提供了追踪的能力,节点将会自动同步识别到的追踪目标的位置和旋转, - */ - export default class ARTracker extends Component<IARTrackerData> { - static EVENTS: string[] - /** - * 详见{@link ARTrackSchema}。 - */ - readonly schema: IComponentSchema - /** - * 跟踪模式。 - */ - get mode(): TTrackMode - /** - * 当前识别状态。 - * - * @version v2.29.1 - */ - get state(): EARTrackerState - /** - * 如果为错误状态,错误信息。 - * - * @version v2.29.1 - */ - get errorMessage(): string - /** - * 是否已经检测到了目标。 - */ - get arActive(): boolean - /** - * `Body`/`Hand`模式下,获取当前的置信度。 - * 一般为`0~1`。 - */ - get score(): number - /** - * 在`Hand`模式下,手势分类,正常`0~18`,无效为`-1`。 - */ - get gesture(): number - /** - * @internal - */ - get filePath(): string - /** - * @internal - */ - get trackId(): number - onAdd(parent: Element, data: IARTrackerData): void - onUpdate(data: IARTrackerData, preData: IARTrackerData): void - onRemove(parent: Element, data: IARTrackerData): void - /** - * 在`Face`/`Body`/`Hand`模式下,获取某个特征点的位置。 - * - * @param point 特征点索引,需要在`0~105`,否则返回`undefined`。 - * @param relativeToTracker 仅在`ar-system`的`pose3d`属性为`false`时生效。是否相对于`ARTracker`本身,默认为`true`,否则返回世界空间坐标。 - * @returns 只有在`arActive`时才有值,否则返回`undefined`。 - */ - getPosition( - point: number, - output?: Vector3, - relativeToTracker?: boolean - ): Vector3 - /** - * @internal - */ - /** - * @internal - */ - } -} - -declare module 'XrFrame/components/physics/Shape' { - import Component from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import Vector3 from 'XrFrame/math/vector3' - import { Kanata } from 'XrFrame/ext' - import type Rigidbody from 'XrFrame/components/physics/Rigidbody' - import type GLTFComponent from 'XrFrame/components/GLTF' - import Quaternion from 'XrFrame/math/quaternion' - import { Delegate } from 'XrFrame/physics/event' - import { ICollideEvent, IOverlapEvent } from 'XrFrame/physics/Collision' - import { TQS } from 'XrFrame/assets/GLTFModel' - export const shapeMap: Map<phys3D.Collider, Shape<any>> - export enum EShapeType { - /** - * @internal - */ - None = 0, - /** - * @see {@link CubeShape} - */ - Cube = 1, - /** - * @internal - */ - CharacterController = 2, - /** - * @see {@link CapsuleShape} - */ - Capsule = 3, - /** - * @see {@link MeshShape} - */ - Mesh = 4, - /** - * @see {@link SphereShape} - */ - Sphere = 5 - } - export interface IShapeData { - /** - * 轮廓中心相对元素{@link Transform}中心的偏移量。 - * @default [0, 0, 0] - */ - center?: [number, number, number] - /** - * 轮廓是否自动贴合{@link Mesh | Mesh组件}或{@link GLTF | GLTF组件}的大小。 - * 如果当前元素下不存在Mesh组件和GLTF组件则不生效。 - * - * > {@link MeshShape}永远会开启这项。 - * - * @default false - */ - autoFit?: boolean - /** - * 是否禁用shape。 - * - * @default false - */ - disabled?: boolean - } - export const ShapeSchema: { - center: { - type: string - } - autoFit: { - type: string - } - disabled: { - type: string - } - } - export enum ShapeImplType { - None = 0, - Basic = 1, - GLTFAbstract = 2 - } - /** - * 轮廓组件的基类。 - * 为元素添加*该组件的子类*可以创建一个可用于交互的轮廓。 - * - * > 💡 只要创建了轮廓,在点击该物体时就可以触发事件: - * > + touch-shape: 点击物体事件,回调参数为{@link IShapeTouchEvent}; - * > + drag-shape: 拖拽物体事件,回调参数为{@link IShapeDragEvent}; - * > + untouch-shape: 松开物体事件,回调参数为{@link IShapeTouchEvent}; - * > - * > 绑定事件的方法可参考以下代码: - * > - * > ``` <xr-node sphere-shape bind:touch-shape="handleTouchShape"></xr-node> ``` - * - * > 💡 如果想要将轮廓可视化来确认轮廓大小,可以在同一个元素下添加{@link ShapeGizmos}组件,或在标签上添加`shape-gizmo`属性(对MeshShape不起作用)。 - * - * @abstract - */ - export default abstract class Shape< - T extends IShapeData = any - > extends Component<IShapeData> { - static EVENTS: string[] - readonly priority: number - implType: ShapeImplType - protected _type: EShapeType - protected _onCollisionEnterDelegate?: Delegate<ICollideEvent> - protected _onCollisionExitDelegate?: Delegate<ICollideEvent> - protected _onCollisionStayDelegate?: Delegate<ICollideEvent> - protected _onTriggerEnterDelegate?: Delegate<IOverlapEvent> - protected _onTriggerExitDelegate?: Delegate<IOverlapEvent> - protected _onTriggerStayDelegate?: Delegate<IOverlapEvent> - get type(): EShapeType - onAdd(parent: Element, data: T): void - onUpdate(data: T, preData: T): void - onTick(dateTime: number, data: T): void - protected abstract getImplClass( - implType: ShapeImplType - ): new () => ShapeImpl | null - onRemove(parent: Element, data: IShapeData): void - onRelease(data: IShapeData): void - shadowRoot?: GLTFAbstractShape<T> - setAsShadow(root: GLTFAbstractShape<T>, transform: TQS): void - getGLTFRootShape(): Shape<T> | undefined - getBasicImpl(): BasicShape<T> | undefined - getShadowShapes(): Array<Shape<T>> - initDelegates(el: Element): void - resetListeners(): void - } - export interface ShapeImpl { - el: Element - onElementAdd?(parent: Element): void - update(data: IShapeData, preData: IShapeData): void - onElementRemove(parent: Element): void - onTick(dateTime: number, data: IShapeData): any - create?(el: Element, shape: Shape<any>, data: IShapeData): any - cleanUp(): any - enable(): any - disable(): any - } - export abstract class BasicShape<T extends IShapeData> - implements ShapeImpl - { - el: Element - shapeComp: Shape<T> - nativeComp: phys3D.Collider - rigidbodyComp?: Rigidbody - _isShadow: boolean - _root: GLTFAbstractShape<T> - _positionInGLTF: Vector3 - _quatInGLTF: Quaternion - protected afterCreateNativeComp(): void - protected destroyNativeComp(): void - onElementAdd(parent: Element): void - protected abstract autoFit(data: T): void - protected abstract applyData(data: T): void - update(data: T, preData: T): void - onElementRemove(parent: Element): void - onRelease(data: T): void - onTick(dateTime: number, data: IShapeData): void - cleanUp(): void - /** - * @internal - */ - get entity(): Kanata.Entity3D - enable(): void - disable(): void - } - export abstract class GLTFAbstractShape<T extends IShapeData> - implements ShapeImpl - { - el: Element - shapeComp: Shape<T> - protected gltf: GLTFComponent - shadowShapes: Array<Shape<T>> - update(data: T, preData: T): void - onElementRemove(parent: Element): void - onTick(dateTime: number, data: T): void - create(el: Element, shape: Shape<T>, data: T): void - protected abstract getShapeClass(): new () => Shape<T> - cleanUp(): void - protected abstract createShadowShape(el: Element, data: T): Shape<T> - enable(): void - disable(): void - } -} - -declare module 'XrFrame/components/physics/SphereShape' { - import Shape, { - BasicShape, - EShapeType, - IShapeData, - ShapeImpl, - ShapeImplType - } from 'XrFrame/components/physics/Shape' - import Vector3 from 'XrFrame/math/vector3' - import Element from 'XrFrame/core/Element' - import { IComponentSchema } from 'XrFrame/core/Component' - /** - * @see {@link SphereShapes} - */ - export interface ISphereShapeData extends IShapeData { - /** - * 球形轮廓的半径。 - * @default 1 - */ - radius?: number - } - export const SphereShapeSchema: IComponentSchema - /** - * 为当前元素创建一个可交互的球状轮廓。 - * 可通过在标签上添加`sphere-shape`属性来为元素添加该组件。 - * - * @see {@link ISphereShapeData} - */ - export default class SphereShape extends Shape<ISphereShapeData> { - static EVENTS: string[] - readonly schema: IComponentSchema - protected _type: EShapeType - protected getImplClass(implType: ShapeImplType): new () => ShapeImpl - } - export class BasicSphereShape extends BasicShape<ISphereShapeData> { - nativeComp: phys3D.SphereCollider - /** - * 轮廓相对于元素中心点的偏移量。 - */ - get center(): Vector3 - set center(v: Vector3) - /** - * 球形轮廓的半径。 - */ - get radius(): number - set radius(v: number) - create(el: Element, shape: SphereShape, data: ISphereShapeData): void - protected autoFit(data: ISphereShapeData): void - protected applyData(data: ISphereShapeData): void - } -} - -declare module 'XrFrame/components/physics/MeshShape' { - import Shape, { - IShapeData, - EShapeType, - ShapeImplType, - ShapeImpl, - BasicShape - } from 'XrFrame/components/physics/Shape' - import Element from 'XrFrame/core/Element' - import { IComponentSchema } from 'XrFrame/core/Component' - /** - * @see {@link MeshShape} - */ - export interface IMeshShapeData extends IShapeData { - /** - * 是否使用凸多边形来包围Mesh。 - * *如果元素有`shape-interact`属性,则会强制开启。* - * @default false - */ - convex?: boolean - } - export const MeshShapeSchema: IComponentSchema - /** - * 利用当前元素下的{@link Mesh | Mesh组件}或{@link GLTF | GLTF组件},创建一个完全贴合的轮廓。如果当前元素下不存在Mesh组件或GLTF组件,则不生效。 - * 可通过在标签上添加`mesh-shape`属性来为元素添加该组件。 - * - * > ⚠️ 如果Mesh或GLTF内部结构非常复杂,创建和维持该组件可能会占用较多的资源。如果发现该组件会导致小程序性能下降,可以考虑改用其他轮廓类型,并开启{@link IShapeData.autoFit | autoFit}属性。 - * - * > ⚠️ MeshShape使用的Mesh的顶点数量不能超过65535个。如果超过了,推荐使用CubeShape+autoFit来代替。 - * - * @see {@link IMeshShapeData} - */ - export default class MeshShape extends Shape<IMeshShapeData> { - static EVENTS: string[] - readonly schema: IComponentSchema - protected _type: EShapeType - protected getImplClass(implType: ShapeImplType): new () => ShapeImpl - } - export class BasicMeshShape extends BasicShape<IMeshShapeData> { - nativeComp: phys3D.MeshCollider - create(el: Element, shape: MeshShape, data: IMeshShapeData): void - onTick(dateTime: number, data: IShapeData): void - protected autoFit(data: IMeshShapeData): void - protected applyData(data: IMeshShapeData): void - } -} - -declare module 'XrFrame/components/physics/CapsuleShape' { - import Shape, { - BasicShape, - EShapeType, - IShapeData, - ShapeImpl, - ShapeImplType - } from 'XrFrame/components/physics/Shape' - import Vector3 from 'XrFrame/math/vector3' - import Element from 'XrFrame/core/Element' - import { IComponentSchema } from 'XrFrame/core/Component' - /** - * @see {@link CapsuleShape} - */ - export interface ICapsuleShapeData extends IShapeData { - /** - * 胶囊体两端球体的半径。 - * @default 0.5 - */ - radius?: number - /** - * 胶囊体的长度。 - * @default 2 - */ - height?: number - /** - * 胶囊体的朝向。 - * @default ECapsuleShapeDirection["Y-Axis"] - */ - direction?: ECapsuleShapeDirection - } - export const CapsuleShapeSchema: IComponentSchema - /** - * 胶囊体轮廓的朝向。 - * - * @category Physics - */ - export enum ECapsuleShapeDirection { - 'X-Axis' = 0, - 'Y-Axis' = 1, - 'Z-Axis' = 2 - } - /** - * 为当前元素创建一个可交互的胶囊体轮廓。 - * 可通过在标签上添加`capsule-shape`属性来为元素添加该组件。 - * - * @see {@link ICapsuleShapeData} - */ - export default class CapsuleShape extends Shape<ICapsuleShapeData> { - static EVENTS: string[] - readonly schema: IComponentSchema - protected _type: EShapeType - protected getImplClass(implType: ShapeImplType): new () => ShapeImpl - } - export class BasicCapsuleShape extends BasicShape<ICapsuleShapeData> { - nativeComp: phys3D.CapsuleCollider - /** - * 轮廓相对于元素中心点的偏移量。 - */ - get center(): Vector3 - set center(v: Vector3) - /** - * 胶囊体两端球体的半径。 - */ - get radius(): number - set radius(v: number) - static defaultHeight: number - /** - * 胶囊体的长度。 - */ - get height(): number - set height(v: number) - /** - * 胶囊体的朝向。 - */ - get direction(): ECapsuleShapeDirection - set direction(v: ECapsuleShapeDirection) - create(el: Element, shape: CapsuleShape, data: ICapsuleShapeData): void - protected autoFit(data: ICapsuleShapeData): void - protected applyData(data: ICapsuleShapeData): void - } -} - -declare module 'XrFrame/components/physics/CubeShape' { - import Shape, { - BasicShape, - EShapeType, - IShapeData, - ShapeImpl, - ShapeImplType - } from 'XrFrame/components/physics/Shape' - import Vector3 from 'XrFrame/math/vector3' - import Element from 'XrFrame/core/Element' - import { IComponentSchema } from 'XrFrame/core/Component' - /** - * @see {@link CubeShape} - */ - export interface ICubeShapeData extends IShapeData { - /** - * 长方体沿x,y,z轴的长度。 - * @default [1, 1, 1] - */ - size?: [number, number, number] - } - export const CubeShapeSchema: IComponentSchema - /** - * 为当前元素创建一个可交互的长方体轮廓。 - * 可通过在标签上添加`cube-shape`属性来为元素添加该组件。 - * - * @see {@link ICubeShapeData} - */ - export default class CubeShape extends Shape<ICubeShapeData> { - static EVENTS: string[] - readonly schema: IComponentSchema - protected _type: EShapeType - protected getImplClass(implType: ShapeImplType): new () => ShapeImpl - } - export class BasicCubeShape extends BasicShape<ICubeShapeData> { - nativeComp: phys3D.BoxCollider - /** - * 轮廓相对于元素中心点的偏移量。 - */ - get center(): Vector3 - set center(v: Vector3) - /** - * 长方体沿x,y,z轴的长度。 - */ - get size(): Vector3 - set size(v: Vector3) - create(el: Element, shape: CubeShape, data: ICubeShapeData): void - protected autoFit(data: ICubeShapeData): void - protected applyData(data: ICubeShapeData): void - } -} - -declare module 'XrFrame/components/physics/Rigidbody' { - import Vector3 from 'XrFrame/math/vector3' - import Quaternion from 'XrFrame/math/quaternion' - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import { - CollisionDetectionMode, - ForceMode - } from 'XrFrame/components/physics/types' - import Element from 'XrFrame/core/Element' - export interface IRigidbodyData { - /** - * 是否禁用刚体。 - * @default false - */ - disabled?: boolean - /** - * 物体的质量。 - * @limit mass > 0 - * @default 1 - */ - mass?: number - /** - * 刚体是否受重力影响。 - * @default true - */ - useGravity?: boolean - /** - * 限制刚体在某个轴上的位移和旋转。 - * 具体值参考{@link RigidbodyConstraints} - */ - constraintsMask?: number - /** - * 是否为*运动学(Kinematic)* 刚体。 - * 设置为*运动学*刚体后,除非手动调用{@link movePosition},否则物体不会在*物理模拟*阶段发生位移或旋转。可以理解为,刚体的行为完全在用户的控制之下。 - * @default false - */ - kinematic?: boolean - } - export const RigidbodySchema: { - mass: { - type: string - } - useGravity: { - type: string - } - constraintsMask: { - type: string - } - disabled: { - type: string - } - kinematic: { - type: string - } - } - /** - * 刚体组件。 - * - * 让物体在物理系统中成为一个有质量的刚体。只有添加了这个组件之后,物体才有可能在物理系统的*物理模拟*阶段发生位移和旋转。 - * @category Physics - */ - export default class Rigidbody extends Component<IRigidbodyData> { - readonly schema: IComponentSchema - readonly priority: number - /** - * 刚体的质量。 - * @limit mass > 0 - * @default 1 - */ - get mass(): number - set mass(v: number) - /** - * 线性阻尼。 - * 影响物体的{@link velocity | 线性速度}。 - * @limit linearDamping >= 0 - * @default 0 - */ - get linearDamping(): number - set linearDamping(v: number) - /** - * 角速度阻尼。 - * 影响物体的{@link angularVelocity | 角速度}。 - * @limit angularDamping >= 0 - * @default 0.05 - */ - get angularDamping(): number - set angularDamping(v: number) - /** - * 刚体是否受重力影响。 - * @default true - */ - get useGravity(): boolean - set useGravity(v: boolean) - /** - * 是否为*运动学(Kinematic)* 刚体。 - * 设置为*运动学*刚体后,除非手动调用{@link movePosition},否则物体不会在*物理模拟*阶段发生位移或旋转。可以理解为,刚体的行为完全在用户的控制之下。 - * @default false - */ - get isKinematic(): boolean - set isKinematic(v: boolean) - /** - * @unimplemented - * @default true - */ - get detectCollisions(): boolean - set detectCollisions(v: boolean) - /** - * 设置刚体的碰撞检测模式。 - * 详见{@link CollisionDetectionMode}。 - * @default {@link CollisionDetectionMode.Discrete} - */ - get collisionDetectionMode(): CollisionDetectionMode - set collisionDetectionMode(v: CollisionDetectionMode) - /** - * 限制物体的旋转(X轴,Y轴,Z轴)。 - * @default [false, false, false] - */ - get rotationConstraints(): boolean[] - set rotationConstraints(v: boolean[]) - /** - * 限制物体的位移(X轴,Y轴,Z轴)。 - * @default [false, false, false] - */ - get positionConstraints(): boolean[] - set positionConstraints(v: boolean[]) - /** - * 直接获取或修改刚体在*物理系统*中的位置。 - * 物理系统中的位置是独立于Transform组件的。 - * - * \**如果你不清楚修改这一项的后果,请不要手动修改它。修改{@link Transform.position}来代替。* - */ - get position(): Vector3 - set position(v: Vector3) - /** - * 直接获取或修改刚体在*物理系统*中的旋转(以四元数表示)。 - * 物理系统中的旋转是独立于节点系统中的Transform的,详见{@link //TODO}。 - * - * \**如果你不清楚修改这一项的后果,请不要手动修改它。修改{@link Transform3D.euler}或{@link Transform3D.quaternion}来代替。* - */ - get rotation(): Quaternion - set rotation(v: Quaternion) - /** - * 刚体的角速度。 - */ - get angularVelocity(): Vector3 - set angularVelocity(v: Vector3) - /** - * 刚体的质心相对于LocalTransform的偏移量。 - * 如果不手动设置这一项,会自动根据刚体附着的轮廓来计算质心。 - * @see {@link resetCenterOfMass} - */ - get centerOfMass(): Vector3 - set centerOfMass(v: Vector3) - /** - * 是否允许*物理模拟*过程中对刚体进行旋转。 - * @default true - */ - get freezeRotation(): boolean - set freezeRotation(v: boolean) - /** - * 刚体的转动惯量。 - * 如果不手动设置的话,会自动根据刚体上附着的轮廓计算得出。 - * @see {@link resetInertiaTensor} - */ - get inertiaTensor(): number - set inertiaTensor(v: number) - /** - * 最大角速度(弧度)。 - * @default 7 - */ - get maxAngularVelocity(): number - set maxAngularVelocity(v: number) - /** - * 最大分离速度。 - * *物理模拟*解决碰撞(相交)的过程中,最大能允许的分离速度。 - * @default Infinity - */ - get maxDepenetrationVelocity(): number - set maxDepenetrationVelocity(v: number) - /** - * 设置刚体进入休眠的动能阈值。 - * @default 0.005 - */ - get sleepThreshold(): number - set sleepThreshold(v: number) - /** - * 设置*物理模拟*过程中解决碰撞的迭代次数。 - * 更高的迭代次数,会消耗更多性能,产生更自然的物理碰撞效果。 - * 如果发现静息状态的刚体(比如说放在地面上),会发生抖动,可以考虑提高这项数值。 - * - * @limit solverIterations > 0 - * @default 6 - */ - get solverIterations(): number - set solverIterations(v: number) - /** - * 设置*物理模拟*过程中计算碰撞后速度的迭代次数。 - * 更高的迭代次数,会消耗更多性能,产生更准确的分离速度。 - * - * @limit solverVelocityIterations > 0 - * @default 1 - */ - get solverVelocityIterations(): number - set solverVelocityIterations(v: number) - /** - * 刚体的线性速度。 - * - * \**修改这一项会造成速度突变,一般情况下可以使用{@link addForce}来代替。* - */ - get velocity(): Vector3 - set velocity(v: Vector3) - /** - * @internal - */ - constructor() - applyData(data: IRigidbodyData): void - onTick(dateTime: number, data: IRigidbodyData): void - onAdd(parent: Element, data: IRigidbodyData): void - onUpdate(data: IRigidbodyData, preData: IRigidbodyData): void - onRemove(parent: Element, data: IRigidbodyData): void - onRelease(data: IRigidbodyData): void - enable(): void - disable(): void - /** @internal */ - get nativeComp(): phys3D.DynamicRigidbody - /** - * @returns 刚体质心在世界坐标中的位置。 - */ - getWorldCenterOfMass(): Vector3 - /** - * 为刚体施加力,会影响刚体的{@link velocity | 线性速度}。 - * @param force 世界坐标下矢量形式的力,作用在物体质心上。 - * @param mode 力的类型。 - */ - addForce(force: Vector3, mode: ForceMode): void - /** - * 为刚体施加力矩,会影响刚体的{@link angularVelocity | 角速度}。 - * @param torque 世界坐标下矢量形式的力矩。 - * @param mode 力矩的类型。 - */ - addTorque(torque: Vector3, mode: ForceMode): void - /** - * @returns 刚体是否处于休眠状态。 - * @see {@link sleep} - */ - isSleeping(): boolean - /** - * 强迫刚体进入休眠状态(至少一帧),休眠状态详见{@link //todo}。 - * \**如果下一帧发生碰撞则会立刻醒来。* - */ - sleep(): void - /** - * 强制唤醒刚体(离开休眠状态)。 - * @see {@link sleep} - */ - wakeUp(): void - /** - * 生成一次模拟爆炸的力。 - * 爆炸范围可以视作一个球状物体,如果球体和刚体产生*相交*,则会在刚体上产生推力。 - * 推力的大小和*相交点*与球心的距离有关,推力的方向从球心指向相交点,推力作用位于*相交点*。 - * - * 视刚体有无附着的轮廓,分为两种情况: - * + 无轮廓(或爆炸球心在刚体轮廓内) - * 相交的判定使用刚体的质心;相交点也取刚体的质心。 - * + 有轮廓 - * 相交的判定使用刚体的所有轮廓;相交点取轮廓距离球心最近的那一点。 - * @param explosionForce 爆炸力的大小。 - * @param explosionPosition 爆炸球体的球心位置。 - * @param explosionRadius 爆炸球体的半径。 - * @param upwardsModifier 使用相对数值来修改推力的*作用位置*的y坐标。 - * @param mode 力的类型。 - * @limit explosionForce > 0 - */ - AddExplosionForce( - explosionForce: number, - explosionPosition: Vector3, - explosionRadius: number, - upwardsModifier: number, - mode: ForceMode - ): void - /** - * 为刚体施加力,会影响刚体的{@link velocity | 线性速度}和{@link angularVelocity | 角速度}。 - * @param force 世界坐标下矢量形式的力,作用在position位置上。 - * @param position 力的作用位置。 - * @param mode 力的类型。 - */ - AddForceAtPosition( - force: Vector3, - position: Vector3, - mode: ForceMode - ): void - /** - * 为刚体施加力,会影响刚体的{@link velocity | 线性速度}。 - * @param force **局部**坐标下矢量形式的力,作用在物体质心上。 - * @param mode 力的类型。 - */ - addRelativeForce(force: Vector3, mode: ForceMode): void - /** - * 为刚体施加力矩,会影响刚体的{@link angularVelocity | 角速度}。 - * @param torque **局部**坐标下矢量形式的力矩。 - * @param mode 力矩的类型。 - */ - addRelativeTorque(torque: Vector3, mode: ForceMode): void - /** - * 测试刚体**表面上**距离某点最近的位置。 - * 如果给予的position在刚体内部,会返回position。 - * 如果刚体无附着的轮廓,会返回[Infinity, Infinity, Infinity]。 - */ - closestPointOnBounds(position: Vector3): Vector3 - /** - * 获取刚体内某一点在世界坐标下的速度。 - * @param worldPoint 世界坐标下的位置(其实在刚体外也可以)。 - */ - getPointVelocity(worldPoint: Vector3): Vector3 - /** - * 获取刚体内某一点在**局部**坐标下的速度。 - * @param relativePoint **局部**坐标下的位置(其实在刚体外也可以)。 - */ - getRelativePointVelocity(relativePoint: Vector3): Vector3 - /** - * 对于***非**运动学刚体*来说,等于直接修改{@link position}; - * 对于*运动学刚体*来说,位置变化会在下一帧生效。可以视作物体在这一帧的*物理模拟*中沿直线路径**移动**到了目的地。 - * @param position 位移的终点 - * @see {@link isKinematic} - */ - movePosition(position: Vector3): void - /** - * @unimplemented 暂未支持,请使用{@link rotation}属性或{@link Transform3D.quaternion}代替。 - */ - moveRotation(rotation: Quaternion): void - /** - * 手动触发,根据刚体附着的轮廓重新计算刚体的质心。 - * @see {@link centerOfMass} - */ - resetCenterOfMass(): void - /** - * 手动触发,根据刚体附着的轮廓重新计算刚体的转动惯量。 - * @see {@link inertiaTensor} - */ - resetInertiaTensor(): void - /** - * 根据给定的密度和刚体附着的轮廓,来计算刚体的质量。 - * @see {@link mass} - */ - setDensity(density: number): void - } -} - -declare module 'XrFrame/components/physics/ShapeInteract' { - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import { CombineMode } from 'XrFrame/components/physics/types' - export enum EShapeInteractType { - None = 0, - Overlap = 1, - Collide = 2 - } - export interface IShapeInteractData { - /** - * 是否禁用Shape间交互。 - * - * @default false - */ - disabled?: boolean - /** - * 是否能与其他Shape发生物理碰撞。 - * - * @default false - */ - collide?: boolean - /** - * 弹性系数,决定碰撞时的能量损失比例。 - * - * 弹性系数 = 1时,碰撞无能量损失。 - * @limit 0 <= bounciness <= 1 - * @default 0 - */ - bounciness?: number - /** - * 静摩擦系数 - * @limit 0 <= staticFriction <= 1 - * @default 0.6 - */ - staticFriction?: number - /** - * 动摩擦系数。 - * @limit 0 <= dynamicFriction <= 1 - * @default 0.6 - */ - dynamicFriction?: number - } - export const ShapeInteractSchema: { - disabled: { - type: string - } - collide: { - type: string - } - bounciness: { - type: string - } - staticFriction: { - type: string - } - dynamicFriction: { - type: string - } - } - /** - * 拥有ShapeInterace组件的Shape才能与其他Shape发生交互。 - * 将`collide`属性设置为true来与其他Shape进行物理碰撞,仅当两个Shape的collide属性**都为true**时它们才能发生碰撞。 - */ - export default class ShapeInteract extends Component<IShapeInteractData> { - readonly schema: IComponentSchema - _disabled: boolean - _collide: boolean - get dynamicFriction(): number - set dynamicFriction(value) - /** - * 静摩擦系数 - * @limit 0 <= staticFriction <= 1 - * @default 0.6 - */ - get staticFriction(): number - set staticFriction(value) - /** - * 弹性系数,决定碰撞时的能量损失比例。 - * - * 弹性系数 = 1时,碰撞无能量损失。 - * @limit 0 <= bounciness <= 1 - * @default 0 - */ - get bounciness(): number - set bounciness(value) - /** - * 如何结合发生碰撞的两个物体的摩擦系数。 - * @default {@link CombineMode.Average} - */ - get frictionCombine(): CombineMode - set frictionCombine(v: CombineMode) - /** - * 如何结合发生碰撞的两个物体的弹性系数。 - * @default {@link CombineMode.Average} - */ - get bounceCombine(): CombineMode - set bounceCombine(v: CombineMode) - constructor() - /** - * @internal - */ - get material(): phys3D.Material - onAdd(parent: Element, data: IShapeInteractData): void - onUpdate(data: IShapeInteractData, preData: IShapeInteractData): void - getInteractType(): EShapeInteractType - } -} - -declare module 'XrFrame/components/gizmo/ShapeGizmos' { - import Component from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import CapsuleGizmo from 'XrFrame/components/gizmo/CapsuleGizmo' - import Shape, { ShapeImplType } from 'XrFrame/components/physics/Shape' - import CubeGizmo from 'XrFrame/components/gizmo/CubeGizmo' - /** - * @see {@link ShapeGizmos} - */ - export interface IShapeGizmosData {} - export const ShapeGizmosSchema: {} - interface GizmoInfo { - shape: Shape<any> - gizmoCtor: null | typeof CubeGizmo | typeof CapsuleGizmo - shadowGizmos: ShapeGizmos[] - type: ShapeImplType - version: number - } - /** - * 将当前元素下的所有{@link Shape | 轮廓}都显示出来。 - * 在标签上添加`shape-gizmo`属性来创建该组件。 - * - * @see {@link IShapeGizmosData} - */ - export default class ShapeGizmos extends Component<IShapeGizmosData> { - onAdd(parent: Element, data: IShapeGizmosData): void - onUpdate(data: IShapeGizmosData, preData: IShapeGizmosData): void - onTick(deltaTime: number, data: IShapeGizmosData): void - onRemove(parent: Element, data: IShapeGizmosData): void - onRelease(data: IShapeGizmosData): void - /** - * @internal - */ - buildGizmo(info: GizmoInfo): void - } - export {} -} - -declare module 'XrFrame/components/AssetPostProcess' { - /** - * AssetPostProcess.ts - * - * * @Date : 10/14/2022, 4:35:12 PM - */ - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - /** - * `AssetPostProcess`资源数据接口。 - */ - export interface IAssetPostProcessData { - /** - * 资源`id`。 - */ - assetId: string - /** - * 同{@link IPostProcessOptions.type}。 - */ - type: string - /** - * 同{@link IPostProcessOptions.isHDR}。 - */ - isHDR?: boolean - /** - * 同{@link IPostProcessOptions.data}。 - */ - data?: { - [key: string]: string - } - } - /** - * {@link AssetPostProcess}的`schema`,详见{@link IAssetPostProcessData}。 - */ - export const AssetPostProcessSchema: IComponentSchema - /** - * 渲染纹理创建组件,用于在`xml`中创建{@link PostProcess}资源,一般被代理到{@link XRAssetPostProcess}元素。 - */ - export default class AssetPostProcess extends Component<IAssetPostProcessData> { - /** - * 详见{@link AssetPostProcessSchema}。 - */ - readonly schema: IComponentSchema - /** - * 对应后处理资源的数据,可用于修改。 - */ - get assetData(): { - [key: string]: any - } - onAdd(parent: Element, data: IAssetPostProcessData): void - onUpdate( - data: IAssetPostProcessData, - preData: IAssetPostProcessData - ): void - /** - * 移除AssetPostProcess。 - */ - onRemove(parent: Element, data: IAssetPostProcessData): void - } -} - -declare module 'XrFrame/elements/xr-node' { - /** - * xr-node.ts - * - * * @Date : 2022/3/18下午2:15:02 - */ - import Element, { IEntityComponents } from 'XrFrame/core/Element' - /** - * 默认包含{@link Transform}组件。 - */ - export const NodeDefaultComponents: IEntityComponents - /** - * 默认将{@link Transform}组件的属性进行映射。 - */ - export const NodeDataMapping: { - 'node-id': string[] - visible: string[] - layer: string[] - position: string[] - rotation: string[] - scale: string[] - } & { - [key: string]: string[] - } - /** - * 标签为`xr-node`,场景中所有3D节点的基础。 - * - * 默认组件见{@link NodeDefaultComponents},属性映射见{@link NodeDataMapping}。 - */ - export default class XRNode extends Element { - static IS(element: Element): element is XRNode - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - readonly isXRNode: boolean - } -} - -declare module 'XrFrame/elements/xr-shadow' { - /** - * xr-shadow.ts - * - * * @Date : 6/14/2022, 3:59:17 PM - */ - import Element, { IEntityComponents } from 'XrFrame/core/Element' - /** - * 默认包含{@link XRNode}的所有默认组件。 - */ - export const ShadowDefaultComponents: IEntityComponents - /** - * 默认包含{@link XRNode}的所有属性映射。 - */ - export const ShadowDataMapping: { - 'node-id': string[] - visible: string[] - layer: string[] - position: string[] - rotation: string[] - scale: string[] - } & { - [key: string]: string[] - } - /** - * 标签为`xr-shadow`。 - * 是一种特殊的节点,开发者**仅可在其下以及子孙挂载自己创建的节点**! - * - * 默认组件见{@link ShadowDefaultComponents},属性映射见{@link ShadowDataMapping}。 - */ - export default class XRShadow extends Element { - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - _appendChild(_child: Element, custom?: boolean): void - _removeChild(_child: Element, _index?: number, custom?: boolean): void - _insertBefore(_child: Element, _before?: Element, _index?: number): void - _replaceChild( - _child: Element, - _oldChild?: Element, - _index?: number - ): void - _spliceBefore( - _before: number | Element, - _deleteCount: number, - _list: Element - ): void - _spliceAppend(_list: Element): void - _spliceRemove(_before: Element, _deleteCount: number): void - } -} - -declare module 'XrFrame/elements/xr-camera' { - /** - * xr-camera.ts - * - * * @Date : 2022/3/29下午5:03:57 - */ - import Element, { IEntityComponents } from 'XrFrame/core/Element' - /** - * 默认包含{@link XRNode}的所有默认组件,以及{@link Camera}组件。 - */ - export const CameraDefaultComponents: IEntityComponents - /** - * 默认包含{@link XRNode}的所有属性映射,以及将{@link Camera}组件的属性进行映射。 - */ - export const CameraDataMapping: { - target: string[] - 'render-target': string[] - 'is-perspective': string[] - 'cull-mask': string[] - depth: string[] - fov: string[] - near: string[] - far: string[] - 'orth-size': string[] - background: string[] - 'is-ar-camera': string[] - 'is-clear-depth': string[] - 'is-clear-stencil': string[] - 'is-clear-color': string[] - 'clear-depth': string[] - 'clear-stencil': string[] - 'clear-color': string[] - 'post-process': string[] - 'allow-features': string[] - } & { - 'node-id': string[] - visible: string[] - layer: string[] - position: string[] - rotation: string[] - scale: string[] - } & { - [key: string]: string[] - } - /** - * 标签为`xr-camera`。 - * - * 默认组件见{@link CameraDefaultComponents},属性映射见{@link CameraDataMapping}。 - */ - export default class XRCamera extends Element { - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - } -} - -declare module 'XrFrame/elements/xr-mesh' { - /** - * xr-mesh.ts - * - * * @Date : 2022/3/29下午5:05:49 - */ - import Element, { IEntityComponents } from 'XrFrame/core/Element' - /** - * 默认包含{@link XRNode}的所有默认组件,以及{@link Mesh}组件。 - */ - export const MeshDefaultComponents: IEntityComponents - /** - * 默认包含{@link XRNode}的所有属性映射,以及将{@link Mesh}组件的属性进行映射。 - */ - export const MeshDataMapping: { - 'never-cull': string[] - 'cast-shadow': string[] - 'receive-shadow': string[] - geometry: string[] - material: string[] - uniforms: string[] - states: string[] - 'env-data': string[] - } & { - 'node-id': string[] - visible: string[] - layer: string[] - position: string[] - rotation: string[] - scale: string[] - } & { - [key: string]: string[] - } - /** - * 标签为`xr-mesh`。 - * - * 默认组件见{@link MeshDefaultComponents},属性映射见{@link MeshDataMapping}。 - */ - export default class XRMesh extends Element { - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - } -} - -declare module 'XrFrame/elements/xr-light' { - /** - * xr-light.ts - * - * * @Date : 4/12/2022, 10:37:57 AM - */ - import Element, { IEntityComponents } from 'XrFrame/core/Element' - /** - * 默认包含{@link XRNode}的所有默认组件,以及{@link Light}组件。 - */ - export const LightDefaultComponents: IEntityComponents - /** - * 默认包含{@link XRNode}的所有属性映射,以及将{@link Light}组件的属性进行映射。 - */ - export const LightDataMapping: { - type: string[] - 'cast-shadow': string[] - 'shadow-distance': string[] - 'shadow-strength': string[] - 'shadow-bias': string[] - color: string[] - intensity: string[] - range: string[] - 'inner-cone-angle': string[] - 'outer-cone-angle': string[] - } & { - 'node-id': string[] - visible: string[] - layer: string[] - position: string[] - rotation: string[] - scale: string[] - } & { - [key: string]: string[] - } - /** - * 标签为`xr-ar-tracker`。 - * - * 默认组件见{@link LightDefaultComponents},属性映射见{@link LightDataMapping}。 - */ - export default class XRLight extends Element { - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - } -} - -declare module 'XrFrame/elements/xr-gltf' { - import { IEntityComponents } from 'XrFrame/core/Element' - import XRShadow from 'XrFrame/elements/xr-shadow' - /** - * 默认包含{@link XRNode}的所有默认组件,以及{@link GLTF}组件。 - */ - export const GLTFDefaultComponents: IEntityComponents - /** - * 默认包含{@link XRNode}的所有属性映射,以及将{@link GLTF}组件的属性进行映射。 - * - * + model → {@link IGLTFComponentData.model} - * + cast-shadow → {@link IGLTFComponentData.castShadow} - * + receive-shadow → {@link IGLTFComponentData.receiveShadow} - * - */ - export const GLTFDataMapping: { - model: string[] - 'cast-shadow': string[] - 'receive-shadow': string[] - 'never-cull': string[] - states: string[] - } & { - 'node-id': string[] - visible: string[] - layer: string[] - position: string[] - rotation: string[] - scale: string[] - } & { - [key: string]: string[] - } - /** - * 标签为`xr-gltf`。 - * 不能在这个标签内放置子标签。 - * - * 默认组件见{@link GLTFDefaultComponents},属性映射见{@link GLTFDataMapping}。 - */ - export default class XRGLTF extends XRShadow { - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - } -} - -declare module 'XrFrame/elements/xr-asset-material' { - /** - * xr-asset-material.ts - * - * * @Date : 2022/3/18下午5:27:37 - */ - import Element, { IEntityComponents } from 'XrFrame/core/Element' - export const AssetMaterialDefaultComponents: IEntityComponents - /** - * 将{@link AssetMaterial}的属性进行映射。 - */ - export const AssetMaterialDataMapping: { - 'asset-id': string[] - effect: string[] - marcos: string[] - uniforms: string[] - states: string[] - 'render-queue': string[] - 'env-data': string[] - } & { - [key: string]: string[] - } - /** - * 标签为`xr-asset-material`。 - * - * 默认组件见{@link AssetMaterialDefaultComponents},属性映射见{@link AssetMaterialDataMapping}。 - */ - export default class XRAssetMaterial extends Element { - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - } -} - -declare module 'XrFrame/elements/xr-asset-render-texture' { - /** - * xr-asset-render-texture.ts - * - * * @Date : 8/29/2022, 12:51:29 PM - */ - import Element, { IEntityComponents } from 'XrFrame/core/Element' - export const AssetRenderTextureDefaultComponents: IEntityComponents - /** - * 将{@link AssetRenderTexture}的属性进行映射。 - */ - export const AssetRenderTextureDataMapping: { - 'asset-id': string[] - width: string[] - height: string[] - 'is-hdr': string[] - } & { - [key: string]: string[] - } - /** - * 标签为`xr-asset-render-texture`。 - * - * 默认组件见{@link AssetRenderTextureDefaultComponents},属性映射见{@link AssetRenderTextureDataMapping}。 - */ - export default class XRAssetRenderTexture extends Element { - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - } -} - -declare module 'XrFrame/elements/xr-asset-load' { - /** - * xr-asset-load.ts - * - * * @Date : 2022/3/16下午5:29:40 - */ - import Element from 'XrFrame/core/Element' - /** - * 将{@link AssetLoad}组件的属性进行映射。 - */ - export const AssetLoadDataMapping: { - type: string[] - 'asset-id': string[] - src: string[] - defer: string[] - options: string[] - } & { - [key: string]: string[] - } - /** - * 标签为`xr-asset-load`。 - * - * 属性映射见{@link AssetLoadDataMapping}。 - */ - export default class XRAssetLoad extends Element { - readonly dataMapping: { - [key: string]: string[] - } - readonly neverTick: boolean - } -} - -declare module 'XrFrame/elements/xr-assets' { - /** - * xr-assets.ts - * - * * @Date : 2022/3/16下午5:28:52 - */ - import Element, { IEntityComponents } from 'XrFrame/core/Element' - /** - * 默认包含{@link Assets}组件。 - */ - export const AssetsDefaultComponents: IEntityComponents - /** - * 标签为`xr-assets`。 - * - * 默认组件见{@link AssetsDefaultComponents}。 - */ - export default class XRAssets extends Element { - readonly defaultComponents: IEntityComponents - readonly neverTick: boolean - } -} - -declare module 'XrFrame/elements/xr-env' { - /** - * xr-env.ts - * - * * @Date : 5/12/2022, 12:56:19 PM - */ - import Element, { IEntityComponents } from 'XrFrame/core/Element' - /** - * 默认包含{@link Env}组件。 - */ - export const EnvDefaultComponents: IEntityComponents - /** - * 默认将{@link Env}组件的属性进行映射。 - */ - export const EnvDataMapping: { - 'env-data': string[] - 'sky-map': string[] - 'is-sky2d': string[] - rotation: string[] - 'diffuse-exp': string[] - 'specular-exp': string[] - } & { - [key: string]: string[] - } - /** - * 标签为`xr-env`。 - * - * 默认组件见{@link EnvDefaultComponents},属性映射见{@link EnvDataMapping}。 - */ - export default class XREnv extends Element { - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - readonly neverTick: boolean - } -} - -declare module 'XrFrame/elements/xr-ar-tracker' { - /** - * xr-ar-tracker.ts - * - * * @Date : 6/27/2022, 3:42:45 PM - */ - import Element, { IEntityComponents } from 'XrFrame/core/Element' - /** - * 默认包含{@link XRNode}的所有默认组件,以及{@link ARTracker}组件。 - */ - export const ARTrackerDefaultComponents: IEntityComponents - /** - * 默认包含{@link XRNode}的所有属性映射,以及将{@link ARTracker}组件的属性进行映射。 - */ - export const ARTrackerDataMapping: { - mode: string[] - 'hit-id': string[] - image: string[] - src: string[] - 'auto-sync': string[] - } & { - 'node-id': string[] - visible: string[] - layer: string[] - position: string[] - rotation: string[] - scale: string[] - } & { - [key: string]: string[] - } - /** - * 标签为`xr-ar-tracker`。 - * - * 默认组件见{@link ARTrackerDefaultComponents},属性映射见{@link ARTrackerDataMapping}。 - */ - export default class XRARTracker extends Element { - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - } -} - -declare module 'XrFrame/elements/xr-text' { - import Element, { IEntityComponents } from 'XrFrame/core/Element' - export const TextDefaultComponents: IEntityComponents - export const TextDataMapping: { - [key: string]: string[] - } - export default class XRText extends Element { - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - } -} - -declare module 'XrFrame/elements/xr-particle' { - import Element, { IEntityComponents } from 'XrFrame/core/Element' - export const ParticleDefaultComponents: IEntityComponents - export const ParticleDataMapping: { - [key: string]: string[] - } - export default class XRParticle extends Element { - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - } -} - -declare module 'XrFrame/elements/xr-asset-post-process' { - /** - * xr-asset-post-process.ts - * - * * @Date : 10/14/2022, 5:18:21 PM - */ - import Element, { IEntityComponents } from 'XrFrame/core/Element' - export const AssetPostProcessDefaultComponents: IEntityComponents - /** - * 将{@link AssetPostProcess}的属性进行映射。 - */ - export const AssetPostProcessDataMapping: { - 'asset-id': string[] - type: string[] - 'is-hdr': string[] - data: string[] - } & { - [key: string]: string[] - } - /** - * 标签为`xr-asset-render-texture`。 - * - * 默认组件见{@link AssetPostProcessDefaultComponents},属性映射见{@link AssetPostProcessDataMapping}。 - */ - export default class XRAssetPostProcess extends Element { - readonly defaultComponents: IEntityComponents - readonly dataMapping: { - [key: string]: string[] - } - } -} - -declare module 'XrFrame/systems/AssetsSystem' { - import Component from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import { IAssetLoadData, IAssetWithState } from 'XrFrame/loader/types' - export interface IAssetsSystemData {} - /** - * 资源系统,负责整个场景的资源管理。 - * - * 一般不需要手动管理,而是利用{@link AssetLoad}、{@link registerGeometry}之类的使用。 - */ - export default class AssetsSystem extends Component<IAssetsSystemData> { - readonly priority: number - /** - * 手动添加一个资源。 - */ - addAsset<T>(type: string, id: string, asset: T): void - /** - * 手动加载一个资源。 - */ - loadAsset( - params: IAssetLoadData, - parent?: Element - ): Promise<IAssetWithState<any>> - /** - * 手动释放一个资源。 - * - * 注意在`xml`里加载的资源不要手动释放。 - */ - releaseAsset(type: string, id: string): void - /** - * 获取一个资源,如果尚未加载完成,也会返回`undefined`。 - */ - getAsset<T>(type: string, id: string, fallback?: string): T - /** - * 获取一个资源以及加载状态。 - */ - getAssetWithState<T>( - type: string, - id: string, - fallback?: string - ): IAssetWithState<T> - /** - * 取消加载一个资源。 - */ - cancelAsset(type: string, id: string): void - /** - * @internal - */ - /** - * @internal - */ - onRelease(data: IAssetsSystemData): void - } -} - -declare module 'XrFrame/systems/NodeSystem' { - import Component from 'XrFrame/core/Component' - export interface INodeSystemData {} - /** - * 节点系统,负责整个场景节点的管理。 - */ - export default class NodeSystem extends Component<INodeSystemData> { - readonly priority: number - onTick(deltaTime: number, data: INodeSystemData): void - } -} - -declare module 'XrFrame/systems/TickSystem' { - /** - * TickSystem.ts - * - * * @Date : 2022/3/29上午10:50:57 - */ - import Component from 'XrFrame/core/Component' - export interface ITickSystemData {} - /** - * Tick系统,负责整个场景生命周期的驱动。 - */ - export default class TickSystem extends Component<ITickSystemData> { - readonly priority: number - onTick(deltaTime: number, data: ITickSystemData): void - } -} - -declare module 'XrFrame/systems/AnimationSystem' { - /** - * AnimationSystem.ts - * - * * @Date : 6/17/2022, 2:35:17 PM - */ - import Animator from 'XrFrame/components/Animator' - import Component from 'XrFrame/core/Component' - export interface IAnimationSystemData {} - /** - * 动画系统,负责整个场景动画的管理。 - */ - export default class AnimationSystem extends Component<IAnimationSystemData> { - readonly priority: number - onTick(deltaTime: number, data: IAnimationSystemData): void - /** - * @internal - */ - /** - * @internal - */ - } -} - -declare module 'XrFrame/systems/VideoSystem' { - /** - * VideoSystem.ts - * - * * @Date : 8/26/2022, 8:02:21 PM - */ - import VideoTexture from 'XrFrame/assets/VideoTexture' - import Component from 'XrFrame/core/Component' - import { Element } from 'XrFrame/xrFrameSystem' - export interface IVideoSystemData {} - /** - * 视频系统,负责整个场景视频的管理。 - */ - export default class VideoSystem extends Component<IVideoSystemData> { - readonly priority: number - onAdd(parent: Element, data: IVideoSystemData): void - onTick(deltaTime: number, data: IVideoSystemData): void - onRelease(data: IVideoSystemData): void - /** - * @internal - */ - /** - * @internal - */ - } -} - -declare module 'XrFrame/systems/RenderSystem' { - /** - * RenderSystem.ts - * - * * @Date : 2022/3/16下午4:20:58 - */ - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - import Camera from 'XrFrame/components/Camera' - import Env from 'XrFrame/components/Env' - import RenderGraph from 'XrFrame/render-graph/RenderGraph' - import LightManager from 'XrFrame/systems/LightManager' - import Observable from 'XrFrame/core/Observable' - /** - * `RenderSystem`系统数据接口。 - */ - export interface IRenderSystemData { - /** - * 是否支持画布输出透明通道,并且能够和背景混合。 - * `xml`中数据类型为`boolean`。 - */ - alpha: boolean - /** - * 场景中阴影的颜色。 - * `xml`中数据类型为`color`。 - */ - shadowColor: number[] - } - /** - * {@link RenderSystem}的`schema`,详见{@link IRenderSystemData}。 - */ - export const RenderSystemSchema: IComponentSchema - /** - * 渲染系统,负责整个场景渲染的管理。 - */ - export default class RenderSystem extends Component<IRenderSystemData> { - readonly priority: number - /** - * 详见{@link RenderSystemSchema}。 - */ - readonly schema: IComponentSchema - protected _lights: LightManager - protected _renderGraph?: RenderGraph - protected _sortedCameras: Camera[] - protected _dirtyCameras: Camera[] - protected _features: { - [key: string]: boolean | number | string - } - protected _dirtyFeatures: { - [key: string]: boolean | number | string - } - protected _camerasChangeEvent: Observable<this> - protected _env: Env - /** - * @internal - */ - get lights(): LightManager - /** - * @internal - */ - get env(): Env - /** - * @internal - */ - get camerasChangeEvent(): Observable<this, any> - /** - * 获取场景中的所有相机,已按照深度排序。 - * - * @internal - */ - get cameras(): Camera[] - /** - * 获取场景中的所有当帧修改过的相机,已按照深度排序。 - * - * @internal - */ - get changedCameras(): Camera[] - /** - * 当前正在使用的RenderGraph。 - */ - get renderGraph(): RenderGraph<any> - get shadowColor(): number[] - /** - * 修改全局宏信息。 - */ - changeMacros(macros: { - [name: string]: string | number | boolean - }): void - /** - * 获取全局宏信息。 - */ - getMacro(key: string): string | number | boolean - /** - * 修改全局渲染特性。 - */ - changeFeatures(features: { - [key: string]: string | number | boolean - }): void - /** - * 获取全局渲染特性。 - */ - getFeature(key: string): boolean | number | string - onAdd(parent: Element, data: IRenderSystemData): void - onTick(): void - onRelease(data: IRenderSystemData): void - /** - * 使用某个RenderGraph,默认会使用内置的`ForwardBaseRG`。 - */ - useRenderGraph(rg: RenderGraph): void - /** - * 开启全局GPU实例化。 - */ - enableInstance(): void - /** - * 关闭全局GPU实例化。 - */ - disableInstance(): void - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - protected _sortCameras(): void - } -} - -declare module 'XrFrame/systems/PhysicsSystem' { - import { Camera } from 'XrFrame/components' - import Component from 'XrFrame/core/Component' - import { Kanata } from 'XrFrame/ext' - import Vector3 from 'XrFrame/math/vector3' - import { RaycastDesc } from 'XrFrame/physics/raycast' - import Element from 'XrFrame/core/Element' - import Shape from 'XrFrame/components/physics/Shape' - /** - * `touch-shape`和`untouch-shape`事件的回调参数。 - */ - export interface IShapeTouchEvent { - /** - * 渲染*被选中的{@link Shape | 轮廓}*的相机。 - */ - camera: Camera - /** - * *被选中的{@link Shape | 轮廓}*所在的元素。 - */ - target: Element - /** - * 被选中的{@link Shape | 轮廓}。 - */ - shape: Shape - /** - * 点击位置在二维canvas中的x坐标。 - */ - x: number - /** - * 点击位置在二维canvas中的y坐标。 - */ - y: number - /** - * {@link camera}在三维场景中的位置。 - */ - origin: [number, number, number] - /** - * 从{@link camera}投射出的射线的单位向量。 - */ - dir: [number, number, number] - /** - * @unimplemented - */ - force: number - } - /** - * `drag-shape`事件的回调参数。 - */ - export interface IShapeDragEvent extends IShapeTouchEvent { - /** - * 点击位置在二维canvas中的x坐标的变化量。 - */ - deltaX: number - /** - * 点击位置在二维canvas中的y坐标的变化量。 - */ - deltaY: number - } - /** - * @see {@link PhysicsSystem} - */ - export interface IPhysicsSystemData {} - /** - * 物理系统,管理着场景中的所有{@link Shape | 轮廓}和{@link Rigidbody | 刚体}。 - */ - export default class PhysicsSystem extends Component<IPhysicsSystemData> { - /** - * @internal - */ - nativeSystem: phys3D.PhysSystem - /** - * 是否进行物理模拟。 - */ - enableSimulation: boolean - constructor() - /** @internal */ - addShape(shape: Shape): void - /** @internal */ - removeShape(shape: Shape): void - onAdd(): void - maxPhysicsDeltaTime: number - fixedDeltaTime: number - /** - * @internal - */ - onTick(dt: number, data: IPhysicsSystemData): void - /** - * @internal - */ - bindRigidbodyWithEntity( - rigidbody: phys3D.Rigidbody, - entity: Kanata.Entity3D - ): void - /** - * @internal - */ - unbindRigidbody(rigidbody: phys3D.Rigidbody): void - /** - * 射线检测,判断给定射线是否与至少一个轮廓相交,并返回与**最近**的那个轮廓相交的信息。 - * 返回的信息记录在desc.hit里,需要事先创建一个RaycastHit对象来负责接收。 - */ - raycast(desc: RaycastDesc): boolean - /** - * 全局重力。 - * @default [0, -9.8, 0] - */ - get gravity(): Vector3 - set gravity(v: Vector3) - /** - * 设置碰撞矩阵。 - * @param str 用于表达碰撞矩阵的字符串 - * @internal - */ - setCollisionMatrix(str: string): void - /** - * 设定某一对layer之间是否会发生碰撞。 - * @param ignore `true`表示**不**碰撞。 - */ - ignoreLayerCollision( - layer1: number, - layer2: number, - ignore?: boolean - ): void - } -} - -declare module 'XrFrame/systems/ARSystem' { - import { Camera, Mesh } from 'XrFrame/components' - import ARTracker, { TTrackMode } from 'XrFrame/components/ARTracker' - import Component, { IComponentSchema } from 'XrFrame/core/Component' - import Matrix4 from 'XrFrame/math/matrix4' - import Vector3 from 'XrFrame/math/vector3' - type Element = import('XrFrame/core/Element').default - /** - * AR追踪原始数据。 - */ - export interface IARRawData { - /** - * 该帧生成时间,单位是纳秒(ns)。 - * 在版本`v2.30.1`之后支持。 - */ - timestamp: number - /** - * 当前相机帧画面宽度。 - */ - width: number - /** - * 当前相机帧画面高度。 - */ - height: number - /** - * 当前相机帧画面`y`通道,yuv420。 - */ - yBuffer: ArrayBuffer - /** - * 当前相机帧画面`uv`通道,yuv420。 - */ - uvBuffer: ArrayBuffer - /** - * 当前相机帧内参矩阵。 - */ - intrinsics: Float32Array - /** - * 当前相机帧视图矩阵。 - */ - viewMatrix: Float32Array - } - /** - * `ARSystem`系统数据接口。 - */ - export interface IARSystemData { - /** - * 系统支持的追踪模式,目前仅支持一个! - * `xml`中数据类型为`array`,默认值为`Plane`。 - */ - modes: TTrackMode[] - /** - * 使用前置还是后置相机,默认后置`Back`。 - */ - camera?: 'Front' | 'Back' - /** - * 在支持的情况下,是否开启实时深度遮挡。 - * **目前暂时不可用!** - */ - depthMask?: boolean - /** - * 开启实时深度遮挡时,遮挡的近处阈值。 - * 值是空间实际尺度(m),默认为`0.02`。 - */ - depthNear?: number - /** - * 开启实时深度遮挡时,遮挡的远处阈值。 - * 值是空间实际尺度(m),默认为`20`。 - */ - depthFar?: number - /** - * 开启实时深度遮挡时,显示一个用于Debug的图层。 - * **目前暂时不可用!** - */ - depthDebug?: boolean - /** - * 在`v2`平面模式下,平面检测模式。 - * `1`为水平面,`2`为垂直平面,`3`为两个都支持。 - * 默认为`3`。 - */ - planeMode?: number - /** - * 在`Face`/`Body`/`Hand`模式下,使用原生的AI3D推理估计。 - * 默认为`false`。 - * **目前暂时不可用!** - */ - pose3d?: boolean - } - /** - * {@link ARSystem}的`schema`,详见{@link IARSystemData}。 - */ - export const ARSystemSchema: IComponentSchema - /** - * AR系统,负责整个场景AR相关对象的管理。 - * - * 代理自小程序的`VKSession`。 - */ - export default class ARSystem extends Component<IARSystemData> { - static EVENTS: string[] - /** - * 详见{@link ARSystemSchema}。 - */ - readonly schema: IComponentSchema - readonly priority: number - /** - * 当前设备是否启动成功。 - */ - get supported(): boolean - /** - * 当前启动的追踪模式。 - */ - get arModes(): TTrackMode[] - /** - * 当前启动的AR系统版本。 - */ - get arVersion(): number - /** - * 当前是否已经可用。 - */ - get ready(): boolean - /** - * 在`Face`/`Body`/`Hand`模式下,当前识别到的姿态数量。 - */ - get posCount(): number - onAdd(parent: Element, data: IARSystemData): void - onTick(deltaTime: number, data: IARSystemData): void - onUpdate(data: IARSystemData, preData: IARSystemData): void - onRemove(parent: Element, data: IARSystemData): void - onRelease(data: IARSystemData): void - /** - * 在`Plane`模式下,同步某个节点到当前追踪到的和平面的交点。 - * - * @param nodeIdOrElement 节点的`nodeId`或是`element`引用。 - * @param switchVisible 是否要自动切换显示或隐藏。 - * @returns 是否放置成功 - */ - placeHere( - nodeIdOrElement: string | Element, - switchVisible?: boolean - ): boolean - /** - * 在`Plane`模式下,重置平面。 - */ - resetPlane(): void - /** - * 获取AR的追踪的原始数据。 - */ - getARRawData(): IARRawData - /** - * 提供一个修改某个设置为`isARCamera`的相机的试图矩阵的手段。 - */ - forceSetViewMatrix(camera: Camera, mat: Matrix4 | null): void - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - } - export {} -} - -declare module 'XrFrame/systems/ShareSystem' { - /** - * ShareSystem.ts - * - * * @Date : 9/19/2022, 5:04:24 PM - */ - import Component from 'XrFrame/core/Component' - export interface IShareSystemData {} - /** - * 分享到临时文件的配置。 - */ - export interface IShareCaptureOptions { - /** - * 输出图片编码。 - * @default 'jpg' - */ - fileType?: 'jpg' | 'png' - /** - * 输出图片jpg时的品质,0~1。 - * @default 0.8 - */ - quality?: number - } - /** - * 分享录屏的配置。 - */ - export interface IShareRecordOptions { - /** - * 输出帧率。 - * @default 30 - */ - fps?: number - /** - * 视频比特率。 - * @default 1000 - */ - videoBitsPerSecond?: number - /** - * 录制视频宽度,不传的话使用Canvas宽度。 - */ - width?: number - /** - * 录制视频高度,不传的话使用Canvas高度。 - */ - height?: number - } - /** - * 录屏状态枚举。 - */ - export enum EShareRecordState { - Idle = 0, - Waiting = 1, - Recording = 2, - Paused = 3 - } - /** - * 分享系统,负责分享相关功能。 - */ - export default class ShareSystem extends Component<IShareSystemData> { - readonly priority: number - /** - * 当前是否支持分享系统。 - */ - get supported(): boolean - /** - * 当前录屏状态。 - */ - get recordState(): EShareRecordState - onTick(deltaTime: number, data: IShareSystemData): void - /** - * @deprecated 请在`v3.0.2`后使用异步版本,同步版本不再维护,请使用`captureToDataURLAsync`。 - * 截屏输出为`base64`。 - */ - captureToDataURL(options?: IShareCaptureOptions): string - /** - * @deprecated 请在`v3.0.2`后使用异步版本,同步版本不再维护,请使用`captureToArrayBufferAsync`。 - * 截屏输出为`ArrayBuffer`。 - */ - captureToArrayBuffer(options?: IShareCaptureOptions): ArrayBuffer - /** - * 截屏输出为`base64`。 - * 基础库`v3.0.2`以上版本支持。 - */ - captureToDataURLAsync(options?: IShareCaptureOptions): Promise<string> - /** - * 截屏输出为`ArrayBuffer`。 - * 基础库`v3.0.2`以上版本支持。 - */ - captureToArrayBufferAsync( - options?: IShareCaptureOptions - ): Promise<ArrayBuffer> - /** - * 截屏输出为本地路径,回调完成后会自动释放。 - * - * @params callback 接受结果的回调,处理完后会释放文件。在v2.27.1前是异步,之后兼容同步和异步。 - */ - captureToLocalPath( - options: IShareCaptureOptions, - callback: (fp: string) => Promise<void> | void - ): Promise<void> - /** - * 直接截屏分享给好友。 - */ - captureToFriends(options?: IShareCaptureOptions): Promise<void> - /** - * 启动录屏。 - * 基础库`v3.1.1`以上版本支持。 - */ - recordStart(options?: IShareRecordOptions): Promise<void> - /** - * 暂停本次录屏。 - * 基础库`v3.1.1`以上版本支持。 - */ - recordPause(): Promise<void> - /** - * 唤醒本次录屏。 - */ - recordResume(): Promise<void> - /** - * 录屏完成,输出到临时文件。 - * 基础库`v3.1.1`以上版本支持。 - * - * @returns 临时文件地址 - */ - recordFinishToTempFile(): Promise<string> - /** - * 录屏完成,直接保存到用户相册。 - * 基础库`v3.1.1`以上版本支持。 - */ - recordFinishToAlbum(): Promise<void> - } -} - -declare module 'XrFrame/systems/GizmoSystem' { - /** - * @author shanexyzhou@tencent.com - */ - import CapsuleGizmo from 'XrFrame/components/gizmo/CapsuleGizmo' - import CubeGizmo from 'XrFrame/components/gizmo/CubeGizmo' - import Component from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - export interface IGizmoSystemData {} - type GizmoComponent = CubeGizmo | CapsuleGizmo - /** - * 动画系统,负责为Gizmo组件创建管理相对应的GizmoMesh元素。 - */ - export default class GizmoSystem extends Component<IGizmoSystemData> { - readonly priority: number - onTick(deltaTime: number, data: IGizmoSystemData): void - /** - * @internal - * 因为exparser的原因,不能通过脚本为普通xml节点添加子节点, - * 只能给XRShadow添加子节点,所以把需要添加gizmo的节点复制一份放在shadowRoot下, - * 每帧去同步transform。 - */ - addGizmo(gizmo: GizmoComponent): Element - /** - * @internal - */ - removeGizmo(gizmo: GizmoComponent): void - } - export {} -} - -declare module 'XrFrame/loader/AssetLoader' { - import { IAssetLoadData } from 'XrFrame/loader/types' - type Scene = import('XrFrame/core/Scene').default - /** - * 指定继承自{@link AssetLoader}的自定义资源加载器,可以接受的的额外配置的`schema`。 - * 在基础库版本**v2.29.2**以上导出。 - * - * 比如使用{@link CubeTextureLoader}加载资源时: - * - * ```xml - * <xr-asset-load - * type="cube-texture" asset-id="sky-cube" src="/assets/textures/skybox/" - * options="faces: right.jpg left.jpg top.jpg bottom.jpg front.jpg back.jpg" - * /> - * ``` - * - * 对应的`schema`接口为: - * ```ts - * export interface ICubeTextureLoaderOptions { - * // left right top bottom front back - * faces: string[]; - * } - * ```ts - * - * 对应的`schema`为: - * ```ts - * schema = { - * faces: {type: 'array'} - * }; - * ``` - */ - export interface ILoaderOptionsSchema { - [key: string]: { - type: string - defaultValue?: any - } - } - /** - * 资源加载器的基类,配合{@link AssetsSystem}使用。 - * 在基础库版本**v2.29.2**以上导出。 - * - * @template T 加载资源的类型。 - * @template ILoadOptions 可接受额外配置的类型。 - */ - export default class AssetLoader<T, ILoadOptions> { - /** - * 和{@link Component.schema}类似,指定解析Options的实际`schema`,对应于`ILoadOptions`。 - */ - readonly schema: ILoaderOptionsSchema - /** - * 当前资源所属场景的实例。 - */ - get scene(): import('XrFrame/core/Scene').default - constructor(_scene: Scene, type: string) - /** - * @internal - */ - /** - * 加载一个资源,并根据情况执行`callbacks`中的回调。 - * **理论上必须要实现!** - * - * @param callbacks 开发者需要在加载进度更新时执行`onLoading`,在加载完成时执行`onLoaded`,在加载出错是执行`onError` - */ - load( - data: IAssetLoadData<ILoadOptions>, - callbacks: { - onLoading(progress: number): void - onLoaded(result: T, localPath?: string): void - onError(error: Error): void - } - ): void - /** - * 取消加载特定资源。一般不需要自己编写逻辑,而是使用`entity.canceled`在加载终点丢弃。 - * 注意`entity.canceled`是在这里赋值的,所以一般继承请务必先执行`super.cancel()`! - */ - cancel(params: IAssetLoadData<ILoadOptions>): void - /** - * 释放资源时将会调用,用于自定义释放逻辑。 - */ - release(params: IAssetLoadData<ILoadOptions>, value: T): void - /** - * 返回默认资源列表。 - * 所有默认资源都是惰性加载的。 - */ - getBuiltin(): Array<{ - assetId: string - src: string - options: ILoadOptions - }> - } - export function getAssetLoaderTypes(): string[] - export function getAssetLoader( - type: string - ): new ( - scene: import('XrFrame/core/Scene').default, - type: string - ) => AssetLoader<any, any> - /** - * 注册一个资源加载器。注意注册后该`type`会被自动注册到DataValue中:{@link registerDataValue}。 - * 在基础库版本**v2.29.2**以上导出。 - * - * @param type 类型,也是写在{@link AssetLoad}上的那个`type`。 - * @param clz 继承自{@link AssetLoader}的自定义资源加载器类。 - */ - export function registerAssetLoader( - type: string, - clz: new (scene: Scene, type: string) => AssetLoader<any, any> - ): void - export {} -} - -declare module 'XrFrame/loader/TextureLoader' { - /** - * TextureLoader.ts - * - * * @Date : 2022/4/1下午5:19:36 - */ - import { Kanata } from 'XrFrame/ext' - import AssetLoader, { - ILoaderOptionsSchema - } from 'XrFrame/loader/AssetLoader' - import { IAssetLoadData } from 'XrFrame/loader/types' - export function isPOT(img: Kanata.IImage): boolean - /** - * {@link TextureLoader}可接受的自定义参数`schema`。 - */ - export interface ITextureLoaderOptions { - /** - * 各向异性系数。 - * @default 1 - */ - anisoLevel?: number - /** - * wrapU,值为数字,见{@link EWrapMode}。 - * @default 2 - */ - wrapU?: number - /** - * wrapV,值为数字,见{@link EWrapMode}。 - * @default 2 - */ - wrapV?: number - /** - * magFilter,值为数字,见{@link EFilterMode}。 - * 默认值依据纹理是否POT而定。 - */ - magFilter?: number - /** - * minFilter,值为数字,见{@link EFilterMode}。 - * 默认值依据纹理是否POT而定。 - */ - minFilter?: number - /** - * 是否要生成mipmaps。 - * @default false - */ - generateMipmaps?: boolean - } - type ITextureLoadData = IAssetLoadData<ITextureLoaderOptions> - /** - * 纹理资源{@link Texture}的加载器。 - * - * 内置资源可以通过{@link registerTexture}注册,拥有内置资源`brdf-lut`、`white`、`transparent`、`black`、`red`、`green`、`blue`、`yellow`、`babyblue`、`babygreen`、`babyred`。 - */ - export default class TextureLoader extends AssetLoader< - Kanata.Texture, - ITextureLoaderOptions - > { - readonly schema: ILoaderOptionsSchema - load( - params: ITextureLoadData, - callbacks: { - onLoading(progress: number): void - onLoaded(value: Kanata.Texture): void - onError(error: Error): void - } - ): void - getBuiltin(): Array<{ - assetId: string - src: string - options: {} - }> - release(params: ITextureLoadData, value: Kanata.Texture): void - } - export {} -} - -declare module 'XrFrame/loader/ImageLoader' { - /** - * ImageLoader.ts - * - * * @Date : 6/13/2022, 12:40:11 PM - */ - import { Kanata } from 'XrFrame/ext' - import AssetLoader, { - ILoaderOptionsSchema - } from 'XrFrame/loader/AssetLoader' - import { IAssetLoadData } from 'XrFrame/loader/types' - export interface IImageLoaderOptions {} - type IImageLoadData = IAssetLoadData<IImageLoaderOptions> - /** - * 图片数据资源{@link IImage}的加载器。 - * - * 图片数据不同于纹理资源{@link Texture},请自行按照场景使用。 - */ - export default class ImageLoader extends AssetLoader< - Kanata.IImage, - IImageLoaderOptions - > { - readonly schema: ILoaderOptionsSchema - load( - params: IImageLoadData, - callbacks: { - onLoading(progress: number): void - onLoaded(value: Kanata.IImage): void - onError(error: Error): void - } - ): void - release(params: IImageLoadData, value: Kanata.IImage): void - } - export {} -} - -declare module 'XrFrame/loader/CubeTextureLoader' { - /** - * CubeCubeTextureLoader.ts - * - * * @Date : 5/10/2022, 11:24:51 AM - */ - import { Kanata } from 'XrFrame/ext' - import AssetLoader, { - ILoaderOptionsSchema - } from 'XrFrame/loader/AssetLoader' - import { IAssetLoadData } from 'XrFrame/loader/types' - /** - * {@link CubeTextureLoader}可接受的自定义参数`schema`。 - */ - export interface ICubeTextureLoaderOptions { - /** - * 顺序为 left right top bottom front back。 - */ - faces: string[] - /** - * 各向异性系数。 - * @default 1 - */ - anisoLevel: number - /** - * wrapU,值为数字,见{@link EWrapMode}。 - * @default 2 - */ - wrapU?: number - /** - * wrapV,值为数字,见{@link EWrapMode}。 - * @default 2 - */ - wrapV?: number - /** - * wrapW,值为数字,见{@link EWrapMode}。 - * @default 2 - */ - wrapW?: number - /** - * magFilter,值为数字,见{@link EFilterMode}。 - * 默认值依据纹理是否POT而定。 - */ - magFilter?: number - /** - * minFilter,值为数字,见{@link EFilterMode}。 - * 默认值依据纹理是否POT而定。 - */ - minFilter?: number - /** - * 是否要生成mipmaps。 - * @default false - */ - generateMipmaps?: boolean - } - type ICubeTextureLoadData = IAssetLoadData<ICubeTextureLoaderOptions> - /** - * 立方体资源{@link CubeTexture}的加载器。 - * - * 内置资源可以通过{@link registerTextureCube}注册,拥有内置资源`brdf-lut`、`white`、`transparent`、`black`、`red`、`green`、`blue`、`yellow`。 - */ - export default class CubeTextureLoader extends AssetLoader< - Kanata.Texture, - ICubeTextureLoaderOptions - > { - /** - * 详见{@link ICubeTextureLoaderOptions}。 - */ - readonly schema: ILoaderOptionsSchema - load( - params: ICubeTextureLoadData, - callbacks: { - onLoading(progress: number): void - onLoaded(value: Kanata.Texture): void - onError(error: Error): void - } - ): void - release(params: ICubeTextureLoadData, value: Kanata.Texture): void - } - export {} -} - -declare module 'XrFrame/loader/VideoTextureLoader' { - /** - * VideoTextureLoader.ts - * - * * @Date : 8/26/2022, 8:02:51 PM - */ - import VideoTexture from 'XrFrame/assets/VideoTexture' - import AssetLoader, { - ILoaderOptionsSchema - } from 'XrFrame/loader/AssetLoader' - import { IAssetLoadData } from 'XrFrame/loader/types' - /** - * {@link VideoTextureLoader}可接受的自定义参数`schema`。 - * - * 基本同{@link IVideoTextureOptions}。 - */ - export interface IVideoTextureLoaderOptions { - anisoLevel: number - placeHolder?: string - autoPlay?: boolean - loop?: boolean - abortAudio?: boolean - } - type IVideoTextureLoadData = IAssetLoadData<IVideoTextureLoaderOptions> - /** - * 视频纹理资源{@link VideoTexture}的加载器。 - */ - export default class VideoTextureLoader extends AssetLoader< - VideoTexture, - IVideoTextureLoaderOptions - > { - /** - * 详见{@link IVideoTextureLoaderOptions}。 - */ - readonly schema: ILoaderOptionsSchema - load( - params: IVideoTextureLoadData, - callbacks: { - onLoading(progress: number): void - onLoaded(value: VideoTexture): void - onError(error: Error): void - } - ): Promise<void> - release(params: IVideoTextureLoadData, value: VideoTexture): void - } - export {} -} - -declare module 'XrFrame/loader/EnvDataLoader' { - /** - * EnvDataLoader.ts - * - * * @Date : 5/10/2022, 11:27:49 AM - */ - import EnvData from 'XrFrame/assets/EnvData' - import AssetLoader, { - ILoaderOptionsSchema - } from 'XrFrame/loader/AssetLoader' - import { IAssetLoadData } from 'XrFrame/loader/types' - interface IBufferSlice { - offset: number - length: number - type: string - } - export interface IEnvDataSource { - skybox?: { - type: '2D' | 'Cube' - half: boolean - map: (string | string[]) | IBufferSlice - } - diffuse?: { - coefficients: number[][] - } - specular?: { - type: '2D' - rgbd: boolean - mipmaps: boolean - mipmapCount?: number - map: string | IBufferSlice - } - } - export interface IEnvDataLoaderOptions {} - type IEnvDataLoadData = IAssetLoadData<IEnvDataLoaderOptions> - /** - * 环境数据资源{@link EnvData}的加载器。 - * - * 拥有内置资源`xr-frame-team-workspace-day`、`xr-frame-team-workspace-night`以及`xr-frame-team-workspace-day2`。 - * 加载的资源一般由[xr-frame-cli](https://github.com/wechat-miniprogram/xr-frame-cli)生成。 - */ - export default class EnvDataLoader extends AssetLoader< - EnvData, - IEnvDataLoaderOptions - > { - readonly schema: ILoaderOptionsSchema - load( - params: IEnvDataLoadData, - callbacks: { - onLoading(progress: number): void - onLoaded(value: EnvData): void - onError(error: Error): void - } - ): Promise<void> - getBuiltin(): Array<{ - assetId: string - src: string - options: IEnvDataLoaderOptions - }> - release(params: IEnvDataLoadData, value: EnvData): void - } - export {} -} - -declare module 'XrFrame/loader/GlTFLoader' { - /** - * GLTFLoader.ts - * - * * @Date : 2022/3/16下午3:47:56 - */ - import GLTFModel from 'XrFrame/assets/GLTFModel' - import AssetLoader, { - ILoaderOptionsSchema - } from 'XrFrame/loader/AssetLoader' - import { IAssetLoadData } from 'XrFrame/loader/types' - import { Scene } from 'XrFrame/elements' - export enum GLBChunkType { - JSON = 1313821514, - BIN = 5130562 - } - export interface IGLTFLoaderOptions { - /** - * *(基础库2.31.1及之后)* - * 可以忽略xr-frame对GLTF模型的某一些限制,来强行渲染有问题的GLTF模型。 - * ErrorCode会在渲染模型失败后,由console报出。 - * 填写-1则忽略所有限制。 - */ - ignoreError: number[] - /** - * *(基础库2.32.1及之后)* - * 开启了之后会在GLTFModel中保留原始json。 - */ - preserveRaw: boolean - } - type IGLTFLoadData = IAssetLoadData<IGLTFLoaderOptions> - /** - * GLTF资源加载器,加载完毕后返回一个{@link GLTFModel}。 - */ - export default class GLTFLoader extends AssetLoader< - GLTFModel, - IGLTFLoaderOptions - > { - readonly schema: ILoaderOptionsSchema - load( - param: IGLTFLoadData, - callbacks: { - onLoading(progress: number): void - onLoaded(value: GLTFModel): void - onError(error: Error): void - } - ): Promise<void> - cancel(params: IGLTFLoadData): void - release(params: IGLTFLoadData, value: GLTFModel): void - /** - * @internal - */ - static createGLTFModel( - scene: Scene, - buffer: ArrayBuffer, - param: IGLTFLoadData, - onLoading?: (progress: number) => void - ): Promise<GLTFModel> - } - export {} -} - -declare module 'XrFrame/loader/KeyframeLoader' { - /** - * KeyframeLoader.ts - * - * * @Date : 6/21/2022, 6:48:33 PM - */ - import KeyframeAnimation from 'XrFrame/animation/KeyframeAnimation' - import AssetLoader, { - ILoaderOptionsSchema - } from 'XrFrame/loader/AssetLoader' - import { IAssetLoadData } from 'XrFrame/loader/types' - export interface IKeyframeLoaderOptions {} - type IKeyframeLoadData = IAssetLoadData<IKeyframeLoaderOptions> - /** - * 帧动画资源{@link KeyframeAnimation}的加载器。 - */ - export default class KeyframeLoader extends AssetLoader< - KeyframeAnimation, - IKeyframeLoaderOptions - > { - readonly schema: ILoaderOptionsSchema - load( - params: IKeyframeLoadData, - callbacks: { - onLoading(progress: number): void - onLoaded(value: KeyframeAnimation): void - onError(error: Error): void - } - ): Promise<void> - } - export {} -} - -declare module 'XrFrame/loader/RawLoader' { - import AssetLoader, { - ILoaderOptionsSchema - } from 'XrFrame/loader/AssetLoader' - import { IAssetLoadData } from 'XrFrame/loader/types' - /** - * 原始数据加载器的参数。 - */ - export interface IRawLoaderOptions { - /** - * 编码,默认为`binary`。 - */ - encoding?: 'binary' | 'utf-8' - } - type IRawLoadData = IAssetLoadData<IRawLoaderOptions> - /** - * 原始数据的加载器。 - */ - export default class RawLoader extends AssetLoader< - string | ArrayBuffer, - IRawLoaderOptions - > { - readonly schema: ILoaderOptionsSchema - load( - params: IRawLoadData, - callbacks: { - onLoading(progress: number): void - onLoaded(value: string | ArrayBuffer): void - onError(error: Error): void - } - ): Promise<void> - } - export {} -} - -declare module 'XrFrame/loader/AtlasLoader' { - /** - * AtlasLoader.ts - * - * * @Date : 10/13/2022, 5:35:00 PM - */ - import Atlas from 'XrFrame/assets/Atlas' - import AssetLoader, { - ILoaderOptionsSchema - } from 'XrFrame/loader/AssetLoader' - import { IAssetLoadData } from 'XrFrame/loader/types' - export interface IAtlasSource { - meta: { - image: string - size: { - w: number - h: number - } - } - frames: { - [key: string]: { - frame: { - x: number - y: number - w: number - h: number - } - spriteSourceSize: { - x: number - y: number - w: number - h: number - } - sourceSize: { - w: number - h: number - } - } - } - } - export interface IAtlasLoaderOptions {} - type IAtlasLoadData = IAssetLoadData<IAtlasLoaderOptions> - /** - * 图集资源{@link Atlas}的加载器。 - * @version 2.27.1 - * - * 推荐使用[Shoebox](https://www.renderhjs.net/shoebox/)生成。 - */ - export default class AtlasLoader extends AssetLoader< - Atlas, - IAtlasLoaderOptions - > { - readonly schema: ILoaderOptionsSchema - load( - params: IAtlasLoadData, - callbacks: { - onLoading(progress: number): void - onLoaded(value: Atlas): void - onError(error: Error): void - } - ): Promise<void> - getBuiltin(): Array<{ - assetId: string - src: string - options: IAtlasLoaderOptions - }> - } - export {} -} - -declare module 'XrFrame/loader/types' { - /** - * types.ts - * - * * @Date : 2022/4/1下午2:19:33 - */ - type Assets = import('XrFrame/components/Assets').default - export function isAsset(value: any): value is IAssetWithState<any> - export enum EAssetState { - Undefined = 0, - Defer = 1, - Loading = 2, - Existed = 3 - } - export interface IAssetWithState<T> { - __isAsset: boolean - __params?: IAssetLoadData - __group?: Assets - value?: T - state: EAssetState - promise?: Promise<IAssetWithState<T>> - } - /** - * {@link AssetLoad}组件数据接口。 - */ - export interface IAssetLoadData<T = any> { - /** - * 资源类型,必须是使用{@link registerAssetLoader}中注册过的类型。 - * `xml`中数据为`string`类型。 - */ - type: string - /** - * 资源Id。 - * `xml`中数据为`string`类型。 - */ - assetId: string - /** - * 资源地址。 - * `xml`中数据为`string`类型。 - */ - src: string - /** - * 资源权重,用于在同一批加载的资源的`progress`事件中计算进度,详见{@link Assets}。 - * `xml`中数据为`number`类型。 - */ - weight?: number - /** - * 资源追加配置,视资源类型而定。 - * `xml`中数据为`dict`类型。 - */ - options: T - /** - * 是否要按需延迟加载,如果开启,则只有在资源被实际引用时才会被加载。 - * `xml`中数据为`boolean`类型。 - */ - defer?: boolean - /** - * @internal - */ - canceled?: boolean - /** - * @internal - */ - startTs?: number - /** - * 加载时长(s),仅用于统计。 - */ - duration?: number - /** - * 当前加载进度。 - */ - progress?: number - } - export {} -} - -declare module 'XrFrame/animation/NativeAnimation' { - import { Kanata } from 'XrFrame/ext' - import Animation, { TDirection } from 'XrFrame/animation/Animation' - import Element from 'XrFrame/core/Element' - export enum ENativeAnimationSimulatorType { - None = 0, - Morph = 1 - } - export interface INativeAnimationData { - clip: Kanata.AnimationClipModel - bindings: Kanata.Entity3D[] - frameCount: number - names: string[] - simulators?: Array<{ - type: ENativeAnimationSimulatorType - target: Element - subElements: Element[] - }> - } - export const DefaultNativeAnimationFPS = 60 - /** - * 使用客户端加速的动画片段,通常由gltf实例化而来,仅供内部使用。 - */ - export default class NativeAnimation extends Animation<INativeAnimationData> { - onInit(data: INativeAnimationData): void - onPlay( - el: Element, - clipName: string, - options: any - ): { - duration: number - loop?: number - delay?: number - direction?: TDirection - } - onUpdate(el: Element, progress: number, reverse: boolean): void - } -} - -declare module 'XrFrame/loader/glTF/GLTFRootNode' { - import GLTFAnimationsNode, { - GLTFAnimationsLoaded, - GLTFAnimationsNodeRaw - } from 'XrFrame/loader/glTF/animations/GLTFAnimationsNode' - import GLTFAccessorsNode, { - GLTFAccessorsNodeRaw - } from 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' - import GLTFBuffersNode, { - GLTFBuffersNodeRaw - } from 'XrFrame/loader/glTF/buffers/GLTFBuffersNode' - import GLTFBufferViewsNode, { - GLTFBufferViewsNodeRaw - } from 'XrFrame/loader/glTF/buffers/GLTFBufferViewsNode' - import { GLTFExtensionsProfiles } from 'XrFrame/loader/glTF/extensions/GLTFExtensions' - import GLTFMeshesNode, { - GLTFMeshesLoaded, - GLTFMeshesNodeRaw - } from 'XrFrame/loader/glTF/geometry/GLTFMeshesNode' - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import GLTFMaterialsNode, { - GLTFMaterialsLoaded, - GLTFMaterialsNodeRaw - } from 'XrFrame/loader/glTF/materials/GLTFMaterialsNode' - import GLTFNodesNode, { - GLTFNodesLoaded, - GLTFNodesNodeRaw - } from 'XrFrame/loader/glTF/scenes/GLTFNodesNode' - import { GLTFSceneLoaded } from 'XrFrame/loader/glTF/scenes/GLTFSceneNode' - import GLTFScenesNode, { - GLTFScenesLoaded, - GLTFScenesNodeRaw - } from 'XrFrame/loader/glTF/scenes/GLTFScenesNode' - import GLTFSkinsNode, { - GLTFSkinsLoaded, - GLTFSkinsNodeRaw - } from 'XrFrame/loader/glTF/skins/GLTFSkinsNode' - import GLTFImagesNode, { - GLTFImagesNodeRaw - } from 'XrFrame/loader/glTF/textures/GLTFImagesNode' - import GLTFSamplersNode, { - GLTFSamplersLoaded, - GLTFSamplersNodeRaw - } from 'XrFrame/loader/glTF/textures/GLTFSamplersNode' - import GLTFTexturesNode, { - GLTFTexturesLoaded, - GLTFTexturesNodeRaw - } from 'XrFrame/loader/glTF/textures/GLTFTexturesNode' - import { EValidation } from 'XrFrame/loader/glTF/utils/exceptions' - type Scene = import('XrFrame/core/Scene').default - export interface GLTFRootNodeRaw { - buffers?: GLTFBuffersNodeRaw - bufferViews?: GLTFBufferViewsNodeRaw - accessors?: GLTFAccessorsNodeRaw - images?: GLTFImagesNodeRaw - samplers?: GLTFSamplersNodeRaw - textures?: GLTFTexturesNodeRaw - materials?: GLTFMaterialsNodeRaw - meshes?: GLTFMeshesNodeRaw - nodes?: GLTFNodesNodeRaw - scenes?: GLTFScenesNodeRaw - skins?: GLTFSkinsNodeRaw - animations?: GLTFAnimationsNodeRaw - scene?: number - extensions?: object - extensionsRequired?: string[] - extensionsUsed?: string[] - } - export interface GLTFRootLoaded { - samplers: GLTFSamplersLoaded - textures: GLTFTexturesLoaded - materials: GLTFMaterialsLoaded - meshes: GLTFMeshesLoaded - nodes: GLTFNodesLoaded - scenes: GLTFScenesLoaded - scene: GLTFSceneLoaded - skins: GLTFSkinsLoaded - animations: GLTFAnimationsLoaded - } - export interface GLTFDesc { - raw: object - scene: Scene - uri?: string - ignoreError?: number[] - extensionProfiles?: GLTFExtensionsProfiles - defaultBinary?: ArrayBuffer - } - export default class GLTFRootNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFRootNodeRaw - readonly uri: string - readonly defaultBinary: ArrayBuffer | null - nodesCollector: { - [path: string]: GLTFBaseNode[] - } - extensionProfiles: GLTFExtensionsProfiles - extensionGlobals: { - [name: string]: object - } - resource: GLTFRootLoaded | null - buffersNode: GLTFBuffersNode | undefined - bufferViewsNode: GLTFBufferViewsNode | undefined - accessorsNode: GLTFAccessorsNode | undefined - imagesNode: GLTFImagesNode | undefined - samplersNode: GLTFSamplersNode | undefined - texturesNode: GLTFTexturesNode | undefined - materialsNode: GLTFMaterialsNode | undefined - meshesNode: GLTFMeshesNode | undefined - nodesNode: GLTFNodesNode | undefined - scenesNode: GLTFScenesNode | undefined - skinsNode: GLTFSkinsNode | undefined - animationsNode: GLTFAnimationsNode | undefined - ignoreError: { - [errorType in EValidation]?: true - } - constructor(desc: GLTFDesc) - build(): void - preload( - reportProgress?: (progress: number) => void - ): Promise<GLTFRootLoaded> - getLoadedResource(): GLTFRootLoaded - getNodesByPath(path: string): GLTFBaseNode[] - getRootExtensionRaw(extName: string): object | undefined - /** - * 在preload完之后可以调用这个函数,会把原始buffer的引用都释放掉。 - * 每个子节点的raw也会释放掉(以防数据是dataURI的形式)。 - */ - releaseRawBuffer(): void - } - export {} -} - -declare module 'XrFrame/loader/glTF/scenes/GLTFNodesNode' { - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import GLTFNodeNode, { - GLTFNodeLoaded, - GLTFNodeNodeRaw, - GLTFNodePrerequisites - } from 'XrFrame/loader/glTF/scenes/GLTFNodeNode' - type ChildNode = GLTFNodeNode - export type GLTFNodesNodeRaw = GLTFNodesNodeRaw[] - export type GLTFTreeNode = { - data: GLTFNodeLoaded - children: GLTFTreeNode[] - parent: GLTFTreeNode | null - index: number - extensions?: object - } - export type GLTFNodesLoaded = GLTFTreeNode[] - export default class GLTFNodesNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFNodeNodeRaw): GLTFNodeNode - readonly raw: GLTFNodesNodeRaw - get nodeName(): string - res: GLTFNodesLoaded - preload(prerequisites: GLTFNodePrerequisites): Promise<GLTFNodesLoaded> - getLoadedResource(): GLTFNodesLoaded - } - export {} -} - -declare module 'XrFrame/physics/RaycastHit' { - import Shape from 'XrFrame/components/physics/Shape' - import { Scene } from 'XrFrame/elements' - import Vector3 from 'XrFrame/math/vector3' - export default class RaycastHit { - constructor(scene: Scene, nativeComp?: phys3D.RaycastHit) - /** - * @internal - * native层真正的raycastHit对象,业务侧无需关心 - */ - get nativeRaycastHit(): phys3D.RaycastHit - /** - * 与射线相交的Shape。 - */ - get shape(): Shape<any> - /** - * 从射线的原点到碰撞点的距离。 - */ - get distance(): number - set distance(v: number) - /** - * 射线与轮廓的交点表面的法线。 - */ - get normal(): Vector3 - set normal(v: Vector3) - /** - * 在世界空间中,射线与轮廓的交点。 - */ - get point(): Vector3 - set point(v: Vector3) - } -} - -declare module 'XrFrame/physics/Collision' { - import Shape from 'XrFrame/components/physics/Shape' - import ContactPoint, { IContactPoint } from 'XrFrame/physics/ContactPoint' - import { Vector3ReadOnly } from 'XrFrame/math/vector3' - const collisionMap: WeakMap<phys3D.Collision, Collision> - export { collisionMap } - /** - * 物理碰撞事件(collide-begin等)的信息。 - * @category Physics - * @readonly - */ - export interface ICollideEvent { - /** - * 从碰撞到分离所用的冲量之和。 - */ - readonly impulse: Vector3ReadOnly - /** - * 两个刚体的相对线性碰撞速度。 - */ - readonly relativeVelocity: Vector3ReadOnly - /** - * 发生碰撞的另一个轮廓。 - */ - readonly shape: Shape - /** - * 本次碰撞的接触点。 - */ - readonly contacts: IContactPoint[] - } - /** - * 物理重叠事件(overlap-begin等)的信息。 - * @category Physics - * @readonly - */ - export interface IOverlapEvent { - /** - * 重叠的另一个轮廓。 - */ - readonly shape: Shape - } - export default class Collision implements ICollideEvent { - constructor(native: phys3D.Collision) - get impulse(): Vector3ReadOnly - get relativeVelocity(): Vector3ReadOnly - get shape(): Shape<any> - get contacts(): ContactPoint[] - } -} - -declare module 'XrFrame/physics/ContactPoint' { - import Shape from 'XrFrame/components/physics/Shape' - import { Vector3ReadOnly } from 'XrFrame/math/vector3' - const contactPointMap: WeakMap<phys3D.ContactPoint, ContactPoint> - export { contactPointMap } - /** - * 物理事件返回的{@link ICollideEvent | 碰撞信息}中的碰撞点。 - * @category Physics - */ - export interface IContactPoint { - /** - * 在该碰撞点处,两个物体的距离。 - * - * 不一定是0或小于0,因为只要两个物体的距离小于{@link Collider.contactOffset}之和,就会判定为碰撞。 - */ - readonly separation: number - /** - * 碰撞平面的法线。 - */ - readonly normal: Vector3ReadOnly - /** - * 碰撞点的位置。 - */ - readonly point: Vector3ReadOnly - /** - * 接收碰撞事件的轮廓。 - */ - readonly thisShape: Shape - /** - * 另一个轮廓。 - */ - readonly otherShape: Shape - } - export default class ContactPoint implements IContactPoint { - get separation(): number - get normal(): Vector3ReadOnly - get point(): Vector3ReadOnly - get thisShape(): Shape<any> - get otherShape(): Shape<any> - constructor(native: phys3D.ContactPoint) - } -} - -declare module 'XrFrame/physics/raycast' { - import Vector3 from 'XrFrame/math/vector3' - import RaycastHit from 'XrFrame/physics/RaycastHit' - /** - * raycast函数的参数。 - * @field origin 射线起点。 - * @field unitDir 射线方向(单位向量)。 - * @field distance 射线的最大长度。 - * @field hit 用来接收碰撞信息的容器。 - * @field layerMask 可以用来屏蔽一些物体。 - * @field (未实现)queryTriggerInteraction,是否能与Trigger相交(默认能)。 - */ - export type RaycastDesc = { - origin: Vector3 - unitDir: Vector3 - distance?: number - hit?: RaycastHit - layerMask?: number - } - /** - * 射线检测,判断给定射线是否与至少一个碰撞体相交,并返回与**最近**的那个碰撞体相交的信息。 - */ - export function raycast( - Phys3D: typeof phys3D, - system: phys3D.PhysSystem, - desc: RaycastDesc - ): boolean -} - -declare module 'XrFrame/kanata/lib/frontend' { - import MeshRendererComponent from 'XrFrame/kanata/lib/frontend/component/MeshRendererComponent' - import renderEnv from 'XrFrame/kanata/lib/frontend/resource/renderEnv' - export { RenderEnv } from 'XrFrame/kanata/lib/frontend/resource/renderEnv' - export { default as AnimatorComponent } from 'XrFrame/kanata/lib/frontend/component/AnimatorComponent' - export { default as CameraComponent } from 'XrFrame/kanata/lib/frontend/component/CameraComponent' - export { default as LightCameraComponent } from 'XrFrame/kanata/lib/frontend/component/LightCameraComponent' - export { default as CullingComponent } from 'XrFrame/kanata/lib/frontend/component/CullingComponent' - export { default as MeshRendererComponent } from 'XrFrame/kanata/lib/frontend/component/MeshRendererComponent' - export { default as SkinnedSkeletonComponent } from 'XrFrame/kanata/lib/frontend/component/SkinnedSkeletonComponent' - export { default as DynamicBonesComponent } from 'XrFrame/kanata/lib/frontend/component/DynamicBonesComponent' - export { default as Entity2D } from 'XrFrame/kanata/lib/frontend/entity/Entity2D' - export { default as Entity3D } from 'XrFrame/kanata/lib/frontend/entity/Entity3D' - export { default as AnimationClipModel } from 'XrFrame/kanata/lib/frontend/resource/AnimationClipModel' - export { default as AnimationClipBinding } from 'XrFrame/kanata/lib/frontend/resource/AnimationClipBinding' - export { default as AnimatorControllerModel } from 'XrFrame/kanata/lib/frontend/resource/AnimatorControllerModel' - export { default as AnimatorControllerStateModel } from 'XrFrame/kanata/lib/frontend/resource/AnimatorControllerStateModel' - export { default as DataBuffer } from 'XrFrame/kanata/lib/frontend/resource/DataBuffer' - export { default as DataModel } from 'XrFrame/kanata/lib/frontend/resource/DataModel' - export { default as Effect } from 'XrFrame/kanata/lib/frontend/resource/Effect' - export { default as Material } from 'XrFrame/kanata/lib/frontend/resource/Material' - export { - default as RenderPass, - IRenderPassOptions - } from 'XrFrame/kanata/lib/frontend/resource/RenderPass' - export { default as SkeletonBoneInverseModel } from 'XrFrame/kanata/lib/frontend/resource/SkeletonBoneInverseModel' - export { - default as Texture, - ITextureOptions - } from 'XrFrame/kanata/lib/frontend/resource/Texture' - export { default as UniformBlock } from 'XrFrame/kanata/lib/frontend/resource/UniformBlock' - export { default as UniformDescriptor } from 'XrFrame/kanata/lib/frontend/resource/UniformDescriptor' - export { default as IndexBuffer } from 'XrFrame/kanata/lib/frontend/resource/IndexBuffer' - export { default as IndexData } from 'XrFrame/kanata/lib/frontend/resource/IndexData' - export { default as VertexBuffer } from 'XrFrame/kanata/lib/frontend/resource/VertexBuffer' - export { default as VertexData } from 'XrFrame/kanata/lib/frontend/resource/VertexData' - export { default as VertexLayout } from 'XrFrame/kanata/lib/frontend/resource/VertexLayout' - export { default as VertexDataDescriptor } from 'XrFrame/kanata/lib/frontend/resource/VertexDataDescriptor' - export { default as View } from 'XrFrame/kanata/lib/frontend/resource/View' - export { default as ScalableList } from 'XrFrame/kanata/lib/frontend/resource/ScalableList' - export { default as crossContext } from 'XrFrame/kanata/lib/frontend/shared/crossContext' - const IS_VALID: () => boolean, - GET_MAIN_CANVAS: () => HTMLCanvasElement, - Image: { - new (): import('XrFrame/kanata/lib/backend').IImage - IS(obj: any): obj is import('XrFrame/kanata/lib/backend').IImage - }, - Phys3D: any - const downloader: import('XrFrame/kanata/lib/backend').IDownloader - export { renderEnv } - export { - Image, - downloader as Downloader, - IS_VALID, - GET_MAIN_CANVAS, - Phys3D - } - export const createWeakRef: <T>(wrapper: T) => { - deref: () => T - } - export const createWeakRefSentry: () => any - export const createNativeUUMap: () => import('XrFrame/kanata/lib/backend').INativeMap<number> - export const createNativeSUMap: () => import('XrFrame/kanata/lib/backend').INativeMap<string> - export const createNativeULUMap: () => import('XrFrame/kanata/lib/backend').ILongIntNativeMap - export const loadTTFFont: ( - url: string, - callback: (font: string) => void - ) => void - export const getGlyphInfo: ( - fontSetting: import('XrFrame/kanata/lib/backend').IFontSetting, - charCode: number - ) => import('XrFrame/kanata/lib/backend').IGlyphInfo - export const refreshNodesWorldTransform: () => void - export const setGlobalPhysicSystem: (system: any) => void - export const bindRigidBodyToNode: (rigidBody: any, nodeId: number) => void - export const bindCCTToNode: (cc: any, nodeId: number) => void - export const unbindRigidBody: (rigidBody: any) => void - export const unbindCCT: (cc: any) => void - export const decodeBase64: (base64: string) => ArrayBuffer - export const initDraco: () => Promise<void> - export const decodeDraco: ( - buffer: ArrayBuffer | ArrayBufferView, - decodeType: import('XrFrame/kanata/lib/backend').EDracoDecodeType - ) => import('XrFrame/kanata/lib/backend').DracoDecoded - export function destroy(): void - export function update(delta: number): void - export const setNodeName: (id: number, name: string) => void - export const setRenderComponentName: ( - comp: MeshRendererComponent, - name: string - ) => void - export const debugPrint: (msg: string) => void - export const eventBridge: { - bindEntityToBone: any - unbindEntityFromBone: any - bindEntitiesToBones: any - unbindEntitiesFromBones: any - } -} - -declare module 'XrFrame/kanata/lib/backend/interface' { - /** - * index.ts - * - * * @Date : 2020/8/18 下午4:48:36 - */ - export interface IEngineSettings { - /** log过滤器 */ - logFilter: boolean - /** log等级 */ - logLevel: string - /** 最大缓存极限 */ - cacheSizeLimit: number - /** 是否开启MSAA */ - realSizeLimit: number - /** 设计分辨率宽 */ - designWidth: number - /** 设计分辨率高 */ - designHeight: number - /** 渲染分辨率宽 */ - renderWidth: number - /** 渲染分辨率高 */ - renderHeight: number - /** 是否开启MSAA */ - mainScreenMSAA: boolean - /** 是否开启透明通道输出 */ - alpha?: boolean - /** loader下载文件的默认根路径 */ - baseURL: string - /** 如果baseURL找不到并且重试次数`globalHTTPRetry`大于0,则会依次尝试使用 */ - backupURLs: string[] - /** 全局loader下载文件重试次数 */ - globalHTTPRetry: string - /** 物理引擎的重力 */ - gravity: number - /** 物理引擎的模拟步进固定间隔 */ - fixedDeltaTime: number - useEngineSubcontext: boolean - /** 物理碰撞矩阵,以十六进制字符串表示 */ - physics3DLayerCollisionMatrix: string - /** 拼缓存的文件名的 */ - cacheDelimiter: string - /** 自动生成的worker文件入口路径 */ - workerPath: string - /** worker执行任务超时时间 */ - workerTimeout: number - gfxIgnoreAssert: boolean - profileGfx: string - /** 全局Uniform定义 */ - shaderGlobalProperties: Array<{ - key: string - type: - | 'Float' - | 'Vector2' - | 'Vector3' - | 'Vector4' - | 'Matrix4' - | 'Texture' - default: number | number[] | string - }> - /** 音频全局定义 */ - audio?: { - /** 全局音量 */ - globalVolume?: number - /** 真实音频数量上限 */ - maxRealVoices?: number - } - } - /** - * 顶点数据格式枚举。 - */ - export enum EVertexFormat { - FLOAT = 0, - FLOAT2 = 1, - FLOAT3 = 2, - FLOAT4 = 3, - BYTE4 = 4, - BYTE4N = 5, - UBYTE4 = 6, - UBYTE4N = 7, - SHORT2 = 8, - SHORT2N = 9, - SHORT4 = 10, - SHORT4N = 11, - UINT10_N2 = 12 - } - /** - * 顶点数据步进类型枚举。 - */ - export enum EVertexStep { - /** - * 逐顶点。 - */ - PER_VERTEX = 0, - /** - * 在使用Instance的情况下,逐实例。 - */ - PER_INSTANCE = 1 - } - /** - * 索引数据类型。 - */ - export enum EIndexType { - /** - * 无效值。 - */ - NONE = 1, - /** - * 16位索引。 - */ - UINT16 = 2, - /** - * 32位索引,注意在某些设备上不支持。 - */ - UINT32 = 3 - } - /** - * 压缩纹理类型。 - */ - export type TCompressTexture = 'etc1' | 'etc2' | 'astc' | 'pvrtc' | 's3tc' - /** - * 纹理类型雷剧。 - */ - export enum ETextureType { - /** - * 2D纹理。 - */ - D2 = 0, - /** - * 立方体纹理。 - */ - Cube = 1, - /** - * 2D纹理数组。 - */ - D2Array = 2, - /** - * 3D纹理。 - */ - D3 = 3 - } - /** - * 纹理格式枚举。 - */ - export enum ETextureFormat { - /** Inputs or Render Target Formats. */ - RGBA8 = 0, - SRGBA8 = 1, - RGB10A2 = 2, - RG8 = 3, - R8 = 4, - RGBA32F = 5, - RGBA16F = 6, - RG11B10F = 7, - RGB8 = 8, - RGB16F = 9, - RGB32F = 10, - /** Render Target Only. */ - Depth_Low = 20, - Depth_High = 21, - Depth_Stencil = 22, - RGBA4 = 23, - RGB565 = 24, - RGB5A1 = 25, - /** Compresseds */ - ETC1RGB8 = 100, - ETC2RGB8 = 110, - ETC2RGBA8 = 111, - PVRTC2RGBV1 = 120, - PVRTC4RGBV1 = 121, - PVRTC2RGBAV1 = 122, - PVRTC4RGBAV1 = 123, - ASTC4x4 = 140, - ASTC5x5 = 141, - ASTC6x6 = 142, - ASTC8x6 = 143, - ASTC8x8 = 144, - DXT1 = 150, - DXT3 = 151, - DXT5 = 152 - } - /** - * 纹理寻址模式枚举。 - */ - export enum EWrapMode { - REPEAT = 1, - CLAMP_TO_EDGE = 2, - MIRRORED_REPEAT = 3 - } - /** - * 纹理过滤模式枚举。 - */ - export enum EFilterMode { - NEAREST = 1, - LINEAR = 2, - NEAREST_MIPMAP_NEAREST = 3, - NEAREST_MIPMAP_LINEAR = 4, - LINEAR_MIPMAP_NEAREST = 5, - LINEAR_MIPMAP_LINEAR = 6 - } - /** - * Uniform值得类型枚举。 - */ - export enum EUniformType { - FLOAT = 0, - FLOAT2 = 1, - FLOAT3 = 2, - FLOAT4 = 3, - MAT2 = 4, - MAT3 = 5, - MAT4 = 6, - SAMPLER = 7 - } - /** - * 背面剔除类型枚举。 - */ - export enum ECullMode { - NONE = 0, - FRONT = 1, - BACK = 2 - } - /** - * 正面顶点绕序枚举。 - */ - export enum EFaceWinding { - CCW = 1, - CW = 2 - } - /** - * 各种测试的比较函数枚举。 - */ - export enum ECompareFunc { - LESS = 1, - LEQUAL = 2, - EQUAL = 3, - GEQUAL = 4, - GREATER = 5, - NOTEQUAL = 6, - NEVER = 7, - ALWAYS = 8 - } - /** - * 模板测试操作枚举。 - */ - export enum EStencilOp { - ZERO = 0, - KEEP = 1, - REPLACE = 2, - INCR_WRAP = 3, - INCR = 4, - DECR_WRAP = 5, - DECR = 6, - INVERT = 7 - } - /** - * 混合因子枚举。 - */ - export enum EBlendFactor { - ZERO = 0, - ONE = 1, - SRC_COLOR = 2, - ONE_MINUS_SRC_COLOR = 3, - SRC_ALPHA = 4, - ONE_MINUS_SRC_ALPHA = 5, - DST_ALPHA = 6, - ONE_MINUS_DST_ALPHA = 7, - DST_COLOR = 8, - ONE_MINUS_DST_COLOR = 9, - SRC_ALPHA_SATURATE = 10, - CONSTANT_COLOR = 11, - ONE_MINUS_CONSTANT_COLOR = 12 - } - /** - * 混合方式枚举。 - */ - export enum EBlendEquation { - FUNC_ADD = 0, - FUNC_SUBTRACT = 1, - FUNC_REVERSE_SUBTRACT = 2, - MIN = 3, - MAX = 4 - } - /** - * 颜色通道掩码枚举。 - */ - export enum EColorMask { - /** - * 将会禁掉所有通道的输出。 - */ - NONE = 16, - R = 1, - G = 2, - B = 4, - A = 8, - RGB = 7, - RGBA = 15 - } - /** - * 像素数据类型枚举。 - */ - export enum EPixelType { - UNSIGNED_BYTE = 5121, - FLOAT = 5126, - UNSIGNED_SHORT_5_6_5 = 33635, - UNSIGNED_SHORT_4_4_4_4 = 32819, - UNSIGNED_SHORT_5_5_5_1 = 32820 - } - /** - * 清屏操作枚举。 - */ - export enum ELoadAction { - /** - * 清除屏幕颜色。 - */ - CLEAR = 0, - /** - * 不清屏,但依赖前面渲染的结果。 - */ - LOAD = 1, - /** - * 完全不关心是否清屏。 - */ - DONTCARE = 2 - } - export enum EDataModelType { - AnimationClip = 1, - SkeletonBoneInverse = 2 - } - /** - * 渲染组件类型枚举。 - */ - export enum EMeshRenderType { - /** - * 未知类型。 - */ - UnKnown = 0, - /** - * 静态3D类型。 - */ - Static3D = 1, - /** - * 蒙皮3D类型。 - */ - Skinned3D = 2, - /** - * UI类型。 - */ - UI = 3 - } - /** - * 图元渲染类型枚举。 - */ - export enum EPrimitiveType { - TRIANGLES = 0, - TRIANGLE_STRIP = 1, - LINES = 2, - LINE_STRIP = 3, - POINTS = 4, - ZERO = 5 - } - /** - * 阴影类型枚举。 - */ - export enum EShadowMode { - /** - * 关闭阴影。 - */ - None = 0, - /** - * 开启单级联阴影,并开启PCF。 - */ - OneCascade_PCF = 1, - /** - * 开启二级联阴影,并开启PCF。 - */ - TwoCascade_PCF = 2, - /** - * 开启四级联阴影,并开启PCF。 - */ - FourCascade_PCF = 4, - /** - * 开启单级联阴影,并开启PCSS。 - */ - PCSS = 5 - } - /** - * 阴影匹配类型枚举。 - */ - export enum EShadowFitMode { - /** - * 阴影范围适配视锥体。 - * 更稳定,可能降低阴影精度。 - */ - FitFrustum = 0, - /** - * 阴影范围适配物体。 - * 能提高阴影精度,但可能会导致阴影不稳定。 - */ - FitObjects = 1 - } - /** - * 顶点数据布局用途枚举。 - */ - export enum EVertexLayoutUsage { - CUSTOM = 0, - POSITION = 1, - NORMAL = 2, - TANGENT = 3, - UV0 = 4, - UV1 = 5, - UV2 = 6, - UV3 = 7, - COLOR = 8, - BONEINDEX = 9, - BONEWEIGHT = 10 - } - /** - * 动态合批操作符枚举。 - */ - export enum EVertexBatchOperator { - /** - * 矩阵乘法。 - */ - MatrixMultiple = 0, - /** - * Scale offset。 - */ - UVST = 1 - } - export enum EAnimationBlendType { - Override = 0, - Additive = 1 - } - export enum EUseDefaultAddedAction { - Ignore = 0, - Refresh = 1 - } - export enum EUseDefaultRetainedAction { - Keep = 0, - Refresh = 1, - WriteBack = 2 - } - export enum EUseDefaultRemovedAction { - Keep = 0, - Clear = 1, - WriteBack = 2 - } - export enum ESkinnedSkeletonFlag { - Use3x4Matrix = 1, - UseTextureMatrix = 2 - } - export const RENDER_ENV_OFFSETS: { - size: number - resetFlag: number - renderPass: number - canvasWidth: number - canvasHeight: number - uniforms: number - useInstanceOrNeverTranspose: number - } - export const POOL_SUB_ID_MASK = 65472 - export const POOL_SUB_ID_SHIT = 6 - export const ENTITY2D_OFFSETS: { - size: number - rotation: number - position: number - scale: number - worldMatrix: number - } - export const ENTITY3D_OFFSETS: { - size: number - dfRotationType: number - rotationType: number - rotation: number - position: number - scale: number - worldOffset: number - worldMatrix: number - } - export const ENTITY3D_EXT_OFFSETS: { - size: number - layer: number - mixedLayerMask: number - } - export const CULLING_OFFSETS: { - size: number - active: number - dfActive: number - layer: number - boundingBallCenter: number - boundingBallRadius: number - entityId: number - } - export const CAMERA_OFFSETS: { - size: number - view: number - depth: number - active: number - fov: number - aspect: number - near: number - far: number - up: number - eye: number - orthoSize: number - isProjection: number - cullingMask: number - canvasSizeY: number - targetTransform: number - viewMatrix: number - projectionMatrix: number - viewMatrixInverse: number - viewMatrix2D: number - projectionMatrix2D: number - viewMatrixInverse2D: number - manualMatrix: number - layerCullDistances: number - } - export const LIGHT_OFFSETS: { - size: number - view: number - depth: number - active: number - shadowDistance: number - shadowMode: number - shadowFilterMode: number - lightDir: number - bounds: number - lightSpaceMatrices: number - } - export const MESH_OFFSETS: { - dynamicBatch: number - skinHandle: number - castShadow: number - bindTarget: number - start: number - size: number - materialId: number - vertexBufferId: number - indexBufferId: number - startIndex: number - numIndices: number - } - export const EFFECT_OFFSETS: { - size: number - useMaterialStates: number - fstencil: number - bstencil: number - blendRGBA: number - colorDepth: number - state: number - } - export const MATERIAL_OFFSETS: { - size: number - renderQueue: number - effect: number - uniformBlock: number - fstencilMask: number - bstencilMask: number - blendRGBAMask: number - colorDepthMask: number - stateMask: number - fstencil: number - bstencil: number - blendRGBA: number - colorDepth: number - state: number - useInstance: number - } - export const SKINNED_SKELETON_OFFSETS: { - boneInverseModelId: number - boneIndices: number - perBoneIndices: number - perBoneEntityId: number - perBoneMatrixOld: number - perBoneMatrixNew: number - } - export const DYNAMIC_BONES_OFFSETS: { - stiffness: number - elasticity: number - damping: number - } - export interface IHandle { - id: number - data?: ArrayBuffer - destroy?: Function - __feObj?: any - } - /** - * 顶点布局解构初始化参数。 - */ - export interface IVertexLayoutOptions { - /** - * 顶点属性列表。 - */ - attributes: Array<{ - /** - * 属性名字。 - */ - name: string - /** - * 属性名格式。 - */ - format: EVertexFormat - /** - * 属性在Buffer中的偏移量(字节)。 - */ - offset: number - /** - * 属性的用途。 - */ - usage: EVertexLayoutUsage - }> - /** - * 步进类型。 - * - * @default EVertexStep.PER_VERTEX - */ - step?: EVertexStep - /** - * 步长,不设定会自动计算。 - */ - stride?: number - /** - * 步进单位。 - * - * @default 1 - */ - stepRate?: number - } - /** - * 动态合批描述符创建参数。 - */ - export interface IVertexDataDescriptorOptions { - vuMap: Array<[string, string, EVertexBatchOperator?]> - ignored?: string[] - ubIndex?: number - } - /** - * UniformBlock描述符创建参数。 - */ - export interface IUniformDescriptorOptions { - /** - * 名字。 - */ - name?: string - /** - * Uniform描述列表。 - */ - uniforms: Array<{ - /** - * 名字。 - */ - name: string - /** - * 类型。 - */ - type: EUniformType - /** - * 长度。 - */ - num?: number - /** - * @deprecated - */ - needTranspose?: boolean - }> - } - /** - * 引擎原生图片接口。 - */ - export interface IImage { - /** - * 是否要预乘Alpha。 - */ - premultiplyAlpha: boolean - /** - * 加载完成的回调。 - */ - onload: (() => void) | null - /** - * 出错的回调。 - */ - onerror: ((error: Error) => void) | null - /** - * @internal - */ - buffer?: ArrayBuffer - /** - * 对于`ArrayBuffer`创建的图片,第一次使用后是否要自动释放内存,在`xr-frame`中,默认自动释放。 - */ - autoRelease?: boolean - /** - * 图片地址或者待解码的ArrayBuffer。 - */ - src: string | ArrayBuffer | ArrayBufferView - /** - * 图片源于ArrayBuffer时,传入的mimetype。 - */ - type?: string - /** - * 图片本地缓存地址,仅在微信内有用。 - */ - localPath?: string - /** - * 图片宽度。 - */ - width: number - /** - * 图片高度。 - */ - height: number - /** - * 解码数据,视不同Backend而定。 - */ - readonly data?: ArrayBuffer | HTMLImageElement - } - /** - * 可用于纹理的资源。 - */ - export type TTextureSource = ArrayBuffer | ArrayBufferView | IImage - /** - * 外部需要注入的下载器接口。 - */ - export interface IRealDownloader { - load: (options: { - src: string - encoding: 'binary' | 'utf-8' | undefined - onLoad: (res: { data: ArrayBuffer, filePath: string }) => void - onError: (error: Error) => void - }) => void - } - /** - * 下载器。 - */ - export interface IDownloader { - inWX: boolean - REAL_DOWNLOADER: IRealDownloader - LOAD(options: Parameters<IRealDownloader['load']>[0]): void - } - /** - * 字体配置。 - */ - export interface IFontSetting { - fontFamily: string - bold?: string - italic?: string - size?: number - } - /** - * 渲染层提供的特性列表。 - */ - export interface IFeatures { - /** - * 是否支持GPU实例化。 - */ - gpuInstance: boolean - /** - * 是否支持3D动态合批。 - */ - dynamicBatch3D: boolean - /** - * 是否支持硬件SRGB解码。 - */ - srgb: boolean - /** - * 是否支持各向异性滤波。 - */ - textureAnisotropic: boolean - /** - * 是否支持浮点纹理。 - */ - textureFloat: boolean - /** - * 是否支持半精度浮点纹理。 - */ - textureHalfFloat: boolean - /** - * 是否支持浮点类型的颜色缓冲。 - */ - colorBufferFloat: boolean - /** - * 是否支持深度纹理。 - */ - depthTexture: boolean - /** - * 是否支持在片段着色器采样深度。 - */ - fragDepth: boolean - } - export interface IRect { - x: number - y: number - w: number - h: number - } - /** - * 对一个View进行清屏的操作。 - */ - export interface IViewAction { - /** - * 颜色操作。 - */ - colorAction?: ELoadAction - /** - * 深度操作。 - */ - depthAction?: ELoadAction - /** - * 模板操作。 - */ - stencilAction?: ELoadAction - /** - * 用于清屏的颜色值。 - * - * @default [0,0,0,0] - */ - clearColor?: [number, number, number, number] - /** - * 用于清屏的深度值。 - * - * @default 1 - */ - clearDepth?: number - /** - * 用于清屏的模板值。 - * - * @default 0 - */ - clearStencil?: number - } - /** - * 视图接口。 - */ - export interface IView { - /** - * 视图清屏操作。 - */ - passAction: IViewAction - /** - * 视图区域。 - */ - viewport: IRect - /** - * 裁剪区域。 - */ - scissor: IRect - } - /** - * 附件接口。 - */ - export interface IAttachment { - texture: IHandle - level?: number - slice?: number - } - /** - * 渲染通道描述符。 - */ - export interface IRenderPassDescriptor { - colors: IAttachment[] - depth: IAttachment - stencil: IAttachment - } - export enum EEventType { - SetRootEntity = 1, - AddChild = 2, - AddChildAtIndex = 3, - RemoveFromParent = 4, - DisperseSubTree = 5, - BindToBone = 6, - BindToBones = 7, - UnBindFromBone = 8, - UnBindFromBones = 9, - EntityCommandActive = 10, - EntityCommandInActive = 11 - } - export interface IGlyphInfo { - code: number - tex: number - uv_x: number - uv_y: number - uv_w: number - uv_h: number - advance: number - bearing_x: number - bearing_y: number - width: number - height: number - } - export interface IEventBridge { - entityAddChild(entity: number, child: number): void - entityAddChildAtIndex( - entity: number, - child: number, - index: number - ): void - entityRemoveFromParent(entity: number): void - entityClear(entity: number): void - entitySetActive(entity: number, active: boolean): void - entitySetLocalMatrixDirty(entity: number): void - setRootEntity(entity: number): void - refreshWorldTransform(): void - bindEntityToBone( - entity: { - id: number - }, - boneEntity: { - id: number - } - ): void - unbindEntityFromBone(entity: { id: number }): void - bindEntitiesToBones( - entities: Array<{ - id: number - }>, - boneEntities: Array<{ - id: number - }> - ): void - unbindEntitiesFromBones( - entities: Array<{ - id: number - }> - ): void - } - export interface IRenderEnv extends IHandle { - version?: string - backendType: string - registerFallbackEffect(lightMode: string, handle?: IHandle): void - changeMacros(macros: { - [name: string]: string | number | boolean - }): void - changeVirtualMacros(macros: { [name: string]: boolean }): void - setInternalInstanceInfo( - type: EMeshRenderType, - info: Array<{ - uniformKey: string - attributeName: string - type: EUniformType - }>, - ignored: string[] - ): void - getErrors(): string[] - supportCompressTextures: TCompressTexture[] - features: IFeatures - commit_version: string - use_puppet_sokol: boolean - } - export interface INativeMap<T> { - set(key: T, value: number): void - get(key: T): number | undefined - del(key: T): void - } - export interface ILongIntNativeMap { - set(key1: number, key2: number, value: number): void - get(key1: number, key2: number): number | undefined - del(key1: number, key2: number): void - } - export type WeakRef = any - export enum EDracoErrorCode { - kDecodeErrorNone = 0, - kDecodeErrorDecodeGeometryType = 1, - kDecodeErrorDracoDecode = 2, - kDecodeErrorAttributeEmpty = 3, - kDecodeErrorAttributeSizeNotEqual = 4, - kDecodeErrorDecodeTypeError = 5 - } - export enum EDracoGeometryType { - kGeometryTypeInvalid = -1, - kGeometryTypeTriangleMesh = 0, - kGeometryTypePointCloud = 1 - } - export enum EDracoDecodeType { - kDecodeTypeCross = 0 - } - export enum EDracoDataType { - DT_INVALID = 0, - DT_INT8 = 1, - DT_UINT8 = 2, - DT_INT16 = 3, - DT_UINT16 = 4, - DT_INT32 = 5, - DT_UINT32 = 6, - DT_INT64 = 7, - DT_UINT64 = 8, - DT_FLOAT32 = 9, - DT_FLOAT64 = 10, - DT_BOOL = 11, - DT_TYPES_COUNT = 12 - } - export interface DracoDecoded { - errCode: EDracoErrorCode - buffer: ArrayBuffer - geoType: EDracoGeometryType - stride: number - count: number - numIndices: number - attrs: Array<{ - numComponents: number - dataType: EDracoDataType - offset: number - numBytes: number - }> - } -} - -declare module 'XrFrame/kanata/lib/index' { - /** - * index.ts - * - * * @Date : 2020/8/18 下午4:48:36 - */ - export * from 'XrFrame/kanata/lib/frontend' - export * from 'XrFrame/kanata/lib/backend/interface' - export const VERSION = '1.0.4' - const Puppet: any - export { Puppet } - /** - * 根据数据,返回二维节点对应结构的Float32array - */ - export function composeRawBufferEntity2D( - rotation: number, - position: ArrayLike<number>, - scale: ArrayLike<number> - ): Float32Array - /** - * 根据数据,返回三维节点对应结构的Float32array,除WorldMatrix。 - */ - export function composeRawBufferEntity3D( - useEuler: boolean, - rotation: ArrayLike<number>, - position: ArrayLike<number>, - scale: ArrayLike<number> - ): Float32Array - /** - * 根据数据,返回三维节点对应结构的Float32array - */ - export function composeRawBufferEntity3DWhole( - useEuler: boolean, - rotation: ArrayLike<number>, - position: ArrayLike<number>, - scale: ArrayLike<number> - ): Float32Array -} - -declare module 'XrFrame/components/text/types' { - import { Kanata } from 'XrFrame/ext' - import { IGlyph } from 'XrFrame/glyph' - export interface IRenderData { - vertexBuffer?: Kanata.VertexBuffer - indexBuffer?: Kanata.IndexBuffer - vertexNum?: number - indiceNum?: number - texture?: number - } - export interface ICharacterData { - x: number - y: number - width: number - height: number - batchIndex: number - character: string - glyph: IGlyph - } - export enum EHorzAlignment { - Left = 0, - Center = 1, - Right = 2 - } - export enum EVertAlignment { - Top = 0, - Middle = 1, - Bottom = 2 - } -} - -declare module 'XrFrame/glyph' { - export interface IGlyph { - character?: string - offsetX: number - offsetY: number - bearingX: number - bearingY: number - advance: number - width: number - height: number - uvs: number[] - texture: number - } -} - -declare module 'XrFrame/components/text/typesetting' { - import { - EHorzAlignment, - EVertAlignment, - ICharacterData - } from 'XrFrame/components/text/types' - import { IGlyph } from 'XrFrame/glyph' - export function Typesetting( - glyphs: IGlyph[], - batchArrays: ICharacterData[][], - batchIndexs: number[], - wrapWidth: number, - wrapHeight: number, - lineHeight: number, - anchor: number[], - padding: number[], - vertAlign: EVertAlignment, - horzAlign: EHorzAlignment - ): void -} - -declare module 'XrFrame/components/text/fillRenderData' { - import { ICharacterData } from 'XrFrame/components/text/types' - export function FillRenderData( - vertexF32: Float32Array, - indexU16: Uint16Array, - batchArray: ICharacterData[] - ): void -} - -declare module 'XrFrame/components/particle/ParticleInstance' { - import { - FactorGradient, - ColorGradient - } from 'XrFrame/components/particle/gradient' - import Particle from 'XrFrame/components/particle/Particle' - import Vector2 from 'XrFrame/math/vector2' - import Vector3 from 'XrFrame/math/vector3' - import Vector4 from 'XrFrame/math/vector4' - export default class ParticleInstance { - static count: number - id: number - position: Vector3 - direction: Vector3 - speed: number - color: Vector4 - colorStep: Vector4 - rampPos: Vector4 - lifeTime: number - age: number - drag: number - size: number - startSize: number - sizeGradientFactor: number - scale: Vector2 - angle: number - angularSpeed: number - particleSystem: Particle - currentSize: number - currentSize2: number - currentSizeGradient: FactorGradient - currentColor: Vector4 - currentColor2: Vector4 - currentColorGradient: ColorGradient - currentAlpha: number - currentAlpha2: number - currentAlphaGradient: FactorGradient - currentSpeedScale: number - currentSpeedScale2: number - currentSpeedScaleGradient: FactorGradient - currentLimitSpeed: number - currentLimitSpeed2: number - currentLimitSpeedGradient: FactorGradient - currentDrag: number - currentDrag2: number - currentDragGradient: FactorGradient - subEmitterMuster: any - startSpriteCellIndex: number - endSpriteCellIndex: number - cellIndex: number - randomCellOffset: any - constructor(particle: Particle) - /** - * 重置粒子实例的状态。 - */ - reset(): void - /** - * 将当前粒子实例的状态拷贝到目标实例。 - * @param {ParticleInstance} other 目标粒子实例 - */ - copyTo(other: ParticleInstance): void - /** - * 更新从动画图集采样的帧序号 - */ - updateCellIndex(): void - clamp(num: any, left?: number, right?: number): any - } -} - -declare module 'XrFrame/components/emitter/BasicShapeEmitter' { - import Vector3 from 'XrFrame/math/vector3' - import ParticleInstance from 'XrFrame/components/particle/ParticleInstance' - import Matrix4 from 'XrFrame/math/matrix4' - export abstract class BasicShapeEmitter { - /** - * keep normalized length - */ - direction?: Vector3 - /** - * keep normalized length - */ - direction2?: Vector3 - abstract startDirection( - worldMatrix: Matrix4, - direction: Vector3, - ...args: any[] - ): void - abstract startPosition( - worldMatrix: Matrix4, - position: Vector3, - ...args: any[] - ): void - processInstance?(instance: ParticleInstance, deltaTime: number): void - setProperty(properties: any): void - } -} - -declare module 'XrFrame/components/emitter' { - import BoxShapeEmitter from 'XrFrame/components/emitter/BoxShapeEmitter' - import PointShapeEmitter from 'XrFrame/components/emitter/PointShapeEmitter' - import DrawShapeEmitter from 'XrFrame/components/emitter/DrawShapeEmitter' - import SphereShapeEmitter from 'XrFrame/components/emitter/SphereShapeEmitter' - import ConeShapeEmitter from 'XrFrame/components/emitter/ConeShapeEmitter' - import CircleShapeEmitter from 'XrFrame/components/emitter/CircleShapeEmitter' - export { - BoxShapeEmitter, - PointShapeEmitter, - DrawShapeEmitter, - SphereShapeEmitter, - ConeShapeEmitter, - CircleShapeEmitter - } -} - -declare module 'XrFrame/components/emitter/SubEmitter' { - import Particle from 'XrFrame/components/particle/Particle' - /** - * 粒子子发射器的依附状态。 - */ - export const enum SubEmitterState { - /** - * 依附于粒子整个生命周期 - */ - ATTACH = 0, - /** - * 在粒子生命周期末出现 - */ - END = 1 - } - export class SubEmitter { - particleSystem: Particle - state: SubEmitterState - constructor(particleSystem: any) - /** - * 通过克隆,获取指定的粒子子发射器实例 - * @return {SubEmitter} 克隆后的子发射器实例 - */ - clone(): SubEmitter - } -} - -declare module 'XrFrame/physics/event' { - import type Element from 'XrFrame/core/Element' - /** - * 物理{@link PhysicsDelegate | Delegate}注册的事件回调类型。 - * @category Physics - * @template E 事件回调接收的参数类型。 - */ - export type DelegateHandler<E> = (e: E) => void - /** - * 挂在entity上的delegate, 不持有native comp, - * 而是持有多个subDelegate, 通过这些subDelegate来invoke. - * 主要作用是让script里可以直接写个onCollisionEnter()的函数来接收该节点下所有物理组件的事件. - */ - export class SharedDelegate<E extends object> { - add(handler: DelegateHandler<E>, context?: any): void - remove(handler: DelegateHandler<E>): void - invoke(e: E): void - dispose(): void - } - /** - * 用来注册回调并接收某个**特定**物理事件的Delegate。 - * @category Physics - * @template E 事件回调接收的参数类型。 - * @see {@link Collider} {@link CharacterController} - */ - export class Delegate<E extends object> { - /** - * @class 挂在物理组件上的Delegate, 内部持有native comp, 由native comp来invoke. - */ - protected nativeMethod: string - _shared?: SharedDelegate<E> - /** @internal */ - isPhysicsDelegate: true - protected xmlEvent: string - protected _el: Element - /** @internal */ - protected _handlers: Map<DelegateHandler<E>, any> - /** @internal */ - constructor( - nativeCollider: phys3D.Collider | undefined, - nativeMethod: string, - el: Element, - xmlEvent: string - ) - get nativeCollider(): phys3D.Collider | undefined - set nativeCollider(v: phys3D.Collider | undefined) - clearNativeHandler(): void - /** - * 注册事件回调。 - */ - add( - handler: DelegateHandler<E>, - context?: any - ): DelegateHandler<E> | void - /** - * 移除已注册的事件回调。 - */ - remove(handler: DelegateHandler<E>): void - /** - * @internal - */ - invoke(native: phys3D.ControllerColliderHit | phys3D.Collision): void - /** - * 移除所有事件回调。 - */ - clear(): void - /** - * @internal - */ - dispose(): void - set el(v: Element) - xmlInvoker?: DelegateHandler<E> - addXMLInvoker(): void - removeXMLInvoker(): void - } -} - -declare module 'XrFrame/components/physics/types' { - export const allShapeNames: string[] - /** - * 对刚体(在某个轴上的)位移和旋转的限制。 - * - * @category Physics - * @see {@link IRigidbodyData.constraintsMask} - */ - export enum RigidbodyConstraints { - None = 0, - FreezePositionX = 1, - FreezePositionY = 2, - FreezePositionZ = 4, - FreezeRotationX = 8, - FreezeRotationY = 16, - FreezeRotationZ = 32, - FreezePosition = 7, - FreezeRotation = 56, - FreezeAll = 63 - } - /** - * @category Physics - */ - export enum CollisionDetectionMode { - Discrete = 0, - Continuous = 1, - ContinuousDynamic = 2, - ContinuousSpeculative = 3 - } - /** - * 力(或力矩)的类型,物理组件中某些接口会用到。 - * @category Physics - * @see {@link Rigidbody.addForce} {@link Rigidbody.addTorque} - */ - export enum ForceMode { - /** - * 持续性的力。 - */ - Force = 0, - /** - * 只持续一帧的力。 - */ - Impulse = 1, - /** - * 只持续一帧的力,无视物体的{@link Rigidbody.mass | 质量}(mass=1)。 - * - * \**其实就是在下一帧修改物体速度。* - */ - VelocityChange = 2, - /** - * 持续性的力,无视物体的{@link Rigidbody.mass | 质量}(mass=1)。 - * - * \**其实就是每帧修改物体速度。* - */ - Acceleration = 4 - } - /** - * 发生碰撞时摩擦系数和弹性系数的结合方式。 - * @see {@link Collider.frictionCombine} {@link Collider.bounceCombine} - */ - export enum CombineMode { - Average = 0, - Mininum = 1, - Multiply = 2, - Maximum = 3 - } -} - -declare module 'XrFrame/components/gizmo/CapsuleGizmo' { - import Component from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - export interface ICapsuleGizmoData { - radius: number - height: number - direction: number - center: [number, number, number] - } - export const CapsuleGizmoSchema: {} - export default class CapsuleGizmo extends Component<ICapsuleGizmoData> { - static pieces: number - onAdd(parent: Element, data: ICapsuleGizmoData): void - onUpdate(data: ICapsuleGizmoData, preData: ICapsuleGizmoData): void - onTick(deltaTime: number, data: ICapsuleGizmoData): void - onRemove(parent: Element, data: ICapsuleGizmoData): void - onRelease(data: ICapsuleGizmoData): void - } -} - -declare module 'XrFrame/components/gizmo/CubeGizmo' { - import Component from 'XrFrame/core/Component' - import Element from 'XrFrame/core/Element' - export interface ICubeGizmoData { - size: [number, number, number] - center: [number, number, number] - } - export const CubeGizmoSchema: {} - export default class CubeGizmo extends Component<ICubeGizmoData> { - onAdd(parent: Element, data: ICubeGizmoData): void - onUpdate(data: ICubeGizmoData, preData: ICubeGizmoData): void - onTick(deltaTime: number, data: ICubeGizmoData): void - onRemove(parent: Element, data: ICubeGizmoData): void - onRelease(data: ICubeGizmoData): void - } -} - -declare module 'XrFrame/render-graph/RenderGraph' { - import RGNode, { TRGNodeAny } from 'XrFrame/render-graph/RGNode' - import Camera from 'XrFrame/components/Camera' - type RenderSystem = import('XrFrame/systems/RenderSystem').default - type Scene = import('XrFrame/core/Scene').default - interface IDigraphNode { - node: TRGNodeAny - ins: number - dist: number[] - } - /** - * 渲染图。 - * - * @category Render - */ - export default class RenderGraph<IOptions = any> { - protected _name: string - protected _options: IOptions - protected _scene?: Scene - protected _isActive: boolean - protected _isDirty: boolean - protected _unusedIds: number[] - protected _digraph: Array<IDigraphNode | undefined> - protected _sorted: TRGNodeAny[] - /** - * 图名字。 - */ - get name(): string - /** - * 当前正在运行的Game实例。 - */ - get scene(): import('XrFrame/core/Scene').default - /** - * 当前的渲染上下文。 - */ - get context(): import('XrFrame/systems/RenderSystem').default - constructor(_name: string, _options: IOptions) - /** - * 创建一个节点。 - */ - createNode<TRGNode extends TRGNodeAny>( - name: string, - clz: new (...args: any) => TRGNode, - options: TRGNode['options'] - ): TRGNode - /** - * 销毁一个节点。 - */ - destroyNode(rgNode: TRGNodeAny): void - /** - * 连接两个节点。 - * - * @param inputKey 需要将`from`节点的输出连接到哪个`to`节点的输入。 - */ - connect<TToNode extends TRGNodeAny>( - from: TRGNodeAny, - to: TToNode, - inputKey?: keyof TToNode['inputTypes'] - ): void - /** - * 断开两个节点的连接。 - */ - disconnect(from: TRGNodeAny, to: TRGNodeAny): void - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * 清空整个图,一般用于图的重新构建。 - * - * @param filter 过滤出需要保留、不被销毁的缓存节点,这些节点只会被重置状态。 - */ - protected _clear( - filter?: (node: RGNode<any, any, any>) => boolean - ): void - protected _handleCamerasChange: (context: RenderSystem) => void - /** - * 图在被第一次真正使用时的回调。 - */ - onActive(context: RenderSystem, options: IOptions): void - /** - * 在渲染上下文中的相机改变时调用,一般用于重新构建图。 - */ - onCamerasChange(cameras: Camera[], changeCameras: Camera[]): void - /** - * 在图每帧执行前调用。 - */ - onExecuteBegin(context: RenderSystem, options: IOptions): void - /** - * 在图每帧执行后调用。 - */ - onExecuteDone(context: RenderSystem, options: IOptions): void - /** - * 在图不再使用时调用。 - */ - onDisable(context: RenderSystem, options: IOptions): void - /** - * @internal - * - * 编译整张图。 - */ - showDebugInfo( - callback?: ( - digraph: Array<IDigraphNode | undefined>, - sorted: TRGNodeAny[] - ) => void - ): string - } - export {} -} - -declare module 'XrFrame/systems/LightManager' { - /** - * LightManager.ts - * - * * @Date : 4/11/2022, 2:29:36 PM - */ - import Camera from 'XrFrame/components/Camera' - import Light from 'XrFrame/components/Light' - export interface IMainLightsInfo { - hasAmbient: boolean - hasMainDir: boolean - ambientColorIns: Float32Array - mainDir: Float32Array - mainColorIns: Float32Array - } - export interface IAddLightsInfo { - count: number - info: Float32Array - dir: Float32Array - pos: Float32Array - colorIns: Float32Array - } - export default class LightManager {} -} - -declare module 'XrFrame/loader/glTF/animations/GLTFAnimationsNode' { - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFNodesLoaded } from 'XrFrame/loader/glTF/scenes/GLTFNodesNode' - import GLTFAnimationNode, { - GLTFAnimationLoaded, - GLTFAnimationNodeRaw - } from 'XrFrame/loader/glTF/animations/GLTFAnimationNode' - import { GLTFAccessorsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' - type ChildNode = GLTFAnimationNode - export type GLTFAnimationsNodeRaw = GLTFAnimationsNodeRaw[] - export type GLTFAnimationsLoaded = GLTFAnimationLoaded[] - export default class GLTFAnimationsNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFAnimationNodeRaw): GLTFAnimationNode - readonly raw: GLTFAnimationsNodeRaw - get nodeName(): string - preload: ( - prerequisites: [ - accessors: GLTFAccessorsLoaded, - nodes: GLTFNodesLoaded - ] - ) => Promise<GLTFAnimationsLoaded> - getLoadedResource(): GLTFAnimationsLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' { - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import GLTFAccessorNode, { - GLTFAccessorLoaded, - GLTFAccessorNodeRaw - } from 'XrFrame/loader/glTF/buffers/GLTFAccessorNode' - import { GLTFBufferViewsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFBufferViewsNode' - type ChildNode = GLTFAccessorNode - export type GLTFAccessorsNodeRaw = GLTFAccessorsNodeRaw[] - export type GLTFAccessorsLoaded = GLTFAccessorLoaded[] - export default class GLTFAccessorsNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFAccessorNodeRaw): GLTFAccessorNode - readonly raw: GLTFAccessorsNodeRaw - get nodeName(): string - preload: ( - prerequisites: GLTFBufferViewsLoaded - ) => Promise<GLTFAccessorsLoaded> - getLoadedResource(): GLTFAccessorsLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/buffers/GLTFBuffersNode' { - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import GLTFBufferNode, { - GLTFBufferLoaded, - GLTFBufferNodeRaw - } from 'XrFrame/loader/glTF/buffers/GLTFBufferNode' - type ChildNode = GLTFBufferNode - export type GLTFBuffersNodeRaw = GLTFBufferNodeRaw[] - export type GLTFBuffersLoaded = GLTFBufferLoaded[] - export default class GLTFBuffersNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFBufferNodeRaw): GLTFBufferNode - readonly raw: GLTFBuffersNodeRaw - get nodeName(): string - getLoadedResource(): GLTFBuffersLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/buffers/GLTFBufferViewsNode' { - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFBufferLoaded } from 'XrFrame/loader/glTF/buffers/GLTFBufferNode' - import GLTFBufferViewNode, { - GLTFBufferViewLoaded, - GLTFBufferViewNodeRaw - } from 'XrFrame/loader/glTF/buffers/GLTFBufferViewNode' - type ChildNode = GLTFBufferViewNode - export type GLTFBufferViewsNodeRaw = GLTFBufferViewsNodeRaw[] - export type GLTFBufferViewsLoaded = GLTFBufferViewLoaded[] - export default class GLTFBufferViewsNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFBufferViewNodeRaw): GLTFBufferViewNode - readonly raw: GLTFBufferViewsNodeRaw - get nodeName(): string - preload: ( - prerequisites: [GLTFBufferLoaded] - ) => Promise<GLTFBufferViewsLoaded> - getLoadedResource(): GLTFBufferViewsLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/extensions/GLTFExtensions' { - /** - * 创建GLTFExtensionProfileBuilder实例来定义一种extension, - * 类内提供了三种方法来操作gltf树: - * + 一种是substitutePreload,替换gltf节点的preload函数; - * + 一种是postBuild,在gltf树preload全部完成之后,再对其进行自定义操作; - * + 一种是registerRunInSlot,需要先在gltf节点内部使用extensionSlot定义一个槽位,然后往这个槽位里填写代码。 - * - * 具体要使用哪些extension请看GLTFLoader.ts。 - */ - type SlotCode = ( - raw: object, - extensionGlobal: object, - prerequisites: any, - args: any - ) => Promise<void> - type ForceSlotCode = ( - extensionGlobal: object, - prerequisites: any, - args: any - ) => Promise<void> - export class GLTFExtensionProfileBuilder { - constructor(extName: string) - registerRootInit( - init: (raw: object, extensionGlobal: object) => void - ): void - registerSubstitutePreload( - path: string, - preload: ( - raw: object, - extensionGlobal: object, - prerequisites?: object - ) => Promise<any> - ): void - registerPostBuild( - execute: (root: any, extensionGlobal: object) => Promise<void> - ): void - registerRunInSlot(slotId: string, code: SlotCode): void - /** - * 不管当前节点有没有extension,都运行,但是运行的时候不会给extRaw(因为可能没有)。 - */ - registerForceRunInSlot(slotId: string, code: ForceSlotCode): void - } - export interface GLTFExtensionProfile { - readonly name: string - readonly preloads: { - [path: string]: ( - raw: string, - extensionGlobal: object, - prerequisites?: object - ) => Promise<any> - } - readonly postBuild?: (root: any, extensionGlobal: object) => void - readonly slotCodeMap: Map<string, SlotCode> - readonly forceSlotCodeMap: Map<string, ForceSlotCode> - readonly rootInit: (raw: object, extensionGlobal: object) => void - } - export type GLTFExtensionsProfiles = { - [name: string]: GLTFExtensionProfile - } - export {} -} - -declare module 'XrFrame/loader/glTF/geometry/GLTFMeshesNode' { - import { Kanata } from 'XrFrame/ext' - import { GLTFAccessorsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFMaterialsLoaded } from 'XrFrame/loader/glTF/materials/GLTFMaterialsNode' - import GLTFMeshNode, { - GLTFMeshLoaded, - GLTFMeshNodeRaw - } from 'XrFrame/loader/glTF/geometry/GLTFMeshNode' - type ChildNode = GLTFMeshNode - export type GLTFMeshesNodeRaw = GLTFMeshesNodeRaw[] - export type GLTFMeshesLoaded = GLTFMeshLoaded[] - export default class GLTFMeshesNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFMeshNodeRaw): GLTFMeshNode - readonly raw: GLTFMeshesNodeRaw - get nodeName(): string - preload: ( - prerequisites: [ - materials: GLTFMaterialsLoaded, - accessors: GLTFAccessorsLoaded, - vbMap: Map<string, [ArrayBuffer, Kanata.VertexLayout, object]> - ] - ) => Promise<GLTFMeshesLoaded> - getLoadedResource(): GLTFMeshesLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/GLTFBaseNode' { - import { GLTFValidation } from 'XrFrame/loader/glTF/utils/exceptions' - type Scene = import('XrFrame/core/Scene').default - function _empty(): { - and: typeof _empty - } - export abstract class GLTFBaseNode { - readonly raw: any - abstract get nodeName(): string - parent: GLTFBaseNode - scene: Scene - isValid: boolean - constructor(raw: object, parent?: GLTFBaseNode) - /** - * 利用raw生成子节点 - */ - abstract build(): void - /** - * @param msg 需要带句号 - */ - protected assert( - pred: any, - msg?: string - ): - | this - | { - and: typeof _empty - } - protected validate( - use: GLTFValidation<any>, - pred?: boolean | string, - ...args: string[] - ): - | this - | { - and: typeof _empty - } - /** - * 加载静态资源,buffer/image等。 - * 所有错误在这个方法抛出,包括格式错误,加载错误等。 - */ - abstract preload(prerequisites?: object): Promise<object> - /** - * 给extension内部使用的,在extension替换preload的时候,用来储存原preload。 - */ - protected _preload: (prerequisites?: object) => Promise<object> - /** - * 获取加载后的资源。 - * 无报错 throws nothing。 - */ - abstract getLoadedResource(): object - protected findRoot(withPath?: boolean): any - getExtensionRaw(extName: string): object | undefined - /** - * 调用这个函数可以放置一个**允许extension代码插入**的位置。 - */ - protected extensionSlot(id: string, args: object): Promise<void> - releaseLoadedResource(): void - } - export abstract class GLTFArrayNode< - T extends GLTFBaseNode - > extends GLTFBaseNode { - abstract readonly raw: object[] - abstract ChildCtor(childRaw: object): T - children: T[] - protected resources: any[] - preload(prerequisites?: any): Promise<any> - build(): void - releaseLoadedResource(): void - } - export {} -} - -declare module 'XrFrame/loader/glTF/materials/GLTFMaterialsNode' { - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFTexturesLoaded } from 'XrFrame/loader/glTF/textures/GLTFTexturesNode' - import GLTFMaterialNode, { - GLTFMaterialLoaded, - GLTFMaterialNodeRaw - } from 'XrFrame/loader/glTF/materials/GLTFMaterialNode' - type ChildNode = GLTFMaterialNode - export type GLTFMaterialsNodeRaw = GLTFMaterialsNodeRaw[] - export type GLTFMaterialsLoaded = GLTFMaterialLoaded[] - export default class GLTFMaterialsNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFMaterialNodeRaw): GLTFMaterialNode - readonly raw: GLTFMaterialsNodeRaw - get nodeName(): string - preload: ( - prerequisites: [textrues: GLTFTexturesLoaded] - ) => Promise<GLTFMaterialsLoaded> - getLoadedResource(): GLTFMaterialsLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/scenes/GLTFSceneNode' { - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { - GLTFNodesLoaded, - GLTFTreeNode - } from 'XrFrame/loader/glTF/scenes/GLTFNodesNode' - export interface GLTFSceneNodeRaw { - nodes?: number[] - name?: string - } - export type GLTFSceneLoaded = GLTFTreeNode[] - export default class GLTFSceneNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFSceneNodeRaw - build(): void - preload( - prerequisites: [nodes: GLTFNodesLoaded] - ): Promise<GLTFSceneLoaded> - getLoadedResource(): GLTFSceneLoaded - } -} - -declare module 'XrFrame/loader/glTF/scenes/GLTFScenesNode' { - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFNodesLoaded } from 'XrFrame/loader/glTF/scenes/GLTFNodesNode' - import GLTFSceneNode, { - GLTFSceneLoaded, - GLTFSceneNodeRaw - } from 'XrFrame/loader/glTF/scenes/GLTFSceneNode' - type ChildNode = GLTFSceneNode - export type GLTFScenesNodeRaw = GLTFScenesNodeRaw[] - export type GLTFScenesLoaded = GLTFSceneLoaded[] - export default class GLTFScenesNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFSceneNodeRaw): GLTFSceneNode - readonly raw: GLTFScenesNodeRaw - get nodeName(): string - preload: ( - prerequisites: [nodes: GLTFNodesLoaded] - ) => Promise<GLTFScenesLoaded> - getLoadedResource(): GLTFScenesLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/skins/GLTFSkinsNode' { - import { GLTFAccessorsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import GLTFSkinNode, { - GLTFSkinLoaded, - GLTFSkinNodeRaw - } from 'XrFrame/loader/glTF/skins/GLTFSkinNode' - type ChildNode = GLTFSkinNode - export type GLTFSkinsNodeRaw = GLTFSkinsNodeRaw[] - export type GLTFSkinsLoaded = GLTFSkinLoaded[] - export default class GLTFSkinsNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFSkinNodeRaw): GLTFSkinNode - readonly raw: GLTFSkinsNodeRaw - get nodeName(): string - preload: ( - prerequisites: [accessors: GLTFAccessorsLoaded] - ) => Promise<GLTFSkinsLoaded> - getLoadedResource(): GLTFSkinsLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/textures/GLTFImagesNode' { - import { GLTFBufferViewsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFBufferViewsNode' - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import GLTFImageNode, { - GLTFImageLoaded, - GLTFImageNodeRaw - } from 'XrFrame/loader/glTF/textures/GLTFImageNode' - type ChildNode = GLTFImageNode - export type GLTFImagesNodeRaw = GLTFImagesNodeRaw[] - export type GLTFImagesLoaded = GLTFImageLoaded[] - export default class GLTFImagesNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFImageNodeRaw): GLTFImageNode - readonly raw: GLTFImagesNodeRaw - get nodeName(): string - preload: ( - prerequisites: [bufferViews: GLTFBufferViewsLoaded] - ) => Promise<GLTFImagesLoaded> - getLoadedResource(): GLTFImagesLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/textures/GLTFSamplersNode' { - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import GLTFSamplerNode, { - GLTFSamplerLoaded, - GLTFSamplerNodeRaw - } from 'XrFrame/loader/glTF/textures/GLTFSamplerNode' - type ChildNode = GLTFSamplerNode - export type GLTFSamplersNodeRaw = GLTFSamplersNodeRaw[] - export type GLTFSamplersLoaded = GLTFSamplerLoaded[] - export default class GLTFSamplersNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFSamplerNodeRaw): GLTFSamplerNode - readonly raw: GLTFSamplersNodeRaw - get nodeName(): string - preload: () => Promise<GLTFSamplersLoaded> - getLoadedResource(): GLTFSamplersLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/textures/GLTFTexturesNode' { - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFImagesLoaded } from 'XrFrame/loader/glTF/textures/GLTFImagesNode' - import { GLTFSamplersLoaded } from 'XrFrame/loader/glTF/textures/GLTFSamplersNode' - import GLTFTextureNode, { - GLTFTextureLoaded, - GLTFTextureNodeRaw - } from 'XrFrame/loader/glTF/textures/GLTFTextureNode' - type ChildNode = GLTFTextureNode - export type GLTFTexturesNodeRaw = GLTFTexturesNodeRaw[] - export type GLTFTexturesLoaded = GLTFTextureLoaded[] - export default class GLTFTexturesNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFTextureNodeRaw): GLTFTextureNode - readonly raw: GLTFTexturesNodeRaw - get nodeName(): string - preload: ( - prerequisites: [ - images: GLTFImagesLoaded, - samplers: GLTFSamplersLoaded - ] - ) => Promise<GLTFTexturesLoaded> - getLoadedResource(): GLTFTexturesLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/utils/exceptions' { - import type { GLTFTargetNodeRaw } from 'XrFrame/loader/glTF/animations/channels/GLTFTargetNode' - import type { GLTFAccessorNodeRaw } from 'XrFrame/loader/glTF/buffers/GLTFAccessorNode' - import type { GLTFAttributesNodeRaw } from 'XrFrame/loader/glTF/geometry/primitives/attributes/GLTFAttributesNode' - import type { GLTFPrimitiveNodeRaw } from 'XrFrame/loader/glTF/geometry/primitives/GLTFPrimitiveNode' - import type { GLTFNodeNodeRaw } from 'XrFrame/loader/glTF/scenes/GLTFNodeNode' - import type { GLTFTextureNodeRaw } from 'XrFrame/loader/glTF/textures/GLTFTextureNode' - export enum EValidation { - TextureSource = 10001, - SkinAccessor = 10101, - NodeWeights = 10201, - MorphAttrib = 10301, - UVSlot = 10401, - JointSlot = 10402, - WeightSlot = 10403, - MorphTargetsCount = 10501, - PrimitiveType = 10502, - IndexBufferLength = 10503, - SparseAccessor = 10601, - NormalizedAccessor = 10602 - } - interface Validation<T> { - id: EValidation - msg: string - validate?(raw: T): boolean - fatal?: boolean - } - export namespace GLTFValidations { - const UndefinedTextureSource: Validation<GLTFTextureNodeRaw> - const SkinAccessorNotCompact: Validation<void> - const UnsupportedNodeWeights: Validation<GLTFNodeNodeRaw> - const UnsupportedMorphAttrib: Validation<GLTFTargetNodeRaw> - const UnsupportedUVSlot: Validation<GLTFAttributesNodeRaw> - const UnsupportedJointSlot: Validation<GLTFAttributesNodeRaw> - const UnsupportedWeightSlot: Validation<GLTFAttributesNodeRaw> - const MorphTargetsCountExceeded: Validation<GLTFPrimitiveNodeRaw> - const UnsupportedPrimitiveType: Validation<GLTFPrimitiveNodeRaw> - const InvalidIndexBufferLength: Validation<GLTFPrimitiveNodeRaw> - const UnsupportedSparseAccessor: Validation<GLTFAccessorNodeRaw> - const UnsupportedNormalizedAccessor: Validation<GLTFAccessorNodeRaw> - } - export { Validation as GLTFValidation } - export const GLTFValidationMap: { - 10001: Validation<GLTFTextureNodeRaw> - 10101: Validation<void> - 10201: Validation<GLTFNodeNodeRaw> - 10301: Validation<GLTFTargetNodeRaw> - 10401: Validation<GLTFAttributesNodeRaw> - 10402: Validation<GLTFAttributesNodeRaw> - 10403: Validation<GLTFAttributesNodeRaw> - 10501: Validation<GLTFPrimitiveNodeRaw> - 10502: Validation<GLTFPrimitiveNodeRaw> - 10503: Validation<GLTFPrimitiveNodeRaw> - 10601: Validation<GLTFAccessorNodeRaw> - 10602: Validation<GLTFAccessorNodeRaw> - } -} - -declare module 'XrFrame/loader/glTF/scenes/GLTFNodeNode' { - import { GLTFMeshesLoaded } from 'XrFrame/loader/glTF/geometry/GLTFMeshesNode' - import { GLTFMeshLoaded } from 'XrFrame/loader/glTF/geometry/GLTFMeshNode' - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFSkinLoaded } from 'XrFrame/loader/glTF/skins/GLTFSkinNode' - import { GLTFSkinsLoaded } from 'XrFrame/loader/glTF/skins/GLTFSkinsNode' - import { GLTF } from 'XrFrame/loader/glTF/utils/types' - export interface GLTFNodeNodeRaw { - children?: number[] - mesh?: number - matrix?: number[] - rotation?: [number, number, number, number] - scale?: [number, number, number] - translation?: [number, number, number] - weights?: number - skin?: number - name?: string - extensions?: object - extras?: any - } - export interface GLTFNodeLoaded { - children: number[] - transform: GLTF.Transform - mesh?: GLTFMeshLoaded - skin?: GLTFSkinLoaded - name: string - extras?: any - } - export type GLTFNodePrerequisites = [ - meshes: GLTFMeshesLoaded, - skins: GLTFSkinsLoaded - ] - export default class GLTFNodeNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFNodeNodeRaw - build(): void - preload(prerequisites: GLTFNodePrerequisites): Promise<GLTFNodeLoaded> - getLoadedResource(): GLTFNodeLoaded - } -} - -declare module 'XrFrame/kanata/lib/frontend/component/MeshRendererComponent' { - /** - * MeshRendererComponent.ts - * - * * @Date : 9/3/2020, 7:54:23 PM - */ - import { EMeshRenderType } from 'XrFrame/kanata/lib/backend' - import NativeObject from 'XrFrame/kanata/lib/frontend/shared/NativeObject' - import Entity3D from 'XrFrame/kanata/lib/frontend/entity/Entity3D' - import Entity2D from 'XrFrame/kanata/lib/frontend/entity/Entity2D' - import UniformBlock from 'XrFrame/kanata/lib/frontend/resource/UniformBlock' - import VertexBuffer from 'XrFrame/kanata/lib/frontend/resource/VertexBuffer' - import IndexBuffer from 'XrFrame/kanata/lib/frontend/resource/IndexBuffer' - import VertexData from 'XrFrame/kanata/lib/frontend/resource/VertexData' - import IndexData from 'XrFrame/kanata/lib/frontend/resource/IndexData' - import Material from 'XrFrame/kanata/lib/frontend/resource/Material' - import SkinnedSkeletonComponent from 'XrFrame/kanata/lib/frontend/component/SkinnedSkeletonComponent' - import CullingComponent from 'XrFrame/kanata/lib/frontend/component/CullingComponent' - export default class MeshRendererComponent extends NativeObject { - static OFFSETS: { - dynamicBatch: number - skinHandle: number - castShadow: number - bindTarget: number - start: number - size: number - materialId: number - vertexBufferId: number - indexBufferId: number - startIndex: number - numIndices: number - } - static CREATE_FAKE( - entity: Entity3D | Entity2D, - options: { - meshCount: number - uniformBlock?: UniformBlock - } - ): FakeMeshRenderComponent - protected _uniforms: UniformBlock - get uniforms(): UniformBlock - get meshCount(): number - get castShadow(): boolean - set castShadow(value: boolean) - get dynamicBatch(): boolean - set dynamicBatch(value: boolean) - set skinSkeleton(sk: SkinnedSkeletonComponent) - set bindTarget(target: Entity3D | Entity2D | null) - get macros(): { - [name: string]: string | number | boolean - } - constructor( - entity: Entity3D | Entity2D, - options: { - meshCount: number - uniformBlock: UniformBlock - renderType: EMeshRenderType - culling?: CullingComponent - macros?: { - [name: string]: string | number | boolean - } - } - ) - protected _createNativeObj( - entity: Entity3D | Entity2D, - options: { - meshCount: number - uniformBlock: UniformBlock - renderType: EMeshRenderType - culling?: CullingComponent - macros?: { - [name: string]: string | number | boolean - } - } - ): import('XrFrame/kanata/lib/backend').IHandle & { - setSharedDirty(): void - } - changeMacros(macros?: { - [name: string]: string | number | boolean - }): void - getStartIndex(index: number): number - setStartIndex(index: number, value: number): void - getNumIndices(index: number): number - setNumIndices(index: number, value: number): void - getVertexBuffer(index: number): VertexBuffer - setVertexBuffer(index: number, buffer: VertexBuffer): void - getIndexBuffer(index: number): IndexBuffer - setIndexBuffer(index: number, buffer: IndexBuffer): void - getVertexData(index: number): VertexData - setVertexData(index: number, buffer: VertexData): void - getIndexData(index: number): IndexData - setIndexData(index: number, buffer: IndexData): void - getMaterial(index: number): Material - setMaterial(index: number, material: Material | null): void - fastSet( - vertexes: Array<VertexBuffer | VertexData>, - indexes: Array<VertexData | IndexBuffer>, - materials: Material[], - startIndexes: number[], - numIndices: number[] - ): void - setDirty(): void - copyStates(comp: MeshRendererComponent): void - } - class FakeMeshRenderComponent extends MeshRendererComponent { - protected _createNativeObj( - entity: Entity3D | Entity2D, - options: { - meshCount: number - uniformBlock: UniformBlock - renderType: EMeshRenderType - culling: CullingComponent - } - ): { - id: number - data: ArrayBuffer - setSharedDirty: () => void - } - get uniforms(): UniformBlock - set uniforms(uniforms: UniformBlock) - } - export {} -} - -declare module 'XrFrame/kanata/lib/frontend/resource/renderEnv' { - /** - * renderEnv.ts - * - * * @Date : 1/18/2021, 3:53:26 PM - */ - import { - EMeshRenderType, - EUniformType, - IFeatures, - IRenderEnv, - TCompressTexture - } from 'XrFrame/kanata/lib/backend' - import View from 'XrFrame/kanata/lib/frontend/resource/View' - import Effect from 'XrFrame/kanata/lib/frontend/resource/Effect' - import RenderPass from 'XrFrame/kanata/lib/frontend/resource/RenderPass' - import UniformBlock from 'XrFrame/kanata/lib/frontend/resource/UniformBlock' - export class RenderEnv { - id: number - __handle: IRenderEnv - useExtendedMemory: boolean - get version(): number[] - get backendType(): string - get canvasWidth(): number - set canvasWidth(value: number) - get canvasHeight(): number - set canvasHeight(value: number) - get supportCompressTextures(): TCompressTexture[] - get features(): IFeatures - get commitVersion(): string - get usePuppetSokol(): boolean - get useInstance(): boolean - set useInstance(value: boolean) - get neverTranspose(): boolean - set neverTranspose(value: boolean) - get isWrongWrapMapping(): boolean - get isNotWrongEffectSort(): boolean - get isGoodInstance(): boolean - get isGoodPhysAndScalableList(): boolean - constructor() - supportCompressTexture(type: TCompressTexture): boolean - registerFallbackEffect(lightMode: string, effect?: Effect): void - beginFrame(): void - endFrame(): void - clearView(view: View): void - setEnvUniform(index: number, uniforms: UniformBlock): void - setRenderPass(renderPass: RenderPass): void - changeMacros(macros: { - [name: string]: string | number | boolean - }): void - getMacro(key: string): string | number | boolean - changeVirtualMacros(macros: { [name: string]: boolean }): void - getVirtualMacro(key: string): boolean - setInternalInstanceInfo( - type: EMeshRenderType, - info: Array<{ - uniformKey: string - attributeName: string - type: EUniformType - }>, - ignored: string[] - ): void - getErrors(): string[] - } - const renderEnv: RenderEnv - export default renderEnv -} - -declare module 'XrFrame/kanata/lib/frontend/component/AnimatorComponent' { - import NativeObject from 'XrFrame/kanata/lib/frontend/shared/NativeObject' - import Entity3D from 'XrFrame/kanata/lib/frontend/entity/Entity3D' - import AnimationClipModel from 'XrFrame/kanata/lib/frontend/resource/AnimationClipModel' - export default class AnimatorComponent extends NativeObject { - static UPDATE_ANIMATORS( - animators: AnimatorComponent[], - size: number - ): void - animationClipModels: AnimationClipModel[] - constructor() - bindAnimations( - animationClipModels: AnimationClipModel[], - entities: Array<Array<Entity3D | null>>, - rootEntity?: Entity3D - ): void - setClipParams( - index: number, - frameIndex: number, - blendWeight: number - ): void - getAnimationClipCount(): number - getNodeCount(): number - getAnimationParameter(index: number): { - animationClipId: number - frameIndex: number - percentage: number - } - getEntity(index: number): number - } -} - -declare module 'XrFrame/kanata/lib/frontend/component/CameraComponent' { - import NativeObject from 'XrFrame/kanata/lib/frontend/shared/NativeObject' - import Entity3D from 'XrFrame/kanata/lib/frontend/entity/Entity3D' - import Entity2D from 'XrFrame/kanata/lib/frontend/entity/Entity2D' - import View from 'XrFrame/kanata/lib/frontend/resource/View' - import ScalableList from 'XrFrame/kanata/lib/frontend/resource/ScalableList' - export default class CameraComponent extends NativeObject { - static OFFSETS: { - size: number - view: number - depth: number - active: number - fov: number - aspect: number - near: number - far: number - up: number - eye: number - orthoSize: number - isProjection: number - cullingMask: number - canvasSizeY: number - targetTransform: number - viewMatrix: number - projectionMatrix: number - viewMatrixInverse: number - viewMatrix2D: number - projectionMatrix2D: number - viewMatrixInverse2D: number - manualMatrix: number - layerCullDistances: number - } - get active(): boolean - set active(value: boolean) - get depth(): number - set depth(value: number) - get isProjection(): boolean - set isProjection(value: boolean) - get view(): View - set view(value: View) - get fov(): number - set fov(value: number) - get aspect(): number - set aspect(value: number) - get near(): number - set near(value: number) - get far(): number - set far(value: number) - get orthoSize(): number - set orthoSize(value: number) - get cullingMask(): number - set cullingMask(value: number) - get layerCullDistances(): Float32Array | number[] - set layerCullDistances(value: Float32Array | number[]) - get canvasSizeY(): number - set canvasSizeY(value: number) - set targetTransform(entityId: number) - get targetTransform(): number - set up(vec3: Float32Array) - constructor(entity: Entity2D | Entity3D, isUI?: boolean) - cull(cullResult: ScalableList, lightMode: string): void - draw(renderList: ScalableList, lightMode: string): void - changeProjectionMatrix(manual: boolean, mat4?: Float32Array): void - changeViewMatrix(manual: boolean, mat4?: Float32Array): void - updateMatrix(): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/component/LightCameraComponent' { - /** - * CameraLightComponent.ts - * - * * @Date : 9/3/2020, 7:54:13 PM - */ - import { EShadowMode } from 'XrFrame/kanata/lib/backend' - import NativeObject from 'XrFrame/kanata/lib/frontend/shared/NativeObject' - import View from 'XrFrame/kanata/lib/frontend/resource/View' - import UniformBlock from 'XrFrame/kanata/lib/frontend/resource/UniformBlock' - import ScalableList from 'XrFrame/kanata/lib/frontend/resource/ScalableList' - import CameraComponent from 'XrFrame/kanata/lib/frontend/component/CameraComponent' - export default class LightCameraComponent extends NativeObject { - static OFFSETS: { - size: number - view: number - depth: number - active: number - shadowDistance: number - shadowMode: number - shadowFilterMode: number - lightDir: number - bounds: number - lightSpaceMatrices: number - } - get view(): View - set view(value: View) - get active(): boolean - set active(value: boolean) - get depth(): number - set depth(value: number) - get shadowDistance(): number - set shadowDistance(value: number) - get shadowFilterMode(): number - set shadowFilterMode(value: number) - get shadowMode(): EShadowMode - set shadowMode(value: EShadowMode) - get lightSpaceMatrices(): Float32Array - constructor() - draw( - camera: CameraComponent, - renderList: ScalableList, - lightMode: string - ): void - prepareUniforms(uniforms: UniformBlock): void - setLightDir(x: number, y: number, z: number): void - setCascadedSplits(s0: number, s1: number, s2: number): void - protected _updateBounds(auto: boolean): void - protected _adjustSplitPercents(index: number, percent: number): number - protected _setSplitPercents(index: number, percent: number): number - } -} - -declare module 'XrFrame/kanata/lib/frontend/component/CullingComponent' { - import Entity3D from 'XrFrame/kanata/lib/frontend/entity/Entity3D' - import Entity2D from 'XrFrame/kanata/lib/frontend/entity/Entity2D' - import PoolObject from 'XrFrame/kanata/lib/frontend/pool/PoolObject' - import PoolManager from 'XrFrame/kanata/lib/frontend/pool/PoolManager' - export default class CullingComponent extends PoolObject { - static POLL_MANAGER: PoolManager - constructor(entity: Entity2D | Entity3D) - getActive(): boolean - setActive(val: boolean): void - getLayer(): number - setLayer(val: number): void - getBoundingBallCenter(): Float32Array - setBoundingBallCenter(val: Float32Array, offset?: number): void - getBoundingBallRadius(): number - setBoundingBallRadius(val: number): void - bindEntity(entity: Entity2D | Entity3D): void - destroy(): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/component/SkinnedSkeletonComponent' { - import NativeObject from 'XrFrame/kanata/lib/frontend/shared/NativeObject' - import SkeletonBoneInverseModel from 'XrFrame/kanata/lib/frontend/resource/SkeletonBoneInverseModel' - import Entity3D from 'XrFrame/kanata/lib/frontend/entity/Entity3D' - export default class SkinnedSkeletonComponent extends NativeObject { - static UPDATE_MATS( - comps: SkinnedSkeletonComponent[], - size: number - ): void - get boneNum(): number - get boneInverseModel(): SkeletonBoneInverseModel - get boneOffsetMatrices(): Float32Array - constructor(boneNum: number, flag: number) - setBoneMatrix( - boneInverseModel: SkeletonBoneInverseModel, - boneIndices: number[], - boneEntities: Entity3D[] - ): void - getBoneNum(): number - getBoneOffsetMatrices(): Float32Array - } -} - -declare module 'XrFrame/kanata/lib/frontend/component/DynamicBonesComponent' { - import NativeObject from 'XrFrame/kanata/lib/frontend/shared/NativeObject' - import Entity3D from 'XrFrame/kanata/lib/frontend/entity/Entity3D' - export default class DynamicBonesComponent extends NativeObject { - static OFFSETS: { - stiffness: number - elasticity: number - damping: number - } - get stiffness(): number - set stiffness(v: number) - get damping(): number - set damping(v: number) - get elasticity(): number - set elasticity(v: number) - constructor(rootNode?: Entity3D) - preUpdate(): void - update( - dt: number, - rootMotion?: { - x: number - y: number - z: number - } - ): void - rebuild(): void - resetRoot(root?: Entity3D): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/entity/Entity2D' { - import PoolObject from 'XrFrame/kanata/lib/frontend/pool/PoolObject' - import PoolManager from 'XrFrame/kanata/lib/frontend/pool/PoolManager' - export default class Entity2D extends PoolObject { - static POLL_MANAGER: PoolManager - static OFFSETS: { - size: number - rotation: number - position: number - scale: number - worldMatrix: number - } - localPositionOffset: number - localRotationOffset: number - localScaleOffset: number - worldMatrixOffset: number - constructor() - addChild(child: Entity2D): void - addChildAtIndex(child: Entity2D, index: number): void - removeFromParent(): void - setAsRoot(): void - destroy(): void - clear(): void - setLocalMatrixDirty(): void - set active(val: boolean) - } -} - -declare module 'XrFrame/kanata/lib/frontend/entity/Entity3D' { - import PoolObject from 'XrFrame/kanata/lib/frontend/pool/PoolObject' - import PoolManager from 'XrFrame/kanata/lib/frontend/pool/PoolManager' - export default class Entity3D extends PoolObject { - static POLL_MANAGER: PoolManager - static OFFSETS: { - size: number - dfRotationType: number - rotationType: number - rotation: number - position: number - scale: number - worldOffset: number - worldMatrix: number - } - static CREATE_TREE( - length: number, - buffer: ArrayBuffer, - out: any[], - calculateWordMatrix?: boolean - ): boolean - localRotationTypeOffset: number - localQuaternionOffset: number - localPositionOffset: number - localScaleOffset: number - worldMatrixOffset: number - extOffset: number - layerOffset: number - mixedLayerMaskOffset: number - constructor() - setUsingEuler(on: boolean): void - isUsingEuler(): boolean - setLayer(layer: number): void - getLayer(): number - getMixedLayerMask(): number - addChild(child: Entity3D): void - addChildAtIndex(child: Entity3D, index: number): void - removeFromParent(): void - setAsRoot(): void - destroy(): void - /** - * 如果只调用entityClear指令,那么Kanata就无法回收根节点下面的子节点了。 - * 目前Kanata的frontend没有父子关系信息只能这么做了。 - * 这个方法目前只能减少eventBridge的指令量,避免在大规模节点销毁的时候频繁触发eventBridge的溢出提交。 - * @param entities - * @param length - */ - clear(entities: Entity3D[], length: number): void - setLocalMatrixDirty(): void - set active(val: boolean) - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/AnimationClipModel' { - import DataModel from 'XrFrame/kanata/lib/frontend/resource/DataModel' - export default class AnimationClipModel extends DataModel { - setAnimationClip(ab: ArrayBuffer): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/AnimationClipBinding' { - /** - * AnimationClipBinding.ts - * - * */ - import Entity3D from 'XrFrame/kanata/lib/frontend/entity/Entity3D' - import AnimationClipModel from 'XrFrame/kanata/lib/frontend/resource/AnimationClipModel' - import { EUseDefaultAddedAction } from 'XrFrame/kanata/lib/backend' - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - import { INativeWorker } from 'XrFrame/kanata/lib/backend/native/worker' - export default class AnimationClipBinding extends PureResource { - __handle: INativeWorker.IAnimationClipBinding - constructor( - clipArray: AnimationClipModel[], - clipArrayOffset: number, - clipArrayLength: number, - entityArray: Array<number | Entity3D | null>, - entityArrayOffset: number, - entityArrayLength: number, - useDefaultAddedNodesAction: EUseDefaultAddedAction, - rootEntity: Entity3D - ) - rebind( - clipArray: AnimationClipModel[], - clipArrayOffset: number, - clipArrayLength: number, - entityArray: Array<number | Entity3D | null>, - entityArrayOffset: number, - entityArrayLength: number, - removeAction: number, - retainedAction: number, - addedAction: number, - rootEntity: Entity3D - ): boolean - update( - clipArray: AnimationClipModel[], - clipArrayOffset: number, - clipArrayLength: number, - entityArray: Array<number | Entity3D | null>, - entityArrayOffset: number, - entityArrayLength: number, - removeAction: number, - retainedAction: number, - addedAction: number - ): boolean - writeDefaultValues(): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/AnimatorControllerModel' { - /** - * AnimatorControllerModel.ts - * - * */ - import AnimatorControllerStateModel from 'XrFrame/kanata/lib/frontend/resource/AnimatorControllerStateModel' - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - import AnimationClipBinding from 'XrFrame/kanata/lib/frontend/resource/AnimationClipBinding' - export default class AnimatorControllerModel extends PureResource { - layerCount: number - static UPDATE_ANIMATOR_CONTROLLERS( - animatorControllers: AnimatorControllerModel[], - size: number - ): void - constructor(layerCount: number) - setAnimationClipBinding(binding: null | AnimationClipBinding): void - setLayerBlendType(layerIndex: number, blendType: number): void - setLayerWeight(layerIndex: number, weight: number): void - setLayerBlend( - layerIndex: number, - blend: null | AnimatorControllerStateModel - ): void - setLayerMask( - layerIndex: number, - mask: { - buffer: null | ArrayBuffer - offset: number - length: number - } - ): void - update(): void - destroy(): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/AnimatorControllerStateModel' { - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - import AnimationClipModel from 'XrFrame/kanata/lib/frontend/resource/AnimationClipModel' - export default class AnimatorControllerStateModel extends PureResource { - readonly count: number - get weight(): number - set weight(weight: number) - get useDefault(): number - set useDefault(useDefault: number) - constructor(count: number) - resetBlendInfo(): void - setNextState(state: AnimatorControllerStateModel | null): void - setBlendInfo( - clip: AnimationClipModel, - frameIndex: number, - blendWeight: number, - additiveReferenceClip: null | AnimationClipModel, - additiveFrameIndex: number - ): boolean - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/DataBuffer' { - /** - * DataBuffer.ts - * - * * @Date : 9/4/2020, 1:21:59 PM - */ - import { IHandle } from 'XrFrame/kanata/lib/backend' - import NativeObject from 'XrFrame/kanata/lib/frontend/shared/NativeObject' - export default class DataBuffer extends NativeObject { - constructor(nativeObj: IHandle) - get dataLength(): number - get byteOffset(): number - get arrayBuffer(): ArrayBuffer - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/DataModel' { - /** - * DataModel.ts - * - * * @Date : 9/4/2020, 1:18:13 PM - */ - import { EDataModelType } from 'XrFrame/kanata/lib/backend' - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - export default class DataModel extends PureResource { - protected _createNativeModel( - type: EDataModelType, - buffer: ArrayBuffer - ): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/Effect' { - /** - * Effect.ts - * - * * @Date : 9/9/2020, 5:49:54 PM - */ - import { - EBlendFactor, - EBlendEquation, - ECullMode, - ECompareFunc, - EPrimitiveType, - EStencilOp - } from 'XrFrame/kanata/lib/backend' - import NativeObject from 'XrFrame/kanata/lib/frontend/shared/NativeObject' - export default class Effect extends NativeObject { - static OFFSETS: { - size: number - useMaterialStates: number - fstencil: number - bstencil: number - blendRGBA: number - colorDepth: number - state: number - } - get passCount(): number - constructor( - name: string, - passCount: number, - keyIndexMap: string[], - passes: Array<{ - lightMode: string - variants?: { - [key: number]: number - } - macros?: { - [key: string]: number - } - shaders?: number[] - }>, - shaders: string[], - variants: number[][], - useRuntimeMacros?: boolean - ) - warmUp(): any - getBlendOn(pass: number): boolean - setBlendOn(pass: number, value: boolean): void - getBlendSrc(pass: number): EBlendFactor - setBlendSrc(pass: number, value: EBlendFactor): void - getBlendDst(pass: number): EBlendFactor - setBlendDst(pass: number, value: EBlendFactor): void - getBlendSrcRGB(pass: number): EBlendFactor - setBlendSrcRGB(pass: number, value: EBlendFactor): void - getBlendSrcAlpha(pass: number): EBlendFactor - setBlendSrcAlpha(pass: number, value: EBlendFactor): void - getBlendDstRGB(pass: number): EBlendFactor - setBlendDstRGB(pass: number, value: EBlendFactor): void - getBlendDstAlpha(pass: number): EBlendFactor - setBlendDstAlpha(pass: number, value: EBlendFactor): void - getBlendFunc(pass: number): EBlendEquation - setBlendFunc(pass: number, value: EBlendEquation): void - getDepthTestOn(pass: number): boolean - setDepthTestOn(pass: number, value: boolean): void - getDepthTestComp(pass: number): ECompareFunc - setDepthTestComp(pass: number, value: ECompareFunc): void - getDepthWrite(pass: number): boolean - setDepthWrite(pass: number, value: boolean): void - getColorWrite(pass: number): number - setColorWrite(pass: number, value: number): void - getCullFace(pass: number): ECullMode - setCullFace(pass: number, value: ECullMode): void - getCullOn(pass: number): boolean - setCullOn(pass: number, value: boolean): void - getPrimitiveType(pass: number): EPrimitiveType - setPrimitiveType(pass: number, value: EPrimitiveType): void - getStencilTestOn(pass: number): boolean - setStencilTestOn(pass: number, value: boolean): void - getStencilComp(pass: number): ECompareFunc - setStencilComp(pass: number, value: ECompareFunc): void - getStencilPass(pass: number): EStencilOp - setStencilPass(pass: number, value: EStencilOp): void - getStencilFail(pass: number): EStencilOp - setStencilFail(pass: number, value: EStencilOp): void - getStencilZFail(pass: number): EStencilOp - setStencilZFail(pass: number, value: EStencilOp): void - getStencilWriteMask(pass: number): number - setStencilWriteMask(pass: number, value: number): void - getStencilReadMask(pass: number): number - setStencilReadMask(pass: number, value: number): void - getStencilRef(pass: number): number - setStencilRef(pass: number, value: number): void - getUseMaterialStates(pass: number): boolean - setUseMaterialStates(pass: number, value: boolean): void - getUseMaterialStateBlendOn(pass: number): boolean - setUseMaterialStateBlendOn(pass: number, value: boolean): void - getUseMaterialStateBlendSrcRGB(pass: number): boolean - setUseMaterialStateBlendSrcRGB(pass: number, value: boolean): void - getUseMaterialStateBlendSrcAlpha(pass: number): boolean - setUseMaterialStateBlendSrcAlpha(pass: number, value: boolean): void - getUseMaterialStateBlendDstRGB(pass: number): boolean - setUseMaterialStateBlendDstRGB(pass: number, value: boolean): void - getUseMaterialStateBlendDstAlpha(pass: number): boolean - setUseMaterialStateBlendDstAlpha(pass: number, value: boolean): void - getUseMaterialStateBlendFunc(pass: number): boolean - setUseMaterialStateBlendFunc(pass: number, value: boolean): void - getUseMaterialStateDepthTestOn(pass: number): boolean - setUseMaterialStateDepthTestOn(pass: number, value: boolean): void - getUseMaterialStateDepthTestComp(pass: number): boolean - setUseMaterialStateDepthTestComp(pass: number, value: boolean): void - getUseMaterialStateDepthWrite(pass: number): boolean - setUseMaterialStateDepthWrite(pass: number, value: boolean): void - getUseMaterialStateCullOn(pass: number): boolean - setUseMaterialStateCullOn(pass: number, value: boolean): void - getUseMaterialStateCullFace(pass: number): boolean - setUseMaterialStateCullFace(pass: number, value: boolean): void - getUseMaterialStatePrimitiveType(pass: number): boolean - setUseMaterialStatePrimitiveType(pass: number, value: boolean): void - getUseMaterialStateStencilTestOn(pass: number): boolean - setUseMaterialStateStencilTestOn(pass: number, value: boolean): void - getUseMaterialStateStencilTestComp(pass: number): boolean - setUseMaterialStateStencilTestComp(pass: number, value: boolean): void - getUseMaterialStateStencilTestPass(pass: number): boolean - setUseMaterialStateStencilTestPass(pass: number, value: boolean): void - getUseMaterialStateStencilTestFail(pass: number): boolean - setUseMaterialStateStencilTestFail(pass: number, value: boolean): void - getUseMaterialStateStencilTestZFail(pass: number): boolean - setUseMaterialStateStencilTestZFail(pass: number, value: boolean): void - getUseMaterialStateColorWrite(pass: number): boolean - setUseMaterialStateColorWrite(pass: number, value: boolean): void - showDebugInfo(): string - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/Material' { - /** - * Material.ts - * - * * @Date : 9/4/2020, 6:41:13 PM - */ - import { - EBlendFactor, - EBlendEquation, - ECompareFunc, - ECullMode, - EStencilOp, - EPrimitiveType - } from 'XrFrame/kanata/lib/backend' - import UniformBlock from 'XrFrame/kanata/lib/frontend/resource/UniformBlock' - import NativeObject from 'XrFrame/kanata/lib/frontend/shared/NativeObject' - import Effect from 'XrFrame/kanata/lib/frontend/resource/Effect' - export default class Material extends NativeObject { - static OFFSETS: { - size: number - renderQueue: number - effect: number - uniformBlock: number - fstencilMask: number - bstencilMask: number - blendRGBAMask: number - colorDepthMask: number - stateMask: number - fstencil: number - bstencil: number - blendRGBA: number - colorDepth: number - state: number - useInstance: number - } - protected _uniforms: UniformBlock - protected _effect: Effect - protected _macros: { - [name: string]: string | number | boolean - } - get effect(): Effect - set effect(value: Effect) - get uniforms(): UniformBlock - set uniforms(value: UniformBlock) - get renderQueue(): number - set renderQueue(value: number) - get useInstance(): boolean - set useInstance(value: boolean) - get blendOn(): boolean - set blendOn(value: boolean) - get blendSrcRGB(): EBlendFactor - set blendSrcRGB(value: EBlendFactor) - get blendSrcRGBChanged(): boolean - get blendSrcAlpha(): EBlendFactor - set blendSrcAlpha(value: EBlendFactor) - set blendSrc(value: EBlendFactor) - get blendDstRGB(): EBlendFactor - set blendDstRGB(value: EBlendFactor) - get blendDstRGBChanged(): boolean - get blendDstAlpha(): EBlendFactor - set blendDstAlpha(value: EBlendFactor) - set blendDst(value: EBlendFactor) - get blendFunc(): EBlendEquation - set blendFunc(value: EBlendEquation) - get depthTestOn(): boolean - set depthTestOn(value: boolean) - get depthTestComp(): ECompareFunc - set depthTestComp(value: ECompareFunc) - get depthWrite(): boolean - set depthWrite(value: boolean) - get colorWrite(): number - set colorWrite(value: number) - get cullFace(): ECullMode - set cullFace(value: ECullMode) - get cullOn(): boolean - set cullOn(value: boolean) - get primitiveType(): EPrimitiveType - set primitiveType(value: EPrimitiveType) - get stencilTestOn(): boolean - set stencilTestOn(value: boolean) - get stencilComp(): ECompareFunc - set stencilComp(value: ECompareFunc) - get stencilPass(): EStencilOp - set stencilPass(value: EStencilOp) - get stencilFail(): EStencilOp - set stencilFail(value: EStencilOp) - get stencilZFail(): EStencilOp - set stencilZFail(value: EStencilOp) - get stencilWriteMask(): number - set stencilWriteMask(value: number) - get stencilReadMask(): number - set stencilReadMask(value: number) - get stencilRef(): number - set stencilRef(value: number) - get blendOnMask(): boolean - set blendOnMask(value: boolean) - get blendSrcRGBMask(): boolean - set blendSrcRGBMask(value: boolean) - get blendSrcAlphaMask(): boolean - set blendSrcAlphaMask(value: boolean) - set blendSrcMask(value: boolean) - get blendDstRGBMask(): boolean - set blendDstRGBMask(value: boolean) - get blendDstAlphaMask(): boolean - set blendDstAlphaMask(value: boolean) - set blendDstMask(value: boolean) - get blendFuncMask(): boolean - set blendFuncMask(value: boolean) - get depthTestOnMask(): boolean - set depthTestOnMask(value: boolean) - get depthTestCompMask(): boolean - set depthTestCompMask(value: boolean) - get depthWriteMask(): boolean - set depthWriteMask(value: boolean) - get colorWriteMask(): boolean - set colorWriteMask(value: boolean) - get cullFaceMask(): boolean - set cullFaceMask(value: boolean) - get cullOnMask(): boolean - set cullOnMask(value: boolean) - get primitiveTypeMask(): boolean - set primitiveTypeMask(value: boolean) - get stencilTestOnMask(): boolean - set stencilTestOnMask(value: boolean) - get stencilCompMask(): boolean - set stencilCompMask(value: boolean) - get stencilPassMask(): boolean - set stencilPassMask(value: boolean) - get stencilFailMask(): boolean - set stencilFailMask(value: boolean) - get stencilZFailMask(): boolean - set stencilZFailMask(value: boolean) - get stencilWriteMaskMask(): boolean - set stencilWriteMaskMask(value: boolean) - get stencilReadMaskMask(): boolean - set stencilReadMaskMask(value: boolean) - get stencilRefMask(): boolean - set stencilRefMask(value: boolean) - constructor( - macros?: { - [name: string]: string | number | boolean - }, - effect?: Effect, - uniformBlock?: UniformBlock - ) - protected _createNativeMat( - macros?: { - [name: string]: string | number | boolean - }, - effect?: Effect, - uniformBlock?: UniformBlock - ): void - changeMacros(macros?: { - [name: string]: string | number | boolean - }): void - getMacro(key: string): string | number | boolean - clone(uniforms?: UniformBlock): Material - showDebugInfo(): string - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/RenderPass' { - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - import Texture from 'XrFrame/kanata/lib/frontend/resource/Texture' - export interface IRenderPassOptions { - colors: Array<{ - texture: Texture - slice?: number - level?: number - }> - depth: { - texture: Texture - slice?: number - level?: number - } - stencil?: { - texture: Texture - slice?: number - level?: number - } - } - export default class RenderPass extends PureResource { - static SCREEN_RENDER_PASS: RenderPass - constructor(options: IRenderPassOptions) - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/SkeletonBoneInverseModel' { - import DataModel from 'XrFrame/kanata/lib/frontend/resource/DataModel' - export default class SkeletonBoneInverseModel extends DataModel { - boneNum: number - setBoneInverseMatrix(matrices: Float32Array): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/Texture' { - /** - * Texture.ts - * - * * @Date : 9/4/2020, 2:35:42 PM - */ - import { - ETextureFormat, - ETextureType, - EWrapMode, - EFilterMode, - TTextureSource - } from 'XrFrame/kanata/lib/backend' - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - /** - * 纹理资源{@link Texture}的创建参数。 - */ - export interface ITextureOptions { - /** - * 纹理宽,如果`source`是`IImage`可以不传。 - */ - width?: number - /** - * 纹理高,如果`source`是`IImage`可以不传。 - */ - height?: number - /** - * @internal - */ - isWriteOnly?: boolean - /** - * @internal - */ - isRenderTarget?: boolean - /** - * @internal - */ - canvas?: HTMLCanvasElement - /** - * 纹理数据源,如果是2D纹理,一般只能有一个元素。如果是`Buffer`类型数据,比如压缩纹理,则需要和`offsets`配合使用,一般用于`mipmaps`的场合。 - * 如果是立方体纹理,则有六个元素。 - */ - source?: TTextureSource[] - /** - * 当`source`为`Buffer`纹理并且拥有`mipmaps`之类的时,标记如何切割数据。 - * 规则是: off1, size1, off2, size2...... - */ - offsets?: Uint32Array - /** - * 纹理类型。 - */ - type?: ETextureType - /** - * 纹理有多少切片,比如立方体纹理就为`6`。 - */ - slices?: number - /** - * 纹理有多少级`mipmap`。 - */ - mips?: number - /** - * 纹理的像素格式。 - */ - pixelFormat?: ETextureFormat - minFilter?: EFilterMode - magFilter?: EFilterMode - /** - * 是否要自动生成`mipmaps`,仅对非压缩纹理有效。 - */ - generateMipmaps?: boolean - wrapU?: EWrapMode - wrapV?: EWrapMode - wrapW?: EWrapMode - /** - * 各向异性等级。 - */ - anisoLevel?: number - /** - * @internal - */ - sampleCount?: number - } - /** - * 纹理资源。 - */ - export default class Texture extends PureResource { - get type(): ETextureType - get width(): number - get height(): number - get slice(): number - get mips(): number - get pixelFormat(): ETextureFormat - get wrapU(): EWrapMode - set wrapU(value: EWrapMode) - get wrapV(): EWrapMode - set wrapV(value: EWrapMode) - get wrapW(): EWrapMode - set wrapW(value: EWrapMode) - get magFilter(): EFilterMode - set magFilter(value: EFilterMode) - get minFilter(): EFilterMode - set minFilter(value: EFilterMode) - get anisoLevel(): number - set anisoLevel(value: number) - get sampleCount(): number - set sampleCount(value: number) - get generateMipmaps(): boolean - set generateMipmaps(value: boolean) - get isRenderTarget(): boolean - set isRenderTarget(value: boolean) - constructor(options: ITextureOptions) - /** - * 在创建了纹理后,可以用此方法来更新。 - */ - update(options: { - /** - * `mipmap`等级。 - */ - level?: number - /** - * 切片。 - */ - slice?: number - /** - * x向偏移。 - */ - xoffset?: number - /** - * x向偏移。 - */ - yoffset?: number - /** - * @internal。 - */ - zoffset?: number - /** - * 宽,相对于x偏移。 - */ - width?: number - /** - * 高,相对于y偏移。 - */ - height?: number - /** - * 数据。 - */ - buffer: TTextureSource - }): void - showDebugInfo(): string - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/UniformBlock' { - /** - * UniformBlock.ts - * - * * @Date : 9/4/2020, 2:34:36 PM - */ - import { IHandle } from 'XrFrame/kanata/lib/backend' - import UniformDescriptor from 'XrFrame/kanata/lib/frontend/resource/UniformDescriptor' - import Texture from 'XrFrame/kanata/lib/frontend/resource/Texture' - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - /** - * 存储Uniform的一个区块。 - */ - export default class UniformBlock extends PureResource { - /** - * @internal - */ - static CREATE_FAKE(descriptor: UniformDescriptor): FakeUniformBlock - /** - * @internal - */ - /** - * 描述符。 - */ - get descriptor(): UniformDescriptor - /** - * @internal - */ - get textures(): { - [name: string]: Texture - } - /** - * @param descriptor 描述符。 - */ - constructor(descriptor: UniformDescriptor) - protected _createNativeObj(descriptor: UniformDescriptor): IHandle - /** - * 是否包含某个成员uniform。 - */ - hasKey(key: string): boolean - /** - * 设置某个成员uniform。 - */ - setUniform( - key: string, - value: ArrayLike<number> | Texture | number - ): boolean - /** - * 获取某个成员uniform。 - * 如果是返回`number`,则是纹理的id。 - */ - getUniform(key: string): Float32Array | number - /** - * 获取某个成员uniform的texture实例。 - */ - getTexture(key: string): Texture - /** - * @internal - */ - /** - * @internal - */ - setAllData(data: Float32Array): void - /** - * 科隆某个uniform。 - */ - clone(): UniformBlock - /** - * 复制某个uniform。 - */ - copy(ub: UniformBlock): void - showDebugInfo(): string - } - class FakeUniformBlock extends UniformBlock { - protected _createNativeObj(descriptor: UniformDescriptor): { - id: number - data: ArrayBuffer - } - } - export {} -} - -declare module 'XrFrame/kanata/lib/frontend/resource/UniformDescriptor' { - /** - * UniformDescriptor.ts - * - * * @Date : 9/4/2020, 2:34:50 PM - */ - import { - EUniformType, - IUniformDescriptorOptions - } from 'XrFrame/kanata/lib/backend' - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - /** - * UniformBlock描述符。 - */ - export default class UniformDescriptor extends PureResource { - /** - * @internal - */ - get layout(): { - [key: string]: [ - EUniformType, - number, - number, - number, - EUniformType, - boolean - ] - } - /** - * 以Float计的长度。 - */ - get size(): number - constructor(options: IUniformDescriptorOptions) - /** - * @internal - */ - hasKey(key: string): boolean - /** - * @internal - */ - setUniform( - key: string, - value: ArrayLike<number> | number, - f32: Float32Array, - u32: Uint32Array - ): void - /** - * @internal - */ - getUniform( - key: string, - f32: Float32Array, - u32: Uint32Array - ): Float32Array | number - /** - * @internal - */ - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/IndexBuffer' { - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - export default class IndexBuffer extends PureResource { - get byteSize(): number - constructor(buffer: ArrayBuffer | ArrayBufferView, is32bits?: boolean) - update(buffer: ArrayBuffer | ArrayBufferView, offset: number): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/IndexData' { - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - export default class IndexData extends PureResource { - get data(): ArrayBuffer - constructor(size: number) - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/VertexBuffer' { - import VertexLayout from 'XrFrame/kanata/lib/frontend/resource/VertexLayout' - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - /** - * 顶点数据。 - */ - export default class VertexBuffer extends PureResource { - get byteSize(): number - get layout(): VertexLayout - constructor(buffer: ArrayBuffer | ArrayBufferView, layout: VertexLayout) - update(buffer: ArrayBuffer | ArrayBufferView, offset: number): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/VertexData' { - /** - * VertexData.ts - * - * * @Date : 9/11/2020, 4:43:52 PM - */ - import VertexDataDescriptor from 'XrFrame/kanata/lib/frontend/resource/VertexDataDescriptor' - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - import VertexLayout from 'XrFrame/kanata/lib/frontend/resource/VertexLayout' - /** - * 用于合批的顶点数据。 - */ - export default class VertexData extends PureResource { - get layout(): VertexLayout - get data(): ArrayBuffer - constructor( - layout: VertexLayout, - size: number, - batchDesc: VertexDataDescriptor - ) - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/VertexLayout' { - /** - * VertexLayout.ts - * - * * @Date : 9/4/2020, 5:01:51 PM - */ - import { - IVertexLayoutOptions, - EVertexLayoutUsage - } from 'XrFrame/kanata/lib/backend' - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - /** - * 顶点布局描述。 - */ - export default class VertexLayout extends PureResource { - /** - * 顶点数据单位步长。 - */ - get stride(): number - constructor(options: IVertexLayoutOptions) - /** - * 获取某个属性的配置。 - */ - getConfigByName(name: string): { - name: string - format: import('XrFrame/kanata/lib/backend').EVertexFormat - offset: number - usage: EVertexLayoutUsage - } - /** - * 获取某个用途的属性的配置。 - */ - getConfigByUsage(usage: EVertexLayoutUsage): { - name: string - format: import('XrFrame/kanata/lib/backend').EVertexFormat - offset: number - usage: EVertexLayoutUsage - } - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/VertexDataDescriptor' { - /** - * VertexDataDescriptor.ts - * - * * @Date : 4/28/2021, 4:38:37 PM - */ - import { IVertexDataDescriptorOptions } from 'XrFrame/kanata/lib/backend' - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - /** - * 用于合批的顶点数据的描述符。 - */ - export default class VertexDataDescriptor extends PureResource { - constructor(options: IVertexDataDescriptorOptions) - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/View' { - /** - * View.ts - * - * * @Date : 9/4/2020, 6:43:18 PM - */ - import { IRect, IViewAction } from 'XrFrame/kanata/lib/backend' - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - /** - * 视图,用于控制清屏、视图区域等配置。 - */ - export default class View extends PureResource { - constructor(options: { - passAction: IViewAction - viewport: IRect - scissor: IRect - }) - } -} - -declare module 'XrFrame/kanata/lib/frontend/resource/ScalableList' { - import PureResource from 'XrFrame/kanata/lib/frontend/shared/PureResource' - export const SL_MAP: Set<ScalableList> - export function CHECK_SLS_RESIZE(): void - export function CLEAR_SLS(): void - /** - * 可扩容列表,用于存储Mesh的剔除结果以及绘制数据的id。 - */ - export default class ScalableList extends PureResource { - /** - * 当前全部可用的大小。 - */ - get size(): number - /** - * 存储的id集合。 - */ - get dataView(): Uint32Array - /** - * 当前已用的大小,一般不需要自己设置。 - */ - get usedSize(): number - set usedSize(value: number) - constructor(initSize: number) - /** - * 扩容,将会扩大两倍,一般不需要自己调用。 - * - * @param deprecatedSize will always be current size, don't use it! - */ - enlarge(deprecatedSize?: number): void - /** - * 初始化到准备`add`的阶段。 - */ - begin(): void - /** - * 添加一个数据。 - * - * @param deprecatedEnlargeSize will always be current size, don't use it! - */ - add(id: number, deprecatedEnlargeSize?: number): void - /** - * 结束此次所有`add`的流程。 - */ - end(): void - /** - * 清空整个列表。 - */ - reset(): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/shared/crossContext' { - /** - * 跨域信息通道,用于主域和子域之间的通信。 - */ - class CrossContext { - constructor() - postMessage(data: any): void - onMessage(callback: (data: any) => void): void - flush(): void - } - let crossContext: CrossContext - export default crossContext -} - -declare module 'XrFrame/components/particle/gradient' { - import Vector3 from 'XrFrame/math/vector3' - import Vector4 from 'XrFrame/math/vector4' - export class ColorGradient { - gradient: number - color: Vector4 - color2: Vector4 - constructor(gradient: any, color: any, color2: any) - /** - * 获取具体颜色属性值 - * @param {Vector4} 用于存储结果的临时变量 - */ - getColor(colorTemp: Vector4): void - } - export class Color3Gradient { - gradient: number - color: Vector3 - constructor(gradient: any, color: any) - } - export class FactorGradient { - gradient: number - factor: number - factor2: number - constructor(gradient: any, factor: any, factor2: any) - /** - * 获取具体属性值 - * @return {number} 插值后的属性大小 - */ - getFactor(): number - } - export class BasicGradientMethod { - /** - * 从获取具体时刻的属性大小 - * @param {number} ratio 粒子所处生命周期的阶段 - * @param {Array} gradients 存储不同时刻指定属性变化的数组 - * @param {Callback} updateFunc 回调函数 - */ - static GetCurrentGradient( - ratio: any, - gradients: any, - updateFunc: any - ): void - } -} - -declare module 'XrFrame/components/emitter/BoxShapeEmitter' { - import Vector3 from 'XrFrame/math/vector3' - import { BasicShapeEmitter } from 'XrFrame/components/emitter/BasicShapeEmitter' - export default class BoxShapeEmitter extends BasicShapeEmitter { - direction: Vector3 - direction2: Vector3 - minEmitBox: Vector3 - maxEmitBox: Vector3 - constructor() - startDirection(worldMatrix: any, direction: any): void - startPosition(worldMatrix: any, position: Vector3): void - } -} - -declare module 'XrFrame/components/emitter/PointShapeEmitter' { - import Vector3 from 'XrFrame/math/vector3' - import { BasicShapeEmitter } from 'XrFrame/components/emitter/BasicShapeEmitter' - export default class PointShapeEmitter extends BasicShapeEmitter { - /** - * 粒子运动方向左区间。 - */ - direction: Vector3 - /** - * 粒子运动方向右区间。 - */ - direction2: Vector3 - constructor() - startDirection(worldMatrix: any, direction: any): void - startPosition(worldMatrix: any, position: Vector3): void - } -} - -declare module 'XrFrame/components/emitter/DrawShapeEmitter' { - import Vector3 from 'XrFrame/math/vector3' - import ParticleInstance from 'XrFrame/components/particle/ParticleInstance' - import { BasicShapeEmitter } from 'XrFrame/components/emitter/BasicShapeEmitter' - export default class DrawShapeEmitter extends BasicShapeEmitter { - direction: Vector3 - constructor() - setContent(content: any, step?: number): void - translateBase64ToArrayBuffer(base64: any): ArrayBufferLike - startDirection(worldMatrix: any, direction: any): void - startPosition(worldMatrix: any, position: Vector3): void - processInstance(instance: ParticleInstance, deltaTime: number): void - lerpNumberArrayToVector( - vector: any, - numberArray1: any, - numberArray2: any, - step: any, - length?: number - ): void - } -} - -declare module 'XrFrame/components/emitter/SphereShapeEmitter' { - import Vector3 from 'XrFrame/math/vector3' - import { BasicShapeEmitter } from 'XrFrame/components/emitter/BasicShapeEmitter' - import Matrix4 from 'XrFrame/math/matrix4' - export default class SphereShapeEmitter extends BasicShapeEmitter { - /** - * 球形半径 - */ - radius: number - /** - * 球形区域覆盖范围[0-1] - */ - radiusRange: number - /** - * 粒子在球形内生成的角度区间[0-360] - */ - arc: number - /** - * 粒子运动方向偏离程度[0-1] - */ - randomizeDirection: number - constructor() - startDirection( - worldMatrix: Matrix4, - direction: Vector3, - position: Vector3 - ): void - startPosition(worldMatrix: Matrix4, position: Vector3): void - } -} - -declare module 'XrFrame/components/emitter/ConeShapeEmitter' { - import Vector3 from 'XrFrame/math/vector3' - import { BasicShapeEmitter } from 'XrFrame/components/emitter/BasicShapeEmitter' - export default class ConeShapeEmitter extends BasicShapeEmitter { - /** - * [0-1] - */ - radiusRange: number - heightRange: number - /** - * [0-360] - */ - arc: number - /** - * randomize the particle direction [0-1] - */ - randomizeDirection: number - get radius(): number - set radius(value: number) - get angle(): number - set angle(value: number) - updateHeight(): void - constructor() - startDirection( - worldMatrix: any, - direction: any, - position: Vector3 - ): void - startPosition(worldMatrix: any, position: Vector3): void - } -} - -declare module 'XrFrame/components/emitter/CircleShapeEmitter' { - import Vector3 from 'XrFrame/math/vector3' - import { BasicShapeEmitter } from 'XrFrame/components/emitter/BasicShapeEmitter' - import Matrix4 from 'XrFrame/math/matrix4' - export default class CircleShapeEmitter extends BasicShapeEmitter { - radius: number - radiusRange: number - direction: Vector3 - direction2: Vector3 - arc: number - angle: number - constructor() - startDirection( - worldMatrix: Matrix4, - direction: Vector3, - position: Vector3 - ): void - startPosition(worldMatrix: any, position: Vector3): void - } -} - -declare module 'XrFrame/render-graph/RGNode' { - /** - * RGNode.ts - * - * * @Date : 1/13/2021, 8:29:55 PM - */ - import { Kanata } from 'XrFrame/ext' - import Camera from 'XrFrame/components/Camera' - import { IRenderTarget } from 'XrFrame/assets/RenderTexture' - type RenderGraph = import('XrFrame/render-graph/RenderGraph').default - type RenderSystem = import('XrFrame/systems/RenderSystem').default - type Scene = import('XrFrame/core/Scene').default - export type TRGNodeAny = RGNode<any, any, any> - /** - * RGNode支持传输的数据类型。 - * 可扩展。 - * - * @category Render - */ - export interface IRGData { - /** - * 空数据类型。 - */ - None: void - /** - * 相机类型。 - */ - Camera: Camera - /** - * 渲染目标类型。 - */ - RenderTarget: IRenderTarget - /** - * Mesh列表,一般作为剔除节点的输出,作为渲染节点的输入。 - */ - MeshList: Kanata.ScalableList - } - /** - * RGNode支持的节点类型。 - */ - export enum ERGNodeType { - Camera = 'Camera', - Clear = 'Clear', - Cull = 'Cull', - Render = 'Render', - Script = 'Script' - } - /** - * 渲染节点基类。 - */ - export default abstract class RGNode< - TInputs extends { - [key: string]: keyof IRGData - }, - TOutput extends keyof IRGData, - IOptions - > { - protected _parent: RenderGraph - protected _id: number - protected _name: string - protected _options: IOptions - /** - * 节点类型。 - * - * @internal - */ - type: ERGNodeType - /** - * 节点输入的数据类型。 - */ - abstract inputTypes: TInputs - /** - * 节点输出的数据类型。 - */ - abstract outputType: TOutput - protected _output?: IRGData[TOutput] - protected _inputs: { - [key: string]: TRGNodeAny - } - protected _outputs: { - [id: number]: string - } - /** - * 节点的初始化配置参数。 - */ - get options(): IOptions - /** - * 节点名字。 - */ - get name(): string - /** - * 节点id。 - */ - get id(): number - /** - * 获取当前游戏实例。 - */ - get scene(): Scene - /** - * 获取当前节点输出。 - */ - get output(): IRGData[TOutput] - /** - * 不要直接调用,请使用`renderGraph.createNode`方法。 - */ - constructor( - _parent: RenderGraph, - _id: number, - _name: string, - _options: IOptions - ) - /** - * 节点初始化后的回调。 - */ - onInit(options: IOptions): void - /** - * 获取某个节点的输入。 - */ - getInput<TKey extends keyof TInputs>(key: TKey): IRGData[TInputs[TKey]] - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * @internal - */ - /** - * 重置节点状态,清空输入,一般用于可缓存的节点优化。 - */ - reset(): void - /** - * 节点在真正被第一次使用时的回调。 - */ - onActive(context: RenderSystem, options: IOptions): void - /** - * 节点在每帧执行时的回调。 - */ - onExecute(context: RenderSystem, options: IOptions): void - /** - * 节点在被图中移除时的回调。 - */ - onDisable(context: RenderSystem, options: IOptions): void - } - export {} -} - -declare module 'XrFrame/loader/glTF/animations/GLTFAnimationNode' { - import { Kanata } from 'XrFrame/ext' - import { GLTFAccessorsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFNodesLoaded } from 'XrFrame/loader/glTF/scenes/GLTFNodesNode' - import { GLTF } from 'XrFrame/loader/glTF/utils/types' - import { - GLTFChannelsLoaded, - GLTFChannelsNodeRaw - } from 'XrFrame/loader/glTF/animations/channels/GLTFChannelsNode' - import { GLTFSamplersNodeRaw } from 'XrFrame/loader/glTF/animations/samplers/GLTFSamplersNode' - /** - * 二进制格式 - * | contentoffset | fps(float) | totalFrame | totalSampleGroup | - * | Array<PuppetAnimationSampleGroup> | - * - * @see PuppetAnimationSampleGroup at GLTFChannelNode.ts - */ - export type PuppetAnimationClipModel = ArrayBuffer | GLTF.BufferView - export interface GLTFAnimationNodeRaw { - channels: GLTFChannelsNodeRaw - samplers: GLTFSamplersNodeRaw - name?: string - extras?: any - } - export interface GLTFAnimationLoaded { - clip: Kanata.AnimationClipModel - channels: GLTFChannelsLoaded - frameCount: number - name?: string - extras?: any - } - export default class GLTFAnimationNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFAnimationNodeRaw - resource: GLTFAnimationLoaded | null - build(): void - preload( - prerequisites: [ - accessors: GLTFAccessorsLoaded, - nodes: GLTFNodesLoaded - ] - ): Promise<GLTFAnimationLoaded> - getLoadedResource(): GLTFAnimationLoaded - } -} - -declare module 'XrFrame/loader/glTF/buffers/GLTFAccessorNode' { - import { GLTF } from 'XrFrame/loader/glTF/utils/types' - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFBufferViewLoaded } from 'XrFrame/loader/glTF/buffers/GLTFBufferViewNode' - import { GLTFBufferViewsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFBufferViewsNode' - export enum EnumGLTFAccessorComponentType { - BYTE = 5120, - UNSIGNED_BYTE = 5121, - SHORT = 5122, - UNSIGNED_SHORT = 5123, - UNSIGNED_INT = 5125, - FLOAT = 5126 - } - export const GLTFAccessorComponentTypeToViewClass: { - 5120: Int8ArrayConstructor - 5121: Uint8ArrayConstructor - 5122: Int16ArrayConstructor - 5123: Uint16ArrayConstructor - 5125: Uint32ArrayConstructor - 5126: Float32ArrayConstructor - } - export const GLTFAccessorTypeToNumberOfElements: { - SCALAR: number - VEC2: number - VEC3: number - VEC4: number - MAT2: number - MAT3: number - MAT4: number - } - export interface GLTFAccessorNodeRaw { - bufferView?: number - byteOffset?: number - componentType: number - count: number - min?: number[] - max?: number[] - type: string - normalized?: boolean - sparse?: boolean - name?: string - extras?: any - } - /** - * 以FloatVec3为例: - * 一个component指一个float, - * 一个element指三个float。 - */ - export interface GLTFAccessorLoaded { - bufferView: GLTFBufferViewLoaded - bufferViewIndex: number - view: GLTF.BufferView - elementLength: number - bytesPerComponent: number - count: number - stride: number - byteStride: number - componentType: EnumGLTFAccessorComponentType - max?: number[] - min?: number[] - compact: boolean - extras?: any - getCompAt(element: number, comp: number): any - } - export default class GLTFAccessorNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFAccessorNodeRaw - build(): void - preload( - prerequisites: [GLTFBufferViewsLoaded] - ): Promise<GLTFAccessorLoaded> - getLoadedResource(): GLTFAccessorLoaded - } -} - -declare module 'XrFrame/loader/glTF/buffers/GLTFBufferNode' { - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - export interface GLTFBufferNodeRaw { - uri?: string - byteLength: number - name?: string - extras?: any - } - export interface GLTFBufferLoaded { - buffer: ArrayBuffer - extras?: any - } - export default class GLTFBufferNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFBufferNodeRaw - protected resource: GLTFBufferLoaded | null - build(): void - preload(): Promise<GLTFBufferLoaded> - getLoadedResource(): GLTFBufferLoaded - } -} - -declare module 'XrFrame/loader/glTF/buffers/GLTFBufferViewNode' { - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFBuffersLoaded } from 'XrFrame/loader/glTF/buffers/GLTFBuffersNode' - export interface GLTFBufferViewNodeRaw { - buffer: number - byteLength: number - byteOffset?: number - byteStride?: number - target?: EnumGLTFBufferViewTarget - name?: string - extras?: any - } - export interface GLTFBufferViewLoaded { - data: ArrayBuffer - byteOffset: number - byteStride: number - byteLength: number - target: EnumGLTFBufferViewTarget - extras?: any - getSlicedData(): ArrayBuffer - getUint8View(): Uint8Array - _sliced: ArrayBuffer - } - export enum EnumGLTFBufferViewTarget { - ARRAY_BUFFER = 34962, - ELEMENT_ARRAY_BUFFER = 34963 - } - export default class GLTFBufferViewNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFBufferViewNodeRaw - build(): void - preload( - prerequisites: [GLTFBuffersLoaded] - ): Promise<GLTFBufferViewLoaded> - getLoadedResource(): GLTFBufferViewLoaded - } -} - -declare module 'XrFrame/loader/glTF/geometry/GLTFMeshNode' { - import { Kanata } from 'XrFrame/ext' - import { GLTFAccessorsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFMaterialsLoaded } from 'XrFrame/loader/glTF/materials/GLTFMaterialsNode' - import { - GLTFPrimitivesLoaded, - GLTFPrimitivesNodeRaw - } from 'XrFrame/loader/glTF/geometry/primitives/GLTFPrimitivesNode' - export interface GLTFMeshNodeRaw { - primitives: GLTFPrimitivesNodeRaw - weights?: number[] - name?: string - extras?: any - } - export interface GLTFMeshLoaded { - subMeshes: GLTFPrimitivesLoaded - weights: number[] - name?: string - extras?: any - } - export default class GLTFMeshNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFMeshNodeRaw - build(): void - preload( - prerequisites: [ - materials: GLTFMaterialsLoaded, - accessors: GLTFAccessorsLoaded, - vbMap: Map<string, [ArrayBuffer, Kanata.VertexLayout, object]> - ] - ): Promise<GLTFMeshLoaded> - getLoadedResource(): GLTFMeshLoaded - } -} - -declare module 'XrFrame/loader/glTF/materials/GLTFMaterialNode' { - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import GLTFTextureInfoNode, { - GLTFTextureInfoNodeRaw - } from 'XrFrame/loader/glTF/materials/texture/GLTFTextureInfoNode' - import GLTFPBRMetallicRoughnessNode, { - GLTFPBRMetallicRoughnessNodeRaw - } from 'XrFrame/loader/glTF/materials/pbr/GLTFPBRMetallicRoughnessNode' - import GLTFNormalTextureInfoNode, { - GLTFNormalTextureInfoNodeRaw - } from 'XrFrame/loader/glTF/materials/texture/GLTFNormalTextureInfoNode' - import GLTFOcclusionTextureInfoNode, { - GLTFOcclusionTextureInfoNodeRaw - } from 'XrFrame/loader/glTF/materials/texture/GLTFOcclusionTextureInfoNode' - import Material from 'XrFrame/assets/Material' - import { IRenderStates } from 'XrFrame/assets/Effect' - import { GLTFTexturesLoaded } from 'XrFrame/loader/glTF/textures/GLTFTexturesNode' - export interface GLTFMaterialExtArgs { - uniform: object - renderStates: IRenderStates - macros: object - } - export enum EnumGLTFMaterialAlphaMode { - OPAQUE = 0, - MASK = 1, - BLEND = 2 - } - export interface GLTFMaterialNodeRaw { - name?: string - pbrMetallicRoughness?: GLTFPBRMetallicRoughnessNodeRaw - normalTexture?: GLTFNormalTextureInfoNodeRaw - occlusionTexture?: GLTFOcclusionTextureInfoNodeRaw - emissiveTexture?: GLTFTextureInfoNodeRaw - emissiveFactor?: [number, number, number] - alphaMode?: string - alphaCutoff?: number - doubleSided?: boolean - extras?: any - } - export type GLTFMaterialPrerequisites = [textrues: GLTFTexturesLoaded] - export interface GLTFMaterialLoaded { - material: Material - extras?: any - } - export default class GLTFMaterialNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFMaterialNodeRaw - resource: GLTFMaterialLoaded | null - pbrMetallicRoughness: GLTFPBRMetallicRoughnessNode | undefined - normalTexture: GLTFNormalTextureInfoNode | undefined - occlusionTexture: GLTFOcclusionTextureInfoNode | undefined - emissiveTexture: GLTFTextureInfoNode | undefined - build(): void - /** - * @internal - */ - preloadWithoutPBR( - prerequisites: GLTFMaterialPrerequisites - ): Promise<GLTFMaterialExtArgs> - /** - * 实际上不一定会走到这里,mesh没有material也是合法的,这时候会去取emptyMaterial。 - */ - preload( - prerequisites: [textrues: GLTFTexturesLoaded] - ): Promise<GLTFMaterialLoaded> - getLoadedResource(): GLTFMaterialLoaded - } -} - -declare module 'XrFrame/loader/glTF/skins/GLTFSkinNode' { - import { Kanata } from 'XrFrame/ext' - import { GLTFAccessorsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - export interface GLTFSkinNodeRaw { - inverseBindMatrices?: number - skeleton?: number - joints: number[] - extras?: any - } - export interface GLTFSkinLoaded { - inverseBindMatrices: Kanata.SkeletonBoneInverseModel - skeleton?: number - joints: number[] - extras?: any - } - export default class GLTFSkinNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFSkinNodeRaw - resource: GLTFSkinLoaded | null - build(): void - preload( - prerequisites: [accessors: GLTFAccessorsLoaded] - ): Promise<GLTFSkinLoaded> - getLoadedResource(): GLTFSkinLoaded - } -} - -declare module 'XrFrame/loader/glTF/textures/GLTFImageNode' { - import { Kanata } from 'XrFrame/ext' - import { GLTFBufferViewsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFBufferViewsNode' - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - export interface GLTFImageNodeRaw { - uri?: string - mimeType?: string - bufferView?: number - name?: string - extras?: any - } - export interface GLTFImageLoaded { - kanataImage?: Kanata.IImage - type?: string - extras?: any - } - export type GLTFImageNodePrerequisites = [ - bufferViews: GLTFBufferViewsLoaded - ] - export default class GLTFImageNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFImageNodeRaw - protected resource: GLTFImageLoaded | null - build(): void - preload( - prerequisites: GLTFImageNodePrerequisites - ): Promise<GLTFImageLoaded> - getLoadedResource(): GLTFImageLoaded - } -} - -declare module 'XrFrame/loader/glTF/textures/GLTFSamplerNode' { - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - export enum EnumGLTFSamplerFilter { - NEAREST = 9728, - LINEAR = 9729, - NEAREST_MIPMAP_NEAREST = 9984, - LINEAR_MIPMAP_NEAREST = 9985, - NEAREST_MIPMAP_LINEAR = 9986, - LINEAR_MIPMAP_LINEAR = 9987 - } - export function NeedMipmap(sampler: EnumGLTFSamplerFilter): boolean - export enum EnumGLTFSamplerWrap { - CLAMP_TO_EDGE = 33071, - MIRRORED_REPEAT = 33648, - REPEAT = 10497 - } - export interface GLTFSamplerNodeRaw { - magFilter?: number - minFilter?: number - wrapS?: number - wrapT?: number - name?: string - extras?: any - } - export interface GLTFSamplerLoaded { - magFilter: EnumGLTFSamplerFilter - minFilter: EnumGLTFSamplerFilter - wrapS: EnumGLTFSamplerWrap - wrapT: EnumGLTFSamplerWrap - extras?: any - } - export default class GLTFSamplerNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFSamplerNodeRaw - build(): void - preload(): Promise<GLTFSamplerLoaded> - getLoadedResource(): GLTFSamplerLoaded - } -} - -declare module 'XrFrame/loader/glTF/textures/GLTFTextureNode' { - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFImagesLoaded } from 'XrFrame/loader/glTF/textures/GLTFImagesNode' - import { GLTFSamplersLoaded } from 'XrFrame/loader/glTF/textures/GLTFSamplersNode' - import { Kanata } from 'XrFrame/ext' - export interface GLTFTextureNodeRaw { - sampler?: number - source?: number - name?: string - extras?: any - } - export interface GLTFTextureLoaded { - texture: Kanata.Texture - extras?: any - } - export default class GLTFTextureNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFTextureNodeRaw - build(): void - preload( - prerequisites: [ - images: GLTFImagesLoaded, - samplers: GLTFSamplersLoaded - ] - ): Promise<GLTFTextureLoaded> - getLoadedResource(): GLTFTextureLoaded - } -} - -declare module 'XrFrame/loader/glTF/animations/channels/GLTFTargetNode' { - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { - GLTFNodesLoaded, - GLTFTreeNode - } from 'XrFrame/loader/glTF/scenes/GLTFNodesNode' - export enum GLTFEnumAnimationTargetPath { - TRANSLATION = 0, - ROTATION = 1, - SCALE = 2, - WEIGHTS = 3 - } - export interface GLTFTargetNodeRaw { - node?: number - path: 'translation' | 'rotation' | 'scale' | 'weights' - extras?: any - } - export interface GLTFTargetLoaded { - node: GLTFTreeNode | null - path: GLTFEnumAnimationTargetPath - extras?: any - } - export default class GLTFTargetNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFTargetNodeRaw - build(): void - preload( - prerequisites: [nodes: GLTFNodesLoaded] - ): Promise<GLTFTargetLoaded> - getLoadedResource(): GLTFTargetLoaded - } -} - -declare module 'XrFrame/loader/glTF/geometry/primitives/attributes/GLTFAttributesNode' { - import { GLTFAccessorsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTF } from 'XrFrame/loader/glTF/utils/types' - import { GLTFTargetsLoaded } from 'XrFrame/loader/glTF/geometry/primitives/targets/GLTFTargetsNode' - /** - * GLTF.Attributes.Name -> Kanata.Layout.Name - */ - export function convertAttributeName(name: string): string - /** - * GLTF.Attributes.Name -> Kanata.Layout.Format - * 在shader里不同用途的attribute的长度是固定的,无论他用的accessor实际元素的长度是多少 - */ - export function getComponentCountFromAttributeName(name: string): number - /** - * GLTF.Attributes.Name -> Shader Macros - */ - export function genMacrosByAttrib(name: string, macros: object): void - export interface GLTFAttributesExtArgs { - trust?: boolean - check?: boolean - } - export type GLTFAttributesNodeRaw = { - [attribName: string]: number - } - export type GLTFAttributesLoaded = GLTF.VertexProperties - export default class GLTFAttributesNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFAttributesNodeRaw - build(): void - preload( - prerequisites: [ - targets: GLTFTargetsLoaded, - materials: any, - accessors: GLTFAccessorsLoaded, - vbMap: Map<string, GLTF.VertexProperties> - ] - ): Promise<GLTFAttributesLoaded> - getLoadedResource(): GLTFAttributesLoaded - } -} - -declare module 'XrFrame/loader/glTF/geometry/primitives/GLTFPrimitiveNode' { - import Geometry from 'XrFrame/assets/Geometry' - import { GLTFAccessorsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFAttributesNodeRaw } from 'XrFrame/loader/glTF/geometry/primitives/attributes/GLTFAttributesNode' - import { GLTFMaterialsLoaded } from 'XrFrame/loader/glTF/materials/GLTFMaterialsNode' - import Material from 'XrFrame/assets/Material' - import { GLTFAccessorLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorNode' - import { GLTF } from 'XrFrame/loader/glTF/utils/types' - import { GLTFTargetsNodeRaw } from 'XrFrame/loader/glTF/geometry/primitives/targets/GLTFTargetsNode' - export enum EnumGLTFPrimitiveMode { - POINTS = 0, - LINES = 1, - LINE_LOOP = 2, - LINE_STRIP = 3, - TRIANGLES = 4, - TRIANGLE_STRIP = 5, - TRIANGLE_FAN = 6 - } - export interface GLTFPrimitiveNodeRaw { - attributes: GLTFAttributesNodeRaw - indices?: number - material?: number - mode?: number - targets?: GLTFTargetsNodeRaw - extras?: any - } - export interface GLTFPrimitiveLoaded { - geometry: Geometry - material: Material - extras?: any - } - export type GLTFPrimitivePrerequisites = [ - materials: GLTFMaterialsLoaded, - accessors: GLTFAccessorsLoaded, - vbMap: Map<string, GLTF.VertexProperties> - ] - export interface GLTFPrimitiveVertexExtArgs { - vbInfo: GLTF.VertexProperties - } - export interface GLTFPrimitiveIndexExtArgs { - accessor: GLTFAccessorLoaded - } - export default class GLTFPrimitiveNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFPrimitiveNodeRaw - build(): void - preload( - prerequisites: GLTFPrimitivePrerequisites - ): Promise<GLTFPrimitiveLoaded> - getLoadedResource(): GLTFPrimitiveLoaded - } -} - -declare module 'XrFrame/loader/glTF/utils/types' { - import { ITransformData } from 'XrFrame/components' - import { Kanata } from 'XrFrame/ext' - import Quaternion from 'XrFrame/math/quaternion' - import Vector3, { Vector3ReadOnly } from 'XrFrame/math/vector3' - export namespace GLTF { - type BufferView = - | Int8Array - | Uint8Array - | Uint16Array - | Uint32Array - | Float32Array - type IndexBufferView = Uint16Array | Uint32Array | Uint8Array - class BoundingBox { - min: Vector3 - max: Vector3 - adoptMin: (newMin: Vector3) => void - adoptMax: (newMax: Vector3) => void - adopt: (newPoint: Vector3) => void - } - interface BoundingBoxReadOnly { - min: Vector3ReadOnly - max: Vector3ReadOnly - } - namespace BoundingBox { - function createZero(): BoundingBox - function createInfinite(): BoundingBox - } - interface VertexLayoutDesc extends Kanata.IVertexLayoutOptions { - stride: number - } - interface VertexProperties { - buffer: Float32Array - layoutDesc: VertexLayoutDesc - layout: Kanata.VertexLayout - macros: object - boundingBox: BoundingBox - /** - * 是否需要自行生成normal和tangent的顶点数据。 - */ - lackNormal: boolean - lackTangent: boolean - /** - * 如果需要生成的话,生成在layoutDesc的哪个attribute里。 - */ - normalSlot: number - tangentSlot: number - } - interface Transform extends ITransformData { - /** - * 同时有quat和rotation的情况下,quat优先; - * 目前只会填写quat,不会填写rotation。 - */ - quat?: Quaternion - } - } -} - -declare module 'XrFrame/kanata/lib/backend' { - /** - * index.ts - * - * * @Date : 9/3/2020, 8:45:18 PM - */ - export * from 'XrFrame/kanata/lib/backend/interface' - import { IImage } from 'XrFrame/kanata/lib/backend/interface' - import { IWorker } from 'XrFrame/kanata/lib/backend/interface/IWorker' - export interface IBackend { - IS_VALID: () => boolean - GET_MAIN_CANVAS(): HTMLCanvasElement - worker: IWorker - Image: { - new (): IImage - IS(obj: any): obj is IImage - } - Phys3D: any - } - const backend: IBackend - export default backend -} - -declare module 'XrFrame/kanata/lib/frontend/shared/NativeObject' { - /** - * NativeObject.ts - * - * * @Date : 9/3/2020, 9:17:03 PM - */ - import { IHandle } from 'XrFrame/kanata/lib/backend' - export default class NativeObject { - _bufferName: string - _byteOffset: number - _bufferLength: number - id: number - _buffer: ArrayBuffer - _f32view: Float32Array - _u32view: Uint32Array - protected _handle: IHandle - protected _init(info: IHandle): void - protected _fastInit(info: IHandle): void - protected _initU32View(): void - protected _initPropertyView( - offset: number, - length: number - ): Float32Array - setRawBuffer(data: Float32Array): void - destroy(): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/pool/PoolObject' { - import Pool from 'XrFrame/kanata/lib/frontend/pool/Pool' - export interface INativePools { - [poolId: number]: Pool - } - export default class PoolObject { - protected _nativePool: Pool - protected _nativeId: number - protected _poolId: number - protected _poolIndex: number - protected _using: boolean - entityOffset: number - get float32View(): Float32Array - get uint32View(): Uint32Array - get id(): number - get poolId(): number - get poolIndex(): number - get poll(): any - get isUsing(): boolean - set isUsing(value: boolean) - protected _init(nativeObjId: number, nativePools: INativePools): void - setRawBuffer(data: Float32Array): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/pool/PoolManager' { - /** - * PoolManager.ts - * - * * @Date : 9/3/2020, 9:19:34 PM - */ - import { IHandle } from 'XrFrame/kanata/lib/backend' - import PoolObject, { - INativePools - } from 'XrFrame/kanata/lib/frontend/pool/PoolObject' - export default class PoolManager { - pools: INativePools - constructor( - template: ArrayBuffer, - templateView: Float32Array, - allocateFunc: (size: number) => IHandle, - extendedMemSize?: number - ) - allocateOne(): number - dispose(obj: PoolObject): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/shared/PureResource' { - /** - * PureResource.ts - * - * * @Date : 9/8/2020, 9:04:32 PM - */ - import { IHandle } from 'XrFrame/kanata/lib/backend' - export default class PureResource { - id: number - __handle: IHandle - protected get _handle(): IHandle - protected set _handle(value: IHandle) - destroy(): void - } -} - -declare module 'XrFrame/kanata/lib/backend/native/worker' { - import { - IHandle, - ETextureType, - ETextureFormat, - IRect, - EMeshRenderType, - INativeMap, - ILongIntNativeMap, - IGlyphInfo, - IRenderEnv, - EDracoDecodeType, - DracoDecoded - } from 'XrFrame/kanata/lib/backend/interface' - export interface INativeWorker { - createVertexLayout(options: string): IHandle - createVertexDataDescriptor(options: string): IHandle - createVertexBuffer( - buffer: ArrayBuffer | ArrayBufferView, - layout: number - ): IHandle - updateVertexBuffer( - bufferId: number, - buffer: ArrayBuffer | ArrayBufferView, - offset: number - ): void - createIndexBuffer( - buffer: ArrayBuffer | ArrayBufferView, - is32bits?: boolean - ): IHandle - updateIndexBuffer( - bufferId: number, - buffer: ArrayBuffer | ArrayBufferView, - offset: number - ): void - createVertexData( - layout: number, - size: number, - batchDesc: number - ): IHandle - createIndexData(size: number): IHandle - createTexture( - type: ETextureType, - width: number, - height: number, - slice: number, - mips: number, - format: ETextureFormat, - flags: number, - buffer: Array<ArrayBuffer | ArrayBufferView>, - offsets: Uint32Array - ): IHandle - createTexture(canvas: HTMLCanvasElement): IHandle - updateTexture( - id: number, - level: number, - slice: number, - xoffset: number, - yoffset: number, - zoffset: number, - width: number, - height: number, - buffer: ArrayBuffer | ArrayBufferView - ): void - updateTextureFlags(textureId: number, flags: number): void - createShader(vs: string, fs: string): IHandle - createUniformBlockDescriptor(descriptor: string): IHandle - createUniformBlock(descriptor: number): IHandle - createEffect( - name: string, - passCount: number, - keyIndexMap: string, - passes: string, - shaders: string[], - variants: string, - flags: number - ): IHandle & { - warmUp(): void - } - createMaterial(macros: string): IHandle - changeMaterialMacros( - material: number, - macros: string, - reset?: boolean - ): void - createScalableList( - initSize: number, - onBackendEnlarge: () => void - ): IHandle & { - enlarge(size: number): void - } - } - export interface INativeWorker { - createView(view: string): IHandle - updateViewRect(view: number, rect: IRect): void - updateViewScissor(view: number, rect: IRect): void - } - export interface INativeWorker { - createRenderPass(descriptor: string): IHandle - } - export interface INativeWorker { - createNodePool(count: number, is3d: boolean): IHandle - createNodeTree( - length: number, - ids: ArrayBuffer, - buffer: ArrayBuffer, - calculateWordMatrix: boolean, - is3d?: boolean - ): boolean - } - export namespace INativeWorker { - interface IAnimationClipBinding extends IHandle { - id: number - rebind( - buffer: ArrayBuffer, - offset: number, - cLength: number, - eLength: number, - removeAction: number, - retainedAction: number, - addedAction: number, - rootEntity: number - ): boolean - update( - buffer: ArrayBuffer, - offset: number, - cLength: number, - eLength: number, - removeAction: number, - retainedAction: number, - addedAction: number - ): boolean - writeDefaultValues(): void - } - } - export interface INativeWorker { - createCullingComponentPool(count: number): IHandle - createRenderComponent( - meshCount: number, - uniformBlock: number, - attachedNode: number, - cullingId: number, - meshRenderType: EMeshRenderType, - macros?: string - ): IHandle & { - setSharedDirty(): void - } - changeMeshMacros(mesh: number, macros: string): void - createAnimator(clipCount: number, nodeCount: number): IHandle - updateAnimators(data: Uint32Array): void - createAnimationClipBinding( - buffer: ArrayBuffer, - offset: number, - cLength: number, - eLength: number, - useDefaultAddedNodesAction: number, - rootEntity: number - ): INativeWorker.IAnimationClipBinding - createAnimatorControllerModel(layerCount: number): { - id: number - buffer: ArrayBuffer - setMaskAtIndex( - index: number, - mask: null | ArrayBuffer, - offset: number, - length: number - ): void - update(): void - } - createAnimatorControllerStateModel(clipCount: number): { - id: number - buffer: ArrayBuffer - } - updateAnimatorControllers(data: Uint32Array): void - createSkinning(boneCount: number, flag: number): IHandle - updateSkinnings(data: Uint32Array): void - createDynamicBones(rootNodeId: number): IHandle & { - preUpdate(): void - update( - dt: number, - rootMotionX?: number, - rootMotionY?: number, - rootMotionZ?: number - ): void - rebuild(): void - resetRoot(rootId: number): void - } - } - export interface INativeWorker { - createRenderCamera( - attachedNode: number, - isUI?: boolean - ): IHandle & { - setSharedDirty(): void - updateMatrices(): void - } - createLightCamera(): IHandle - } - export interface INativeWorker { - createAnimationClipModel(buffer: ArrayBuffer): IHandle - createBoneInverseModel(buffer: ArrayBuffer): IHandle - } - export interface INativeWorker { - eventBusSM: ArrayBuffer - dirtyNodesSM: ArrayBuffer - uiRenderList: ArrayBuffer - enlargeUIRenderList(): void - refreshNodesWorldTransform(): void - } - export interface INativeWorker { - loadTTFFont(buffer: ArrayBuffer, filaPath: string): string - getGlyphInfo(name: string, charCode: number): IGlyphInfo - } - export interface INativeWorker { - decodeImage( - buffer: ArrayBuffer, - callback: ( - data: ArrayBuffer | undefined, - width: number, - height: number - ) => void, - premultiplyAlpha: boolean - ): void - getRenderEnv(): IRenderEnv - clearView(view: number): void - cullCamera(camera: number, cullResult: number, lightMode: string): void - drawCamera(camera: number, renderList: number, lightMode: string): void - drawLight( - light: number, - camera: number, - renderList: number, - lightMode: string - ): void - submit(): void - destroy(): void - createWeakRef<T>(wrapper: T): { - deref: () => T - } - createWeakRefSentry(): any - createNativeUUMap(): INativeMap<number> - createNativeSUMap(): INativeMap<string> - createNativeULUMap(): ILongIntNativeMap - decodeBase64(base64: string): ArrayBuffer - decodeDraco( - buffer: ArrayBuffer | ArrayBufferView, - decodeType: EDracoDecodeType - ): DracoDecoded - setNodeName(id: number, name: string): void - setRenderComponentName(id: number, name: string): void - debugPrint(msg: string): void - } - let Phys3D: any - export const native: { - worker: INativeWorker - } - export function destroy(): void - export function GET_MAIN_CANVAS(): HTMLCanvasElement - export function IS_VALID(): boolean - export { Phys3D } -} - -declare module 'XrFrame/loader/glTF/animations/channels/GLTFChannelsNode' { - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFNodesLoaded } from 'XrFrame/loader/glTF/scenes/GLTFNodesNode' - import { GLTFSamplersLoaded } from 'XrFrame/loader/glTF/animations/samplers/GLTFSamplersNode' - import GLTFChannelNode, { - GLTFChannelLoaded, - GLTFChannelNodeRaw - } from 'XrFrame/loader/glTF/animations/channels/GLTFChannelNode' - type ChildNode = GLTFChannelNode - export type GLTFChannelsNodeRaw = GLTFChannelsNodeRaw[] - export type GLTFChannelsLoaded = GLTFChannelLoaded[] - export default class GLTFChannelsNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFChannelNodeRaw): GLTFChannelNode - readonly raw: GLTFChannelsNodeRaw - get nodeName(): string - preload: ( - prerequisites: [ - nodes: GLTFNodesLoaded, - samplers: GLTFSamplersLoaded - ] - ) => Promise<GLTFChannelsLoaded> - getLoadedResource(): GLTFChannelsLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/animations/samplers/GLTFSamplersNode' { - import { GLTFAccessorsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import GLTFSamplerNode, { - GLTFSamplerLoaded, - GLTFSamplerNodeRaw - } from 'XrFrame/loader/glTF/animations/samplers/GLTFSamplerNode' - type ChildNode = GLTFSamplerNode - export type GLTFSamplersNodeRaw = GLTFSamplersNodeRaw[] - export type GLTFSamplersLoaded = GLTFSamplerLoaded[] - export default class GLTFSamplersNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFSamplerNodeRaw): GLTFSamplerNode - readonly raw: GLTFSamplersNodeRaw - get nodeName(): string - preload: ( - prerequisites: [accessors: GLTFAccessorsLoaded] - ) => Promise<GLTFSamplersLoaded> - getLoadedResource(): GLTFSamplersLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/geometry/primitives/GLTFPrimitivesNode' { - import { Kanata } from 'XrFrame/ext' - import { GLTFAccessorsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' - import { GLTFArrayNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFMaterialsLoaded } from 'XrFrame/loader/glTF/materials/GLTFMaterialsNode' - import GLTFPrimitiveNode, { - GLTFPrimitiveLoaded, - GLTFPrimitiveNodeRaw - } from 'XrFrame/loader/glTF/geometry/primitives/GLTFPrimitiveNode' - type ChildNode = GLTFPrimitiveNode - export type GLTFPrimitivesNodeRaw = GLTFPrimitivesNodeRaw[] - export type GLTFPrimitivesLoaded = GLTFPrimitiveLoaded[] - export default class GLTFPrimitivesNode extends GLTFArrayNode<ChildNode> { - ChildCtor(childRaw: GLTFPrimitiveNodeRaw): GLTFPrimitiveNode - readonly raw: GLTFPrimitivesNodeRaw - get nodeName(): string - preload: ( - prerequisites: [ - materials: GLTFMaterialsLoaded, - accessors: GLTFAccessorsLoaded, - vbMap: Map<string, [ArrayBuffer, Kanata.VertexLayout, object]> - ] - ) => Promise<GLTFPrimitivesLoaded> - getLoadedResource(): GLTFPrimitivesLoaded - } - export {} -} - -declare module 'XrFrame/loader/glTF/materials/texture/GLTFTextureInfoNode' { - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import GLTFTextureTransformInfo from 'XrFrame/loader/glTF/materials/texture/GLTFTextureTransformInfo' - export interface GLTFTextureInfoNodeRaw { - index: number - texCoord?: number - extras?: any - extensions?: any - } - export interface GLTFTextureInfoLoaded { - index: number - texCoord: number - extras?: any - transformInfo?: GLTFTextureTransformInfo - } - export default class GLTFTextureInfoNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFTextureInfoNodeRaw - build(): void - preload(): Promise<GLTFTextureInfoLoaded> - getLoadedResource(): GLTFTextureInfoLoaded - } -} - -declare module 'XrFrame/loader/glTF/materials/pbr/GLTFPBRMetallicRoughnessNode' { - import { Kanata } from 'XrFrame/ext' - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFTexturesLoaded } from 'XrFrame/loader/glTF/textures/GLTFTexturesNode' - import { GLTFTextureInfoNodeRaw } from 'XrFrame/loader/glTF/materials/texture/GLTFTextureInfoNode' - export interface GLTFPBRMetallicRoughnessNodeRaw { - baseColorFactor?: [number, number, number, number] - baseColorTexture?: GLTFTextureInfoNodeRaw - metallicFactor?: number - roughnessFactor?: number - metallicRoughnessTexture?: GLTFTextureInfoNodeRaw - extras?: any - } - export interface GLTFPBRMetallicRoughnessLoaded { - uniform: { - [key: string]: ArrayLike<number> | number | Kanata.Texture - } - renderStates: object - macros: { - [key: string]: boolean | number - } - extras?: any - } - export default class GLTFPBRMetallicRoughnessNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFPBRMetallicRoughnessNodeRaw - build(): void - preload( - prerequisites: [textrues: GLTFTexturesLoaded] - ): Promise<GLTFPBRMetallicRoughnessLoaded> - getLoadedResource(): GLTFPBRMetallicRoughnessLoaded - } -} - -declare module 'XrFrame/loader/glTF/materials/texture/GLTFNormalTextureInfoNode' { - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import GLTFTextureTransformInfo from 'XrFrame/loader/glTF/materials/texture/GLTFTextureTransformInfo' - export interface GLTFNormalTextureInfoNodeRaw { - index: number - texCoord?: number - scale?: number - extras?: any - extensions?: any - } - export interface GLTFNormalTextureInfoLoaded { - index: number - texCoord: number - scale: number - extras?: any - transformInfo?: GLTFTextureTransformInfo - } - export default class GLTFNormalTextureInfoNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFNormalTextureInfoNodeRaw - build(): void - preload(): Promise<GLTFNormalTextureInfoLoaded> - getLoadedResource(): GLTFNormalTextureInfoLoaded - } -} - -declare module 'XrFrame/loader/glTF/materials/texture/GLTFOcclusionTextureInfoNode' { - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import GLTFTextureTransformInfo from 'XrFrame/loader/glTF/materials/texture/GLTFTextureTransformInfo' - export interface GLTFOcclusionTextureInfoNodeRaw { - index: number - texCoord?: number - strength?: number - extras?: any - extensions?: any - } - export interface GLTFOcclusionTextureInfoLoaded { - index: number - texCoord: number - strength: number - extras?: any - transformInfo?: GLTFTextureTransformInfo - } - export default class GLTFOcclusionTextureInfoNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFOcclusionTextureInfoNodeRaw - build(): void - preload(): Promise<GLTFOcclusionTextureInfoLoaded> - getLoadedResource(): GLTFOcclusionTextureInfoLoaded - } -} - -declare module 'XrFrame/loader/glTF/geometry/primitives/targets/GLTFTargetsNode' { - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - export type GLTFTargetsNodeRaw = Array<{ - [targetAttribName: string]: number - }> - export interface GLTFTargetsLoaded { - attributes: { - [targetAttribName: string]: number - } - } - export const validMorphAttribs: string[] - export default class GLTFTargetsNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFTargetsNodeRaw - build(): void - preload(): Promise<GLTFTargetsLoaded> - getLoadedResource(): GLTFTargetsLoaded - } -} - -declare module 'XrFrame/kanata/lib/backend/interface/IWorker' { - /** - * IWorker.ts - * - * * @Date : 12/3/2020, 4:45:58 PM - */ - import { - IHandle, - ETextureType, - ETextureFormat, - IRect, - EMeshRenderType, - INativeMap, - ILongIntNativeMap, - IGlyphInfo, - IVertexLayoutOptions, - IView, - IRenderPassDescriptor, - IEventBridge, - IDownloader, - IUniformDescriptorOptions, - IFontSetting, - TTextureSource, - IImage, - IVertexDataDescriptorOptions, - IRenderEnv, - IEngineSettings, - EDracoDecodeType, - DracoDecoded - } from 'XrFrame/kanata/lib/backend/interface' - global { - const MAIN_CANVAS: HTMLCanvasElement - const ENGINE_SETTINGS: IEngineSettings - const ENGINE_MODE: 'Game' | 'Editor' - const IS_SUB_CONTEXT: boolean - const HOST: string - } - export interface IWorker { - createVertexLayout(options: IVertexLayoutOptions): IHandle - createVertexDataDescriptor( - options: IVertexDataDescriptorOptions - ): IHandle - createVertexBuffer( - buffer: ArrayBuffer | ArrayBufferView, - layout: IHandle - ): IHandle - updateVertexBuffer( - bufferHandle: IHandle, - buffer: ArrayBuffer | ArrayBufferView, - offset: number - ): void - createIndexBuffer( - buffer: ArrayBuffer | ArrayBufferView, - is32bits?: boolean - ): IHandle - updateIndexBuffer( - bufferHandle: IHandle, - buffer: ArrayBuffer | ArrayBufferView, - offset: number - ): void - createVertexData( - layout: IHandle, - size: number, - batchDesc: IHandle - ): IHandle - createIndexData(size: number): IHandle - createTexture( - type: ETextureType, - width: number, - height: number, - slice: number, - mips: number, - format: ETextureFormat, - flags: number, - source: TTextureSource[], - offsets: Uint32Array - ): IHandle - createAutoUpdateTextureFromCanvas(canvas: HTMLCanvasElement): IHandle - updateTexture( - handle: IHandle, - level: number, - slice: number, - xoffset: number, - yoffset: number, - zoffset: number, - width: number, - height: number, - buffer: - | ArrayBuffer - | ArrayBufferView - | IImage - | HTMLCanvasElement - | ImageData - ): void - updateTextureFlags(texture: IHandle, flags: number): void - createUniformBlockDescriptor( - descriptor: IUniformDescriptorOptions - ): IHandle - createUniformBlock(descriptor: IHandle): IHandle - createEffect( - name: string, - passCount: number, - keyIndexMap: string[], - passes: Array<{ - lightMode: string - variants?: { - [key: number]: number - } - macros?: { - [key: string]: number - } - shaders?: number[] - }>, - shaders: string[], - variants: number[][], - useRuntimeMacros: boolean - ): IHandle & { - warmUp(): void - } - createMaterial( - macros?: { - [name: string]: string | number | boolean - }, - uniformBlock?: IHandle - ): IHandle - changeMaterialMacros( - material: IHandle, - macros: { - [name: string]: string | number | boolean - }, - reset?: boolean - ): void - } - export interface IWorker { - createView(view: IView): IHandle - updateViewRect(view: IHandle, rect: IRect): void - updateViewScissor(view: IHandle, rect: IRect): void - } - export interface IWorker { - createRenderPass(descriptor: IRenderPassDescriptor): IHandle - } - export interface IWorker { - createNodePool(count: number, is3d: boolean): IHandle - createNodeTree( - length: number, - ids: ArrayBuffer, - buffer: ArrayBuffer, - calculateWordMatrix: boolean, - is3d: boolean - ): boolean - } - export interface IWorker { - createCullingComponentPool(count: number): IHandle - createRenderComponent( - meshCount: number, - uniformBlock: IHandle, - attachedNodeId: number, - cullingCompId: number, - meshRenderType: EMeshRenderType, - macros?: { - [name: string]: string | number | boolean - } - ): IHandle & { - setSharedDirty(): void - } - changeMeshMacros( - mesh: IHandle, - macros: { - [name: string]: string | number | boolean - }, - reset?: boolean - ): void - createAnimator(clipCount: number, nodeCount: number): IHandle - updateAnimators( - feObjects: Array<{ - __handle: IHandle - id: number - }>, - size: number - ): void - createAnimationClipBinding( - clipArray: Array<{ - __handle: IHandle - id: number - }>, - clipArrayOffset: number, - clipArrayLength: number, - entityArray: Array< - | number - | { - id: number - } - | null - >, - entityArrayOffset: number, - entityArrayLength: number, - useDefaultAddedNodesAction: number, - rootEntity: { - id: number - } - ): IHandle - rebindAnimationClipBinding( - binding: IHandle, - clipArray: Array<{ - __handle: IHandle - id: number - }>, - clipArrayOffset: number, - clipArrayLength: number, - entityArray: Array< - | number - | { - id: number - } - | null - >, - entityArrayOffset: number, - entityArrayLength: number, - removeAction: number, - retainedAction: number, - addedAction: number, - rootEntity: { - id: number - } - ): boolean - updateAnimationClipBinding( - binding: IHandle, - clipArray: Array<{ - __handle: IHandle - id: number - }>, - clipArrayOffset: number, - clipArrayLength: number, - entityArray: Array< - | number - | { - id: number - } - | null - >, - entityArrayOffset: number, - entityArrayLength: number, - removeAction: number, - retainedAction: number, - addedAction: number - ): boolean - writeAnimationClipBindingDefaultValues(binding: IHandle): void - createAnimatorControllerModel(layerCount: number): IHandle - setAnimatorControllerModelMaskAtIndex( - model: IHandle, - index: number, - mask: { - buffer: null | ArrayBuffer - offset: number - length: number - } - ): void - updateAnimatorControllerModel(model: IHandle): void - createAnimatorControllerStateModel(clipCount: number): IHandle - updateAnimatorControllers( // for performance - feObjects: Array<{ - __handle: IHandle - id: number - }>, - size: number - ): void - createSkinning(boneCount: number, flag: number): IHandle - updateSkinnings( - feObjects: Array<{ - __handle: IHandle - id: number - }>, - size: number - ): void - createDynamicBones(rootNodeId: number): IHandle & { - preUpdate(): void - update( - dt: number, - rootMotionX?: number, - rootMotionY?: number, - rootMotionZ?: number - ): void - rebuild(): void - resetRoot(rootId: number): void - } - } - export interface IWorker { - createRenderCamera( - attachedNodeId: number, - isUI?: boolean - ): IHandle & { - setSharedDirty(): void - updateMatrices(): void - } - createLightCamera(): IHandle - } - export interface IWorker { - createAnimationClipModel(buffer: ArrayBuffer): IHandle - createBoneInverseModel(buffer: ArrayBuffer): IHandle - createScalableList( - initSize: number, - onBackendEnlarge?: () => void - ): IHandle & { - enlarge(size: number): void - } - } - export interface IWorker { - eventBridge: IEventBridge - } - export interface IWorker { - loadTTFFont(url: string, callback: (font: string) => void): void - getGlyphInfo(fontSetting: IFontSetting, charCode: number): IGlyphInfo - } - export interface IWorker { - setGlobalPhysicSystem(system: any): void - bindRigidBodyToNode(rigidBody: any, nodeId: number): void - unbindRigidBody(rigidBody: any): void - bindCCTToNode(cc: any, nodeId: number): void - unbindCCT(cc: any): void - } - export interface IWorker { - downloader: IDownloader - update(delta: number): void - destroy(): void - refreshNodesWorldTransform(): void - getRenderEnv(): IRenderEnv - clearView(view: IHandle): void - cullCamera( - camera: IHandle, - cullResult: IHandle, - lightMode: string - ): void - drawCamera( - camera: IHandle, - renderList: IHandle, - lightMode: string - ): void - drawLight( - light: IHandle, - camera: IHandle, - renderList: IHandle, - lightMode: string - ): void - submit(): void - createWeakRef<T>(wrapper: T): { - deref: () => T - } - createWeakRefSentry(): any - createNativeUUMap(): INativeMap<number> - createNativeSUMap(): INativeMap<string> - createNativeULUMap(): ILongIntNativeMap - decodeBase64(base64: string): ArrayBuffer - initDraco?(): Promise<void> - decodeDraco( - buffer: ArrayBuffer | ArrayBufferView, - decodeType: EDracoDecodeType - ): DracoDecoded - setNodeName(id: number, name: string): void - setRenderComponentName(handle: IHandle, name: string): void - debugPrint(msg: string): void - } -} - -declare module 'XrFrame/kanata/lib/frontend/pool/Pool' { - import { IHandle } from 'XrFrame/kanata/lib/backend' - import NativeObject from 'XrFrame/kanata/lib/frontend/shared/NativeObject' - export default class Pool extends NativeObject { - u32viewExt: Uint32Array - constructor(nativeObj: IHandle) - supplyExtendedMemory(buffer: ArrayBuffer): void - } -} - -declare module 'XrFrame/loader/glTF/animations/channels/GLTFChannelNode' { - import { StreamReader } from 'XrFrame/core/utils' - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - import { GLTFNodesLoaded } from 'XrFrame/loader/glTF/scenes/GLTFNodesNode' - import { GLTF } from 'XrFrame/loader/glTF/utils/types' - import { GLTFSamplerLoaded } from 'XrFrame/loader/glTF/animations/samplers/GLTFSamplerNode' - import { GLTFSamplersLoaded } from 'XrFrame/loader/glTF/animations/samplers/GLTFSamplersNode' - import { - GLTFTargetLoaded, - GLTFTargetNodeRaw - } from 'XrFrame/loader/glTF/animations/channels/GLTFTargetNode' - export enum EnumPuppetAnimationSampleGroupType { - tx = 1, - ty = 2, - tz = 3, - sx = 4, - sy = 5, - sz = 6, - qx = 7, - qy = 8, - qz = 9, - qw = 10, - ex = 11, - ey = 12, - ez = 13 - } - /** - * 二进制格式, byteLength = 12 + 16 * samples.len - * | Array<| nodeid | type | count |> | - * | Array<PuppetAnimationClipSample> | - */ - export type PuppetAnimationSampleGroup = ArrayBuffer | GLTF.BufferView - /** - * 二进制格式, byteLength = 16 - * uint32_t index; - * float value; - * float in_tangent; - * float out_tangent; - * - * @remind out_tangent的值决定了插值的类型!很hack! - * out_tangent = Infinity: STEP - * out_tangent = NaN: Spherical Linear Interpolation (for quaternion) - * out_tangent为正常值: Cubic Spline Interpolation (or Linear) - */ - export type PuppetAnimationClipSample = ArrayBuffer | GLTF.BufferView - export interface GLTFChannelNodeRaw { - sampler: number - target: GLTFTargetNodeRaw - extras?: any - } - export interface GLTFChannelLoaded { - sampler: GLTFSamplerLoaded - target: GLTFTargetLoaded - vectorGroups: number - headerBytesNeeded: number - bodyBytesNeeded: number - serializeHeaderOnBuffer( - stream: StreamReader, - channelIndex: number - ): void - serializeBodyOnBuffer(stream: StreamReader): number - extraMorphNodeCount: number - extras?: any - } - export default class GLTFChannelNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFChannelNodeRaw - build(): void - preload( - prerequisites: [ - nodes: GLTFNodesLoaded, - samplers: GLTFSamplersLoaded - ] - ): Promise<GLTFChannelLoaded> - getLoadedResource(): GLTFChannelLoaded - } -} - -declare module 'XrFrame/loader/glTF/animations/samplers/GLTFSamplerNode' { - import { GLTFAccessorLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorNode' - import { GLTFAccessorsLoaded } from 'XrFrame/loader/glTF/buffers/GLTFAccessorsNode' - import { GLTFBaseNode } from 'XrFrame/loader/glTF/GLTFBaseNode' - export enum EnumGLTFSamplerInterpolation { - STEP = 0, - LINEAR = 1, - CUBICSPLINE = 2 - } - export interface GLTFSamplerNodeRaw { - input: number - output: number - interpolation?: 'STEP' | 'LINEAR' | 'CUBICSPLINE' - extras?: any - } - export interface GLTFSamplerLoaded { - input: GLTFAccessorLoaded - output: GLTFAccessorLoaded - interpolation: EnumGLTFSamplerInterpolation - sampleCount: number - extras?: any - } - export default class GLTFSamplerNode extends GLTFBaseNode { - get nodeName(): string - readonly raw: GLTFSamplerNodeRaw - build(): void - preload( - prerequisites: [accessors: GLTFAccessorsLoaded] - ): Promise<GLTFSamplerLoaded> - getLoadedResource(): GLTFSamplerLoaded - } -} - -declare module 'XrFrame/loader/glTF/materials/texture/GLTFTextureTransformInfo' { - import Vector2 from 'XrFrame/math/vector2' - export interface ITransformInfo { - offset?: number[] - rotation?: number - scale?: number[] - } - export default class GLTFTextureTransformInfo { - offset: Vector2 - rotation: number - scale: Vector2 - get uvMatrixArray(): number[] - constructor(textureTransform: ITransformInfo) - /** - * 设置UV变化矩阵,列主序 - * - * @param {number} tx x轴偏移 - * @param {number} ty y轴偏移 - * @param {number} sx x轴缩放 - * @param {number} sy y轴缩放 - * @param {number} rotation 旋转 - */ - setUvTransform( - tx: number, - ty: number, - sx: number, - sy: number, - rotation: number - ): void - /** - * 更新UV矩阵 - * - * @memberof GLTFTextureTransformInfo - */ - updateUVMatrixArray(): void - } -} - -declare module 'XrFrame/core/utils' { - export function assert(pred: boolean, msg: string): void - export function decode(data: ArrayBuffer, format: 'utf-8' | 'gbk'): string - export function wxPromiseWrapper<T = any>( - executor: any, - args: any - ): Promise<T> - export class StreamReader { - constructor(buffer: ArrayBuffer, byteOffset?: number) - get size(): number - read<T>(type: StreamReader.Type): T - write<T>(type: StreamReader.Type, value: T): void - /** - * 跳过一个位置,以后再填写。 - */ - reserve<T>(type: StreamReader.Type): { - write(value: T): void - } - readChunk(length: number): ArrayBuffer - align(alignment: number): void - end(): boolean - pos(): number - } - export namespace StreamReader { - enum Type { - Float = 0, - UInt32 = 1, - UInt16 = 2 - } - const TypeAlignment: { - 0: number - 1: number - 2: number - } - const TypeSize: { - 0: number - 1: number - 2: number - } - } -}

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 z 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%0Aml0)LTY-k0!l)Qiw`za#$V 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 Gm;VQ10u3hs literal 0 HcmV?d00001 diff --git a/src/images/my-list-icon1.png b/src/images/my-list-icon1.png new file mode 100644 index 0000000000000000000000000000000000000000..0a668f1a376b28c11096db2333849be85d30f486 GIT binary patch literal 1138 zcmV-&1daQNP)Px(EJ;K`R9Hvtn15(nRTRg+_q{aj+O>wf7Z-8j1}k(hL_u(_-DqF~Weur6Hbn3b z{}{_a9fH$;HmFShaBe7WNQVXeOPEfyB!x)}t=dli5Tr10=*9}$aB^=-XaZ_pUXQ%@ zmNd=Mn~&IwOd}m zy#Wt>v>A`=_yNJzEz2N?^5%EOETv1M@Xs7FcXr~?i+{R>_5{o>d^=7Z8~2uj6Gi}b z2Ju~2&EHa!J&;8czaIrjh`}P11 z9~^T7?Ox&0sTAZED{qMnBfjfMU4ZoEvjDwf+UQyuiGEiqdjS4E2U)gqR4;TR5xZ6w zICZ%PjD9Vj9?!-)S5M)gQ&BwL`-i12OYqiVo*h~V1$|G=aMcW2X z;TqWVyG&(s2cCnboxwA)Idk4jgO;NJk^l>szZLZf4DQ+IMqN(|n*qlrqbN#0LJrs~ z&3bVTzs&CT(oc9(*nl?riN_xO6tcWjqHD=VNaL@ zLLmUg$B&UUh7(7&6jl`F2}n|s!MtdyP6F7l6|}gR)^+{EY&JXF$i5M9o1&^8Fvgbd zWQ{y}m?xs)j1aE__(kuZN8PR(}h@U-(c+b*sIJ{Gmq_@D>V0n`0v=HK$ZQzcMj_8K=_8S1& z%tb^)LWsBh1g-X^L?R~{Ur*#z)u;@pKK;<$+xPilVGgh zga(dhIDfY~ZcX6Ig$#IsbADkpfE7haFi9#k`qP5*-L`<0NaO|s%pR8k-JJ9KS9qVE zrmL%KTd=j&y7vLs1n1q3fs2~9HJi;^H;5*WP$;w|(9&Y;9U~>?GMsN+2li9+b%p&@ zvzD*_r^1W6{?PpVyr;kU?Y^0CIJ{Ys<(tk=iBcayG$Dj={ilar&`LX1RmZ{DUIO09 zaDKwpv1S-`c6O?{T+WxS%qe)i*p2#Or?HxDzvh7d1=a+oJjuQ<0ssI207*qoM6N<$ Eg7k$f)c^nh literal 0 HcmV?d00001 diff --git a/src/images/my-list-icon2.png b/src/images/my-list-icon2.png new file mode 100644 index 0000000000000000000000000000000000000000..3bac174d3cc0b30d730d4ac49b52859994ee4743 GIT binary patch literal 1524 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

k<8s{>|3sSD#d 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