@shijiu/jsview-vue 2.2.35 → 2.2.128

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 (77) hide show
  1. package/bin/browser/BrowserApic.vue.mjs +2 -1
  2. package/bin/browser/BrowserApic2.vue.mjs +2 -1
  3. package/bin/browser/BrowserApicLib.mjs +2 -1
  4. package/bin/browser/BrowserQrcode.vue.mjs +3 -1
  5. package/bin/browser/BrowserTextureAnim.vue.mjs +7 -6
  6. package/bin/jsview-vue.mjs +1557 -894
  7. package/bin/types/JsViewEngineWidget/MetroWidget/Slide.d.ts +21 -0
  8. package/bin/types/JsViewEngineWidget/TemplateParser/MetroTemplate.d.ts +2 -8
  9. package/bin/types/JsViewEngineWidget/WidgetCommon.d.ts +9 -3
  10. package/bin/types/JsViewVueTools/ConstSymbol.d.ts +2 -0
  11. package/bin/types/JsViewVueTools/ForgeConstDefine.d.ts +11 -0
  12. package/bin/types/JsViewVueTools/JsvRuntimeBridge.d.ts +113 -57
  13. package/bin/types/JsViewVueTools/JsvTextureStore/CapturedTexture/CapturedTexture.d.ts +11 -0
  14. package/bin/types/JsViewVueTools/JsvTextureStore/Texture.d.ts +8 -0
  15. package/bin/types/JsViewVueWidget/JsvConnectLine/JsvConnectLine.vue.d.ts +1 -1
  16. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ActionRefObject.d.ts +4 -0
  17. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ActorControl.d.ts +65 -0
  18. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ActorState.d.ts +6 -0
  19. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/CallbackManager.d.ts +11 -0
  20. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ForgeTypeDefine.d.ts +15 -0
  21. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/FreeMoveActor.vue.d.ts +6 -0
  22. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SetAction.d.ts +71 -0
  23. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SetCondition.d.ts +95 -0
  24. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SetState.d.ts +62 -0
  25. package/bin/types/JsViewVueWidget/JsvFreeMoveActor/index.d.ts +2 -1
  26. package/bin/types/JsViewVueWidget/JsvLine/JsvLine.vue.d.ts +1 -1
  27. package/bin/types/JsViewVueWidget/JsvNativeSharedDiv.vue.d.ts +66 -28
  28. package/bin/types/JsViewVueWidget/JsvNinePatch.vue.d.ts +1 -0
  29. package/bin/types/JsViewVueWidget/JsvScrollBox/JsvScrollBox.vue.d.ts +176 -0
  30. package/bin/types/JsViewVueWidget/JsvScrollBox/ScrollSymbol.d.ts +7 -0
  31. package/bin/types/JsViewVueWidget/JsvScrollBox/index.d.ts +1 -0
  32. package/bin/types/JsViewVueWidget/JsvTextBox.vue.d.ts +3 -3
  33. package/bin/types/JsViewVueWidget/index.d.ts +1 -0
  34. package/package.json +1 -1
  35. package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +10 -1
  36. package/utils/JsViewEngineWidget/MetroWidget/MetroWidgetSetup.js +398 -309
  37. package/utils/JsViewEngineWidget/MetroWidget/RenderItem.ts +2 -1
  38. package/utils/JsViewEngineWidget/MetroWidget/Slide.ts +56 -0
  39. package/utils/JsViewEngineWidget/MetroWidget/TaskManager.ts +51 -10
  40. package/utils/JsViewEngineWidget/MetroWidget/TokenGenerator.ts +10 -0
  41. package/utils/JsViewEngineWidget/TemplateParser/ListMetroTemplate.ts +9 -3
  42. package/utils/JsViewEngineWidget/TemplateParser/MetroTemplate.ts +25 -35
  43. package/utils/JsViewEngineWidget/WidgetCommon.ts +20 -7
  44. package/utils/JsViewPlugin/JsvPlayer/BrowserJsvPlayer.vue +13 -1
  45. package/utils/JsViewPlugin/JsvPlayer/JsvPlayer.vue +470 -338
  46. package/utils/JsViewVueTools/ConstSymbol.ts +3 -0
  47. package/utils/JsViewVueTools/ForgeConstDefine.ts +11 -0
  48. package/utils/JsViewVueTools/JsvRuntimeBridge.js +172 -50
  49. package/utils/JsViewVueTools/JsvTextureStore/CapturedTexture/CapturedTexture.ts +62 -0
  50. package/utils/JsViewVueTools/JsvTextureStore/JsvTextureStore.ts +41 -7
  51. package/utils/JsViewVueTools/JsvTextureStore/Texture.ts +15 -1
  52. package/utils/JsViewVueTools/index.js +2 -0
  53. package/utils/JsViewVueWidget/JsvApic/JsvApic/BrowserApic.vue +6 -6
  54. package/utils/JsViewVueWidget/JsvApic/JsvApic2/BrowserApic2.vue +5 -6
  55. package/utils/JsViewVueWidget/JsvApic/JsvBrowserApicLib/ApicDataBase.js +5 -1
  56. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActionRefObject.ts +1 -1
  57. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorControl.ts +23 -1
  58. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorState.ts +4 -4
  59. package/utils/JsViewVueWidget/JsvFreeMoveActor/CallbackManager.ts +6 -6
  60. package/utils/JsViewVueWidget/JsvFreeMoveActor/ForgeTypeDefine.ts +1 -1
  61. package/utils/JsViewVueWidget/JsvFreeMoveActor/FreeMoveActor.vue +43 -9
  62. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetAction.ts +24 -0
  63. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetCondition.ts +50 -1
  64. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetState.ts +56 -0
  65. package/utils/JsViewVueWidget/JsvFreeMoveActor/index.js +3 -0
  66. package/utils/JsViewVueWidget/JsvMaskClipDiv.vue +6 -1
  67. package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +121 -68
  68. package/utils/JsViewVueWidget/JsvNinePatch.vue +4 -1
  69. package/utils/JsViewVueWidget/JsvPosterImage.vue +22 -9
  70. package/utils/JsViewVueWidget/JsvQrcode/BrowserQrcode.vue +6 -2
  71. package/utils/JsViewVueWidget/JsvScrollBox/JsvScrollBox.vue +309 -0
  72. package/utils/JsViewVueWidget/JsvScrollBox/ScrollSymbol.ts +15 -0
  73. package/utils/JsViewVueWidget/JsvScrollBox/index.js +2 -0
  74. package/utils/JsViewVueWidget/JsvTextBox.vue +12 -4
  75. package/utils/JsViewVueWidget/JsvTextureAnim/BrowserTextureAnim.vue +9 -6
  76. package/utils/JsViewVueWidget/JsvTextureAnim/JsvTextureAnim.vue +2 -0
  77. package/utils/JsViewVueWidget/index.js +1 -0
