@shijiu/jsview-vue 0.9.631 → 0.9.766

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 (140) hide show
  1. package/dom/bin/jsview-browser-debug-dom.min.js +1 -1
  2. package/dom/bin/jsview-dom.min.js +1 -1
  3. package/dom/bin/jsview-engine-js-browser.min.js +1 -0
  4. package/dom/bin/jsview-forge-define.min.js +1 -1
  5. package/dom/jsv-engine-js-browser.js +6 -0
  6. package/dom/target_core_revision.js +4 -4
  7. package/loader/loader.js +4 -0
  8. package/package.json +1 -1
  9. package/patches/node_modules/@vue/cli-service/lib/config/base.js +1 -1
  10. package/samples/AnimPicture/App.vue +5 -5
  11. package/samples/Basic/components/div/DivLayout.vue +1 -1
  12. package/samples/Basic/components/img/ImageGroup.vue +2 -2
  13. package/samples/Basic/components/img/ImgLayout.vue +79 -15
  14. package/samples/Basic/components/text/TextDirection.vue +104 -0
  15. package/samples/Basic/components/text/TextEmoji.vue +1 -1
  16. package/samples/Basic/components/text/TextGroup1.vue +1 -1
  17. package/samples/Basic/components/text/TextGroup2.vue +11 -1
  18. package/samples/Basic/components/text/TextOverflow.vue +8 -3
  19. package/samples/BasicFocusControl/components/BaseBlock.vue +2 -2
  20. package/samples/Collision/App.vue +11 -11
  21. package/samples/DemoHomepage/App.vue +43 -8
  22. package/samples/DemoHomepage/router.js +18 -10
  23. package/samples/DemoHomepage/views/Homepage.vue +83 -96
  24. package/samples/FilterDemo/App.vue +1 -1
  25. package/samples/FlipCard/App.vue +2 -2
  26. package/samples/FlipCard/FlipCard.vue +3 -3
  27. package/samples/GridDemo/App.vue +3 -3
  28. package/samples/GridDemo/ButtonBlock.vue +2 -2
  29. package/samples/GridDemo/FocusItem.vue +2 -2
  30. package/samples/GridDemo/Item.vue +1 -1
  31. package/samples/HashHistory/App.vue +10 -3
  32. package/samples/HashHistory/components/Item.vue +1 -1
  33. package/samples/ImpactStop/App.vue +15 -11
  34. package/samples/Input/InputPanel.vue +1 -1
  35. package/samples/LongImage/Button.vue +1 -1
  36. package/samples/LongImage/ButtonItem.vue +1 -1
  37. package/samples/LongImage/LongImageScroll.vue +2 -2
  38. package/samples/LongText/App.vue +1 -1
  39. package/samples/LongText/Button.vue +1 -1
  40. package/samples/LongText/ButtonItem.vue +1 -1
  41. package/samples/LongText/LongTextScroll.vue +3 -3
  42. package/samples/Marquee/App.vue +176 -40
  43. package/samples/Marquee/longText.js +14 -0
  44. package/samples/MetroWidgetDemos/Advanced/App.vue +5 -6
  45. package/samples/MetroWidgetDemos/Advanced/ButtonItem.vue +4 -4
  46. package/samples/MetroWidgetDemos/Advanced/Buttons.vue +5 -5
  47. package/samples/MetroWidgetDemos/Advanced/Mixed.vue +4 -4
  48. package/samples/MetroWidgetDemos/Advanced/widgets/Item.vue +82 -0
  49. package/samples/MetroWidgetDemos/Advanced/widgets/WidgetItem.vue +88 -0
  50. package/samples/MetroWidgetDemos/Advanced/{Widgets.vue → widgets/Widgets.vue} +56 -11
  51. package/samples/MetroWidgetDemos/Advanced/widgets/focus1.png +0 -0
  52. package/samples/MetroWidgetDemos/Item.vue +4 -2
  53. package/samples/MetroWidgetDemos/PerformanceTest/App.vue +4 -4
  54. package/samples/MetroWidgetDemos/PerformanceTest/components/ContentItem.vue +1 -1
  55. package/samples/MetroWidgetDemos/PerformanceTest/components/MyTab.vue +3 -3
  56. package/samples/MetroWidgetDemos/PingPong/AppPage.vue +2 -2
  57. package/samples/MetroWidgetDemos/PingPong/TabItem.vue +1 -1
  58. package/samples/MetroWidgetDemos/PingPong/ViewSwiper.vue +3 -3
  59. package/samples/MetroWidgetDemos/Simple/AbsoluteTemplate.vue +2 -2
  60. package/samples/MetroWidgetDemos/Simple/App.vue +2 -2
  61. package/samples/MetroWidgetDemos/Simple/RelativeTemplate.vue +6 -6
  62. package/samples/MetroWidgetDemos/WidgetItem.vue +2 -3
  63. package/samples/MetroWidgetDemos/data.js +2 -1
  64. package/samples/NinePatchDemo/App.vue +2 -2
  65. package/samples/NinePatchDemo/Item.vue +2 -2
  66. package/samples/Preload/App.vue +1 -1
  67. package/samples/Preload/Item.vue +1 -1
  68. package/samples/QrcodeDemo/App.vue +1 -1
  69. package/samples/ScaleDownNeon/App.vue +107 -0
  70. package/samples/SoundPool/App.vue +3 -3
  71. package/samples/SpriteImage/App.vue +5 -0
  72. package/samples/TextBox/App.vue +9 -82
  73. package/samples/TextBox/RenderCenter.vue +40 -16
  74. package/samples/TextBox/RenderLeft.vue +48 -19
  75. package/samples/TextBox/RenderOneLine.vue +30 -49
  76. package/samples/TextBox/RenderRight.vue +40 -16
  77. package/samples/TextShadowDemo/App.vue +11 -17
  78. package/samples/TextureAnimation/App2.vue +1 -1
  79. package/samples/TextureSize/App.vue +3 -3
  80. package/samples/ThrowMoveDemo/LRParabolicDemo.vue +33 -47
  81. package/samples/TouchSample/MetroWidgetHorizontal.vue +1 -1
  82. package/samples/TouchSample/MetroWidgetVertical.vue +1 -1
  83. package/samples/TransitPage/App.vue +1 -1
  84. package/samples/VideoDemo/App.vue +8 -8
  85. package/samples/VideoDemo/components/Button.vue +1 -1
  86. package/samples/VideoDemo/components/Controllor.vue +1 -1
  87. package/samples/VisibleSensorDemo/App.vue +3 -3
  88. package/scripts/jsview-run-android.js +5 -4
  89. package/utils/JsViewEngineWidget/JsvFocusBlock.vue +4 -4
  90. package/utils/JsViewEngineWidget/MetroWidget/Const.js +11 -0
  91. package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +245 -111
  92. package/utils/JsViewEngineWidget/TemplateParser.js +227 -178
  93. package/utils/JsViewEngineWidget/WidgetCommon.js +14 -6
  94. package/utils/JsViewEngineWidget/index.js +3 -2
  95. package/utils/JsViewPlugin/BrowserPluginLoader.js +4 -2
  96. package/utils/JsViewPlugin/JsvAudio/AudioProxy.js +302 -0
  97. package/utils/JsViewPlugin/JsvAudio/CheckType.js +68 -0
  98. package/utils/JsViewPlugin/JsvAudio/Events.js +17 -0
  99. package/utils/JsViewPlugin/JsvAudio/JsvAudio.vue +176 -0
  100. package/utils/JsViewPlugin/JsvAudio/JsvAudioBridgeProxy.js +40 -0
  101. package/utils/JsViewPlugin/JsvAudio/JsvAudioBrowser.vue +46 -0
  102. package/utils/JsViewPlugin/JsvAudio/PluginLoader.js +140 -0
  103. package/utils/JsViewPlugin/JsvAudio/index.js +26 -0
  104. package/utils/JsViewPlugin/JsvAudio/version.js +24 -0
  105. package/utils/JsViewPlugin/JsvPlayer/JsvMedia.js +61 -12
  106. package/utils/JsViewPlugin/JsvPlayer/JsvPlayer.vue +8 -1
  107. package/utils/JsViewPlugin/JsvPlayer/index.js +14 -0
  108. package/utils/JsViewPlugin/JsvPlayer/version.js +5 -5
  109. package/utils/JsViewVueTools/JsvHashHistory.js +34 -8
  110. package/utils/JsViewVueTools/JsvImpactTracer.js +2 -2
  111. package/utils/JsViewVueTools/JsvRuntimeBridge.js +46 -8
  112. package/utils/JsViewVueTools/JsvStyleClass.js +9 -0
  113. package/utils/JsViewVueTools/JsvTextTools.js +18 -0
  114. package/utils/JsViewVueTools/TypeCheckAndSet.js +3 -3
  115. package/utils/JsViewVueTools/index.js +2 -1
  116. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserTextureAnim.vue +5 -7
  117. package/utils/JsViewVueWidget/JsvActorMove/JsvActorMove.vue +20 -22
  118. package/utils/JsViewVueWidget/JsvApic/JsvApic.vue +4 -4
  119. package/utils/JsViewVueWidget/JsvGrid.vue +1 -9
  120. package/utils/JsViewVueWidget/JsvInput/Cursor.vue +1 -1
  121. package/utils/JsViewVueWidget/JsvMarquee.vue +188 -205
  122. package/utils/JsViewVueWidget/JsvMaskClipDiv.vue +1 -1
  123. package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +35 -27
  124. package/utils/JsViewVueWidget/JsvNinePatch.vue +63 -54
  125. package/utils/JsViewVueWidget/JsvSpray/JsvSpray.vue +10 -5
  126. package/utils/JsViewVueWidget/JsvSpriteAnim/JsvSpriteAnim.vue +2 -2
  127. package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +21 -5
  128. package/utils/JsViewVueWidget/JsvSwiper3D/JsvSwiper.vue +23 -3
  129. package/utils/JsViewVueWidget/JsvTextBox.vue +27 -84
  130. package/utils/JsViewVueWidget/JsvTouchContainer.vue +5 -6
  131. package/utils/JsViewVueWidget/JsvTransparentDiv.vue +1 -1
  132. package/utils/JsViewVueWidget/JsvVisibleSensor/JsvVisibleSensor.vue +5 -5
  133. package/utils/JsViewVueWidget/index.js +8 -8
  134. package/utils/JsViewEngineWidget/MetroPage.js +0 -2128
  135. package/utils/JsViewEngineWidget/SimpleWidget/ContentView.vue +0 -51
  136. package/utils/JsViewEngineWidget/SimpleWidget/Dispatcher.js +0 -19
  137. package/utils/JsViewEngineWidget/SimpleWidget/DivWrapper.vue +0 -53
  138. package/utils/JsViewEngineWidget/SimpleWidget/ItemView.vue +0 -142
  139. package/utils/JsViewEngineWidget/SimpleWidget/RootView.vue +0 -140
  140. package/utils/JsViewEngineWidget/SimpleWidget/SimpleWidget.vue +0 -1629
