@shijiu/jsview-vue-samples 2.3.0 → 2.3.151-test.0

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 (117) hide show
  1. package/DashPath/App.vue +17 -16
  2. package/DashPath/AppForOperator.vue +2 -4
  3. package/DemoForOperator/AnimPic/AnimPic.vue +24 -2
  4. package/DemoForOperator/Banger/Banger/Banger.vue +73 -9
  5. package/DemoForOperator/Blur/Blur.vue +146 -0
  6. package/DemoForOperator/Blur/BlurInOut/BlurInOut.vue +158 -0
  7. package/DemoForOperator/Blur/BlurInOut/StaticBgSlide.vue +162 -0
  8. package/DemoForOperator/Blur/BlurPopup/BlurPopup.vue +113 -0
  9. package/DemoForOperator/BookFlip/App.vue +115 -0
  10. package/DemoForOperator/BookFlip/BookFlip/FlipPage.vue +179 -0
  11. package/DemoForOperator/BookFlip/BookFlip/FlippingBook.vue +310 -0
  12. package/DemoForOperator/BookFlip/BookFlip/flip.glsl +135 -0
  13. package/DemoForOperator/BookFlip/BookPage.vue +82 -0
  14. package/DemoForOperator/Bounce/Bounce.vue +33 -1
  15. package/DemoForOperator/ChunLian/Couplets.vue +44 -1
  16. package/DemoForOperator/ClickSpriteAnim/App.vue +130 -0
  17. package/DemoForOperator/ClickSpriteAnim/Item.vue +74 -0
  18. package/DemoForOperator/DominantColor/App.vue +187 -0
  19. package/DemoForOperator/EpisodeList/EpisodeList/Controller.vue +0 -3
  20. package/DemoForOperator/EpisodeList/EpisodeList/EpisodeList.vue +76 -2
  21. package/DemoForOperator/Firework1/App.vue +1 -1
  22. package/DemoForOperator/Firework1/Fireworks.vue +50 -11
  23. package/DemoForOperator/FlipPage/FlipPage/FlipPage.vue +29 -1
  24. package/DemoForOperator/Focus/Alpha/AlphaFocusBox.vue +27 -2
  25. package/DemoForOperator/Focus/Light/LightFocusBox.vue +42 -1
  26. package/DemoForOperator/Focus/Normal/NormalFocusBox.vue +12 -0
  27. package/DemoForOperator/FrameShadow/App.vue +193 -0
  28. package/DemoForOperator/FrameShadow/FrameShadow.vue +61 -0
  29. package/DemoForOperator/FullscreenIn/App.vue +1 -1
  30. package/DemoForOperator/FullscreenIn/FullscreenPoster.vue +18 -3
  31. package/DemoForOperator/Genie/geniePakcer/Genie.vue +60 -18
  32. package/DemoForOperator/GrayFilter/GrayFilter.vue +21 -0
  33. package/DemoForOperator/Jigsaw/JigsawFull.vue +46 -4
  34. package/DemoForOperator/Jigsaw/JigsawSingle.vue +34 -2
  35. package/DemoForOperator/LongChatBox/App.vue +36 -0
  36. package/DemoForOperator/LongChatBox/Bubble.vue +104 -0
  37. package/DemoForOperator/LongChatBox/LongChat.vue +173 -0
  38. package/DemoForOperator/LongChatBox/TextManager.ts +147 -0
  39. package/DemoForOperator/LongChatBox/VirtualList.vue +298 -0
  40. package/DemoForOperator/LongChatBox/testData.js +51 -0
  41. package/DemoForOperator/LongChatBox/utile.js +331 -0
  42. package/DemoForOperator/Particle/Drop/DropParticle.vue +33 -1
  43. package/DemoForOperator/Particle/Explode/ExplodeParticle.vue +23 -2
  44. package/DemoForOperator/PosterAnim/PosterAnim.js +21 -0
  45. package/DemoForOperator/PosterOverflow/PosterOverflow.vue +16 -0
  46. package/DemoForOperator/Resize/App.vue +157 -0
  47. package/DemoForOperator/Resize/Resize/Item.vue +234 -0
  48. package/DemoForOperator/Resize/Resize/Resize.vue +96 -0
  49. package/DemoForOperator/Ripple/Ripple.vue +16 -1
  50. package/DemoForOperator/ScreenShootScale/App.vue +96 -0
  51. package/DemoForOperator/ScreenShootScale/Back.vue +86 -0
  52. package/DemoForOperator/ScreenShootScale/Front.vue +133 -0
  53. package/DemoForOperator/ScreenShootScale/Item.vue +62 -0
  54. package/DemoForOperator/ScreenShootScale/ScreenShootScale.vue +109 -0
  55. package/DemoForOperator/SmoothSwiper/App.vue +50 -0
  56. package/DemoForOperator/Sound/Bounce/App.vue +56 -0
  57. package/DemoForOperator/Sound/Bounce/Bounce.vue +87 -0
  58. package/DemoForOperator/Sound/Bounce/FreeMoveBuilder.js +146 -0
  59. package/DemoForOperator/Sound/Bounce/bgmusic.mp3 +0 -0
  60. package/DemoForOperator/Sound/Bounce/coin.mp3 +0 -0
  61. package/DemoForOperator/Sound/FocusMove/App.vue +134 -0
  62. package/DemoForOperator/Sound/FocusMove/Item.vue +43 -0
  63. package/DemoForOperator/Sound/FocusMove/move.mp3 +0 -0
  64. package/DemoForOperator/Sound/Rain/App.vue +11 -0
  65. package/DemoForOperator/Sound/Rain/Raining/Rain.vue +69 -0
  66. package/DemoForOperator/Sound/Rain/Raining/RainScene.vue +118 -0
  67. package/DemoForOperator/Sound/Sound/Sound.vue +24 -0
  68. package/DemoForOperator/Sound/Sound/index.js +4 -0
  69. package/DemoForOperator/Sound/Sound/useSound.js +112 -0
  70. package/DemoForOperator/Sprite/Sprite.vue +62 -5
  71. package/DemoForOperator/Stretch/Stretch/Stretch.vue +52 -2
  72. package/DemoForOperator/Swiper/App.vue +101 -0
  73. package/DemoForOperator/Swiper/Item.vue +56 -0
  74. package/DemoForOperator/Swiper/ParallaxSlide.vue +164 -0
  75. package/DemoForOperator/TabContent/TabContent/TabContent.vue +39 -1
  76. package/DemoForOperator/TabContentVertical/App.vue +104 -0
  77. package/DemoForOperator/TabContentVertical/ContentPage.vue +67 -0
  78. package/DemoForOperator/TabContentVertical/Item.vue +94 -0
  79. package/DemoForOperator/TabContentVertical/PageItem.vue +40 -0
  80. package/DemoForOperator/TabContentVertical/TabContent/CreepFocus.vue +160 -0
  81. package/DemoForOperator/TabContentVertical/TabContent/Item.vue +63 -0
  82. package/DemoForOperator/TabContentVertical/TabContent/TabContent.vue +184 -0
  83. package/DemoForOperator/TabContentVertical/TabContent/TabItem.vue +368 -0
  84. package/DemoForOperator/TabContentVertical/TabContent/TabWidget.vue +259 -0
  85. package/DemoForOperator/TabContentVertical/TabContent/Util.js +3 -0
  86. package/DemoForOperator/TabContentVertical/TabContent/ViewSwiper.vue +110 -0
  87. package/DemoForOperator/TabContentVertical/assets/children_science.png +0 -0
  88. package/DemoForOperator/TabContentVertical/assets/documentary.png +0 -0
  89. package/DemoForOperator/TabContentVertical/assets/free.png +0 -0
  90. package/DemoForOperator/TabContentVertical/assets/game.png +0 -0
  91. package/DemoForOperator/TabContentVertical/assets/home_selected.png +0 -0
  92. package/DemoForOperator/TabContentVertical/assets/movie_ticket.png +0 -0
  93. package/DemoForOperator/TabContentVertical/assets/my_account.png +0 -0
  94. package/DemoForOperator/TabContentVertical/assets/opera.png +0 -0
  95. package/DemoForOperator/TabContentVertical/assets/sports.png +0 -0
  96. package/DemoForOperator/TabContentVertical/assets/tv_drama.png +0 -0
  97. package/DemoForOperator/TabContentVertical/assets/variety_show.png +0 -0
  98. package/DemoForOperator/TabContentVertical/assets/vip.png +0 -0
  99. package/DemoForOperator/TabContentVertical/testData.js +76 -0
  100. package/DemoForOperator/Vortex/Vortex/Vortex.vue +26 -0
  101. package/DemoForOperator/routeList.js +118 -1
  102. package/DemoHomepage/components/Item.vue +11 -0
  103. package/DemoHomepage/router.js +75 -1
  104. package/GiftRain/components/SpriteTranslate.vue +68 -48
  105. package/HashHistory/App.vue +2 -2
  106. package/HashHistory/router.js +1 -1
  107. package/MetroWidgetDemos/TripleWidget/App.vue +7 -1
  108. package/MetroWidgetDemos/TripleWidget/Item.vue +16 -2
  109. package/MetroWidgetDemos/TripleWidget/SWidgetItem.vue +7 -1
  110. package/MetroWidgetDemos/TripleWidget/WidgetItem.vue +8 -2
  111. package/MetroWidgetDemos/routeList.js +17 -0
  112. package/PosterPacker/App.vue +2 -2
  113. package/ViewOpacity/App.vue +19 -0
  114. package/package.json +1 -1
  115. package/DashPath/DashPath.vue +0 -118
  116. package/DemoForOperator/ScalePoster/App.vue +0 -4
  117. package/DemoForOperator/ScalePoster/ScalePoster.vue +0 -0