@@ -27,7 +27,9 @@ import { RenderItem } from "./RenderItem";
27
27
  import { VisibleInfo } from "./VisibleInfo";
28
28
  import { WidgetRectInfo } from "./WidgetRectInfo";
29
29
  import ActorControl from "../../JsViewVueWidget/JsvFreeMoveActor/ActorControl.ts";
30
- import { TaskType, SlideAnimWrapper, TaskManager, AnimationManager } from "./TaskManager.ts";
30
+ import { TaskType, SlideAnimWrapper, TaskManager, AnimationManager, SlideTaskType } from "./TaskManager.ts";
31
+ import { getDirectionByRect, RectCache } from "./Slide.ts";
32
+ import { ForgeConst } from "../../JsViewVueTools/ForgeConstDefine.ts";
31
33
 
32
34
  const TAG = "MetroWidget";
33
35
 
@@ -109,7 +111,7 @@ export const setup = (
109
111
  };
110
112
 
111
113
  let innerKeepTraceRange = 0;
112
- if (typeof props.keepTraceRange > 0) {
114
+ if (typeof props.keepTraceRange == "number" && props.keepTraceRange > 0) {
113
115
  innerKeepTraceRange = props.keepTraceRange;
114
116
  } else {
115
117
  if (props.touchFlag > 0) {
@@ -173,7 +175,6 @@ export const setup = (
173
175
  let preEdgeRect = null;
174
176
  let isFocus = false;
175
177
  let vertical = props.direction == VERTICAL;
176
- let preAnchorItemIndex = -1;
177
178
  let templateItemAdder = null;
178
179
  let permanentItemList = [];
179
180
  let mounted = false;
@@ -182,7 +183,6 @@ export const setup = (
182
183
  let childSlideEventLock = false;
183
184
  let onKeyDownLock = false;
184
185
  let visibleInfo = new VisibleInfo();
185
- let preSlideDirection = 0;
186
186
  let alreadyCallItemFocus = false;
187
187
  let innerSlideSetting = props.slideSetting
188
188
  const currentFocusIndex = ref(0);
@@ -196,125 +196,181 @@ export const setup = (
196
196
  && item.templateInfo[pos_key] + item.templateInfo[size_key] - 1 < visibleInfo.end;
197
197
  }
198
198
 
199
- let templateCacheFrameCount = -1;
200
- const onMacroTaskEnd = (taskList) => {
201
- let resizeList = [];
199
+ //tools
200
+ const lastOfArray = (array) => {
201
+ if (array instanceof Array && array.length > 0) {
202
+ return array[array.length - 1]
203
+ }
204
+ return null;
205
+ }
206
+
207
+ const onAddTask = (allTask) => {
202
208
  let resizeTaskMap = {};
203
- let slideTask = null;
204
209
  //统一处理itemResize和slide动画
205
210
  let minIndex = Infinity;
206
- let slideInfo = null;
207
211
  let mergeTmp = false;
208
212
  let anchorInfo = null;
209
- let duration = 200;
210
- let easing = null;
211
213
 
212
214
  let pos_key = vertical ? "top" : "left";
213
215
  let size_key = vertical ? "height" : "width";
214
- let doAnim = false;
215
216
 
216
- let existOnFocusChange = false;
217
217
  let targetVisibleStart = visibleInfo.start;
218
+ let slideDoAnim = false;
218
219
 
219
- //先遍历寻找slide task, 确认目标位置. 有多个slide task时取最后一个
220
- taskList.forEach(i => {
221
- if (i.type == TaskType.SLIDE) {
222
- slideTask = i;
223
- mergeTmp = mergeTmp || i.params?.updateParam?.mergeTmp;
224
- if (!isNaN(i.params?.target)) {
225
- targetVisibleStart = -i.params.target;
226
- }
227
- }
228
- });
220
+ mRectCache.cacheManually();
229
221
 
230
- for (let task of taskList) {
231
- if (task.type == TaskType.RESIZE_ITEM) {
232
- mergeTmp = mergeTmp || task.params?.updateParam?.mergeTmp;
222
+ /**
223
+ * 处理resize
224
+ */
225
+ let resizeAnimInfo = {
226
+ doAnim: false,
227
+ duration: 200,
228
+ easing: "",
229
+ }
230
+ let resizeList = allTask.resize.concat();
231
+ if (resizeList.length > 0) {
232
+ //resize
233
+ resizeList.forEach(task => {
233
234
  resizeTaskMap[task.params.index] = task;
234
- resizeList.push(task);
235
235
  const { index, animInfo } = task.params;
236
- doAnim = doAnim || !!animInfo;
236
+ if (animInfo) {
237
+ resizeAnimInfo.doAnim = true;
238
+ resizeAnimInfo.duration = animInfo.duration ?? resizeAnimInfo.duration;
239
+ resizeAnimInfo.easing = animInfo.duration ?? "";
240
+ }
237
241
  minIndex = Math.min(minIndex, index);
238
242
 
239
- duration = task.params.animInfo?.duration ?? duration;
240
- easing = task.params.animInfo?.easing ?? easing;
243
+ metroTemplate.updateItemSize(task.params.index, {
244
+ width: task.params.width,
245
+ height: task.params.height,
246
+ })
247
+ });
241
248
 
242
- if (index == id2Index(focusId) && typeof animInfo?.anchor != "undefined") {
243
- //记录锚点信息
244
- const item = getItemByIndex(index);
245
- anchorInfo = {
246
- anchorPosition: item.templateInfo[pos_key] + item.templateInfo[size_key] * animInfo.anchor - 1 - targetVisibleStart,
247
- anchor: animInfo.anchor,
249
+ //使用上一帧的状态计算anchorPosition
250
+ if (resizeTaskMap[id2Index(focusId)]) {
251
+ const task = resizeTaskMap[id2Index(focusId)];
252
+ const animInfo = task.params.animInfo;
253
+ if (typeof animInfo?.anchor == "number") {
254
+ const preRect = getItemById(focusId)?.templateInfo?.layoutCache.getPreRect();
255
+ if (preRect) {
256
+ anchorInfo = {
257
+ anchorPosition: preRect[pos_key] + preRect[size_key] * animInfo.anchor - 1 - visibleInfo.start,
258
+ anchor: animInfo.anchor,
259
+ }
248
260
  }
249
261
  }
250
- } else if (task.type == TaskType.ON_FOCUS_CHANGE) {
251
- existOnFocusChange = true;
252
262
  }
253
263
  }
254
264
 
255
- if (slideTask) {
256
- slideInfo = {
257
- target: slideTask.params.target,
258
- animObj: slideTask.params.animObj,
265
+ /**
266
+ * 获取slide的targetRect
267
+ * 多个slide task取最后一个
268
+ */
269
+
270
+ /* 两种改变方式: 直接指定Position; 通过targetRect计算 */
271
+ let targetRect = null;
272
+ let direction = undefined;
273
+
274
+ let validSlideTask = false;
275
+ if (allTask.slide.length > 0) {
276
+ validSlideTask = true;
277
+ //有滚动时, 取消延时加载
278
+ tryCancelDelayLoad();
279
+ let slideTask = lastOfArray(allTask.slide);
280
+ slideDoAnim = slideTask.params.doAnim;
281
+ switch (slideTask.subType) {
282
+ case SlideTaskType.SLIDE_BY_DIV: {
283
+ const div = slideTask.params.div;
284
+ const item_layout = div.jsvGetRelativePosition(toRaw(locateDiv.value));
285
+ let fakeItem = {
286
+ templateInfo: {
287
+ left: item_layout.left,
288
+ top: item_layout.top,
289
+ width: item_layout.width,
290
+ height: item_layout.height,
291
+ centerYPos: Math.floor(item_layout.top + item_layout.height / 2),
292
+ centerXPos: Math.floor(item_layout.left + item_layout.width / 2),
293
+ index: id2Index(focusId),
294
+ },
295
+ };
296
+ templateItemAdder.tryAddItemByPosition(vertical ? fakeItem.templateInfo.top : fakeItem.templateInfo.left);
297
+ targetRect = fakeItem.templateInfo;
298
+ } break;
299
+ case SlideTaskType.SLIDE_BY_POS: {
300
+ const position = slideTask.params.position;
301
+ templateItemAdder.tryAddItemByPosition(position);
302
+ targetVisibleStart = position;
303
+ } break;
304
+ case SlideTaskType.SLIDE_BY_ITEM: {
305
+ const index = slideTask.params.index;
306
+ templateItemAdder.tryAddItemByIndex(index);
307
+ const targetItem = getItemByIndex(index);
308
+ if (targetItem) {
309
+ if (typeof slideTask.params.direction != "undefined") {
310
+ direction = slideTask.params.direction;
311
+ }
312
+ targetRect = targetItem.templateInfo;
313
+ } else {
314
+ //无效的滚动
315
+ validSlideTask = false;
316
+ }
317
+ } break;
318
+ case SlideTaskType.SLIDE_BY_RECT: {
319
+ if (typeof slideTask.params.direction != "undefined") {
320
+ direction = slideTask.params.direction;
321
+ }
322
+ targetRect = slideTask.params.rect;
323
+ } break;
324
+ default:
325
+ break;
259
326
  }
260
- }
261
327
 
262
- let existItemResize = false;
263
- if (resizeList.length > 0) {
264
- existItemResize = true;
265
- //TODO 应该是尺寸变化后的可视item需要记录位置, 但暂时先记录20个
266
- if (templateCacheFrameCount != Forge.sFrameCount.count) {
267
- metroTemplate.cacheLayout(minIndex, minIndex + 20);
268
- templateCacheFrameCount = Forge.sFrameCount.count;
269
- }
270
- //resize
271
- resizeList.forEach(task => {
272
- metroTemplate.updateItemSize(task.params.index, {
273
- width: task.params.width,
274
- height: task.params.height,
275
- })
276
- });
277
- //保持anchor
328
+ mergeTmp = mergeTmp || slideTask.params?.updateParam?.mergeTmp;
329
+ }
330
+ if (!validSlideTask && resizeList.length > 0) {
331
+ //没有slide任务时, 采用resize的slide位置计算
278
332
  if (anchorInfo) {
333
+ //保持anchor
279
334
  const focusItem = getItemById(focusId);
280
335
  const start = focusItem.templateInfo[pos_key] + focusItem.templateInfo[size_key] * anchorInfo.anchor - 1 - anchorInfo.anchorPosition;
281
- targetVisibleStart = normalizeVisibleStart(start, focusItem.templateInfo);
336
+ targetVisibleStart = normalizeVisibleStart(start, focusItem.templateInfo, focusItem.templateInfo.index);
282
337
  } else {
283
- targetVisibleStart = _calculateVisibleStart(getItemById(focusId).templateInfo, preSlideDirection);
338
+ targetRect = getItemById(focusId).templateInfo;
284
339
  }
285
-
286
- if (visibleInfo.start != targetVisibleStart) {
287
- //只有resize引起的slide动画时, 动画时长使用resize设置, 否者使用slideSetting设置
288
- slideInfo = {
289
- target: -targetVisibleStart,
290
- };
291
- if (doAnim) {
292
- slideInfo.animObj = {
293
- easing: "",
294
- onStart: null,
295
- speed: null,
296
- duration,
297
- }
298
- } else {
299
- //resize无动画时正常slide
300
- if (slideTask) {
301
- slideInfo.animObj = slideTask.params?.animObj
302
- } else {
303
- //默认滚动
304
- slideInfo.animObj = {
305
- //resize无动画时正常slide
306
- easing: "",
307
- onStart: null,
308
- onEnd: null,
309
- speed: innerSlideSetting.Speed,
310
- duration: innerSlideSetting.Duration,
311
- }
312
- }
340
+ slideDoAnim = resizeAnimInfo.doAnim;
341
+ }
342
+
343
+ if (targetRect) {
344
+ const v = visibleInfo.copy();
345
+ let preInfo = null;
346
+ if (resizeList.length > 0) {
347
+ //存在resize时, 需要调整targetRect
348
+ preInfo = mRectCache.getPreRect();
349
+ if (preInfo) {
350
+ v.start = targetRect.left - preInfo.left + v.start;
351
+ preInfo.left += (v.start - visibleInfo.start);
352
+ }
353
+ }
354
+ targetVisibleStart = _calculateVisibleStart(targetRect, direction, targetRect, v, preInfo);
355
+ } else {
356
+ //resize通过anchor直接设置了visibleStart
357
+ if (resizeList.length > 0) {
358
+ let tRect = getItemById(focusId)?.templateInfo;
359
+ if (tRect) {
360
+ mRectCache.cache({
361
+ left: tRect.left,
362
+ top: tRect.top,
363
+ width: tRect.width,
364
+ height: tRect.height,
365
+ frameCount: Forge.sFrameCount.count,
366
+ })
313
367
  }
314
368
  }
315
369
  }
316
370
 
371
+ let needSlide = false;
317
372
  if (targetVisibleStart != visibleInfo.start) {
373
+ needSlide = true;
318
374
  taskManager.run(() => {
319
375
  const preVisibleStart = visibleInfo.start;
320
376
  visibleInfo.start = targetVisibleStart;
@@ -323,6 +379,7 @@ export const setup = (
323
379
  }
324
380
  });
325
381
  }
382
+
326
383
  //updatePage
327
384
  let updateHandler
328
385
  taskManager.run(() => {
@@ -342,39 +399,41 @@ export const setup = (
342
399
  // resize item 动画
343
400
  if (resizeList.length > 0) {
344
401
  updateHandler.applyTmp();
345
- if (doAnim) {
402
+ if (resizeAnimInfo.doAnim) {
346
403
  const visibleIndexList = Array.from(pageUpdater.getTmpRange());
347
404
  //创建item slide anim
348
405
  for (let index of visibleIndexList) {
349
406
  const renderItem = getItemByIndex(index);
350
407
  const { left, top } = renderItem.templateInfo;
351
408
  if (index >= minIndex) {
352
- const layoutCache = renderItem.templateInfo.layoutCache;
353
- const doItemSlide = (div) => {
354
- taskManager.run(() => {
355
- const cancel = animationManager.startSlideAnim(
356
- div,
357
- [layoutCache.left - left, layoutCache.top - top],
358
- [0, 0],
359
- resizeTaskMap[index] ?
360
- resizeTaskMap[index].params.animInfo
361
- : { duration: duration }
362
- )
363
- return () => {
364
- cancel()
365
- }
366
- });
367
- }
409
+ const layoutCache = renderItem.templateInfo.layoutCache.getPreRect();
410
+ if (layoutCache) {
411
+ const doItemSlide = (div) => {
412
+ taskManager.run(() => {
413
+ const cancel = animationManager.startSlideAnim(
414
+ div,
415
+ [layoutCache.left - left, layoutCache.top - top],
416
+ [0, 0],
417
+ resizeTaskMap[index] ?
418
+ resizeTaskMap[index].params.animInfo
419
+ : { duration: resizeAnimInfo.duration }
420
+ )
421
+ return () => {
422
+ cancel()
423
+ }
424
+ });
425
+ }
368
426
 
369
- if (renderItem.mounted.value) {
370
- doItemSlide(renderItem.rootDiv);
371
- } else {
372
- taskManager.run(() => {
373
- const unregister = renderItem.addDivMountedListener((div) => {
374
- doItemSlide(div);
427
+ if (renderItem.mounted.value) {
428
+ doItemSlide(renderItem.rootDiv);
429
+ } else {
430
+ taskManager.run(() => {
431
+ const unregister = renderItem.addDivMountedListener((div) => {
432
+ doItemSlide(div);
433
+ });
434
+ return unregister;
375
435
  });
376
- return unregister;
377
- });
436
+ }
378
437
  }
379
438
  }
380
439
  }
@@ -382,13 +441,22 @@ export const setup = (
382
441
  }
383
442
 
384
443
  //处理滚动动画
385
- let viewSlid = false;
386
- if (slideInfo) {
387
- viewSlid = executeSlide(slideInfo, updateHandler);
444
+ if (needSlide) {
445
+ let animInfo = undefined;
446
+ if (slideDoAnim) {
447
+ animInfo = {
448
+ easing: null,//resizeAnimInfo.doAnim ? resizeAnimInfo.easing : '' /* innerSlideSetting.Easing */,
449
+ duration: resizeAnimInfo.doAnim ? resizeAnimInfo.duration : innerSlideSetting.Duration,
450
+ speed: innerSlideSetting.Speed,
451
+ onStart: null,
452
+ onEnd: null,
453
+ }
454
+ }
455
+ executeSlide(visibleInfo.start, animInfo, updateHandler)
388
456
  }
389
457
 
390
458
  //回调
391
- if (existItemResize && props.onAllItemResizeDone) {
459
+ if (resizeList.length > 0 && props.onAllItemResizeDone) {
392
460
  taskManager.run(() => {
393
461
  const handler = setTimeout(() => {
394
462
  props.onAllItemResizeDone();
@@ -398,7 +466,7 @@ export const setup = (
398
466
  }
399
467
  })
400
468
  }
401
- if ((viewSlid || existOnFocusChange) && props.onFocusRectChange) {
469
+ if ((needSlide || allTask.focus.length > 0) && props.onFocusRectChange) {
402
470
  taskManager.run(() => {
403
471
  const handler = setTimeout(() => {
404
472
  props.onFocusRectChange();
@@ -409,22 +477,21 @@ export const setup = (
409
477
  })
410
478
  }
411
479
  }
412
- const taskManager = new TaskManager(onMacroTaskEnd);
480
+ const taskManager = new TaskManager(onAddTask);
413
481
  const animationManager = new AnimationManager();
414
482
 
415
- const executeSlide = (slideInfo, updateHandler) => {
483
+ const executeSlide = (target, animObj, updateHandler) => {
416
484
  let preLeft = slideDivLeft.value;
417
485
  let preTop = slideDivTop.value;
418
486
  taskManager.run(() => {
419
- slideDivLeft.value = vertical ? 0 : -visibleInfo.start;
420
- slideDivTop.value = vertical ? -visibleInfo.start : 0;
487
+ slideDivLeft.value = vertical ? 0 : -target;
488
+ slideDivTop.value = vertical ? -target : 0;
421
489
  return () => {
422
490
  slideDivLeft.value = preLeft;
423
491
  slideDivTop.value = preTop;
424
492
  }
425
493
  });
426
- let viewSlid = preLeft != slideDivLeft.value || preTop != slideDivTop.value;
427
- if (slideInfo.animObj) {
494
+ if (animObj) {
428
495
  updateHandler.applyTmp();
429
496
  taskManager.run(() => {
430
497
  const from = vertical ? [0, preTop - slideDivTop.value] : [preLeft - slideDivLeft.value, 0];
@@ -433,7 +500,7 @@ export const setup = (
433
500
  from,
434
501
  [0, 0],
435
502
  {
436
- ...slideInfo.animObj,
503
+ ...animObj,
437
504
  onEnd: () => {
438
505
  updateHandler.apply()
439
506
  }
@@ -454,26 +521,27 @@ export const setup = (
454
521
  clearTimeout(handler);
455
522
  }
456
523
  })
457
- return viewSlid
458
524
  }
459
525
 
460
526
  const updateItemSize = (index, newSize, animInfo) => {
461
- taskManager.addTask(TaskType.RESIZE_ITEM,
462
- {
463
- index,
464
- width: newSize.width,
465
- height: newSize.height,
466
- animInfo,
467
- });
527
+ const item = getItemByIndex(index);
528
+ if (item && (item.templateInfo.width !== newSize.width || item.templateInfo.height !== newSize.height)) {
529
+ taskManager.addTask(TaskType.RESIZE_ITEM,
530
+ {
531
+ index,
532
+ width: newSize.width,
533
+ height: newSize.height,
534
+ animInfo,
535
+ preRect: {
536
+ left: item.templateInfo.left,
537
+ top: item.templateInfo.top,
538
+ width: item.templateInfo.width,
539
+ height: item.templateInfo.height,
540
+ },
541
+ });
542
+ }
468
543
  }
469
544
 
470
- const _slideTo = (target, animObj, updateParam = { mergeTmp: false }) => {
471
- if (slideLock || target == visibleInfo.start) {
472
- return
473
- };
474
- taskManager.addTask(TaskType.SLIDE, { target: -target, animObj, updateParam });
475
- };
476
-
477
545
  let callFocusAfterUpdate = false;
478
546
 
479
547
  //methods
@@ -689,27 +757,6 @@ export const setup = (
689
757
  enterFocusRect = rect;
690
758
  };
691
759
 
692
- const slideTo = (position, doAnim) => {
693
- //有外部触发的滚动时, 取消load
694
- tryCancelDelayLoad();
695
- templateItemAdder.tryAddItemByPosition(position);
696
- if (
697
- typeof position !== "undefined" &&
698
- position != null
699
- ) {
700
- let animObj = null;
701
- if (doAnim) {
702
- animObj = {
703
- easing: innerSlideSetting.Easing,
704
- onStart: null,
705
- speed: innerSlideSetting.Speed,
706
- duration: innerSlideSetting.Duration,
707
- };
708
- }
709
- _slideTo(position, animObj);
710
- }
711
- };
712
-
713
760
  const setZIndex = (index, normalZIndex, focusZIndex) => {
714
761
  const targetItem = getItemByIndex(index);
715
762
  if (targetItem) {
@@ -722,45 +769,63 @@ export const setup = (
722
769
  }
723
770
  }
724
771
 
725
- const slideToItem = (index, doAnim) => {
726
- templateItemAdder.tryAddItemByIndex(index);
727
- const targetItem = getItemByIndex(index);
728
- if (targetItem) {
729
- const direction = index - preAnchorItemIndex >= 0 ? 1 : -1;
730
- const visible_start = _calculateVisibleStart(targetItem.templateInfo, direction);
731
- slideTo(visible_start, doAnim);
772
+ const slideToInner = (position, doAnim, updateParam = { mergeTmp: false }) => {
773
+ if (slideLock || position == (vertical ? slideDivTop.value : slideDivLeft.value)) {
774
+ return
775
+ };
776
+ taskManager.addTask(TaskType.SLIDE, { position, doAnim, updateParam }, SlideTaskType.SLIDE_BY_POS);
777
+ };
778
+
779
+ const slideTo = (position, doAnim) => {
780
+ if (typeof position == "number") {
781
+ slideToInner(position, doAnim);
732
782
  }
733
783
  };
734
784
 
785
+ const slideToItemInner = (index, doAnim, direction = undefined, preItem = undefined) => {
786
+ taskManager.addTask(
787
+ TaskType.SLIDE,
788
+ {
789
+ index,
790
+ doAnim,
791
+ direction,
792
+ preItem,
793
+ },
794
+ SlideTaskType.SLIDE_BY_ITEM);
795
+ };
796
+ const slideToItem = (index, doAnim) => {
797
+ slideToItemInner(index, doAnim)
798
+ }
799
+
735
800
  const slideToDiv = (div, doAnim) => {
736
- //有外部触发的滚动时, 取消load
737
- tryCancelDelayLoad();
801
+ slideToDivInner(div, doAnim);
802
+ }
803
+ const slideToDivInner = (div, doAnim, direction = undefined) => {
738
804
  if (div) {
739
- const item_layout = div.jsvGetRelativePosition(toRaw(locateDiv.value));
740
- const direction = 1;
741
-
742
- let fakeItem = {
743
- templateInfo: {
744
- left: item_layout.left,
745
- top: item_layout.top,
746
- width: item_layout.width,
747
- height: item_layout.height,
748
- centerYPos: Math.floor(item_layout.top + item_layout.height / 2),
749
- centerXPos: Math.floor(item_layout.left + item_layout.width / 2),
750
- index: id2Index(focusId),
805
+ taskManager.addTask(
806
+ TaskType.SLIDE,
807
+ {
808
+ div,
809
+ doAnim,
810
+ direction,
751
811
  },
752
- };
753
-
754
- let cur_slide = _calculateVisibleStart(fakeItem.templateInfo, direction);
755
- if (cur_slide != visibleInfo.start) {
756
- _slideTo(cur_slide, doAnim ? {
757
- easing: "",
758
- onStart: null,
759
- speed: innerSlideSetting.Speed,
760
- duration: innerSlideSetting.Duration,
761
- onEnd: null,
762
- } : null);
763
- }
812
+ SlideTaskType.SLIDE_BY_DIV);
813
+ }
814
+ }
815
+ const slideToRect = (rect, doAnim, direction = undefined) => {
816
+ if (rect
817
+ && typeof rect.left == 'number'
818
+ && typeof rect.top == 'number'
819
+ && typeof rect.width == 'number'
820
+ && typeof rect.height == 'number') {
821
+ taskManager.addTask(
822
+ TaskType.SLIDE,
823
+ {
824
+ rect,
825
+ doAnim,
826
+ direction,
827
+ },
828
+ SlideTaskType.SLIDE_BY_RECT);
764
829
  }
765
830
  }
766
831
 
@@ -844,7 +909,12 @@ export const setup = (
844
909
  );
845
910
  updater.apply();
846
911
  onItemFocus(getItemById(focusId), null);
847
- slideToItem(id2Index(focusId), false);
912
+ let targetRect = mRectCache.getCurRect() ?? mRectCache.getPreRect();
913
+ if (targetRect) {
914
+ slideToRect(targetRect, false);
915
+ } else {
916
+ slideToItem(id2Index(focusId), false);
917
+ }
848
918
  //template和slideDivStyle均确定后再次重设box condition
849
919
  updateTouchBoxCondition();
850
920
  };
@@ -1323,16 +1393,11 @@ export const setup = (
1323
1393
  },
1324
1394
  };
1325
1395
 
1326
- let cur_slide = _calculateVisibleStart(fakeItem.templateInfo, direction);
1396
+ let cur_slide = _calculateVisibleStart(fakeItem.templateInfo, direction, fakeItem.templateInfo, visibleInfo);
1327
1397
  if (cur_slide != visibleInfo.start) {
1328
- _slideTo(
1398
+ slideToInner(
1329
1399
  cur_slide,
1330
- {
1331
- easing: "",
1332
- onStart: null,
1333
- speed: innerSlideSetting.Speed,
1334
- duration: innerSlideSetting.Duration,
1335
- },
1400
+ true,
1336
1401
  {
1337
1402
  mergeTmp: true
1338
1403
  });
@@ -1344,7 +1409,7 @@ export const setup = (
1344
1409
 
1345
1410
  const _changeFocusId = (id, cache_pre = true) => {
1346
1411
  preFocusId = cache_pre ? focusId : -1;
1347
- focusId = id;
1412
+ focusId = id >= 0 && id < metroTemplate.size ? id : 0;
1348
1413
  currentFocusIndex.value = id2Index(id);
1349
1414
  taskManager.addTask(TaskType.ON_FOCUS_CHANGE);
1350
1415
  }
@@ -1431,22 +1496,12 @@ export const setup = (
1431
1496
  onItemBlur(preFocusItem);
1432
1497
  onItemFocus(next_focus_item, preEdgeRect);
1433
1498
 
1434
-
1435
1499
  if (next_focus_item.itemConfig.itemSlide == METRO_WIDGET_CONST.ITEM_SLIDE.ACT_ITEM_FOCUS) {
1436
- let cur_visible_start = _calculateVisibleStart(
1437
- next_focus_item.templateInfo,
1500
+ slideToItemInner(
1501
+ next_focus_item.index,
1502
+ true,
1438
1503
  vertical ? vertical_direction : horizontal_direction,
1439
- preFocusItem.templateInfo,
1440
- );
1441
- if (visibleInfo.start !== cur_visible_start) {
1442
- let animObj = {
1443
- easing: "",
1444
- onStart: null,
1445
- speed: innerSlideSetting.Speed,
1446
- duration: innerSlideSetting.Duration,
1447
- };
1448
- _slideTo(cur_visible_start, animObj, { mergeTmp: false });
1449
- }
1504
+ preFocusItem);
1450
1505
  } else {
1451
1506
  const updater = pageUpdater.update(
1452
1507
  metroTemplate,
@@ -1505,19 +1560,20 @@ export const setup = (
1505
1560
  }
1506
1561
  };
1507
1562
 
1508
- const normalizeVisibleStart = (origin, targetItem = null) => {
1563
+ const normalizeVisibleStart = (origin, targetRect = undefined, index = undefined) => {
1509
1564
  let pos_key = vertical ? "top" : "left";
1510
1565
  let size_key = vertical ? "height" : "width";
1511
1566
  let visibleStart = origin;
1567
+
1512
1568
  if ((innerSlideSetting.BoundaryProtect & SlideSetting.START_PROTECT) > 0) {
1513
1569
  if (visibleInfo.start >= 0) {
1514
1570
  let boundary = 0;
1515
1571
  //首个元素是占位符时, 在保证获焦区域完全展示的前提下要保证首个不可获焦元素的完全展示
1516
1572
  const headTemplateInfo = getItemByIndex(0).templateInfo;
1517
1573
  if (
1518
- targetItem
1519
- && (!headTemplateInfo.focusable || targetItem.index == headTemplateInfo.index)
1520
- && targetItem[pos_key] + targetItem[size_key] <=
1574
+ targetRect
1575
+ && (!headTemplateInfo.focusable || index == headTemplateInfo.index)
1576
+ && targetRect[pos_key] + targetRect[size_key] <=
1521
1577
  visibleInfo.range
1522
1578
  ) {
1523
1579
  boundary = headTemplateInfo[size_key];
@@ -1536,9 +1592,9 @@ export const setup = (
1536
1592
  if (visibleInfo.end <= lastEnd) {
1537
1593
  let boundary = lastVisibleStart;
1538
1594
  if (
1539
- targetItem
1540
- && (!lastTemplateInfo.focusable || targetItem.index == lastTemplateInfo.index)
1541
- && targetItem[pos_key] - lastVisibleStart >= 0
1595
+ targetRect
1596
+ && (!lastTemplateInfo.focusable || index == lastTemplateInfo.index)
1597
+ && targetRect[pos_key] - lastVisibleStart >= 0
1542
1598
  ) {
1543
1599
  boundary = lastTemplateInfo[pos_key] - visibleInfo.range;
1544
1600
  }
@@ -1551,18 +1607,31 @@ export const setup = (
1551
1607
  return visibleStart;
1552
1608
  }
1553
1609
 
1554
- let preTemplateInfo = null;
1555
- const _calculateVisibleStart = (targetTemplateInfo, direction, preInfo = null) => {
1556
- if (!targetTemplateInfo) {
1610
+ const mRectCache = new RectCache();
1611
+ const _calculateVisibleStart = (targetRect, _direction, templateInfo, visibleInfo, preInfo = null) => {
1612
+ if (!targetRect) {
1557
1613
  console.error("MetroWidget: _calculateVisibleStart target item is null");
1558
1614
  return 0;
1559
1615
  }
1616
+ const curRect = {
1617
+ left: targetRect.left,
1618
+ top: targetRect.top,
1619
+ width: targetRect.width,
1620
+ height: targetRect.height,
1621
+ frameCount: Forge.sFrameCount.count,
1622
+ }
1623
+ mRectCache.cache(curRect);
1624
+ let preRect = mRectCache.getPreRect();
1560
1625
  if (preInfo) {
1561
- preTemplateInfo = preInfo;
1626
+ preRect = preInfo;
1627
+ }
1628
+ let direction = _direction;
1629
+ if (typeof direction != "number") {
1630
+ //通过preRect确定direction
1631
+ let d = getDirectionByRect(curRect, preRect);
1632
+ direction = vertical ? d.vertical : d.horizontal;
1562
1633
  }
1563
1634
 
1564
- preSlideDirection = direction;
1565
- preAnchorItemIndex = targetTemplateInfo.index;
1566
1635
  let pos_key = vertical ? "top" : "left";
1567
1636
  let size_key = vertical ? "height" : "width";
1568
1637
  let center_key = vertical ? "centerYPos" : "centerXPos";
@@ -1577,7 +1646,7 @@ export const setup = (
1577
1646
 
1578
1647
  //首页不滚动
1579
1648
  if (innerSlideSetting.FixFirstPage) {
1580
- if (targetTemplateInfo[pos_key] + targetTemplateInfo[size_key] - 1 < visibleInfo.range) {
1649
+ if (targetRect[pos_key] + targetRect[size_key] - 1 < visibleInfo.range) {
1581
1650
  new_visible_start = 0;
1582
1651
  needCalculate = false;
1583
1652
  }
@@ -1585,19 +1654,19 @@ export const setup = (
1585
1654
 
1586
1655
  if (needCalculate) {
1587
1656
  new_visible_start = Math.ceil(
1588
- targetTemplateInfo[center_key] -
1657
+ targetRect[pos_key] + targetRect[size_key] / 2 -
1589
1658
  visibleInfo.range * innerSlideSetting.FixPercent
1590
1659
  );
1591
1660
  }
1592
1661
  break;
1593
1662
  case SlideSetting.Type.WHOLE_PAGE:
1594
- if (typeof targetTemplateInfo.pageHeadIndex == "undefined") {
1663
+ if (!templateInfo || typeof templateInfo.pageHeadIndex == "undefined") {
1595
1664
  //TODO 子控制滚动时whole page滚动
1596
1665
  console.error(
1597
1666
  "child controlled whole page slide type is not supported."
1598
1667
  );
1599
1668
  } else {
1600
- new_visible_start = getItemByIndex(targetTemplateInfo.pageHeadIndex)
1669
+ new_visible_start = getItemByIndex(templateInfo.pageHeadIndex)
1601
1670
  .templateInfo[pos_key];
1602
1671
  }
1603
1672
 
@@ -1605,7 +1674,7 @@ export const setup = (
1605
1674
  case SlideSetting.Type.SEAMLESS:
1606
1675
  //首页不滚动
1607
1676
  if (innerSlideSetting.FixFirstPage) {
1608
- if (targetTemplateInfo[pos_key] + targetTemplateInfo[size_key] - 1 < visibleInfo.range) {
1677
+ if (targetRect[pos_key] + targetRect[size_key] - 1 < visibleInfo.range) {
1609
1678
  new_visible_start = 0;
1610
1679
  needCalculate = false;
1611
1680
  }
@@ -1618,68 +1687,72 @@ export const setup = (
1618
1687
  * end-1.0: 焦点往左时不处理, 往右的时候更新position以保持焦点的end位置一致
1619
1688
  * 重合区域: 保持焦点的中心位置一致
1620
1689
  */
1621
- const rect0Start = visibleInfo.start;
1622
- const rect0End = visibleInfo.start + visibleInfo.range * innerSlideSetting.StartPercent;
1623
- const rect1Start = visibleInfo.start + visibleInfo.range * innerSlideSetting.EndPercent;
1624
- const rect1End = visibleInfo.end;
1625
-
1626
- const itemStart = targetTemplateInfo[pos_key];
1627
- const itemEnd = targetTemplateInfo[pos_key] + targetTemplateInfo[size_key] - 1;
1628
-
1629
- let targetStart;
1630
- let targetEnd;
1631
- if (preTemplateInfo != null) {
1632
- targetStart = preTemplateInfo[pos_key];
1633
- targetEnd = preTemplateInfo[pos_key] + preTemplateInfo[size_key] - 1;
1634
- } else {
1635
- targetStart = rect0End;
1636
- targetEnd = rect1Start;
1637
- }
1638
-
1639
- let rect0Result = undefined;
1640
- let rect1Result = undefined;
1641
- if (itemStart < rect0End) {
1642
- if (targetStart < rect0Start) {
1643
- rect0Result = itemStart;
1644
- } else {
1645
- //inRect0, 只处理往左/往上
1646
- if (direction <= 0) {
1647
- let pre;
1648
- if (targetStart < rect0End) {
1649
- pre = targetStart;
1650
- } else {
1651
- pre = rect0End;
1690
+ const itemStart = targetRect[pos_key];
1691
+ const itemEnd = targetRect[pos_key] + targetRect[size_key] - 1;
1692
+ const itemMainSize = targetRect[size_key];
1693
+
1694
+ if (preRect) {
1695
+ const rect0Start = visibleInfo.start;
1696
+ const rect0End = visibleInfo.start + visibleInfo.range * innerSlideSetting.StartPercent;
1697
+ const rect0Range = rect0End - rect0Start + 1
1698
+ const rect1Start = visibleInfo.start + visibleInfo.range * innerSlideSetting.EndPercent;
1699
+ const rect1End = visibleInfo.start + visibleInfo.range - 1;
1700
+ const rect1Range = rect1End - rect1Start + 1;
1701
+
1702
+ let target0 = Math.min(preRect[pos_key], rect0End);
1703
+ let target1 = Math.max(preRect[pos_key] + preRect[size_key] - 1, rect1Start);
1704
+
1705
+ let rect0Result = undefined;
1706
+ let rect1Result = undefined;
1707
+
1708
+ //item的head对齐rect0的end
1709
+ if (itemStart < rect0End) {
1710
+ if (target0 < rect0Start) {
1711
+ //preRect位置错误或者item的尺寸大于区域范围(保证item完整显示)
1712
+ // rect0Result = itemStart;
1713
+ } else {
1714
+ if (direction <= 0) {
1715
+ //inRect0, 只处理往左/往上
1716
+ rect0Result = visibleInfo.start + (itemStart - target0)
1652
1717
  }
1653
- rect0Result = visibleInfo.start + (itemStart - pre);
1654
1718
  }
1655
1719
  }
1656
- }
1657
- if (itemEnd > rect1Start) {
1658
- if (targetEnd > rect1End) {
1659
- rect1Result = itemEnd - visibleInfo.range;
1660
- } else {
1661
- //inRect1, 只处理往右/往下
1662
- let pre;
1663
- if (targetEnd > rect1Start) {
1664
- pre = targetEnd;
1720
+
1721
+ //item的头部对齐rect1的start
1722
+ if (itemEnd > rect1Start) {
1723
+ if (target1 > rect1End) {
1724
+ //preRect位置错误或者item的尺寸大于区域范围(保证item完整显示)
1725
+ // rect1Result = itemEnd - visibleInfo.range;
1665
1726
  } else {
1666
- pre = rect1Start;
1667
- }
1668
- if (direction >= 0) {
1669
- rect1Result = visibleInfo.start + (itemEnd - pre);
1727
+ if (direction >= 0) {
1728
+ //inRect1, 只处理往右/往下
1729
+ rect1Result = visibleInfo.start + (itemEnd - target1);
1730
+ }
1670
1731
  }
1671
1732
  }
1672
- } else {
1673
- //不移动
1733
+
1734
+ if (typeof rect0Result !== "undefined" && typeof rect1Result !== "undefined") {
1735
+ //重叠区域
1736
+ new_visible_start = rect0Result;
1737
+ } else if (typeof rect0Result !== "undefined") {
1738
+ new_visible_start = rect0Result;
1739
+ } else if (typeof rect1Result !== "undefined") {
1740
+ new_visible_start = rect1Result;
1741
+ }
1674
1742
  }
1675
1743
 
1676
- if (typeof rect0Result !== "undefined" && typeof rect1Result !== "undefined") {
1677
- //重叠区域
1678
- new_visible_start = rect0Result;
1679
- } else if (typeof rect0Result !== "undefined") {
1680
- new_visible_start = rect0Result;
1681
- } else if (typeof rect1Result !== "undefined") {
1682
- new_visible_start = rect1Result;
1744
+ //保证item处于safe area范围
1745
+ const headSafeArea = innerSlideSetting.HeadSafeArea * visibleInfo.range;
1746
+ const tailSafeArea = innerSlideSetting.TailSafeArea * visibleInfo.range;
1747
+ if (itemMainSize > visibleInfo.range - headSafeArea - tailSafeArea) {
1748
+ // 大item
1749
+ new_visible_start = Math.round(itemStart - (visibleInfo.range - itemMainSize) / 2)
1750
+ } else {
1751
+ if (itemStart < new_visible_start + headSafeArea) {
1752
+ new_visible_start = itemStart - headSafeArea;
1753
+ } else if (itemEnd > new_visible_start + visibleInfo.range - 1 - tailSafeArea) {
1754
+ new_visible_start = itemEnd - visibleInfo.range + tailSafeArea;
1755
+ }
1683
1756
  }
1684
1757
  }
1685
1758
  break;
@@ -1690,8 +1763,7 @@ export const setup = (
1690
1763
  );
1691
1764
  }
1692
1765
 
1693
- preTemplateInfo = targetTemplateInfo;
1694
- new_visible_start = normalizeVisibleStart(new_visible_start, targetTemplateInfo);
1766
+ new_visible_start = normalizeVisibleStart(new_visible_start, targetRect, templateInfo?.index);
1695
1767
  return Math.round(new_visible_start);
1696
1768
  };
1697
1769
 
@@ -1727,6 +1799,7 @@ export const setup = (
1727
1799
  console.log(`MetroWidget: ${props.name} get focus while data is empty.`);
1728
1800
  return;
1729
1801
  }
1802
+
1730
1803
  let focus_id =
1731
1804
  typeof enterFocusId !== "undefined" &&
1732
1805
  enterFocusId >= 0 &&
@@ -1752,18 +1825,30 @@ export const setup = (
1752
1825
  onItemBlur(getItemById(preFocusId));
1753
1826
  props.onBlur?.();
1754
1827
  isFocus = false;
1828
+ mRectCache.clean()
1755
1829
  };
1756
1830
 
1757
1831
  const _updatePage = (rangeSet) => {
1832
+ let cur = id2Index(focusId);
1833
+ if (cur >= 0) {
1834
+ rangeSet.add(cur)
1835
+ }
1758
1836
  const tmpArray = Array.from(rangeSet);
1759
- renderData.value = tmpArray.map((item) => {
1837
+ let newArray = tmpArray.map((item) => {
1760
1838
  return getItemByIndex(item);
1761
1839
  });
1840
+ const newItemList = newArray.filter((i) => { return !renderData.value?.includes(i) });
1841
+ renderData.value = newArray;
1762
1842
  if (props.enableItemRenderBreak) {
1763
1843
  itemRender.value = false;
1764
- nextTick(() => {
1844
+ const f = () => {
1845
+ // 关闭强制TriggerManualBlock,改为vue内部通过dom的任务数来确定是否执行打断
1846
+ // if (newItemList.length > 12 && props.enableItemRenderBreak) {
1847
+ // window.JsView?.triggerManualBlocker?.();
1848
+ // }
1765
1849
  itemRender.value = true;
1766
- });
1850
+ };
1851
+ nextTick(f);
1767
1852
  }
1768
1853
  };
1769
1854
 
@@ -1831,7 +1916,6 @@ export const setup = (
1831
1916
  }
1832
1917
 
1833
1918
  const mergeTouchSlideToSlideDiv = (touchCount) => {
1834
- // console.log("testtest", props.name, `touchToDiv div: ${slideDivTop.value}, visibleStart:${visibleInfo.start} swapCount: ${Forge.sFrameCount.count}`)
1835
1919
  if (vertical) {
1836
1920
  slideDivTop.value = -visibleInfo.start;
1837
1921
  } else {
@@ -1919,7 +2003,7 @@ export const setup = (
1919
2003
  anchorPos += anchorSpacing;
1920
2004
  }
1921
2005
  const reachConditionList = anchorPosList.map(pos => {
1922
- actorController
2006
+ return actorController
1923
2007
  .condition(reachAnchorGroup)
1924
2008
  .reachPosition(pos, undefined)
1925
2009
  .then([(data) => { updateRenderItems(true, true) }])
@@ -2061,7 +2145,11 @@ export const setup = (
2061
2145
  actorController = new ActorControl();
2062
2146
  const divView = touchDiv.value.jsvGetProxyView();
2063
2147
  actorController.bindForgeView(divView, true);
2064
- divView.DragEnables?.(4 | 0x08 | 0x10); // 只激活drag
2148
+ divView.DragEnables?.(
2149
+ ForgeConst.DragFlags.TOUCH_RECV_MOVE_BIT |
2150
+ ForgeConst.DragFlags.TOUCH_RECV_FLING_BIT |
2151
+ ForgeConst.DragFlags.TOUCH_RECV_FIRST_START |
2152
+ ForgeConst.DragFlags.TOUCH_RECV_LAST_END);
2065
2153
  // debugAnimId = actorController.debugGetAnimId();
2066
2154
  // debugViewId = divView.ViewId;
2067
2155
  // console.log("testtest", props.name, `animId:${debugAnimId} viewId:${debugViewId}`);
@@ -2139,7 +2227,7 @@ export const setup = (
2139
2227
  }
2140
2228
 
2141
2229
  let init_focus_id = 0;
2142
- let cur_visible_start = 0;
2230
+ let initVisibleStart = 0;
2143
2231
 
2144
2232
  if (typeof props.initFocusId == "number") {
2145
2233
  templateItemAdder.tryAddItemById(props.initFocusId);
@@ -2147,18 +2235,19 @@ export const setup = (
2147
2235
  if (item) {
2148
2236
  init_focus_id = props.initFocusId;
2149
2237
  if (item.itemConfig.itemSlide == METRO_WIDGET_CONST.ITEM_SLIDE.ACT_ITEM_FOCUS) {
2150
- cur_visible_start = _calculateVisibleStart(item.templateInfo, 0);
2238
+ initVisibleStart = _calculateVisibleStart(item.templateInfo, 0, item.templateInfo, visibleInfo);
2151
2239
  }
2152
2240
  }
2153
2241
  }
2154
2242
  focusId = init_focus_id;
2155
- visibleInfo.start = cur_visible_start;
2156
2243
 
2157
- //保证创建速度, 你描画一屏
2244
+ let initVisibleInfo = visibleInfo.copy();
2245
+ initVisibleInfo.start = initVisibleStart;
2246
+ //保证创建速度, 先描画一屏
2158
2247
  const initUpdater = pageUpdater.update(
2159
2248
  metroTemplate,
2160
- visibleInfo.startWithPadding,
2161
- visibleInfo.endWithPadding,
2249
+ initVisibleInfo.startWithPadding,
2250
+ initVisibleInfo.endWithPadding,
2162
2251
  0,
2163
2252
  false,
2164
2253
  permanentItemList
@@ -2168,8 +2257,8 @@ export const setup = (
2168
2257
  const delayLoadHandler = setTimeout(() => {
2169
2258
  const updateHandler = pageUpdater.update(
2170
2259
  metroTemplate,
2171
- visibleInfo.startWithPadding - innerKeepTraceRange * pageRange,
2172
- visibleInfo.endWithPadding + innerKeepTraceRange * pageRange,
2260
+ initVisibleInfo.startWithPadding - innerKeepTraceRange * pageRange,
2261
+ initVisibleInfo.endWithPadding + innerKeepTraceRange * pageRange,
2173
2262
  focusId,
2174
2263
  false,
2175
2264
  permanentItemList
@@ -2183,8 +2272,8 @@ export const setup = (
2183
2272
  onMounted(() => {
2184
2273
  _changeFocusId(focusId, false);
2185
2274
  mounted = true;
2186
- if (visibleInfo.start) {
2187
- _slideTo(visibleInfo.start, null);
2275
+ if (initVisibleStart) {
2276
+ slideToInner(initVisibleStart, false);
2188
2277
  }
2189
2278
  if (isFocus && !alreadyCallItemFocus) {
2190
2279
  onItemFocus(getItemById(focusId), preEdgeRect);