@shijiu/jsview-vue 0.9.602 → 0.9.684

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 (86) 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/target_core_revision.js +4 -4
  5. package/package.json +1 -1
  6. package/samples/Basic/components/text/TextOverflow.vue +10 -5
  7. package/samples/Collision/App.vue +452 -0
  8. package/samples/DemoHomepage/components/BodyFrame.vue +2 -0
  9. package/samples/DemoHomepage/router.js +25 -0
  10. package/samples/DemoHomepage/views/Homepage.vue +3 -10
  11. package/samples/ImpactStop/App.vue +435 -0
  12. package/samples/Input/App.vue +8 -17
  13. package/samples/Input/InputPanel.vue +18 -11
  14. package/samples/Marquee/App.vue +176 -40
  15. package/samples/Marquee/longText.js +14 -0
  16. package/samples/MetroWidgetDemos/Advanced/App.vue +5 -6
  17. package/samples/MetroWidgetDemos/Advanced/ButtonItem.vue +1 -1
  18. package/samples/MetroWidgetDemos/Advanced/Buttons.vue +5 -5
  19. package/samples/MetroWidgetDemos/Advanced/Mixed.vue +4 -4
  20. package/samples/MetroWidgetDemos/Advanced/widgets/Item.vue +83 -0
  21. package/samples/MetroWidgetDemos/Advanced/widgets/WidgetItem.vue +89 -0
  22. package/samples/MetroWidgetDemos/Advanced/{Widgets.vue → widgets/Widgets.vue} +56 -11
  23. package/samples/MetroWidgetDemos/Advanced/widgets/focus1.png +0 -0
  24. package/samples/MetroWidgetDemos/Item.vue +20 -2
  25. package/samples/MetroWidgetDemos/PingPong/App.vue +3 -3
  26. package/samples/MetroWidgetDemos/PingPong/AppPage.vue +17 -2
  27. package/samples/MetroWidgetDemos/PingPong/AppTab.vue +3 -10
  28. package/samples/MetroWidgetDemos/PingPong/{Item.vue → TabItem.vue} +2 -10
  29. package/samples/MetroWidgetDemos/PingPong/ViewSwiper.vue +2 -2
  30. package/samples/MetroWidgetDemos/Simple/AbsoluteTemplate.vue +2 -2
  31. package/samples/MetroWidgetDemos/Simple/App.vue +2 -2
  32. package/samples/MetroWidgetDemos/Simple/RelativeTemplate.vue +4 -4
  33. package/samples/MetroWidgetDemos/data.js +2 -1
  34. package/samples/Preload/App.vue +16 -11
  35. package/samples/ScaleDownNeon/App.vue +107 -0
  36. package/samples/TextBox/App.vue +7 -81
  37. package/samples/TextBox/RenderCenter.vue +40 -16
  38. package/samples/TextBox/RenderLeft.vue +48 -19
  39. package/samples/TextBox/RenderOneLine.vue +30 -49
  40. package/samples/TextBox/RenderRight.vue +40 -16
  41. package/samples/TextShadowDemo/App.vue +11 -17
  42. package/samples/TextureAnimation/App2.vue +111 -0
  43. package/samples/TextureAnimation/assets/blackWhiteGrid.png +0 -0
  44. package/samples/TextureAnimation/assets/light.png +0 -0
  45. package/samples/TextureAnimation/assets/light2.png +0 -0
  46. package/samples/TextureAnimation/assets/mask.png +0 -0
  47. package/samples/TextureSize/App.vue +3 -3
  48. package/samples/VisibleSensorDemo/App.vue +92 -25
  49. package/utils/JsViewEngineWidget/MetroWidget/Const.js +11 -0
  50. package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +188 -80
  51. package/utils/JsViewEngineWidget/TemplateParser.js +89 -32
  52. package/utils/JsViewEngineWidget/WidgetCommon.js +3 -4
  53. package/utils/JsViewEngineWidget/index.js +3 -2
  54. package/utils/JsViewPlugin/JsvPlayer/JsvMedia.js +95 -12
  55. package/utils/JsViewPlugin/JsvPlayer/JsvPlayer.vue +25 -3
  56. package/utils/JsViewPlugin/JsvPlayer/index.js +22 -1
  57. package/utils/JsViewPlugin/JsvPlayer/version.js +4 -4
  58. package/utils/JsViewVueTools/JsvImpactTracer.js +113 -0
  59. package/utils/JsViewVueTools/index.js +2 -1
  60. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserPreload.vue +11 -1
  61. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserTextureAnim.vue +203 -14
  62. package/utils/JsViewVueWidget/JsvActorMove/JsvActorMove.vue +2 -2
  63. package/utils/JsViewVueWidget/JsvInput/Cursor.vue +4 -2
  64. package/utils/JsViewVueWidget/JsvInput/JsvInput.vue +13 -12
  65. package/utils/JsViewVueWidget/JsvMarquee.vue +178 -205
  66. package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +35 -27
  67. package/utils/JsViewVueWidget/JsvNinePatch.vue +1 -2
  68. package/utils/JsViewVueWidget/JsvPreload/JsvPreload.vue +37 -41
  69. package/utils/JsViewVueWidget/JsvSpriteAnim/JsvSpriteAnim.vue +282 -285
  70. package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +18 -2
  71. package/utils/JsViewVueWidget/JsvSwiper3D/JsvSwiper.vue +22 -2
  72. package/utils/JsViewVueWidget/JsvTextBox.vue +35 -72
  73. package/utils/JsViewVueWidget/JsvTextureAnim/JsvTextureAnim.vue +123 -46
  74. package/utils/JsViewVueWidget/JsvTextureAnim/index.js +9 -5
  75. package/utils/JsViewVueWidget/JsvTouchContainer.vue +3 -4
  76. package/utils/JsViewVueWidget/JsvVideo.vue +9 -12
  77. package/utils/JsViewVueWidget/index.js +2 -2
  78. package/utils/JsViewVueWidget/utils/index.js +8 -0
  79. package/utils/JsViewVueWidget/utils/text.js +19 -0
  80. package/utils/JsViewEngineWidget/MetroPage.js +0 -2128
  81. package/utils/JsViewEngineWidget/SimpleWidget/ContentView.vue +0 -51
  82. package/utils/JsViewEngineWidget/SimpleWidget/Dispatcher.js +0 -19
  83. package/utils/JsViewEngineWidget/SimpleWidget/DivWrapper.vue +0 -53
  84. package/utils/JsViewEngineWidget/SimpleWidget/ItemView.vue +0 -142
  85. package/utils/JsViewEngineWidget/SimpleWidget/RootView.vue +0 -140
  86. package/utils/JsViewEngineWidget/SimpleWidget/SimpleWidget.vue +0 -1629