@@ -2,7 +2,7 @@
2
2
  * @Author: ChenChanghua
3
3
  * @Date: 2021-09-22 16:08:58
4
4
  * @LastEditors: ChenChanghua
5
- * @LastEditTime: 2022-08-09 11:10:07
5
+ * @LastEditTime: 2022-12-19 11:17:10
6
6
  * @Description: file content
7
7
  -->
8
8
 
@@ -23,7 +23,13 @@
23
23
  * name {string} 用于设置焦点的名称
24
24
  * padding {object} 控件内边距, 默认为{left: 0, right: 0, top: 0, bottom: 0}
25
25
  * direction {enum} (必选)控件方向 HORIZONTAL/VERTICAL
26
- * loopFocus {boolean} 焦点到边界后自动转到下一行,默认false
26
+ * focusMoveType {int} 焦点移动的模式, 可通过 | 运算进行组合
27
+ NO_ADJUST: 无特殊处理
28
+ COLUMN_LOOP: 到达列首/尾后跳转到上/下一列, 只在水平滚动时生效
29
+ ROW_LOOP: 到达行首/尾后跳转到上/下一行, 只在竖直滚动时生效
30
+ COLUMN_FIND_NEAR: 一列中没有下一个元素时是否跳转到相邻列
31
+ ROW_FIND_NEAR: 一行中没有下一个元素时是否跳转到相邻行
32
+
27
33
  * initFocusId {int} 初始焦点,默认为0
