@shijiu/jsview-vue 2.2.35 → 2.2.201

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/bin/browser/BrowserApic.vue.mjs +4 -3
  2. package/bin/browser/BrowserApic2.vue.mjs +4 -3
  3. package/bin/browser/BrowserApicLib.mjs +10 -3
  4. package/bin/browser/BrowserJsvFragShaderView.vue.mjs +63 -0
  5. package/bin/browser/BrowserQrcode.vue.mjs +3 -1
  6. package/bin/browser/BrowserTextureAnim.vue.mjs +7 -6
  7. package/bin/jsview-vue.mjs +2990 -1146
  8. package/bin/types/JsViewEngineWidget/JsvFocus/JsvFocusManager.d.ts +8 -6
  9. package/bin/types/JsViewEngineWidget/MetroWidget/Dispatcher.d.ts +10 -12
  10. package/bin/types/JsViewEngineWidget/MetroWidget/ListWidget.vue.d.ts +3 -3
  11. package/bin/types/JsViewEngineWidget/MetroWidget/MetroWidget.vue.d.ts +3 -3
  12. package/bin/types/JsViewEngineWidget/MetroWidget/MetroWidgetSetup.d.ts +2 -2
  13. package/bin/types/JsViewEngineWidget/MetroWidget/RenderItem.d.ts +3 -0
  14. package/bin/types/JsViewEngineWidget/MetroWidget/Slide.d.ts +21 -0
  15. package/bin/types/JsViewEngineWidget/TemplateParser/ListMetroTemplate.d.ts +1 -0
  16. package/bin/types/JsViewEngineWidget/TemplateParser/MetroTemplate.d.ts +2 -8
  17. package/bin/types/JsViewEngineWidget/TemplateParser/TemplateItemAdder.d.ts +1 -1
  18. package/bin/types/JsViewEngineWidget/WidgetCommon.d.ts +9 -3
  19. package/bin/types/JsViewEngineWidget/index.d.ts +10 -1
  20. package/bin/types/JsViewVueTools/ConstSymbol.d.ts +2 -0
  21. package/bin/types/JsViewVueTools/ForgeConstDefine.d.ts +11 -0
  22. package/bin/types/JsViewVueTools/JsvFederationTools.d.ts +16 -0
  23. package/bin/types/JsViewVueTools/JsvPerformance.d.ts +5 -0
  24. package/bin/types/JsViewVueTools/JsvPreDownloader.d.ts +33 -0
  25. package/bin/types/JsViewVueTools/JsvRuntimeBridge.d.ts +113 -57
  26. package/bin/types/JsViewVueTools/JsvTextureStore/CapturedTexture/CapturedTexture.d.ts +11 -0
  27. package/bin/types/JsViewVueTools/JsvTextureStore/JsvTextureStore.d.ts +45 -1
  28. package/bin/types/JsViewVueTools/JsvTextureStore/Texture.d.ts +8 -0
  29. package/bin/types/JsViewVueTools/index.d.ts +19 -11
  30. package/bin/types/JsViewVueWidget/JsvApic/JsvApic/BrowserApic.vue.d.ts +1 -1
  31. package/bin/types/JsViewVueWidget/JsvApic/JsvApic/JsvApic.vue.d.ts +1 -1
  32. package/bin/types/JsViewVueWidget/JsvApic/JsvApic2/BrowserApic2.vue.d.ts +1 -1
  33. package/bin/types/JsViewVueWidget/JsvApic/JsvApic2/JsvApic2.vue.d.ts +1 -1
  34. package/bin/types/JsViewVueWidget/JsvApic/JsvBrowserApicLib/Viewer.d.ts +2 -1
  35. package/bin/types/JsViewVueWidget/JsvClipDiv/JsvClipDiv.vue.d.ts +70 -0
  36. package/bin/types/JsViewVueWidget/JsvClipDiv/index.d.ts +1 -0
  37. package/bin/types/JsViewVueWidget/JsvConnectLine/JsvConnectLine.vue.d.ts +1 -1
  38. package/bin/types/JsViewVueWidget/JsvDriftScope/JsvDriftScope.vue.d.ts +104 -0
  39. package/bin/types/JsViewVueWidget/JsvDriftScope/index.d.ts +1 -0
  40. package/bin/types/JsViewVueWidget/JsvFragShaderView/BrowserJsvFragShaderView.vue.d.ts +13 -0
  41. package/bin/types/JsViewVueWidget/JsvFragShaderView/JsvFragShaderView.vue.d.ts +13 -0
  42. package/bin/types/JsViewVueWidget/JsvFragShaderView/index.d.ts +2 -0
  43. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ActionRefObject.d.ts +4 -0
  44. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ActorControl.d.ts +91 -0
  45. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ActorState.d.ts +6 -0
  46. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/CallbackManager.d.ts +11 -0
  47. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ForgeTypeDefine.d.ts +15 -0
  48. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/FreeMoveActor.vue.d.ts +6 -0
  49. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SetAction.d.ts +71 -0
  50. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SetCondition.d.ts +97 -0
  51. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SetState.d.ts +62 -0
  52. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SyncLinkManager.d.ts +18 -0
  53. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/index.d.ts +4 -1
  54. package/bin/types/JsViewVueWidget/JsvLine/JsvLine.vue.d.ts +1 -1
  55. package/bin/types/JsViewVueWidget/JsvNativeSharedDiv.vue.d.ts +66 -28
  56. package/bin/types/JsViewVueWidget/JsvNinePatch.vue.d.ts +2 -0
  57. package/bin/types/JsViewVueWidget/JsvScrollBox/JsvScrollBox.vue.d.ts +236 -0
  58. package/bin/types/JsViewVueWidget/JsvScrollBox/JsvScrollFollow.vue.d.ts +153 -0
  59. package/bin/types/JsViewVueWidget/JsvScrollBox/ScrollInnerSymbol.d.ts +4 -0
  60. package/bin/types/JsViewVueWidget/JsvScrollBox/ScrollSymbol.d.ts +12 -0
  61. package/bin/types/JsViewVueWidget/JsvScrollBox/index.d.ts +3 -0
  62. package/bin/types/JsViewVueWidget/JsvTextBox.vue.d.ts +3 -3
  63. package/bin/types/JsViewVueWidget/index.d.ts +4 -0
  64. package/package.json +1 -1
  65. package/tools/config/rollup.config.mjs +1 -0
  66. package/utils/JsViewEngineWidget/JsvFocus/{JsvFocusManager.js → JsvFocusManager.ts} +12 -12
  67. package/utils/JsViewEngineWidget/MetroWidget/Dispatcher.ts +20 -0
  68. package/utils/JsViewEngineWidget/MetroWidget/ListWidget.vue +27 -10
  69. package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +52 -11
  70. package/utils/JsViewEngineWidget/MetroWidget/MetroWidgetSetup.js +686 -480
  71. package/utils/JsViewEngineWidget/MetroWidget/RenderItem.ts +13 -1
  72. package/utils/JsViewEngineWidget/MetroWidget/Slide.ts +56 -0
  73. package/utils/JsViewEngineWidget/MetroWidget/TaskManager.ts +59 -10
  74. package/utils/JsViewEngineWidget/MetroWidget/TokenGenerator.ts +10 -0
  75. package/utils/JsViewEngineWidget/TemplateParser/CommonMetroTemplate.ts +20 -10
  76. package/utils/JsViewEngineWidget/TemplateParser/ListMetroTemplate.ts +27 -3
  77. package/utils/JsViewEngineWidget/TemplateParser/MetroTemplate.ts +25 -35
  78. package/utils/JsViewEngineWidget/TemplateParser/TemplateItemAdder.ts +7 -0
  79. package/utils/JsViewEngineWidget/WidgetCommon.ts +20 -7
  80. package/utils/JsViewEngineWidget/{index.js → index.ts} +1 -1
  81. package/utils/JsViewPlugin/JsvAudio/AudioProxy.js +21 -2
  82. package/utils/JsViewPlugin/JsvPlayer/BrowserJsvPlayer.vue +13 -1
  83. package/utils/JsViewPlugin/JsvPlayer/JsvPlayer.vue +470 -338
  84. package/utils/JsViewVueTools/ConstSymbol.ts +3 -0
  85. package/utils/JsViewVueTools/ForgeConstDefine.ts +11 -0
  86. package/utils/JsViewVueTools/JsvPreDownloader.ts +3 -3
  87. package/utils/JsViewVueTools/JsvRuntimeBridge.js +172 -50
  88. package/utils/JsViewVueTools/JsvTextureStore/CapturedTexture/CapturedTexture.ts +62 -0
  89. package/utils/JsViewVueTools/JsvTextureStore/JsvTextureStore.ts +42 -8
  90. package/utils/JsViewVueTools/JsvTextureStore/Texture.ts +15 -1
  91. package/utils/JsViewVueTools/index.js +19 -17
  92. package/utils/JsViewVueWidget/JsvApic/JsvApic/BrowserApic.vue +8 -8
  93. package/utils/JsViewVueWidget/JsvApic/JsvApic/JsvApic.vue +3 -3
  94. package/utils/JsViewVueWidget/JsvApic/JsvApic2/BrowserApic2.vue +7 -8
  95. package/utils/JsViewVueWidget/JsvApic/JsvApic2/JsvApic2.vue +3 -3
  96. package/utils/JsViewVueWidget/JsvApic/JsvBrowserApicLib/ApicDataBase.js +5 -1
  97. package/utils/JsViewVueWidget/JsvApic/JsvBrowserApicLib/Viewer.js +8 -3
  98. package/utils/JsViewVueWidget/JsvClipDiv/JsvClipDiv.vue +42 -0
  99. package/utils/JsViewVueWidget/JsvClipDiv/index.ts +1 -0
  100. package/utils/JsViewVueWidget/JsvConnectLine/JsvConnectLine.vue +5 -1
  101. package/utils/JsViewVueWidget/JsvDriftScope/JsvDriftScope.vue +82 -0
  102. package/utils/JsViewVueWidget/JsvDriftScope/index.ts +1 -0
  103. package/utils/JsViewVueWidget/JsvFragShaderView/BrowserJsvFragShaderView.vue +48 -0
  104. package/utils/JsViewVueWidget/JsvFragShaderView/JsvFragShaderView.vue +145 -0
  105. package/utils/JsViewVueWidget/JsvFragShaderView/index.js +18 -0
  106. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActionRefObject.ts +1 -1
  107. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorControl.ts +156 -55
  108. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorState.ts +4 -4
  109. package/utils/JsViewVueWidget/JsvFreeMoveActor/CallbackManager.ts +6 -6
  110. package/utils/JsViewVueWidget/JsvFreeMoveActor/ForgeTypeDefine.ts +1 -1
  111. package/utils/JsViewVueWidget/JsvFreeMoveActor/FreeMoveActor.vue +43 -9
  112. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetAction.ts +33 -0
  113. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetCondition.ts +69 -8
  114. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetState.ts +60 -0
  115. package/utils/JsViewVueWidget/JsvFreeMoveActor/SyncLinkManager.ts +120 -0
  116. package/utils/JsViewVueWidget/JsvFreeMoveActor/index.js +7 -0
  117. package/utils/JsViewVueWidget/JsvMaskClipDiv.vue +6 -1
  118. package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +121 -68
  119. package/utils/JsViewVueWidget/JsvNinePatch.vue +17 -2
  120. package/utils/JsViewVueWidget/JsvPosterImage.vue +22 -9
  121. package/utils/JsViewVueWidget/JsvQrcode/BrowserQrcode.vue +6 -2
  122. package/utils/JsViewVueWidget/JsvScrollBox/JsvScrollBox.vue +518 -0
  123. package/utils/JsViewVueWidget/JsvScrollBox/JsvScrollFollow.vue +468 -0
  124. package/utils/JsViewVueWidget/JsvScrollBox/ScrollInnerSymbol.ts +9 -0
  125. package/utils/JsViewVueWidget/JsvScrollBox/ScrollSymbol.ts +24 -0
  126. package/utils/JsViewVueWidget/JsvScrollBox/index.ts +3 -0
  127. package/utils/JsViewVueWidget/JsvTextBox.vue +12 -4
  128. package/utils/JsViewVueWidget/JsvTextureAnim/BrowserTextureAnim.vue +9 -6
  129. package/utils/JsViewVueWidget/JsvTextureAnim/JsvTextureAnim.vue +2 -0
  130. package/utils/JsViewVueWidget/index.js +4 -0
  131. package/utils/JsViewEngineWidget/MetroWidget/Dispatcher.js +0 -19