@@ -0,0 +1,234 @@
1
+ <!--
2
+ * @Author: ChenChanghua
3
+ * @Date: 2023-03-08 14:52:17
4
+ * @Description: file content
5
+ -->
6
+ <script>
7
+ let animToken = 0;
8
+ </script>
9
+ <script setup>
10
+ import { ref, onBeforeUnmount, computed } from "vue";
11
+ import { getKeyFramesGroup } from "jsview";
12
+
13
+ const props = defineProps({
14
+ data: Object,
15
+ onAction: Object,
16
+ query: Object,
17
+ animSetting: Object,
18
+ itemOnClick: Function,
19
+ itemOnGaze: Function,
20
+ itemOnIgnore: Function,
21
+ itemOnFocus: Function,
22
+ itemOnBlur: Function,
23
+ widgetLayout: Object,
24
+ widgetPadding: Object,
25
+ });
26
+
27
+ const focused = ref(false);
28
+
29
+ const blurSize = props.data.blurSize;
30
+ const focusSize = props.data.focusSize;
31
+ const expandSize = props.data.expandSize;
32
+ const duration = props.animSetting.duration;
33
+ const easing = props.animSetting.easing;
34
+ const width = ref(blurSize.w);
35
+ const height = ref(blurSize.h);
36
+ const top = computed(() => (blurSize.h - height.value) / 2);
37
+
38
+ let timeoutHandler = -1;
39
+
40
+ const animInfo = {
41
+ duration: duration,
42
+ easing: easing,
43
+ onEnd: () => {},
44
+ };
45
+
46
+ const isLarge = ref(false);
47
+ const showLarge = ref(false);
48
+
49
+ const transitionStr = `left ${duration / 1000}s ${easing}, top ${
50
+ duration / 1000
51
+ }s ${easing}, width ${duration / 1000}s ${easing}, height ${
52
+ duration / 1000
53
+ }s ${easing}`;
54
+ const animation = ref(null);
55
+ const scaleupAnim = `resize_item_scale_up_keep_center_${animToken++}`;
56
+ const scaledownAnim = `resize_item_scale_down_keep_center_${animToken++}`;
57
+
58
+ const xOffset = (focusSize.w - expandSize.w) / 2;
59
+ const yOffset = (focusSize.h - expandSize.h) / 2;
60
+ const scaleupBody = `@keyframes ${scaleupAnim} { from {transform: translate3d(${xOffset}, ${yOffset}, 0);} to {transform: translate3d(0, 0, 0);} }`;
61
+ const scaledownBody = `@keyframes ${scaledownAnim} { from {transform: translate3d(0, 0, 0);} to {transform: translate3d(${xOffset}, ${yOffset}, 0);}}`;
62
+
63
+ const styleSheets = getKeyFramesGroup();
64
+ styleSheets.insertRule(scaleupBody);
65
+ styleSheets.insertRule(scaledownBody);
66
+ function onAnimEnd() {
67
+ animation.value = null;
68
+ }
69
+ function onTransitionDone() {
70
+ if (!isLarge.value) {
71
+ showLarge.value = false;
72
+ }
73
+ }
74
+
75
+ const edgeTransition = `left ${duration / 1000}s ${easing}, top ${
76
+ duration / 1000
77
+ }s ${easing}`;
78
+ const rightSlotLeft = computed(() => {
79
+ return width.value - blurSize.w;
80
+ });
81
+
82
+ function getAnchor(targetWidth) {
83
+ const curPosition = props.query.position(props.query.index);
84
+ //position是相对于布局区域的,所以加上padding
85
+ let curRect = [curPosition.left + props.widgetPadding.left, curPosition.left + props.widgetPadding.left + curPosition.width];
86
+ //留个20不贴边
87
+ let targetRect = [props.widgetLayout.width - targetWidth - 20, props.widgetLayout.width];
88
+ console.log("ccht get anchor", curRect, targetRect);
89
+ if (targetRect[0] > curRect[0]) {
90
+ //右边有足够空间
91
+ return 0;
92
+ } else {
93
+ //[a,b] 映射到 [c,d] 的不动点公式 x = (ad-bc)/(a+d-b-c)
94
+ let fixPoint = (curRect[0] * targetRect[1] - curRect[1] * targetRect[0]) / (curRect[0] + targetRect[1] - curRect[1] - targetRect[0]);
95
+ console.log("ccht get anchor 2", fixPoint);
96
+ return (fixPoint - curRect[0]) / curPosition.width;
97
+ }
98
+ }
99
+
100
+ const onFocus = () => {
101
+ focused.value = true;
102
+ if (width.value == blurSize.w) {
103
+ //立即放大
104
+ width.value = focusSize.w;
105
+ height.value = focusSize.h;
106
+ props.query.updateItemSize(
107
+ props.query.index,
108
+ {
109
+ width: width.value,
110
+ height: blurSize.h, //布局的高度不需要改变, 只需要改宽
111
+ },
112
+ animInfo
113
+ );
114
+
115
+ if (props.data.resizable && !isLarge.value) {
116
+ //延迟展开
117
+ timeoutHandler = setTimeout(() => {
118
+ isLarge.value = true;
119
+ showLarge.value = true;
120
+ animation.value = `${scaleupAnim} ${duration / 1000}s ${easing}`;
121
+ let anchor = getAnchor(expandSize.w);
122
+ width.value = expandSize.w;
123
+ height.value = expandSize.h;
124
+ props.query.updateItemSize(
125
+ props.query.index,
126
+ {
127
+ width: width.value,
128
+ height: blurSize.h, //布局的高度不需要改变, 只需要改宽
129
+ },
130
+ { ...animInfo, anchor: anchor }
131
+ );
132
+ }, props.data.resizeDelay ?? 1500);
133
+ }
134
+ }
135
+ props.itemOnFocus?.();
136
+ };
137
+
138
+ const onBlur = () => {
139
+ focused.value = false;
140
+ if (width.value != blurSize.w) {
141
+ if (isLarge.vue) {
142
+ animation.value = `${scaledownAnim} ${duration / 1000}s linear`;
143
+ }
144
+ isLarge.value = false;
145
+ let anchor = getAnchor(blurSize.w);
146
+ width.value = blurSize.w;
147
+ height.value = blurSize.h;
148
+ props.query.updateItemSize(
149
+ props.query.index,
150
+ {
151
+ width: width.value,
152
+ height: blurSize.h, //布局的高度不需要改变, 只需要改宽
153
+ },
154
+ { ...animInfo, anchor: anchor }
155
+ );
156
+ }
157
+
158
+ clearTimeout(timeoutHandler);
159
+ timeoutHandler = -1;
160
+ props.itemOnBlur?.();
161
+ };
162
+
163
+ const onClick = () => {
164
+ props.itemOnClick?.();
165
+ };
166
+
167
+ const onGaze = () => {
168
+ props.itemOnGaze?.();
169
+ };
170
+
171
+ const onIgnore = () => {
172
+ props.itemOnIgnore?.();
173
+ };
174
+
175
+ props.onAction.register("onFocus", onFocus);
176
+ props.onAction.register("onBlur", onBlur);
177
+ props.onAction.register("onClick", onClick);
178
+ props.onAction.register("onGaze", onGaze);
179
+ props.onAction.register("onIgnore", onIgnore);
180
+
181
+ onBeforeUnmount(() => {
182
+ clearTimeout(timeoutHandler);
183
+ timeoutHandler = -1;
184
+ styleSheets.removeRule(scaleupAnim);
185
+ styleSheets.removeRule(scaledownAnim);
186
+ });
187
+ </script>
188
+
189
+ <template>
190
+ <div
191
+ :style="{
192
+ top: top,
193
+ width: width,
194
+ height: height,
195
+ transition: transitionStr,
196
+ overflow: 'hidden',
197
+ }"
198
+ @transitionend="onTransitionDone"
199
+ >
200
+ <div
201
+ :style="{
202
+ width: width,
203
+ height: height,
204
+ animation: animation,
205
+ }"
206
+ @animationend="onAnimEnd"
207
+ >
208
+ <div v-if="showLarge">
209
+ <slot name="large"></slot>
210
+ </div>
211
+ <div v-else>
212
+ <slot name="small" :focused="focused"></slot>
213
+ </div>
214
+ </div>
215
+ </div>
216
+ <div
217
+ :style="{
218
+ top: top,
219
+ transition: edgeTransition,
220
+ }"
221
+ >
222
+ <slot name="left"></slot>
223
+ </div>
224
+
225
+ <div
226
+ :style="{
227
+ left: rightSlotLeft,
228
+ top: top,
229
+ transition: edgeTransition,
230
+ }"
231
+ >
232
+ <slot name="right"></slot>
233
+ </div>
234
+ </template>
@@ -0,0 +1,96 @@
1
+ <!--
2
+ * @Author: ChenChanghua
3
+ * @Date: 2023-03-08 14:52:08
4
+ * @Description: file content
5
+ -->
6
+ <script setup>
7
+ import {
8
+ ListWidget,
9
+ HORIZONTAL,
10
+ FixPositionSlide,
11
+ } from "jsview";
12
+ import Item from "./Item.vue";
13
+ import { onMounted } from "vue";
14
+
15
+ const props = defineProps({
16
+ name: String,
17
+ provideData: Function,
18
+ measures: Function,
19
+ initFocusId: Number,
20
+ layout: Object,
21
+ onEdge: Function,
22
+ anim: Object,
23
+ padding: Object,
24
+ itemOnClick: Function,
25
+ itemOnGaze: Function,
26
+ itemOnIgnore: Function,
27
+ itemOnFocus: Function,
28
+ itemOnBlur: Function,
29
+ });
30
+
31
+ const animSetting = {
32
+ duration: props.anim.duration ?? 200,
33
+ easing: props.anim.easing ?? "jsv-ease(0.2, 0.6, 2)",
34
+ };
35
+
36
+ const fixPositionSlide = new FixPositionSlide({
37
+ fixPercent: 0,
38
+ align: "start",
39
+ ...animSetting,
40
+ });
41
+
42
+ const onEdge = (edgeInfo) => {
43
+ props.onEdge(edgeInfo);
44
+ };
45
+
46
+ onMounted(() => {});
47
+ </script>
48
+
49
+ <template>
50
+ <list-widget
51
+ :name="name"
52
+ :left="layout.left"
53
+ :top="layout.top"
54
+ :width="layout.width"
55
+ :height="layout.height"
56
+ :provideData="provideData"
57
+ :direction="HORIZONTAL"
58
+ :slideSetting="fixPositionSlide"
59
+ :measures="measures"
60
+ :padding="padding"
61
+ :onEdge="onEdge"
62
+ >
63
+ <template #renderItem="{ data, onAction, query }">
64
+ <item
65
+ :data="data"
66
+ :onAction="onAction"
67
+ :query="query"
68
+ :animSetting="animSetting"
69
+ :itemOnClick="itemOnClick"
70
+ :itemOnGaze="itemOnGaze"
71
+ :itemOnIgnore="itemOnIgnore"
72
+ :itemOnFocus="itemOnFocus"
73
+ :itemOnBlur="itemOnBlur"
74
+ :widgetLayout="layout"
75
+ :widgetPadding="padding"
76
+ >
77
+ <template #small="{ focused }">
78
+ <slot name="itemSmall" :data="data" :focused="focused"></slot>
79
+ </template>
80
+ <template #large>
81
+ <slot name="itemLarge" :data="data"></slot>
82
+ </template>
83
+ <template #right="{ width }">
84
+ <slot
85
+ name="itemRightEdge"
86
+ :itemSmallWidth="width"
87
+ :data="data"
88
+ ></slot>
89
+ </template>
90
+ <template #left>
91
+ <slot name="itemLeftEdge" :data="data"></slot>
92
+ </template>
93
+ </item>
94
+ </template>
95
+ </list-widget>
96
+ </template>
@@ -13,7 +13,16 @@
13
13
  <script setup>