@@ -1,22 +1,15 @@
1
1
  <script setup>
2
- import { reactive, onMounted, ref } from "vue";
2
+ import { watch, reactive, onMounted, ref } from "vue";
3
3
  import { useRouter } from "vue-router";
4
4
  import { jJsvRuntimeBridge, JsvVisibleSensor } from "jsview";
5
5
 
6
6
  const BOX_WIDTH = 150;
7
7
  const BOX_HEIGHT = 150;
8
- const BOX_COLOR = "#00FFFF";
8
+ const BOX_COLOR = "rgba(0,255,255,0.6)";
9
+ const VISIBLE_RANGE = 0.25;
9
10
 
10
11
  const router = useRouter();
11
12
 
12
- let shown = reactive({
13
- vertical: 0.25,
14
- horizon: 1.0,
15
- });
16
-
17
- let left_change = reactive({ left: 0 });
18
- let top_change = reactive({ top: 0 });
19
-
20
13
  const containerRef = ref(null);
21
14
  let case_config = ref(null);
22
15
  let status_text = reactive({
@@ -26,12 +19,24 @@ let status_text = reactive({
26
19
  newV: "false",
27
20
  });
28
21
 
29
- case_config.value = getTestCase(0);
22
+ let test_case_type = ref(0);
23
+
24
+ window.LudlTestCase = test_case_type;
25
+
26
+ case_config.value = getTestCase(test_case_type.value);
27
+
28
+ watch(test_case_type, () => {
29
+ case_config.value = getTestCase(test_case_type.value);
30
+ });
30
31
 
31
32
  onMounted(() => {
32
33
  jJsvRuntimeBridge.notifyPageLoaded();
33
34
  });
34
35
 
36
+ // const onAnimDone = () => {
37
+ // test_case_type.value = (test_case_type.value + 1) % 2;
38
+ // };
39
+
35
40
  // 内部接口
36
41
  const onBeVisible = (old_h, new_h, old_v, new_v) => {
37
42
  status_text.oldH = old_h ? "true" : "false";
@@ -46,6 +51,9 @@ const onKeyDown = (ev) => {
46
51
  router?.go(-1); // 有router时,回退
47
52
  return true;
48
53
  }
54
+ if (ev.keyCode == 13) {
55
+ test_case_type.value = (test_case_type.value + 1) % 2;
56
+ }
49
57
  return false;
50
58
  };
51
59
 
@@ -60,17 +68,17 @@ function getTestCase(test_index) {
60
68
  switch (test_index) {
61
69
  case 0: {
62
70
  // 上到下
63
- test_config.animation = "visibleSensor_upDown 5s infinite linear";
71
+ test_config.animation = "visibleSensor_upDown 8s infinite linear";
64
72
  test_config.text = "从上到下";
65
73
  test_config.horizon = 1.0;
66
- test_config.vertical = 0.25;
74
+ test_config.vertical = VISIBLE_RANGE;
67
75
  break;
68
76
  }
69
77
  case 1: {
70
78
  // 左到右
71
- test_config.animation = "visibleSensor_leftRight 5s infinite linear";
79
+ test_config.animation = "visibleSensor_leftRight 8s infinite linear";
72
80
  test_config.text = "从左到右";
73
- test_config.horizon = 0.25;
81
+ test_config.horizon = VISIBLE_RANGE;
74
82
  test_config.vertical = 1.0;
75
83
  break;
76
84
  }
@@ -87,7 +95,7 @@ function getTestCase(test_index) {
87
95
  :style="{
88
96
  left: 10,
89
97
  top: 10,
90
- height: 100,
98
+ height: 120,
91
99
  width: 900,
92
100
  fontColor: '#000000',
93
101
  fontSize: 15,
@@ -95,7 +103,8 @@ function getTestCase(test_index) {
95
103
  }"
96
104
  >
97
105
  {{
98
- `new horizon: ${status_text.newH}
106
+ `按OK键切换方向
107
+ new horizon: ${status_text.newH}
99
108
  new vertical: ${status_text.newV}
100
109
  -------
101
110
  old horizon: ${status_text.oldH}
@@ -106,12 +115,34 @@ old vertical: ${status_text.oldV}`
106
115
  ref="containerRef"
107
116
  :style="{
108
117
  left: 240,
109
- top: 110,
110
- width: 800,
111
- height: 500,
118
+ top: 180,
119
+ width: 300,
120
+ height: 300,
112
121
  backgroundColor: '#00F0F0',
113
122
  }"
114
123
  >
124
+ <div
125
+ :style="{
126
+ left: 50,
127
+ top: 50,
128
+ width: 200,
129
+ height: 200,
130
+ backgroundColor: '#00AAAA',
131
+ zIndex: test_case_type == 0 ? -22 : 0,
132
+ }"
133
+ />
134
+
135
+ <div
136
+ :style="{
137
+ left: 80,
138
+ top: 30,
139
+ width: 140,
140
+ height: 240,
141
+ backgroundColor: '#0000AA',
142
+ zIndex: test_case_type == 0 ? -33 : 0,
143
+ }"
144
+ />
145
+
115
146
  <div
116
147
  :style="{
117
148
  left: 0,
@@ -128,6 +159,40 @@ old vertical: ${status_text.oldV}`
128
159
  :container="containerRef"
129
160
  :callback="onBeVisible"
130
161
  >
162
+ <div v-if="test_case_type == 0">
163
+ <div
164
+ :style="{
165
+ width: BOX_WIDTH,
166
+ height: BOX_HEIGHT * VISIBLE_RANGE,
167
+ backgroundColor: '#FF0000',
168
+ }"
169
+ />
170
+ <div
171
+ :style="{
172
+ top: BOX_HEIGHT * (1 - VISIBLE_RANGE),
173
+ width: BOX_WIDTH,
174
+ height: BOX_HEIGHT * VISIBLE_RANGE,
175
+ backgroundColor: '#FF0000',
176
+ }"
177
+ />
178
+ </div>
179
+ <div v-else>
180
+ <div
181
+ :style="{
182
+ width: BOX_WIDTH * VISIBLE_RANGE,
183
+ height: BOX_HEIGHT,
184
+ backgroundColor: '#FF0000',
185
+ }"
186
+ />
187
+ <div
188
+ :style="{
189
+ left: BOX_WIDTH * (1 - VISIBLE_RANGE),
190
+ width: BOX_WIDTH * VISIBLE_RANGE,
191
+ height: BOX_HEIGHT,
192
+ backgroundColor: '#FF0000',
193
+ }"
194
+ />
195
+ </div>
131
196
  <div
132
197
  :style="{
133
198
  width: BOX_WIDTH,
@@ -137,7 +202,9 @@ old vertical: ${status_text.oldV}`
137
202
  lineHeight: 30,
138
203
  }"
139
204
  >
140
- {{ case_config.text }}
205
+ {{
206
+ `${case_config.text}\nH:${status_text.newH}\nV:${status_text.newV}`
207
+ }}
141
208
  </div>
142
209
  </JsvVisibleSensor>
143
210
  </div>
@@ -149,19 +216,19 @@ old vertical: ${status_text.oldV}`
149
216
  <style scoped>
150
217
  @keyframes visibleSensor_upDown {
151
218
  from {
152
- transform: translate3d(300px, -200px, 0);
219
+ transform: translate3d(75px, -180px, 0);
153
220
  }
154
221
  to {
155
- transform: translate3d(300px, 600px, 0);
222
+ transform: translate3d(75px, 330px, 0);
156
223
  }
157
224
  }
158
225
 
159
226
  @keyframes visibleSensor_leftRight {
160
227
  from {
161
- transform: translate3d(-160px, 200px, 0);
228
+ transform: translate3d(-180px, 75px, 0);
162
229
  }
163
230
  to {
164
- transform: translate3d(1400px, 200px, 0);
231
+ transform: translate3d(330px, 75px, 0);
165
232
  }
166
233
  }
167
234
  </style>
@@ -0,0 +1,11 @@
1
+ /*
2
+ * @Author: ChenChanghua
3
+ * @Date: 2022-09-21 10:09:15
4
+ * @LastEditors: ChenChanghua
5
+ * @LastEditTime: 2022-09-21 10:15:34
6
+ * @Description: file content
7
+ */
8
+ export const METRO_WIDGET = {
9
+ SLIDE: 0x1,
10
+ CHILD_SLIDE_EVENT: 0x1 << 1,
11
+ };
@@ -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-11-07 15:51:14
6
6
  * @Description: file content
7
7
  -->
8
8
 
@@ -52,15 +52,16 @@
52
52
  * @params item {object} data中的数据
53
53
  * @return 模板信息,
54
54
  {
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获得焦点时是否滚动, 一般用于嵌套的情景, 由内部组件控制滚动
55
+ left {int}: 绝对布局时的left,
56
+ top {int}: 绝对布局时的top,
57
+ width {int}: item的宽,
58
+ height {int}: item的高,
59
+ focusable {boolean}: item是否可以获得焦点,
60
+ marginBottom {int}: item的下方margin,
61
+ marginRight {int}: item的右方margin,
62
+ findNextAnchor {object}: 自定义上下左右四条边寻找临近item的基准位置,值为0-1 {left: 0.5, right: 0.5, top: 0.5, bottom: 0.5}
63
+ doSlide {boolean}: item获得焦点时是否滚动, 一般用于嵌套的情景, 由内部组件控制滚动,
64
+ zIndex {int | object}: item的zIndex, 为object时可以分别设置{focus: 0, normal: 0}, 为number时则同时设置获焦和不获焦的zIndex
64
65
  }
65
66
  *
66
67
  * onFocus {function} 控件获取焦点的回调
@@ -110,9 +111,25 @@
110
111
  @params {int} id 焦点id
111
112
  @params {boolean} needSlide 是否需要滚动
112
113
  @params {boolean} doAnim 滚动时是否做动画
114
+ @params {object} extraSetting 额外的参数设置
115
+ {
116
+ lockChildSlideEvent: {boolean} 设置焦点时忽略子发过来的滚动事件
117
+ }
113
118
  refreshData
114
119
  @description 刷新数据, 只有存在provideData时才会生效
115
120
  @params {boolean} forceUpdate 是否强制刷新
121
+ getVisibleItems
122
+ @description 获取可视item的列表信息
123
+ @return {start: 开始的index, end: 结束的index, dataList: 可视item的数据列表}
124
+ lock
125
+ @description 设置内部的锁
126
+ @params {int} type 锁的类型, 通过|来实现多个类型的复合
127
+ SLIDE: 滚动动画锁
128
+ CHILD_SLIDE_EVENT: 子组件发送的滚动事件锁
129
+ @return {function} 解锁的函数
130
+ unlock
131
+ @description 解锁
132
+ @params {int} type 参考lock的type参数
116
133
  * 【技巧说明】
117
134
  * Q: 插槽props如何使用?
118
135
  * A: data: 当前item的数据
@@ -123,8 +140,6 @@
123
140
  获取 item 相对 MetroWidget 左上角坐标
124
141
  templatePosition: {Function} (index : int) => {left: 0, top: 0, width: 0, height: 0}
125
142
  获取 item 的布局坐标, 一般用于自定义滚动
126
- absolutePosition: {Function} (index : int) => {left: 0, top: 0, width: 0, height: 0}
127
- 获取 item 的绝对坐标, 一般用于控制焦点
128
143
  getCurrentFocusId: {Function} () => {id: 0, index: 0}
129
144
  获取当前焦点信息,id 为在可获得焦点元素列表中的索引,index 为在所有元素列表中的索引
130
145
  slideTo: {Function} (targetPosition : int, doAnim : Boolean) => void
@@ -175,6 +190,7 @@ import { TemplateParser, TemplateItemAdder } from "../TemplateParser";
175
190
  import { PageUpdater } from "./PageUpdater";
176
191
  import { SingleRangeModel } from "../RangeModel";
177
192
  import Dispatcher from "./Dispatcher";
193
+ import { METRO_WIDGET } from "./Const";
178
194
  import {
179
195
  EdgeDirection,
180
196
  VERTICAL,
@@ -409,6 +425,10 @@ let preUpdateVisibleStart = 0;
409
425
  let mounted = false;
410
426
  let focusNode = ref(null);
411
427
  let pageRange = vertical ? props.height : props.width;
428
+
429
+ let slideLock = false;
430
+ let childSlideEventLock = false;
431
+
412
432
  let visibleInfo = {
413
433
  _start: 0,
414
434
  range: 0,
@@ -489,10 +509,6 @@ const _getTemplatePosition = (index) => {
489
509
  };
490
510
  };
491
511
 
492
- const _getAbsolutePosition = (index, targetEle) => {
493
- return getPositionRelativeToView(innerData[index].itemDivRef, targetEle);
494
- };
495
-
496
512
  const _dispatchEvent = (event) => {
497
513
  switch (event.type) {
498
514
  case Dispatcher.Type.setEnterFocusId:
@@ -539,13 +555,22 @@ const onItemFocus = (index, rect) => {
539
555
  }
540
556
  };
541
557
 
542
- const setFocusId = (id, needSlide = true, doAnim = false) => {
558
+ const setFocusId = (id, needSlide = true, doAnim = false, extraSetting) => {
559
+ if (id == focusId) {
560
+ return;
561
+ }
543
562
  templateItemAdder.tryAddItemById(id);
544
563
  let next_focus_item = templateParser.GetItemById(id);
545
564
  if (next_focus_item) {
546
565
  if (needSlide) {
547
566
  slideToItem(templateParser.FocusIdToIndex(id), doAnim);
548
567
  }
568
+ let unlock = null;
569
+ if (extraSetting) {
570
+ if (extraSetting.lockChildSlideEvent) {
571
+ unlock = lock(METRO_WIDGET.CHILD_SLIDE_EVENT);
572
+ }
573
+ }
549
574
 
550
575
  const cur_focus_item = templateParser.GetItemById(focusId);
551
576
  preFocusId = focusId;
@@ -566,6 +591,37 @@ const setFocusId = (id, needSlide = true, doAnim = false) => {
566
591
  _updateFocusItem();
567
592
  onItemBlur(templateParser.FocusIdToIndex(preFocusId));
568
593
  onItemFocus(templateParser.FocusIdToIndex(focusId), preEdgeRect);
594
+ unlock?.();
595
+ }
596
+ };
597
+
598
+ const lock = (type) => {
599
+ const unlocker = [];
600
+ if (type & METRO_WIDGET.SLIDE) {
601
+ slideLock = true;
602
+ unlocker.push(() => {
603
+ slideLock = false;
604
+ });
605
+ }
606
+ if (type & METRO_WIDGET.CHILD_SLIDE_EVENT) {
607
+ childSlideEventLock = true;
608
+ unlocker.push(() => {
609
+ childSlideEventLock = false;
610
+ });
611
+ }
612
+ return () => {
613
+ unlocker.map((item) => {
614
+ item();
615
+ });
616
+ };
617
+ };
618
+
619
+ const unlock = (type) => {
620
+ if (type & METRO_WIDGET.SLIDE) {
621
+ slideLock = true;
622
+ }
623
+ if (type & METRO_WIDGET.CHILD_SLIDE_EVENT) {
624
+ childSlideEventLock = true;
569
625
  }
570
626
  };
571
627
 
@@ -693,7 +749,8 @@ const refreshData = (force_update) => {
693
749
  dataList,
694
750
  props.measures,
695
751
  pageRange,
696
- _onTemplateAdd
752
+ _onTemplateAdd,
753
+ props.name
697
754
  );
698
755
  }
699
756
  if (need_update_content) {
@@ -748,7 +805,24 @@ const refreshData = (force_update) => {
748
805
  }
749
806
  };
750
807
 
808
+ const getVisibleItems = () => {
809
+ const info = templateParser.GetVisibleItemList(
810
+ visibleInfo.startWithPadding,
811
+ visibleInfo.endWithPadding,
812
+ focusId,
813
+ false,
814
+ null
815
+ );
816
+ return {
817
+ start: info.visibleStart,
818
+ end: info.visibleEnd,
819
+ dataList: dataList.slice(info.visibleStart, info.visibleEnd + 1),
820
+ };
821
+ };
822
+
751
823
  const exportObject = {
824
+ lock,
825
+ unlock,
752
826
  slideTo,
753
827
  setFocusId,
754
828
  getFocusBlockRef,
@@ -757,7 +831,7 @@ const exportObject = {
757
831
  slideToItem,
758
832
  refreshData,
759
833
  _dispatchEvent,
760
- _getAbsolutePosition,
834
+ getVisibleItems,
761
835
  };
762
836
 
763
837
  const _calculateNearestItemByRect = (visible_range, enter_rect_info) => {
@@ -1001,7 +1075,7 @@ const _onTemplateAdd = (item) => {
1001
1075
  data: item,
1002
1076
  index: innerData.length,
1003
1077
  controller: reactive({
1004
- zIndex: 0,
1078
+ zIndex: item.normalZIndex >= 0 ? item.normalZIndex : 0,
1005
1079
  }),
1006
1080
  mounted: false,
1007
1081
  itemDivRef: null,
@@ -1059,7 +1133,6 @@ const _onTemplateAdd = (item) => {
1059
1133
  index: item.index,
1060
1134
  position: _getPosition,
1061
1135
  templatePosition: _getTemplatePosition,
1062
- absolutePosition: _getAbsolutePosition,
1063
1136
  getCurrentFocusId: _getCurrentId,
1064
1137
  slideTo: slideTo,
1065
1138
  },
@@ -1094,6 +1167,9 @@ const _itemOnFocusSideEffect = (item, edgeRect) => {
1094
1167
 
1095
1168
  const _onCustomerEvent = (ev) => {
1096
1169
  if (ev.type === "focusRect") {
1170
+ if (childSlideEventLock) {
1171
+ return true;
1172
+ }
1097
1173
  if (ev.ownerNode == exportObject) {
1098
1174
  return false;
1099
1175
  }
@@ -1198,21 +1274,31 @@ const _moveToNext = (
1198
1274
  onend: _onSlideEnd,
1199
1275
  };
1200
1276
  _slideTo(visibleInfo.start, animObj);
1277
+ pageUpdater.update(
1278
+ templateParser,
1279
+ visibleInfo.startWithPadding - props.keepTraceRange * pageRange,
1280
+ Math.min(
1281
+ visibleInfo.startMax +
1282
+ visibleInfo.range +
1283
+ visibleInfo.padding.end -
1284
+ 1,
1285
+ visibleInfo.endWithPadding + props.keepTraceRange * pageRange
1286
+ ),
1287
+ next_item_id,
1288
+ false,
1289
+ permanentItemList
1290
+ );
1291
+ } else {
1292
+ //不做滚动时,保证获焦的item创建
1293
+ pageUpdater.update(
1294
+ templateParser,
1295
+ cur_visible_start,
1296
+ cur_visible_start + visibleInfo.range + visibleInfo.padding.end - 1,
1297
+ next_item_id,
1298
+ false,
1299
+ permanentItemList
1300
+ );
1201
1301
  }
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
1302
  pageUpdater.applyTmp();
1217
1303
  }
1218
1304
 
@@ -1303,40 +1389,50 @@ const _calculateVisibleStart = (target_item, direction) => {
1303
1389
  ];
1304
1390
  break;
1305
1391
  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
- }
1392
+ if (
1393
+ target_item[size_key] >=
1394
+ visibleInfo.range *
1395
+ (props.slideSetting.EndPercent - props.slideSetting.StartPercent)
1396
+ ) {
1397
+ //尺寸较大的item
1398
+ new_visible_start = target_item[center_key] - visibleInfo.range * 0.5;
1326
1399
  } 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;
1400
+ if (direction > 0) {
1401
+ if (
1402
+ target_item[pos_key] + target_item[size_key] >
1403
+ visibleInfo.start +
1404
+ visibleInfo.range * props.slideSetting.EndPercent
1405
+ ) {
1406
+ new_visible_start =
1407
+ target_item[pos_key] +
1408
+ target_item[size_key] -
1409
+ visibleInfo.range * props.slideSetting.EndPercent;
1410
+ }
1411
+ } else if (direction < 0) {
1412
+ if (
1413
+ target_item[pos_key] <
1414
+ visibleInfo.start +
1415
+ visibleInfo.range * props.slideSetting.StartPercent
1416
+ ) {
1417
+ new_visible_start =
1418
+ target_item[pos_key] -
1419
+ visibleInfo.range * props.slideSetting.StartPercent;
1420
+ }
1421
+ } else {
1422
+ //不是沿widget方向的移动
1423
+ if (target_item[pos_key] < visibleInfo.start) {
1424
+ new_visible_start =
1425
+ target_item[pos_key] -
1426
+ visibleInfo.range * props.slideSetting.StartPercent;
1427
+ } else if (
1428
+ target_item[pos_key] + target_item[size_key] >
1429
+ visibleInfo.end
1430
+ ) {
1431
+ new_visible_start =
1432
+ target_item[pos_key] +
1433
+ target_item[size_key] -
1434
+ visibleInfo.range * props.slideSetting.EndPercent;
1435
+ }
1340
1436
  }
1341
1437
  }
1342
1438
  break;
@@ -1403,9 +1499,16 @@ const _ifValidEnterRect = (rect_info) => {
1403
1499
  return rect_info && rect_info.direction && rect_info.rect;
1404
1500
  };
1405
1501
 
1406
- const _setZIndex = (index, z_index) => {
1502
+ const _setZIndex = (index, z_index, is_focus) => {
1407
1503
  if (innerData[index]) {
1408
- innerData[index].controller.zIndex = z_index;
1504
+ let data = innerData[index].data,
1505
+ i = z_index;
1506
+ if (is_focus && data.focusZIndex >= 0) {
1507
+ i = data.focusZIndex;
1508
+ } else if (data.normalZIndex >= 0) {
1509
+ i = data.normalZIndex;
1510
+ }
1511
+ innerData[index].controller.zIndex = i;
1409
1512
  }
1410
1513
  };
1411
1514
 
@@ -1457,11 +1560,11 @@ const _onSlideEnd = (event) => {
1457
1560
  };
1458
1561
 
1459
1562
  const _updateFocusItem = () => {
1460
- _setZIndex(templateParser.FocusIdToIndex(focusId), innerData.length);
1563
+ _setZIndex(templateParser.FocusIdToIndex(focusId), innerData.length, true);
1461
1564
  };
1462
1565
 
1463
1566
  const _updateBlurItem = () => {
1464
- _setZIndex(templateParser.FocusIdToIndex(preFocusId), 0);
1567
+ _setZIndex(templateParser.FocusIdToIndex(preFocusId), 0, false);
1465
1568
  };
1466
1569
 
1467
1570
  const _updateFocusByDragInfo = (viewX, viewY) => {
@@ -1607,21 +1710,23 @@ const _onScroll = () => {
1607
1710
 
1608
1711
  //之前rootview相关的代码
1609
1712
  const _updatePosition = (x, y, anim_info) => {
1713
+ if (slideLock) return;
1610
1714
  if (toRaw(slideDiv.value)) {
1611
- let pre_pos = toRaw(slideDiv.value).jsvMaskView.GetLayoutParams();
1715
+ let pre_left = toRaw(slideDiv.value).style.left,
1716
+ pre_top = toRaw(slideDiv.value).style.top;
1612
1717
  //jsvMaskView的位置更新时会被设置位0,因此不能通过ResetLayoutParams设置位置
1613
1718
  slideDivLeft.value = x;
1614
1719
  slideDivTop.value = y;
1615
1720
  if (anim_info) {
1616
- let delta_x = Math.abs(pre_pos.MarginLeft - x);
1617
- let delta_y = Math.abs(pre_pos.MarginTop - y);
1721
+ let delta_x = Math.abs(pre_left - x);
1722
+ let delta_y = Math.abs(pre_top - y);
1618
1723
  let duration = Math.round(
1619
1724
  delta_x === 0 ? delta_y / anim_info.speed : delta_x / anim_info.speed
1620
1725
  );
1621
1726
  let slide_animation = new Forge.TranslateAnimation(
1622
- pre_pos.MarginLeft - x,
1727
+ pre_left - x,
1623
1728
  0,
1624
- pre_pos.MarginTop - y,
1729
+ pre_top - y,
1625
1730
  0,
1626
1731
  duration,
1627
1732
  anim_info.easing
@@ -1708,7 +1813,8 @@ templateItemAdder = new TemplateItemAdder(
1708
1813
  dataList,
1709
1814
  props.measures,
1710
1815
  pageRange,
1711
- _onTemplateAdd
1816
+ _onTemplateAdd,
1817
+ props.name
1712
1818
  );
1713
1819
  if (props.onScroll) {
1714
1820
  templateItemAdder.tryAddItemByIndex(dataList.length - 1);
@@ -1740,12 +1846,14 @@ slidePile = new Forge.RectArea(
1740
1846
  let init_focus_id = 0;
1741
1847
  let cur_visible_start = 0;
1742
1848
 
1743
- if (props.initFocusId) {
1849
+ if (typeof props.initFocusId == 'number') {
1744
1850
  templateItemAdder.tryAddItemById(props.initFocusId);
1745
1851
  const item = templateParser.GetItemById(props.initFocusId);
1746
1852
  if (item) {
1747
1853
  init_focus_id = props.initFocusId;
1748
- cur_visible_start = _calculateVisibleStart(item, 1);
1854
+ if (item.doSlide) {
1855
+ cur_visible_start = _calculateVisibleStart(item, 1);
1856
+ }
1749
1857
  }
1750
1858
  }
1751
1859
  focusId = init_focus_id;