@@ -0,0 +1,518 @@
1
+ <!--
2
+ * 【模块 export 内容】
3
+ * JsvScrollBox:Vue高阶组件,支持触控拖动的滚动型组件。
4
+ * props说明:
5
+ * style {Object} (必填,响应式) 其中的width/height为必填项目, 决定scroll固定的底座的尺寸
6
+ * sliderSize {Object} (必填,响应式) 滑动区域的尺寸,滑块的尺寸在非滑动方向不能大于组件尺寸
7
+ * {
8
+ * width {number}, 当VERTICAL滑动模式时为选填,HORIZONTAL为必填
9
+ * height {number}, 当HORIZONTAL滑动模式时为选填,VERTICAL为必填
10
+ * }
11
+ * mode {ScrollBoxStyle.DrawerMode/ScrollBoxStyle.PinMode}
12
+ * 选填, 非响应式, 默认为 PinMode
13
+ * 运动模式选择, DrawerMode: 抽屉模式,内容尺寸大于固定底座
14
+ * PinMode: 滚动杆模式,内容尺寸小于固定底座
15
+ * direction {import VERTICAL/HORIZONTAL} (必填,非响应式) 滑动方向
16
+ * enableFling {boolean} (选填,非响应式) 是否需要支持fling,默认为false
17
+ * initPercent {Number} (选填,非响应式) 滑块起始位置,等同于mount后进行updatePercent()
18
+ * linkName {String} (选填,非响应式) 本滑动模块的名字,用于全局进行syncWith处理的关联名
19
+ * 注意: 如果不需要共享进度,不要声明,可以节省一些构造性能
20
+ * syncWith {String} (选填,响应式) 进度联动组件来源,内容为联动来源的linkName
21
+ * syncType {ScrollBoxStyle.SyncForward|ScrollType.SyncReverse}
22
+ * (选填,响应式) 决定syncWith的联动模式,当syncWith设置后才能生效
23
+ * SyncForward(默认值): 同进同退, mySelf = sourcePercent
24
+ * SyncReverse: 进退反向, mySelf = (1 - sourcePercent)
25
+ *
26
+ * template说明:
27
+ * FixedBox={boxWidth, boxHeight}: 以本组件底座左上角0,0对齐的一个slot
28
+ * SliderBox={boxWidth, boxHeight}: 以滑块div的左上角0,0对齐的一个slot,
29
+ *
30
+ * expose函数说明:
31
+ * setSensor(sensitivity:number, callback:Function<percent:number, x:number, y:number>) 设置运动后触发的回调
32
+ * sensitivity为回调敏感度, 每移动多少像素进行回调,适当放大(推荐10以上)可以极大减小对js回调过多引起的性能降低
33
+ * updatePercent(percent:number) 设置滚动调位置(百分比),百分比 = (SliderTop - 底座Top) / Slider可滑动总区域
34
+ * Slider可滑动总区域 = 底座Height - SliderHeight
35
+ * 当为横向运动时,Top被Left代换,Height被Width代换
36
+ *
37
+ -->
38
+
39
+ <template>
40
+ <div
41
+ :style="{
42
+ top: rProps.style?.top,
43
+ left: rProps.style?.left,
44
+ }"
45
+ >
46
+ <div
47
+ ref="rFixedViewRef"
48
+ :style="{
49
+ width: rFixedBoxWidth,
50
+ height: rFixedBoxHeight,
51
+ }"
52
+ >
53
+ <slot
54
+ name="FixedBox"
55
+ :boxWidth="rFixedBoxWidth"
56
+ :boxHeight="rFixedBoxHeight"
57
+ />
58
+ <div
59
+ ref="rSliderViewRef"
60
+ :style="{
61
+ width: rSliderWidth,
62
+ height: rSliderHeight,
63
+ }"
64
+ >
65
+ <slot
66
+ name="SliderBox"
67
+ :boxWidth="rSliderWidth"
68
+ :boxHeight="rSliderHeight"
69
+ />
70
+ </div>
71
+ </div>
72
+ </div>
73
+ </template>
74
+
75
+ <script setup lang="ts">
76
+ import {
77
+ shallowRef,
78
+ watchEffect,
79
+ onMounted,
80
+ onUnmounted,
81
+ defineExpose,
82
+ defineProps,
83
+ } from "vue";
84
+ import ActControl from "../../JsViewVueWidget/JsvFreeMoveActor/ActorControl";
85
+ import { VERTICAL, HORIZONTAL } from "../../JsViewVueTools/ConstSymbol";
86
+ import { ScrollBoxStyle } from "./ScrollSymbol";
87
+ import { ScrollInnerStyle } from "./ScrollInnerSymbol";
88
+ import { ForgeConst } from "../../JsViewVueTools/ForgeConstDefine";
89
+ import {
90
+ GetSyncLinkManager,
91
+ SyncLinkSource,
92
+ } from "../../JsViewVueWidget/JsvFreeMoveActor/SyncLinkManager";
93
+ import { newNexus, NexusNode } from "../JsvFreeMoveActor/NexusNode";
94
+
95
+ let rProps = defineProps({
96
+ // 底座的尺寸
97
+ style: {
98
+ type: Object,
99
+ require: true,
100
+ },
101
+
102
+ // 滑动允许方向(VERTICAL / HORIZONTAL)
103
+ direction: {
104
+ type: Symbol,
105
+ require: true,
106
+ },
107
+
108
+ // 滑块的尺寸,垂直于direction的轴不用设置
109
+ sliderSize: {
110
+ type: Object, // {width, height}
111
+ require: true,
112
+ },
113
+
114
+ // 滑块模式
115
+ // ScrollBoxStyle.PinMode: 滑块小于底座
116
+ // ScrollBoxStyle.DrawerMode: 滑块大于底座
117
+ mode: {
118
+ type: Symbol,
119
+ default: ScrollBoxStyle.PinMode,
120
+ },
121
+
122
+ // 初始进度条的进度
123
+ initPercent: {
124
+ type: Number,
125
+ default: 0,
126
+ },
127
+
128
+ enableFling: {
129
+ type: Boolean,
130
+ default: false,
131
+ },
132
+
133
+ linkName: {
134
+ type: String,
135
+ default: null,
136
+ },
137
+
138
+ syncWith: {
139
+ type: String,
140
+ default: null,
141
+ },
142
+
143
+ syncType: {
144
+ type: Symbol,
145
+ default: ScrollBoxStyle.SyncForward,
146
+ },
147
+ });
148
+
149
+ /** 本地常量 **/
150
+ const cDirection = rProps.direction;
151
+ const cMode = rProps.mode;
152
+ const cInitPercent = rProps.initPercent;
153
+ const cEnableFling = rProps.enableFling;
154
+ const cSliderActor = new ActControl();
155
+ const cFixedBoxActor =
156
+ cMode == ScrollBoxStyle.PinMode ? new ActControl() : null;
157
+ const cLinkName = rProps.linkName;
158
+ const cSyncLinkManager = GetSyncLinkManager();
159
+
160
+ // Actor condition group id(1~9可任意用)
161
+ const cWallConditionGroup = 1;
162
+ const cSensorConditionGroup = 2;
163
+ const cLinkConditionGroup = 3;
164
+ const cLinkMasterGroup = 4;
165
+
166
+ /** 本地非响应式变量 **/
167
+ let vMounted: boolean = false;
168
+ let vHorizontalGap: number = 0;
169
+ let vVerticalGap: number = 0;
170
+ let vLinkProvide: SyncLinkSource | null = null; // 是否对外提供同步进度影响
171
+ let vWaitMasterLinkSourceReady: Promise<void> | null = null;
172
+ let vSyncWithNameCache: String | null = null; // 当前关联的SyncLinkSource的名称
173
+ let vSyncTypeCache: Symbol = ScrollBoxStyle.SyncForward;
174
+ let vSyncLinkNexusNode: NexusNode | null = null;
175
+ let vCurrentPercent: number = 0;
176
+
177
+ /** 本地响应式变量 **/
178
+ let rFixedBoxWidth = shallowRef(NaN);
179
+ let rFixedBoxHeight = shallowRef(NaN);
180
+ let rFixedViewRef = shallowRef(null);
181
+ let rSliderWidth = shallowRef(NaN);
182
+ let rSliderHeight = shallowRef(NaN);
183
+ let rSliderViewRef = shallowRef(null);
184
+
185
+ // 记录slider的活动范围
186
+ let rSliderEdgeBox = {
187
+ top: 0,
188
+ bottom: 0,
189
+ left: 0,
190
+ right: 0,
191
+ };
192
+
193
+ watchEffect(() => {
194
+ let fixedBoxSize = {
195
+ width: rProps.style!.width,
196
+ height: rProps.style!.height,
197
+ }; // 从响应式props中复制值
198
+
199
+ let sliderSize = {
200
+ width: rProps.sliderSize!.width,
201
+ height: rProps.sliderSize!.height,
202
+ }; // 从响应式props中复制值
203
+
204
+ // 补正slider另一个不需要设置的边
205
+ if (cDirection == VERTICAL) {
206
+ sliderSize.width = fixedBoxSize.width;
207
+ } else {
208
+ sliderSize.height = fixedBoxSize.height;
209
+ }
210
+
211
+ // 合理性校验
212
+ if (
213
+ cMode == ScrollBoxStyle.PinMode &&
214
+ (sliderSize.height > fixedBoxSize.height ||
215
+ sliderSize.width > fixedBoxSize.width)
216
+ ) {
217
+ // PinMode检测错误,滑块大于了底座
218
+ console.error(
219
+ `slider oversize in pin-mode bw=${fixedBoxSize.width} bh=${fixedBoxSize.height} sw=${sliderSize.width} sh=${sliderSize.height}`
220
+ );
221
+ return;
222
+ } else if (
223
+ cMode == ScrollBoxStyle.DrawerMode &&
224
+ (sliderSize.height < fixedBoxSize.height ||
225
+ sliderSize.width < fixedBoxSize.width)
226
+ ) {
227
+ console.error(
228
+ `box oversize in drawer-mode bw=${fixedBoxSize.width} bh=${fixedBoxSize.height} sw=${sliderSize.width} sh=${sliderSize.height}`
229
+ );
230
+ return;
231
+ }
232
+
233
+ // 变更检查,尽量减少触发template的响应式
234
+ if (
235
+ sliderSize.width != rSliderWidth.value ||
236
+ sliderSize.height != rSliderHeight.value ||
237
+ fixedBoxSize.width != rFixedBoxWidth.value ||
238
+ fixedBoxSize.height != rFixedBoxHeight.value
239
+ ) {
240
+ // 更新template
241
+ rSliderWidth.value = sliderSize.width;
242
+ rSliderHeight.value = sliderSize.height;
243
+ rFixedBoxWidth.value = fixedBoxSize.width;
244
+ rFixedBoxHeight.value = fixedBoxSize.height;
245
+ rebuildSliderSet();
246
+ }
247
+
248
+ // 在 rebuildSliderSet 之后,确认syncWith是否变化,变化则重建参照的SyncLinkSource
249
+ if (
250
+ vSyncWithNameCache != rProps.syncWith ||
251
+ vSyncTypeCache != rProps.syncType
252
+ ) {
253
+ vSyncWithNameCache = rProps.syncWith;
254
+ vSyncTypeCache = rProps.syncType;
255
+ changeSyncLink(vSyncWithNameCache);
256
+ }
257
+ });
258
+
259
+ function changeSyncLink(newSyncSourceName: String) {
260
+ // 清理原Link nexusNode
261
+ vSyncLinkNexusNode = null;
262
+ rebuildAckSync();
263
+
264
+ if (newSyncSourceName != null) {
265
+ // 创建新Source的Ready promise, 在确认目标节点存在后再获取NexusNode来创建condition
266
+ // 注意此Promise要在unMounted时通过UnListen进行反注册,才能规避内存泄漏
267
+ vWaitMasterLinkSourceReady = cSyncLinkManager
268
+ .WaitSourceMounted(newSyncSourceName)
269
+ .then(() => {
270
+ // 获取Link nexusNode。此引用不用专门释放,没有内存泄漏问题
271
+ vSyncLinkNexusNode =
272
+ cSyncLinkManager.GetSourceNexusNode(newSyncSourceName);
273
+ rebuildAckSync();
274
+ });
275
+ }
276
+ }
277
+
278
+ function rebuildAckSync() {
279
+ if (!vMounted) return;
280
+
281
+ // 清理老设定
282
+ cSliderActor.run((cmds) => {
283
+ return [cmds.state().removeConditionByGroup(cLinkConditionGroup)];
284
+ });
285
+
286
+ if (vSyncLinkNexusNode != null) {
287
+ // 创建运动跟随的condition
288
+ cSliderActor.run((cmds) => {
289
+ return [
290
+ cmds
291
+ .condition(cLinkConditionGroup, true)
292
+ .movementSync(vSyncLinkNexusNode!)
293
+ .then([
294
+ cmds
295
+ .action()
296
+ .ackMovementSync(
297
+ 0,
298
+ vHorizontalGap,
299
+ 0,
300
+ vVerticalGap,
301
+ 0b11,
302
+ vSyncTypeCache == ScrollBoxStyle.SyncForward ? 1 : 2
303
+ ),
304
+ ]),
305
+ ];
306
+ });
307
+ }
308
+ }
309
+
310
+ function rebuildSyncMaster() {
311
+ if (vLinkProvide != null) {
312
+ // 创建移动信息的发生器
313
+ cSliderActor.run((cmds) => {
314
+ return [
315
+ cmds.state().removeConditionByGroup(cLinkMasterGroup),
316
+ cmds
317
+ .state()
318
+ .startMovementSync(
319
+ vLinkProvide!.nexusNode,
320
+ 0,
321
+ vHorizontalGap,
322
+ 0,
323
+ vVerticalGap,
324
+ 0b11
325
+ ),
326
+ // 触发跟随节点记录进度
327
+ cmds
328
+ .condition(cLinkMasterGroup, true)
329
+ .onFlingEnd()
330
+ .then([
331
+ cmds
332
+ .state()
333
+ .fireNexusEvent(
334
+ vLinkProvide!.nexusNode,
335
+ ScrollInnerStyle.UpdatePercentNexusCode
336
+ ),
337
+ ]),
338
+ // 触发跟随节点记录进度
339
+ cmds
340
+ .condition(cLinkMasterGroup, true)
341
+ .onDragEnd()
342
+ .then([
343
+ cmds
344
+ .state()
345
+ .fireNexusEvent(
346
+ vLinkProvide!.nexusNode,
347
+ ScrollInnerStyle.UpdatePercentNexusCode
348
+ ),
349
+ ]),
350
+ ];
351
+ });
352
+ }
353
+ }
354
+
355
+ function rebuildSliderSet() {
356
+ // 计算slider的活动区域
357
+ // 运动区域无论正负都通用的算法
358
+ vHorizontalGap = rFixedBoxWidth.value - rSliderWidth.value;
359
+ vVerticalGap = rFixedBoxHeight.value - rSliderHeight.value;
360
+
361
+ // 更新slider的活动范围
362
+ rSliderEdgeBox.left = vHorizontalGap > 0 ? 0 : vHorizontalGap;
363
+ rSliderEdgeBox.top = vVerticalGap > 0 ? 0 : vVerticalGap;
364
+ rSliderEdgeBox.right = vHorizontalGap < 0 ? 0 : vHorizontalGap;
365
+ rSliderEdgeBox.bottom = vVerticalGap < 0 ? 0 : vVerticalGap;
366
+
367
+ if (vMounted) {
368
+ // 设置Actor的活动边界
369
+ cSliderActor.run((cmds) => [
370
+ cmds.state().removeConditionByGroup(cWallConditionGroup),
371
+ cmds
372
+ .condition(cWallConditionGroup, true)
373
+ .boxPosition(
374
+ rSliderEdgeBox.left,
375
+ rSliderEdgeBox.top,
376
+ rSliderEdgeBox.right,
377
+ rSliderEdgeBox.bottom
378
+ )!
379
+ .then([cmds.action().stopMoving(true)]),
380
+ // 跟进抬起时进度信息
381
+ cmds
382
+ .condition(cWallConditionGroup, true)
383
+ .onFlingEnd()
384
+ .then([
385
+ (pointInfo: any) => {
386
+ vCurrentPercent = positionToPercent(pointInfo);
387
+ },
388
+ ]),
389
+ // 跟进fling结束时的进度信息
390
+ cmds
391
+ .condition(cWallConditionGroup, true)
392
+ .onDragEnd()
393
+ .then([
394
+ (pointInfo: any) => {
395
+ vCurrentPercent = positionToPercent(pointInfo);
396
+ },
397
+ ]),
398
+ ]);
399
+
400
+ // 尺寸变化时,重建Sync同步的信息
401
+ rebuildSyncMaster();
402
+ rebuildAckSync();
403
+ }
404
+ }
405
+
406
+ // setSensor 函数声明
407
+ function setSensor(callback: Function, sensitivity: number) {
408
+ cSliderActor.run((cmds) => [
409
+ cmds.state().removeConditionByGroup(cSensorConditionGroup),
410
+ ]);
411
+ if (callback != null) {
412
+ cSliderActor.run((cmds) => [
413
+ cmds
414
+ .condition(cSensorConditionGroup, true)
415
+ .onMovement(sensitivity) // 设置x或y移动超过12时才触发回调,以此减少回调的频次,规避js的性能影响
416
+ .then([
417
+ (pointInfo: any) => {
418
+ let percent: number = positionToPercent(pointInfo);
419
+ vCurrentPercent = percent;
420
+ callback(percent, pointInfo.xPos, pointInfo.yPos);
421
+ },
422
+ ]),
423
+ ]);
424
+ }
425
+ }
426
+
427
+ // 内部函数,位置信息转成百分比信息
428
+ function positionToPercent(pointInfo: any): number {
429
+ let percent: number = 0;
430
+ if (cDirection == HORIZONTAL) {
431
+ percent = vHorizontalGap != 0 ? pointInfo.xPos / vHorizontalGap : 0;
432
+ } else {
433
+ percent = vVerticalGap != 0 ? pointInfo.yPos / vVerticalGap : 0;
434
+ }
435
+ return percent;
436
+ }
437
+
438
+ // updatePercent 函数声明
439
+ function updatePercent(percent: number) {
440
+ let xPos: number = 0;
441
+ let yPos: number = 0;
442
+ if (cDirection == HORIZONTAL) {
443
+ xPos = Math.floor(percent * vHorizontalGap);
444
+ } else {
445
+ yPos = Math.floor(percent * vVerticalGap);
446
+ }
447
+ cSliderActor.run((cmds) => [cmds.action().teleportTo(xPos, yPos)]);
448
+ vCurrentPercent = percent;
449
+ }
450
+
451
+ function currentPercent(): number {
452
+ return vCurrentPercent;
453
+ }
454
+
455
+ onMounted(() => {
456
+ vMounted = true;
457
+
458
+ // 构建slider的FreeMove控制对象
459
+ let sliderView = (rSliderViewRef.value as any).jsvGetProxyView();
460
+ cSliderActor.bindForgeView(sliderView, true);
461
+ sliderView.DragEnables?.(
462
+ ForgeConst.DragFlags.TOUCH_RECV_MOVE_BIT |
463
+ (cEnableFling ? ForgeConst.DragFlags.TOUCH_RECV_FLING_BIT : 0) |
464
+ ForgeConst.DragFlags.TOUCH_RECV_FIRST_START |
465
+ ForgeConst.DragFlags.TOUCH_RECV_LAST_END
466
+ ); // 激活 Move | TouchDown | TouchEnd
467
+
468
+ // 设置初始进度
469
+ if (cInitPercent != 0) {
470
+ updatePercent(cInitPercent);
471
+ }
472
+
473
+ if (cFixedBoxActor != null) {
474
+ // 父节点激活 touchDown 和 touchAttractChild
475
+ // 用于点击滑动区域时,将子节点拖过来
476
+ let fixedBoxView = (rFixedViewRef.value as any).jsvGetProxyView();
477
+ cFixedBoxActor.bindForgeView(fixedBoxView, true);
478
+ fixedBoxView.DragEnables?.(ForgeConst.DragFlags.TOUCH_RECV_FIRST_START); // 仅激活touchDown即可捕获并触发 TouchAttractChild
479
+ cFixedBoxActor.run((cmds) => [
480
+ cmds.state().setTouchAttractChild(cSliderActor),
481
+ ]);
482
+ }
483
+
484
+ // 创建提供同步信息来源的 SyncLinkSource,并登录到SyncLinkManager中(SourceOnMounted)
485
+ // 注意:此处理一定要在 onUnmounted 时进行 SourceOnUnmounted,才能规避内存泄漏
486
+ if (cLinkName != null) {
487
+ vLinkProvide = new SyncLinkSource(cLinkName, newNexus());
488
+ rebuildSyncMaster();
489
+ cSyncLinkManager.SourceOnMounted(vLinkProvide);
490
+ }
491
+
492
+ // 设置滑动区域和关联区域
493
+ rebuildSliderSet();
494
+ });
495
+
496
+ onUnmounted(() => {
497
+ /** 关于LinkSource的释放 **/
498
+ // 释放作为linkSource master时的句柄
499
+ if (vLinkProvide != null) {
500
+ cSyncLinkManager.SourceOnUnmounted(cLinkName);
501
+ vLinkProvide = null;
502
+ }
503
+
504
+ // 释放作为linkSource slave时的句柄
505
+ if (vWaitMasterLinkSourceReady != null) {
506
+ cSyncLinkManager.UnListen(vWaitMasterLinkSourceReady);
507
+ vWaitMasterLinkSourceReady = null;
508
+ }
509
+ });
510
+
511
+ defineExpose({
512
+ setSensor,
513
+ updatePercent,
514
+ currentPercent,
515
+ });
516
+ </script>
517
+
518
+ <style lang="scss" scoped></style>