14
14
  import { JsvRipple, JsvRippleShape } from "jsview";
15
15
  import { shallowRef } from "vue";
16
+
16
17
  const props = defineProps({
18
+ /**
19
+ * 布局配置对象
20
+ * @prop {Object} layout
21
+ * @property {string} layout.left 左侧位置(带单位)
22
+ * @property {string} layout.top 顶部位置(带单位)
23
+ * @property {string|number} layout.width 宽度(带单位或数字)
24
+ * @property {string|number} layout.height 高度(带单位或数字)
25
+ */
17
26
  layout: {
18
27
  type: Object,
19
28
  required: true,
@@ -23,7 +32,13 @@ const props = defineProps({
23
32
  const rippleViewRef = shallowRef();
24
33
 
25
34
  defineExpose({
26
- /* position: 位置, duration: 时长(秒) */
35
+ /**
36
+ * 添加涟漪效果
37
+ * @param {Object} position 涟漪起始位置
38
+ * @param {number} position.left 起始位置左坐标
39
+ * @param {number} position.top 起始位置顶坐标
40
+ * @param {number} [duration=3] 涟漪持续时间(单位:秒)
41
+ */
27
42
  addRipple(position, duration = 3) {
28
43
  //duration = ln(amplitude) / timeDecay => timeDecay = ln(amplitude) / duration
29
44
  const amplitude = 50;
@@ -0,0 +1,96 @@
1
+ <template>
2
+ <Back />
3
+ <Front v-if="frontShow" @hidden="onFrontHidden" />
4
+ <ScreenShootScale
5
+ v-if="showScale"
6
+ :from="from"
7
+ :to="to"
8
+ :duration="duration"
9
+ :easing="easing"
10
+ :fromSource="fromSource"
11
+ :toSource="toSource"
12
+ @animationend="onAnimEnd"
13
+ />
14
+ </template>
15
+ <script setup>
16
+ import Front from "./Front.vue";
17
+ import Back from "./Back.vue";
18
+ import ScreenShootScale from "./ScreenShootScale.vue";
19
+ import { useFocusHub, JsvTextureStoreApi } from "jsview";
20
+ import { onMounted, ref, provide } from "vue";
21
+
22
+ const showScale = ref(false);
23
+ function capture(divRef) {
24
+ return new Promise((resolve, reject) => {
25
+ JsvTextureStoreApi.capture2Texture(
26
+ divRef.value,
27
+ (textureName, autoRecycle, w, h) => {
28
+ if (textureName) {
29
+ resolve({
30
+ url: `jsvtexturestore://${textureName}`,
31
+ release: () => {
32
+ console.log("release", textureName);
33
+ JsvTextureStoreApi.deleteTexture(textureName);
34
+ },
35
+ });
36
+ } else {
37
+ reject();
38
+ }
39
+ if (autoRecycle) {
40
+ // 已经是设置了texture的自动回收,所以不再需要主动调用 JsvTextureStoreApi.deleteTexture 来释放内存
41
+ }
42
+ },
43
+ false // 自动回收, 不填也行,默认为true
44
+ );
45
+ });
46
+ }
47
+ let from, to, duration, easing, fromSource, toSource, releaseFunc;
48
+ function start(
49
+ _from,
50
+ _to,
51
+ _duration,
52
+ _easing,
53
+ _fromSource,
54
+ _toSource,
55
+ _releaseFunc
56
+ ) {
57
+ showScale.value = true;
58
+ from = _from;
59
+ to = _to;
60
+ duration = _duration;
61
+ easing = _easing;
62
+ fromSource = _fromSource;
63
+ toSource = _toSource;
64
+ releaseFunc = _releaseFunc;
65
+ }
66
+ function onAnimEnd() {
67
+ showScale.value = false;
68
+ releaseFunc?.();
69
+ }
70
+ provide("capture", capture);
71
+ provide("start", start);
72
+
73
+ let targetPosition = {};
74
+ provide("setTarget", (l, t, w, h) => {
75
+ targetPosition.left = l;
76
+ targetPosition.top = t;
77
+ targetPosition.width = w;
78
+ targetPosition.height = h;
79
+ });
80
+ provide("getTarget", () => {
81
+ return Object.assign({}, targetPosition);
82
+ });
83
+
84
+ const focusHub = useFocusHub();
85
+ const frontShow = ref(true);
86
+
87
+ const onFrontHidden = () => {
88
+ console.log("onHidden");
89
+ focusHub.setFocus("backmw");
90
+ frontShow.value = false;
91
+ };
92
+
93
+ onMounted(() => {
94
+ focusHub.setFocus("frontmw");
95
+ });
96
+ </script>
@@ -0,0 +1,86 @@
1
+ <!--
2
+ * @Author: ChenChanghua
3
+ * @Date: 2023-03-08 14:52:08
4
+ * @Description: file content
5
+ -->
6
+ <script setup>
7
+ import { MetroWidget, HORIZONTAL } from "jsview";
8
+ import Item from "./Item.vue";
9
+ import { onMounted } from "vue";
10
+
11
+ const randomColor = () => {
12
+ let randomColor = Math.round(Math.random() * 2 ** 24).toString(16);
13
+ return (
14
+ "#" + new Array(6 - randomColor.length).fill("0").join("") + randomColor
15
+ );
16
+ };
17
+
18
+ const provideData = () => {
19
+ const data = [];
20
+ for (let i = 0; i < 10; ++i) {
21
+ data.push({
22
+ width: 200,
23
+ height: 100,
24
+ marginRight: 10,
25
+ marginBottom: 10,
26
+ color: randomColor(),
27
+ content: i,
28
+ });
29
+ }
30
+ data[0].imgUrl =
31
+ "https://cdn.release.qcast.cn/JsViewFrameworkTester/JsViewVueSampleResources/DemoForOperator/Genie/App/element_228542_icon_20230610184253.jpg";
32
+ return data;
33
+ };
34
+
35
+ const measures = (data) => {
36
+ return {
37
+ width: data.width,
38
+ height: data.height,
39
+ marginRight: data.marginRight,
40
+ marginBottom: data.marginBottom,
41
+ };
42
+ };
43
+
44
+ // callbacks
45
+ const onEdge = (edgeInfo) => {};
46
+
47
+ const onFocus = () => {};
48
+
49
+ const onBlur = () => {};
50
+
51
+ const widgetLayout = {
52
+ left: 50,
53
+ top: 450,
54
+ width: 1000,
55
+ height: 120,
56
+ };
57
+
58
+ onMounted(() => {});
59
+ </script>
60
+
61
+ <template>
62
+ <div
63
+ :style="{
64
+ width: 1280,
65
+ height: 720,
66
+ backgroundColor: '#007788',
67
+ }"
68
+ />
69
+ <metro-widget
70
+ name="backmw"
71
+ :left="widgetLayout.left"
72
+ :top="widgetLayout.top"
73
+ :width="widgetLayout.width"
74
+ :height="widgetLayout.height"
75
+ :provideData="provideData"
76
+ :direction="HORIZONTAL"
77
+ :measures="measures"
78
+ :onEdge="onEdge"
79
+ :onFocus="onFocus"
80
+ :onBlur="onBlur"
81
+ >
82
+ <template #renderItem="{ data, onAction }">
83
+ <item :data="data" :onAction="onAction" />
84
+ </template>
85
+ </metro-widget>
86
+ </template>
@@ -0,0 +1,133 @@
1
+ <!--
2
+ * @Author: ChenChanghua
3
+ * @Date: 2023-03-08 14:52:08
4
+ * @Description: file content
5
+ -->
6
+ <script setup>
7
+ import { MetroWidget, VERTICAL, useFocusHub } from "jsview";
8
+ import Item from "./Item.vue";
9
+ import { onMounted, defineEmits, inject, shallowRef } from "vue";
10
+
11
+ const emit = defineEmits(["hidden"]);
12
+ const capture = inject("capture");
13
+ const start = inject("start");
14
+ const divRef = shallowRef(null);
15
+
16
+ const getTarget = inject("getTarget");
17
+
18
+ const randomColor = () => {
19
+ let randomColor = Math.round(Math.random() * 2 ** 24).toString(16);
20
+ return (
21
+ "#" + new Array(6 - randomColor.length).fill("0").join("") + randomColor
22
+ );
23
+ };
24
+
25
+ const provideData = () => {
26
+ const data = [];
27
+ for (let i = 0; i < 10; ++i) {
28
+ data.push({
29
+ width: 300,
30
+ height: 100,
31
+ marginRight: 10,
32
+ marginBottom: 10,
33
+ color: randomColor(),
34
+ content: i,
35
+ });
36
+ }
37
+ return data;
38
+ };
39
+
40
+ const measures = (data) => {
41
+ return {
42
+ width: data.width,
43
+ height: data.height,
44
+ marginRight: data.marginRight,
45
+ marginBottom: data.marginBottom,
46
+ };
47
+ };
48
+
49
+ // callbacks
50
+ const onEdge = (edgeInfo) => {};
51
+
52
+ const onFocus = () => {};
53
+
54
+ const onBlur = () => {};
55
+
56
+ const widgetLayout = {
57
+ left: 50,
58
+ top: 50,
59
+ width: 320,
60
+ height: 500,
61
+ };
62
+
63
+ onMounted(() => {});
64
+
65
+ const onKeyDown = (ev) => {
66
+ if (ev.keyCode == 27 || ev.keyCode == 8 || ev.keyCode == 10000) {
67
+ capture(divRef).then((resInfo) => {
68
+ emit("hidden");
69
+ start(
70
+ {
71
+ left: 0,
72
+ top: 0,
73
+ width: 1280,
74
+ height: 720,
75
+ },
76
+ getTarget(),
77
+ 1000,
78
+ "ease-in-out",
79
+ resInfo.url,
80
+ "https://cdn.release.qcast.cn/JsViewFrameworkTester/JsViewVueSampleResources/DemoForOperator/Genie/App/element_228542_icon_20230610184253.jpg",
81
+ resInfo.release
82
+ );
83
+ });
84
+ return true;
85
+ }
86
+ return false;
87
+ };
88
+ </script>
89
+
90
+ <template>
91
+ <jsv-focus-block
92
+ name="tt"
93
+ :onAction="{
94
+ onKeyDown,
95
+ }"
96
+ >
97
+ <div
98
+ ref="divRef"
99
+ :style="{
100
+ width: 1280,
101
+ height: 720,
102
+ backgroundColor: '#778800',
103
+ }"
104
+ >
105
+ <metro-widget
106
+ name="frontmw"
107
+ :left="widgetLayout.left"
108
+ :top="widgetLayout.top"
109
+ :width="widgetLayout.width"
110
+ :height="widgetLayout.height"
111
+ :provideData="provideData"
112
+ :direction="VERTICAL"
113
+ :measures="measures"
114
+ :onEdge="onEdge"
115
+ :onFocus="onFocus"
116
+ :onBlur="onBlur"
117
+ >
118
+ <template #renderItem="{ data, onAction }">
119
+ <item :data="data" :onAction="onAction" />
120
+ </template>
121
+ </metro-widget>
122
+ <div
123
+ :style="{
124
+ left: 400,
125
+ top: 100,
126
+ fontSize: 30,
127
+ }"
128
+ >
129
+ 摁返回键
130
+ </div>
131
+ </div>
132
+ </jsv-focus-block>
133
+ </template>