28
34
  * slideSetting {SlideSetting} 页面滑动的设置, 目前SlideSetting有三个子类, 具体见 WidgetCommon 中的说明
29
35
  WholePageSlide
@@ -52,15 +58,16 @@
52
58
  * @params item {object} data中的数据
53
59
  * @return 模板信息,
54
60
  {
55
- left: 绝对布局时的left,
56
- top: 绝对布局时的top,
57
- width: item的宽,
58
- height: item的高,
59
- focusable: item是否可以获得焦点,
60
- marginBottom: item的下方margin,
61
- marginRight: item的右方margin,
62
- findNextAnchor: 自定义上下左右四条边寻找临近item的基准位置,值为0-1 {left: 0.5, right: 0.5, top: 0.5, bottom: 0.5}
63
- doSlide: item获得焦点时是否滚动, 一般用于嵌套的情景, 由内部组件控制滚动
61
+ left {int}: 绝对布局时的left,
62
+ top {int}: 绝对布局时的top,
63
+ width {int}: item的宽,
64
+ height {int}: item的高,
65
+ focusable {boolean}: item是否可以获得焦点,
66
+ marginBottom {int}: item的下方margin,
67
+ marginRight {int}: item的右方margin,
68
+ findNextAnchor {object}: 自定义上下左右四条边寻找临近item的基准位置,值为0-1 {left: 0.5, right: 0.5, top: 0.5, bottom: 0.5}
69
+ doSlide {boolean}: item获得焦点时是否滚动, 一般用于嵌套的情景, 由内部组件控制滚动,
70
+ zIndex {int | object}: item的zIndex, 为object时可以分别设置{focus: 0, normal: 0}, 为number时则同时设置获焦和不获焦的zIndex
64
71
  }
65
72
  *
66
73
  * onFocus {function} 控件获取焦点的回调
@@ -79,6 +86,7 @@
79
86
  * loadAll {boolean} 加载不显示的view,触控场景使用
80
87
  * flingPageWidth {}
81
88
  * flingPageEdge {}
89
+ * disableClip {boolean} 取消显示范围的clipView
82
90
  * methods:
83
91
  getFocusBlockRef 获取此MetroWidget的 jsv-focus-block句柄,可以使用requestFocus完成获焦
84
92
 
@@ -110,9 +118,25 @@
110
118
  @params {int} id 焦点id
111
119
  @params {boolean} needSlide 是否需要滚动
112
120
  @params {boolean} doAnim 滚动时是否做动画
121
+ @params {object} extraSetting 额外的参数设置
122
+ {
123
+ lockChildSlideEvent: {boolean} 设置焦点时忽略子发过来的滚动事件
124
+ }
113
125
  refreshData
114
126
  @description 刷新数据, 只有存在provideData时才会生效
115
127
  @params {boolean} forceUpdate 是否强制刷新
128
+ getVisibleItems
129
+ @description 获取可视item的列表信息
130
+ @return {start: 开始的index, end: 结束的index, dataList: 可视item的数据列表}
131
+ lock
132
+ @description 设置内部的锁
133
+ @params {int} type 锁的类型, 通过|来实现多个类型的复合
134
+ SLIDE: 滚动动画锁
135
+ CHILD_SLIDE_EVENT: 子组件发送的滚动事件锁
136
+ @return {function} 解锁的函数
137
+ unlock
138
+ @description 解锁
139
+ @params {int} type 参考lock的type参数
116
140
  * 【技巧说明】
117
141
  * Q: 插槽props如何使用?
118
142
  * A: data: 当前item的数据
@@ -123,8 +147,6 @@
123
147
  获取 item 相对 MetroWidget 左上角坐标
124
148
  templatePosition: {Function} (index : int) => {left: 0, top: 0, width: 0, height: 0}
125
149
  获取 item 的布局坐标, 一般用于自定义滚动
126
- absolutePosition: {Function} (index : int) => {left: 0, top: 0, width: 0, height: 0}
127
- 获取 item 的绝对坐标, 一般用于控制焦点
128
150
  getCurrentFocusId: {Function} () => {id: 0, index: 0}
129
151
  获取当前焦点信息,id 为在可获得焦点元素列表中的索引,index 为在所有元素列表中的索引
130
152
  slideTo: {Function} (targetPosition : int, doAnim : Boolean) => void
@@ -175,6 +197,7 @@ import { TemplateParser, TemplateItemAdder } from "../TemplateParser";
175
197
  import { PageUpdater } from "./PageUpdater";
176
198
  import { SingleRangeModel } from "../RangeModel";
177
199
  import Dispatcher from "./Dispatcher";
200
+ import { METRO_WIDGET } from "./Const";
178
201
  import {
179
202
  EdgeDirection,
180
203
  VERTICAL,
@@ -381,6 +404,14 @@ const props = defineProps({
381
404
  onScroll: {
382
405
  type: Function,
383
406
  },
407
+ focusMoveType: {
408
+ type: Number,
409
+ default: 0,
410
+ },
411
+ disableClip: {
412
+ type: Boolean,
413
+ default: false,
414
+ },
384
415
  });
385
416
 
386
417
  let dataUpdateToken = ref(0);
@@ -407,8 +438,12 @@ let itemRender = ref(!props.enableItemRenderBreak);
407
438
  let permanentItemList = [];
408
439
  let preUpdateVisibleStart = 0;
409
440
  let mounted = false;
410
- let focusNode = ref(null);
441
+ let focusNode = shallowRef(null);
411
442
  let pageRange = vertical ? props.height : props.width;
443
+
444
+ let slideLock = false;
445
+ let childSlideEventLock = false;
446
+
412
447
  let visibleInfo = {
413
448
  _start: 0,
414
449
  range: 0,
@@ -444,8 +479,8 @@ let visibleInfo = {
444
479
  },
445
480
  };
446
481
 
447
- let locateDiv = ref(null);
448
- let slideDiv = ref(null);
482
+ let locateDiv = shallowRef(null);
483
+ let slideDiv = shallowRef(null);
449
484
  let renderData = shallowRef([]);
450
485
  let slideDivLeft = ref(0);
451
486
  let slideDivTop = ref(0);
@@ -463,7 +498,7 @@ const _onFocusChange = (id) => {
463
498
  const _getCurrentId = () => {
464
499
  return {
465
500
  id: focusId,
466
- index: templateParser.FocusIdToIndex(focusId),
501
+ index: templateParser.IdToIndex(focusId),
467
502
  };
468
503
  };
469
504
 
@@ -489,10 +524,6 @@ const _getTemplatePosition = (index) => {
489
524
  };
490
525
  };
491
526
 
492
- const _getAbsolutePosition = (index, targetEle) => {
493
- return getPositionRelativeToView(innerData[index].itemDivRef, targetEle);
494
- };
495
-
496
527
  const _dispatchEvent = (event) => {
497
528
  switch (event.type) {
498
529
  case Dispatcher.Type.setEnterFocusId:
@@ -539,12 +570,21 @@ const onItemFocus = (index, rect) => {
539
570
  }
540
571
  };
541
572
 
542
- const setFocusId = (id, needSlide = true, doAnim = false) => {
573
+ const setFocusId = (id, needSlide = true, doAnim = false, extraSetting) => {
574
+ if (id == focusId) {
575
+ return;
576
+ }
543
577
  templateItemAdder.tryAddItemById(id);
544
578
  let next_focus_item = templateParser.GetItemById(id);
545
579
  if (next_focus_item) {
546
580
  if (needSlide) {
547
- slideToItem(templateParser.FocusIdToIndex(id), doAnim);
581
+ slideToItem(templateParser.IdToIndex(id), doAnim);
582
+ }
583
+ let unlock = null;
584
+ if (extraSetting) {
585
+ if (extraSetting.lockChildSlideEvent) {
586
+ unlock = lock(METRO_WIDGET.CHILD_SLIDE_EVENT);
587
+ }
548
588
  }
549
589
 
550
590
  const cur_focus_item = templateParser.GetItemById(focusId);
@@ -564,8 +604,39 @@ const setFocusId = (id, needSlide = true, doAnim = false) => {
564
604
  };
565
605
  _updateBlurItem();
566
606
  _updateFocusItem();
567
- onItemBlur(templateParser.FocusIdToIndex(preFocusId));
568
- onItemFocus(templateParser.FocusIdToIndex(focusId), preEdgeRect);
607
+ onItemBlur(templateParser.IdToIndex(preFocusId));
608
+ onItemFocus(templateParser.IdToIndex(focusId), preEdgeRect);
609
+ unlock?.();
610
+ }
611
+ };
612
+
613
+ const lock = (type) => {
614
+ const unlocker = [];
615
+ if (type & METRO_WIDGET.SLIDE) {
616
+ slideLock = true;
617
+ unlocker.push(() => {
618
+ slideLock = false;
619
+ });
620
+ }
621
+ if (type & METRO_WIDGET.CHILD_SLIDE_EVENT) {
622
+ childSlideEventLock = true;
623
+ unlocker.push(() => {
624
+ childSlideEventLock = false;
625
+ });
626
+ }
627
+ return () => {
628
+ unlocker.map((item) => {
629
+ item();
630
+ });
631
+ };
632
+ };
633
+
634
+ const unlock = (type) => {
635
+ if (type & METRO_WIDGET.SLIDE) {
636
+ slideLock = true;
637
+ }
638
+ if (type & METRO_WIDGET.CHILD_SLIDE_EVENT) {
639
+ childSlideEventLock = true;
569
640
  }
570
641
  };
571
642
 
@@ -693,7 +764,8 @@ const refreshData = (force_update) => {
693
764
  dataList,
694
765
  props.measures,
695
766
  pageRange,
696
- _onTemplateAdd
767
+ _onTemplateAdd,
768
+ props.name
697
769
  );
698
770
  }
699
771
  if (need_update_content) {
@@ -740,7 +812,7 @@ const refreshData = (force_update) => {
740
812
  dataUpdateToken.value++;
741
813
  pageUpdater.apply();
742
814
  _updateFocusItem();
743
- onItemFocus(templateParser.FocusIdToIndex(focusId), null);
815
+ onItemFocus(templateParser.IdToIndex(focusId), null);
744
816
  if (needSlide) {
745
817
  _slideTo(visibleInfo.start, null);
746
818
  } else if (need_update_content) {
@@ -748,7 +820,24 @@ const refreshData = (force_update) => {
748
820
  }
749
821
  };
750
822
 
823
+ const getVisibleItems = () => {
824
+ const info = templateParser.GetVisibleItemList(
825
+ visibleInfo.startWithPadding,
826
+ visibleInfo.endWithPadding,
827
+ focusId,
828
+ false,
829
+ null
830
+ );
831
+ return {
832
+ start: info.visibleStart,
833
+ end: info.visibleEnd,
834
+ dataList: dataList.slice(info.visibleStart, info.visibleEnd + 1),
835
+ };
836
+ };
837
+
751
838
  const exportObject = {
839
+ lock,
840
+ unlock,
752
841
  slideTo,
753
842
  setFocusId,
754
843
  getFocusBlockRef,
@@ -757,7 +846,7 @@ const exportObject = {
757
846
  slideToItem,
758
847
  refreshData,
759
848
  _dispatchEvent,
760
- _getAbsolutePosition,
849
+ getVisibleItems,
761
850
  };
762
851
 
763
852
  const _calculateNearestItemByRect = (visible_range, enter_rect_info) => {
@@ -979,7 +1068,7 @@ const onKeyDown = (ev) => {
979
1068
  _moveToNext(horizontal_direction, vertical_direction);
980
1069
  break;
981
1070
  case 13:
982
- onItemClick(templateParser.FocusIdToIndex(focusId));
1071
+ onItemClick(templateParser.IdToIndex(focusId));
983
1072
  break;
984
1073
  default:
985
1074
  //只接受上下左右确定键
@@ -1001,7 +1090,7 @@ const _onTemplateAdd = (item) => {
1001
1090
  data: item,
1002
1091
  index: innerData.length,
1003
1092
  controller: reactive({
1004
- zIndex: 0,
1093
+ zIndex: item.normalZIndex >= 0 ? item.normalZIndex : 0,
1005
1094
  }),
1006
1095
  mounted: false,
1007
1096
  itemDivRef: null,
@@ -1019,7 +1108,7 @@ const _onTemplateAdd = (item) => {
1019
1108
  this.slotMounted.value = true;
1020
1109
  if (callFocusAfterUpdate && this.data.id === focusId) {
1021
1110
  nextTick(() => {
1022
- onItemFocus(templateParser.FocusIdToIndex(focusId), preEdgeRect);
1111
+ onItemFocus(templateParser.IdToIndex(focusId), preEdgeRect);
1023
1112
  });
1024
1113
  callFocusAfterUpdate = false;
1025
1114
  }
@@ -1059,7 +1148,6 @@ const _onTemplateAdd = (item) => {
1059
1148
  index: item.index,
1060
1149
  position: _getPosition,
1061
1150
  templatePosition: _getTemplatePosition,
1062
- absolutePosition: _getAbsolutePosition,
1063
1151
  getCurrentFocusId: _getCurrentId,
1064
1152
  slideTo: slideTo,
1065
1153
  },
@@ -1094,6 +1182,9 @@ const _itemOnFocusSideEffect = (item, edgeRect) => {
1094
1182
 
1095
1183
  const _onCustomerEvent = (ev) => {
1096
1184
  if (ev.type === "focusRect") {
1185
+ if (childSlideEventLock) {
1186
+ return true;
1187
+ }
1097
1188
  if (ev.ownerNode == exportObject) {
1098
1189
  return false;
1099
1190
  }
@@ -1122,7 +1213,9 @@ const _onCustomerEvent = (ev) => {
1122
1213
  yPos: item_layout.top,
1123
1214
  width: item_layout.width,
1124
1215
  height: item_layout.height,
1125
- index: templateParser.FocusIdToIndex(focusId),
1216
+ centerYPos: Math.floor(item_layout.top + item_layout.height / 2),
1217
+ centerXPos: Math.floor(item_layout.left + item_layout.width / 2),
1218
+ index: templateParser.IdToIndex(focusId),
1126
1219
  };
1127
1220
 
1128
1221
  let cur_slide = _calculateVisibleStart(obj, direction);
@@ -1168,15 +1261,14 @@ const _moveToNext = (
1168
1261
  item_edge_rect
1169
1262
  ) => {
1170
1263
  let cur_focus_item = templateParser.GetItemById(focusId);
1171
- let next_item_id = templateParser.GetNextItem(
1264
+ let next_focus_item = templateParser.GetNextItem(
1172
1265
  focusId,
1173
1266
  vertical_direction,
1174
1267
  horizontal_direction,
1175
- props.loopFocus
1268
+ props.focusMoveType
1176
1269
  );
1177
- if (next_item_id >= 0) {
1270
+ if (next_focus_item !== null) {
1178
1271
  preFocusId = focusId;
1179
- let next_focus_item = templateParser.GetItemById(next_item_id);
1180
1272
  templateItemAdder.tryAddItem(next_focus_item, 1);
1181
1273
  focusId = next_focus_item.id;
1182
1274
 
@@ -1185,8 +1277,7 @@ const _moveToNext = (
1185
1277
 
1186
1278
  let cur_visible_start = _calculateVisibleStart(next_focus_item, direction);
1187
1279
  if (
1188
- !innerData[templateParser.FocusIdToIndex(next_item_id)].itemConfig
1189
- ?.takeOverSlide &&
1280
+ !innerData[templateParser.IdToIndex(focusId)].itemConfig?.takeOverSlide &&
1190
1281
  visibleInfo.start !== cur_visible_start
1191
1282
  ) {
1192
1283
  if (next_focus_item.doSlide) {
@@ -1198,21 +1289,31 @@ const _moveToNext = (
1198
1289
  onend: _onSlideEnd,
1199
1290
  };
1200
1291
  _slideTo(visibleInfo.start, animObj);
1292
+ pageUpdater.update(
1293
+ templateParser,
1294
+ visibleInfo.startWithPadding - props.keepTraceRange * pageRange,
1295
+ Math.min(
1296
+ visibleInfo.startMax +
1297
+ visibleInfo.range +
1298
+ visibleInfo.padding.end -
1299
+ 1,
1300
+ visibleInfo.endWithPadding + props.keepTraceRange * pageRange
1301
+ ),
1302
+ next_focus_item.id,
1303
+ false,
1304
+ permanentItemList
1305
+ );
1306
+ } else {
1307
+ //不做滚动时,保证获焦的item创建
1308
+ pageUpdater.update(
1309
+ templateParser,
1310
+ cur_visible_start,
1311
+ cur_visible_start + visibleInfo.range + visibleInfo.padding.end - 1,
1312
+ next_focus_item.id,
1313
+ false,
1314
+ permanentItemList
1315
+ );
1201
1316
  }
1202
- pageUpdater.update(
1203
- templateParser,
1204
- visibleInfo.startWithPadding - props.keepTraceRange * pageRange,
1205
- Math.min(
1206
- visibleInfo.startMax +
1207
- visibleInfo.range +
1208
- visibleInfo.padding.end -
1209
- 1,
1210
- visibleInfo.endWithPadding + props.keepTraceRange * pageRange
1211
- ),
1212
- next_item_id,
1213
- false,
1214
- permanentItemList
1215
- );
1216
1317
  pageUpdater.applyTmp();
1217
1318
  }
1218
1319
 
@@ -1247,8 +1348,8 @@ const _moveToNext = (
1247
1348
  preEdgeRect = rect;
1248
1349
  _updateBlurItem();
1249
1350
  _updateFocusItem();
1250
- onItemBlur(templateParser.FocusIdToIndex(preFocusId));
1251
- onItemFocus(templateParser.FocusIdToIndex(focusId), preEdgeRect);
1351
+ onItemBlur(templateParser.IdToIndex(preFocusId));
1352
+ onItemFocus(templateParser.IdToIndex(focusId), preEdgeRect);
1252
1353
  } else {
1253
1354
  let x_off_set = props.direction === VERTICAL ? 0 : visibleInfo.start;
1254
1355
  let y_off_set = props.direction === VERTICAL ? visibleInfo.start : 0;
@@ -1272,7 +1373,7 @@ const _moveToNext = (
1272
1373
  height: cur_focus_item.height,
1273
1374
  };
1274
1375
  props.onEdge?.({ direction: edge, rect: rect });
1275
- innerData[templateParser.FocusIdToIndex(focusId)].callbacks.onWidgetEdge?.({
1376
+ innerData[templateParser.IdToIndex(focusId)].callbacks.onWidgetEdge?.({
1276
1377
  direction: edge,
1277
1378
  });
1278
1379
  }
@@ -1298,45 +1399,63 @@ const _calculateVisibleStart = (target_item, direction) => {
1298
1399
  );
1299
1400
  break;
1300
1401
  case SlideSetting.Type.WHOLE_PAGE:
1301
- new_visible_start = templateParser.GetItem(target_item.pageHeadIndex)[
1302
- pos_key
1303
- ];
1402
+ if (typeof target_item.pageHeadIndex == "undefined") {
1403
+ //TODO 子控制滚动时whole page滚动
1404
+ console.error(
1405
+ "child controlled whole page slide type is not supported."
1406
+ );
1407
+ } else {
1408
+ new_visible_start = templateParser.GetItem(target_item.pageHeadIndex)[
1409
+ pos_key
1410
+ ];
1411
+ }
1412
+
1304
1413
  break;
1305
1414
  case SlideSetting.Type.SEAMLESS:
1306
- if (direction > 0) {
1307
- if (
1308
- target_item[pos_key] + target_item[size_key] >
1309
- visibleInfo.start + visibleInfo.range * props.slideSetting.EndPercent
1310
- ) {
1311
- new_visible_start =
1312
- target_item[pos_key] +
1313
- target_item[size_key] -
1314
- visibleInfo.range * props.slideSetting.EndPercent;
1315
- }
1316
- } else if (direction < 0) {
1317
- if (
1318
- target_item[pos_key] <
1319
- visibleInfo.start +
1320
- visibleInfo.range * props.slideSetting.StartPercent
1321
- ) {
1322
- new_visible_start =
1323
- target_item[pos_key] -
1324
- visibleInfo.range * props.slideSetting.StartPercent;
1325
- }
1415
+ if (
1416
+ target_item[size_key] >=
1417
+ visibleInfo.range *
1418
+ (props.slideSetting.EndPercent - props.slideSetting.StartPercent)
1419
+ ) {
1420
+ //尺寸较大的item
1421
+ new_visible_start = target_item[center_key] - visibleInfo.range * 0.5;
1326
1422
  } else {
1327
- //不是沿widget方向的移动
1328
- if (target_item[pos_key] < visibleInfo.start) {
1329
- new_visible_start =
1330
- target_item[pos_key] -
1331
- visibleInfo.range * props.slideSetting.StartPercent;
1332
- } else if (
1333
- target_item[pos_key] + target_item[size_key] >
1334
- visibleInfo.end
1335
- ) {
1336
- new_visible_start =
1337
- target_item[pos_key] +
1338
- target_item[size_key] -
1339
- visibleInfo.range * props.slideSetting.EndPercent;
1423
+ if (direction > 0) {
1424
+ if (
1425
+ target_item[pos_key] + target_item[size_key] >
1426
+ visibleInfo.start +
1427
+ visibleInfo.range * props.slideSetting.EndPercent
1428
+ ) {
1429
+ new_visible_start =
1430
+ target_item[pos_key] +
1431
+ target_item[size_key] -
1432
+ visibleInfo.range * props.slideSetting.EndPercent;
1433
+ }
1434
+ } else if (direction < 0) {
1435
+ if (
1436
+ target_item[pos_key] <
1437
+ visibleInfo.start +
1438
+ visibleInfo.range * props.slideSetting.StartPercent
1439
+ ) {
1440
+ new_visible_start =
1441
+ target_item[pos_key] -
1442
+ visibleInfo.range * props.slideSetting.StartPercent;
1443
+ }
1444
+ } else {
1445
+ //不是沿widget方向的移动
1446
+ if (target_item[pos_key] < visibleInfo.start) {
1447
+ new_visible_start =
1448
+ target_item[pos_key] -
1449
+ visibleInfo.range * props.slideSetting.StartPercent;
1450
+ } else if (
1451
+ target_item[pos_key] + target_item[size_key] >
1452
+ visibleInfo.end
1453
+ ) {
1454
+ new_visible_start =
1455
+ target_item[pos_key] +
1456
+ target_item[size_key] -
1457
+ visibleInfo.range * props.slideSetting.EndPercent;
1458
+ }
1340
1459
  }
1341
1460
  }
1342
1461
  break;
@@ -1403,9 +1522,16 @@ const _ifValidEnterRect = (rect_info) => {
1403
1522
  return rect_info && rect_info.direction && rect_info.rect;
1404
1523
  };
1405
1524
 
1406
- const _setZIndex = (index, z_index) => {
1525
+ const _setZIndex = (index, z_index, is_focus) => {
1407
1526
  if (innerData[index]) {
1408
- innerData[index].controller.zIndex = z_index;
1527
+ let data = innerData[index].data,
1528
+ i = z_index;
1529
+ if (is_focus && data.focusZIndex >= 0) {
1530
+ i = data.focusZIndex;
1531
+ } else if (data.normalZIndex >= 0) {
1532
+ i = data.normalZIndex;
1533
+ }
1534
+ innerData[index].controller.zIndex = i;
1409
1535
  }
1410
1536
  };
1411
1537
 
@@ -1430,7 +1556,7 @@ const _onFocus = (params) => {
1430
1556
  enterFocusId = -1;
1431
1557
  enterFocusRect = null;
1432
1558
  _updateFocusItem();
1433
- onItemFocus(templateParser.FocusIdToIndex(focusId), preEdgeRect);
1559
+ onItemFocus(templateParser.IdToIndex(focusId), preEdgeRect);
1434
1560
  props.onFocus?.();
1435
1561
  };
1436
1562
 
@@ -1444,7 +1570,7 @@ const _onBlur = () => {
1444
1570
  }
1445
1571
  preFocusId = focusId;
1446
1572
  _updateBlurItem();
1447
- innerData[templateParser.FocusIdToIndex(preFocusId)].callbacks.onBlur();
1573
+ innerData[templateParser.IdToIndex(preFocusId)].callbacks.onBlur();
1448
1574
 
1449
1575
  props.onBlur?.();
1450
1576
  };
@@ -1457,11 +1583,11 @@ const _onSlideEnd = (event) => {
1457
1583
  };
1458
1584
 
1459
1585
  const _updateFocusItem = () => {
1460
- _setZIndex(templateParser.FocusIdToIndex(focusId), innerData.length);
1586
+ _setZIndex(templateParser.IdToIndex(focusId), innerData.length, true);
1461
1587
  };
1462
1588
 
1463
1589
  const _updateBlurItem = () => {
1464
- _setZIndex(templateParser.FocusIdToIndex(preFocusId), 0);
1590
+ _setZIndex(templateParser.IdToIndex(preFocusId), 0, false);
1465
1591
  };
1466
1592
 
1467
1593
  const _updateFocusByDragInfo = (viewX, viewY) => {
@@ -1607,21 +1733,23 @@ const _onScroll = () => {
1607
1733
 
1608
1734
  //之前rootview相关的代码
1609
1735
  const _updatePosition = (x, y, anim_info) => {
1736
+ if (slideLock) return;
1610
1737
  if (toRaw(slideDiv.value)) {
1611
- let pre_pos = toRaw(slideDiv.value).jsvMaskView.GetLayoutParams();
1738
+ let pre_left = slideDivLeft.value,
1739
+ pre_top = slideDivTop.value;
1612
1740
  //jsvMaskView的位置更新时会被设置位0,因此不能通过ResetLayoutParams设置位置
1613
1741
  slideDivLeft.value = x;
1614
1742
  slideDivTop.value = y;
1615
1743
  if (anim_info) {
1616
- let delta_x = Math.abs(pre_pos.MarginLeft - x);
1617
- let delta_y = Math.abs(pre_pos.MarginTop - y);
1744
+ let delta_x = Math.abs(pre_left - x);
1745
+ let delta_y = Math.abs(pre_top - y);
1618
1746
  let duration = Math.round(
1619
1747
  delta_x === 0 ? delta_y / anim_info.speed : delta_x / anim_info.speed
1620
1748
  );
1621
1749
  let slide_animation = new Forge.TranslateAnimation(
1622
- pre_pos.MarginLeft - x,
1750
+ pre_left - x,
1623
1751
  0,
1624
- pre_pos.MarginTop - y,
1752
+ pre_top - y,
1625
1753
  0,
1626
1754
  duration,
1627
1755
  anim_info.easing
@@ -1629,7 +1757,9 @@ const _updatePosition = (x, y, anim_info) => {
1629
1757
  slide_animation.SetAnimationListener(
1630
1758
  new Forge.AnimationListener(anim_info.onstart, anim_info.onend, null)
1631
1759
  );
1632
- toRaw(slideDiv.value).jsvMaskView.StartAnimation(slide_animation);
1760
+ toRaw(slideDiv.value)
1761
+ .jsvGetProxyView(true)
1762
+ .StartAnimation(slide_animation);
1633
1763
  }
1634
1764
  _onScroll();
1635
1765
  }
@@ -1637,7 +1767,7 @@ const _updatePosition = (x, y, anim_info) => {
1637
1767
 
1638
1768
  const _initRootTouch = () => {
1639
1769
  if (props.enableTouch && toRaw(slideDiv.value)) {
1640
- let view = toRaw(slideDiv.value).jsvMaskView;
1770
+ let view = toRaw(slideDiv.value).jsvGetProxyView(true);
1641
1771
  var drag_setting = new Forge.DragSetting(
1642
1772
  dragDirection,
1643
1773
  20,
@@ -1654,7 +1784,7 @@ const _initItemViewTouch = (itemDivRef, index) => {
1654
1784
  if (props.enableTouch) {
1655
1785
  if (itemDivRef) {
1656
1786
  // 为view添加触控处理
1657
- let view = itemDivRef.jsvMaskView;
1787
+ let view = itemDivRef.jsvGetProxyView(true);
1658
1788
  let dragSetting = new Forge.DragSetting(
1659
1789
  Forge.DragSetting.DIRECTION_DISABLE,
1660
1790
  20,
@@ -1703,12 +1833,14 @@ templateParser = _getTemplateParser(
1703
1833
  props.supportHistoryPath,
1704
1834
  props.layoutType
1705
1835
  );
1836
+
1706
1837
  templateItemAdder = new TemplateItemAdder(
1707
1838
  templateParser,
1708
1839
  dataList,
1709
1840
  props.measures,
1710
1841
  pageRange,
1711
- _onTemplateAdd
1842
+ _onTemplateAdd,
1843
+ props.name
1712
1844
  );
1713
1845
  if (props.onScroll) {
1714
1846
  templateItemAdder.tryAddItemByIndex(dataList.length - 1);
@@ -1740,12 +1872,14 @@ slidePile = new Forge.RectArea(
1740
1872
  let init_focus_id = 0;
1741
1873
  let cur_visible_start = 0;
1742
1874
 
1743
- if (props.initFocusId) {
1875
+ if (typeof props.initFocusId == "number") {
1744
1876
  templateItemAdder.tryAddItemById(props.initFocusId);
1745
1877
  const item = templateParser.GetItemById(props.initFocusId);
1746
1878
  if (item) {
1747
1879
  init_focus_id = props.initFocusId;
1748
- cur_visible_start = _calculateVisibleStart(item, 1);
1880
+ if (item.doSlide) {
1881
+ cur_visible_start = _calculateVisibleStart(item, 1);
1882
+ }
1749
1883
  }
1750
1884
  }
1751
1885
  focusId = init_focus_id;
@@ -1776,7 +1910,7 @@ onMounted(() => {
1776
1910
  _slideTo(visibleInfo.start, null);
1777
1911
  }
1778
1912
 
1779
- onItemFocus(templateParser.FocusIdToIndex(focusId), preEdgeRect);
1913
+ onItemFocus(templateParser.IdToIndex(focusId), preEdgeRect);
1780
1914
 
1781
1915
  if (props.enableItemRenderBreak) {
1782
1916
  nextTick(() => {
@@ -1810,7 +1944,7 @@ defineExpose(exportObject);
1810
1944
  top: top,
1811
1945
  width: width,
1812
1946
  height: height,
1813
- overflow: 'hidden',
1947
+ overflow: disableClip ? null : 'hidden',
1814
1948
  }"
1815
1949
  >
1816
1950
  <div :style="{ left: innerPadding.left, top: innerPadding.top }">