@shijiu/jsview-vue-samples 2.2.373 → 2.3.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 (181) hide show
  1. package/BakeViewDemo/AnimatePic.vue +1 -1
  2. package/Basic/components/text/TextDirection.vue +7 -2
  3. package/BasicFocusControl/components/BaseBlock.vue +65 -18
  4. package/BreakRender/assets/imageList.json +235 -235
  5. package/ColorSpace/App.vue +4 -4
  6. package/CoupletsTest/App.vue +1 -1
  7. package/CoupletsTest/widget/Banger/Banger.vue +3 -3
  8. package/CoupletsTest/widget/Banger/MaroonLoader.vue +5 -5
  9. package/CoupletsTest/widget/Couplets/Couplets.vue +4 -4
  10. package/CoupletsTest/widget/Fireworks/Fireworks.vue +13 -13
  11. package/CssPreprocessor/Stylus/components/stylus-group1/StylusOperations.vue +0 -1
  12. package/CssPreprocessor/utils/ContentBlock.vue +3 -3
  13. package/CssPreprocessor/utils/{FontStyle.css → FontConfig.css} +3 -3
  14. package/CssPreprocessor/utils/TitleBar.vue +2 -2
  15. package/CustomShader/App.vue +6 -6
  16. package/CustomShader/gaussianBlur.glsl +1 -1
  17. package/DashPath/App.vue +79 -0
  18. package/DashPath/AppForOperator.vue +35 -0
  19. package/DashPath/DashPath.vue +118 -0
  20. package/DemoForOperator/AnimPic/AnimPic.vue +47 -0
  21. package/DemoForOperator/AnimPic/App.vue +28 -0
  22. package/DemoForOperator/Banger/App.vue +26 -0
  23. package/DemoForOperator/Banger/Banger/Banger.vue +252 -0
  24. package/DemoForOperator/Banger/Banger/Maroon.vue +123 -0
  25. package/DemoForOperator/Banger/Banger/MaroonLoader.vue +78 -0
  26. package/DemoForOperator/Banger/Banger/SpriteDeal.js +30 -0
  27. package/DemoForOperator/Bounce/App.vue +43 -0
  28. package/DemoForOperator/Bounce/Bounce.vue +49 -0
  29. package/DemoForOperator/Bounce/FreeMoveBuilder.js +139 -0
  30. package/DemoForOperator/ChunLian/App.vue +47 -0
  31. package/DemoForOperator/ChunLian/Couplets.vue +248 -0
  32. package/DemoForOperator/EpisodeList/App.vue +80 -0
  33. package/DemoForOperator/EpisodeList/EpisodeList/Controller.vue +113 -0
  34. package/DemoForOperator/EpisodeList/EpisodeList/EpisodeList.vue +176 -0
  35. package/DemoForOperator/EpisodeList/GroupItem.vue +65 -0
  36. package/DemoForOperator/EpisodeList/ListItem.vue +48 -0
  37. package/DemoForOperator/Firework1/App.vue +25 -0
  38. package/DemoForOperator/Firework1/Fireworks.vue +358 -0
  39. package/DemoForOperator/Firework1/SpriteDeal.js +30 -0
  40. package/DemoForOperator/FlipPage/App.vue +75 -0
  41. package/DemoForOperator/FlipPage/FlipPage/FlipPage.vue +150 -0
  42. package/DemoForOperator/FlipPage/FlipPage/flipIn.glsl +41 -0
  43. package/DemoForOperator/FlipPage/FlipPage/flipOut.glsl +41 -0
  44. package/DemoForOperator/Focus/Alpha/AlphaFocusBox.vue +70 -0
  45. package/DemoForOperator/Focus/Alpha/AlphaPage.vue +40 -0
  46. package/DemoForOperator/Focus/Alpha/Item.vue +64 -0
  47. package/DemoForOperator/Focus/App.vue +124 -0
  48. package/DemoForOperator/Focus/CommonPageSetting.js +30 -0
  49. package/DemoForOperator/Focus/Item.vue +46 -0
  50. package/DemoForOperator/Focus/Light/Item.vue +67 -0
  51. package/DemoForOperator/Focus/Light/LightFocusBox.vue +46 -0
  52. package/DemoForOperator/Focus/Light/LightPage.vue +43 -0
  53. package/DemoForOperator/Focus/Light/utils/FrameCanvasStore.ts +68 -0
  54. package/DemoForOperator/Focus/Light/utils/RotateFrame.vue +146 -0
  55. package/DemoForOperator/Focus/Light/utils/circleHaloMask.png +0 -0
  56. package/DemoForOperator/Focus/Normal/Item.vue +64 -0
  57. package/DemoForOperator/Focus/Normal/NormalFocusBox.vue +53 -0
  58. package/DemoForOperator/Focus/Normal/NormalPage.vue +41 -0
  59. package/DemoForOperator/Focus/SwipeLight/Item.vue +73 -0
  60. package/DemoForOperator/Focus/SwipeLight/SwipeLightBox.vue +62 -0
  61. package/DemoForOperator/Focus/SwipeLight/SwipeLightPage.vue +44 -0
  62. package/DemoForOperator/FullscreenIn/App.vue +105 -0
  63. package/DemoForOperator/FullscreenIn/FullscreenPoster.vue +41 -0
  64. package/DemoForOperator/FullscreenIn/Item.vue +50 -0
  65. package/DemoForOperator/Genie/App.vue +78 -0
  66. package/DemoForOperator/Genie/geniePakcer/Genie.vue +699 -0
  67. package/DemoForOperator/Genie/geniePakcer/genieBottom.glsl +49 -0
  68. package/DemoForOperator/Genie/geniePakcer/genieLeft.glsl +50 -0
  69. package/DemoForOperator/Genie/geniePakcer/genieRight.glsl +57 -0
  70. package/DemoForOperator/Genie/geniePakcer/genieTop.glsl +50 -0
  71. package/DemoForOperator/GrayFilter/App.vue +51 -0
  72. package/DemoForOperator/GrayFilter/GrayFilter.vue +38 -0
  73. package/DemoForOperator/Jigsaw/App.vue +45 -0
  74. package/DemoForOperator/Jigsaw/JigsawFull.vue +100 -0
  75. package/DemoForOperator/Jigsaw/JigsawSingle.vue +86 -0
  76. package/DemoForOperator/Particle/App.vue +69 -0
  77. package/DemoForOperator/Particle/Drop/DropParticle.vue +176 -0
  78. package/DemoForOperator/Particle/Explode/ExplodeParticle.vue +99 -0
  79. package/DemoForOperator/PosterAnim/App.vue +125 -0
  80. package/DemoForOperator/PosterAnim/Bounce/BouncePage.vue +54 -0
  81. package/DemoForOperator/PosterAnim/Bounce/Item.vue +85 -0
  82. package/DemoForOperator/PosterAnim/Breath/BreathPage.vue +47 -0
  83. package/DemoForOperator/PosterAnim/Breath/Item.vue +58 -0
  84. package/DemoForOperator/PosterAnim/CommonPageSetting.js +30 -0
  85. package/DemoForOperator/PosterAnim/Item.vue +46 -0
  86. package/DemoForOperator/PosterAnim/PosterAnim.js +58 -0
  87. package/DemoForOperator/PosterAnim/Scale/Item.vue +72 -0
  88. package/DemoForOperator/PosterAnim/Scale/ScalePage.vue +48 -0
  89. package/DemoForOperator/PosterAnim/Shake/Item.vue +85 -0
  90. package/DemoForOperator/PosterAnim/Shake/ShakePage.vue +53 -0
  91. package/DemoForOperator/PosterOverflow/App.vue +116 -0
  92. package/DemoForOperator/PosterOverflow/Item.vue +67 -0
  93. package/DemoForOperator/PosterOverflow/PosterOverflow.vue +23 -0
  94. package/DemoForOperator/Ripple/App.vue +54 -0
  95. package/DemoForOperator/Ripple/Ripple.vue +50 -0
  96. package/DemoForOperator/ScalePoster/App.vue +4 -0
  97. package/DemoForOperator/ScalePoster/ScalePoster.vue +0 -0
  98. package/DemoForOperator/Sprite/App.vue +33 -0
  99. package/DemoForOperator/Sprite/Sprite.vue +90 -0
  100. package/DemoForOperator/Stretch/App.vue +103 -0
  101. package/DemoForOperator/Stretch/Stretch/Item.vue +192 -0
  102. package/DemoForOperator/Stretch/Stretch/Stretch.vue +168 -0
  103. package/DemoForOperator/TabContent/App.vue +89 -0
  104. package/DemoForOperator/TabContent/ContentPage.vue +66 -0
  105. package/DemoForOperator/TabContent/Item.vue +85 -0
  106. package/DemoForOperator/TabContent/PageItem.vue +40 -0
  107. package/DemoForOperator/TabContent/TabContent/CreepFocus.vue +160 -0
  108. package/DemoForOperator/TabContent/TabContent/Item.vue +63 -0
  109. package/DemoForOperator/TabContent/TabContent/TabContent.vue +146 -0
  110. package/DemoForOperator/TabContent/TabContent/TabItem.vue +368 -0
  111. package/DemoForOperator/TabContent/TabContent/TabWidget.vue +243 -0
  112. package/DemoForOperator/TabContent/TabContent/Util.js +3 -0
  113. package/DemoForOperator/TabContent/TabContent/ViewSwiper.vue +110 -0
  114. package/DemoForOperator/TabContent/testData.js +241 -0
  115. package/DemoForOperator/Vortex/App.vue +78 -0
  116. package/DemoForOperator/Vortex/Vortex/Vortex.vue +154 -0
  117. package/DemoForOperator/Vortex/Vortex/vortexIn.glsl +38 -0
  118. package/DemoForOperator/Vortex/Vortex/vortexOut.glsl +38 -0
  119. package/DemoForOperator/index.js +6 -0
  120. package/DemoForOperator/routeList.js +142 -0
  121. package/DemoHomepage/App.vue +50 -30
  122. package/DemoHomepage/components/Dialog.vue +1 -0
  123. package/DemoHomepage/components/TabFrame.vue +7 -0
  124. package/DemoHomepage/router.js +104 -81
  125. package/DemoHomepage/views/Homepage.vue +7 -6
  126. package/DivMetroPerformance/components/ContentItem.vue +0 -1
  127. package/DivMetroPerformance/data.js +3 -3
  128. package/DriftScopeTest/App.vue +1 -1
  129. package/FilterDemo/AnimatePic.vue +1 -1
  130. package/FilterDemo/VideoLayer.vue +2 -2
  131. package/FlexCellDemo/TestFrame1.vue +0 -4
  132. package/FullScreenFlex/TestFrame2.vue +1 -1
  133. package/GiftRain/App.vue +12 -15
  134. package/HashParams/App.vue +0 -1
  135. package/JsvPreDownloader/App.vue +4 -6
  136. package/Marquee/App.vue +2 -2
  137. package/MediaDemo/components/frames/AudioFrame.vue +1 -1
  138. package/MediaDemo/components/frames/VideoFrame.vue +1 -1
  139. package/MetroWidgetDemos/MassiveItems/ContentItem.vue +1 -2
  140. package/MetroWidgetDemos/MassiveItems/data.js +1 -1
  141. package/MetroWidgetDemos/PerformanceTest/components/ContentItem.vue +0 -1
  142. package/MetroWidgetDemos/PerformanceTest/components/MyTab.vue +18 -17
  143. package/MetroWidgetDemos/PerformanceTest/data.js +3 -3
  144. package/MetroWidgetDemos/RefreshDemo/assets/imageList.json +235 -235
  145. package/MetroWidgetDemos/SkeletonDiagram/assets/imageList.json +235 -235
  146. package/MetroWidgetDemos/focusableItemMetroWidget/WidgetItem.vue +3 -1
  147. package/MetroWidgetDemos/routeList.js +17 -17
  148. package/Poster3d/App.vue +69 -0
  149. package/Poster3d/Poster3d.vue +92 -0
  150. package/PosterPacker/App.vue +5 -5
  151. package/PosterPacker/tools/geniePakcer/Genie.vue +2 -2
  152. package/PosterPacker/tools/vortexPacker/Vortex.vue +15 -15
  153. package/QrcodeDemo/App.vue +1 -1
  154. package/Ripple/App.vue +1 -1
  155. package/ScaleDownNeon/App.vue +13 -10
  156. package/SceneTransition/App.vue +7 -6
  157. package/SceneTransition/maskConfig/config2.js +12 -12
  158. package/SceneTransition/maskConfig/config3.js +14 -14
  159. package/SprayView/App.vue +96 -51
  160. package/SpringFestival/App.vue +73 -0
  161. package/SpringFestival/SpringFestivalScene/ChunLian.vue +211 -0
  162. package/SpringFestival/SpringFestivalScene/FreeMoveBuilder.js +139 -0
  163. package/SpringFestival/SpringFestivalScene/LanternAnim.js +60 -0
  164. package/SpringFestival/SpringFestivalScene/Rain.vue +137 -0
  165. package/SpringFestival/SpringFestivalScene/Scene.vue +218 -0
  166. package/SpringFestival/SpringFestivalScene/imageConfig.js +87 -0
  167. package/SpringFestival/SpringFestivalScene/index.js +1 -0
  168. package/Swiper/App.vue +28 -29
  169. package/Swiper/Item.vue +19 -0
  170. package/SwiperTest/App.vue +9 -9
  171. package/TestNativeSharedView/AckEventDefine.ts +82 -0
  172. package/TestNativeSharedView/App.vue +4 -6
  173. package/TestNativeSharedView/JsvDemoTester.js +131 -0
  174. package/TextureAnimation/App3.vue +100 -0
  175. package/TextureAnimation/utils/FrameCanvasStore.ts +68 -0
  176. package/TextureAnimation/utils/RotateFrame.vue +146 -0
  177. package/TextureAnimation/utils/circleHaloMask.png +0 -0
  178. package/TextureSize/App.vue +5 -6
  179. package/TombSweepingDayTest/Raining/RainScene.vue +4 -4
  180. package/ViewOpacity/App.vue +6 -7
  181. package/package.json +1 -1
@@ -0,0 +1,699 @@
1
+ <script setup>
2
+ /**
3
+ * @file Genie组件说明
4
+ * Genie:收缩或者放出效果的组件
5
+ * props说明:
6
+ * @prop {Number} width (必填) 组件的基础宽度
7
+ * @prop {Number} height (必填) 组件的基础高度
8
+ * @prop {Number} top (非必填) 组件的基础top
9
+ * @prop {Number} left (非必填) 组件的基础left
10
+ * @prop {Number} time (非必填) 组件的动画时长
11
+ * @prop {Object} position (必填) 组件收缩点的坐标
12
+ * @prop {String} direction (必填) 组件动画方向
13
+ * @prop {Function} animationEnd (非必填) 组件做完一次动画后的回调
14
+ * @prop {Boolean} initShow (必填) 组件初始状态
15
+ * methods:
16
+ * @method switcher 暴露出去的方法 交替组件内部显示情况
17
+ *
18
+ */
19
+
20
+ import genieLeft from "./genieLeft.glsl?raw";
21
+ import genieRight from "./genieRight.glsl?raw";
22
+ import genieBottom from "./genieBottom.glsl?raw";
23
+ import genieTop from "./genieTop.glsl?raw";
24
+ import {
25
+ shallowRef,
26
+ computed,
27
+ onMounted,
28
+ onUnmounted,
29
+ onBeforeUnmount,
30
+ watchEffect,
31
+ } from "vue";
32
+ import {
33
+ JsvFragShaderView,
34
+ getKeyFramesGroup,
35
+ JsvTextureStoreApi,
36
+ } from "jsview";
37
+ const props = defineProps({
38
+ width: { type: Number, require: true },
39
+ height: { type: Number, require: true },
40
+ left: { type: Number, default: 0 },
41
+ top: { type: Number, default: 0 },
42
+ time: { type: Number, default: 2 },
43
+ position: { type: Object, require: true },
44
+ size: { type: Number, default: 1 },
45
+ direction: { type: String, require: true },
46
+ onAnimEnd: { type: Function, default: () => {} },
47
+ initShow: { type: Boolean, require: true },
48
+ });
49
+
50
+ let rShow = shallowRef(false);
51
+ let rFlag = shallowRef(true);
52
+ //是否第一次动画
53
+ let initAni = true;
54
+ //动画
55
+ const cStyleShell = getKeyFramesGroup();
56
+ //动画字符串
57
+ let rAniStr = shallowRef("release");
58
+ //位移动画中心点方向
59
+ let vTransformDirection = "";
60
+ //形变比例
61
+ let vTransformScale = 1;
62
+ //自动播放控制
63
+ let autoControl = shallowRef(false);
64
+ //shader模型
65
+ let vTempMode = "";
66
+ let vShaderMode = "";
67
+ //替换
68
+ let rReplacedShader = shallowRef("");
69
+ //动画
70
+ let vContract;
71
+ let vRelease;
72
+ //位移量
73
+ let vDistanceX;
74
+ let vDistanceY;
75
+ //shader动画的参数
76
+ let vRange1;
77
+ let vRange2;
78
+
79
+ //在组件外部的八种情况
80
+ //左上方
81
+ if (props.position.x < 0 && props.position.y < 0) {
82
+ vDistanceX = props.position.x;
83
+ vDistanceY = props.position.y;
84
+ //释放的动画
85
+ vRelease = `@keyframes release {
86
+ 0% {
87
+ transform: translate3d(${vDistanceX},${vDistanceY}, 0);
88
+ }
89
+ 70%{
90
+ transform: translate3d(${vDistanceX},${vDistanceY}, 0);
91
+ }
92
+ 80% {
93
+ transform: translate3d(0, 0, 0);
94
+ }
95
+ 100% {
96
+ transform: translate3d(0, 0, 0);
97
+ }
98
+ }`;
99
+ vContract = `@keyframes contract {
100
+ 0% {
101
+ transform: translate3d(0, 0, 0);
102
+ }
103
+ 30% {
104
+ transform: translate3d(0, 0, 0);
105
+ }
106
+ 40%{
107
+ transform: translate3d(${vDistanceX}, ${vDistanceY}, 0);
108
+ }
109
+ 100% {
110
+ transform: translate3d(${vDistanceX}, ${vDistanceY}, 0);
111
+ }
112
+ }`;
113
+ if (props.direction == "horizontal") {
114
+ vShaderMode = genieLeft;
115
+ vRange1 = 1 - 1 / props.height;
116
+ vRange2 = 1 - 2 / props.height;
117
+ } else if (props.direction == "vertical") {
118
+ vShaderMode = genieTop;
119
+ vRange1 = 1 / props.width;
120
+ vRange2 = 2 / props.width;
121
+ }
122
+ } else if (props.position.x < props.width && props.position.y < 0) {
123
+ //正上方
124
+ vDistanceY = props.position.y;
125
+ //释放的动画
126
+ vRelease = `@keyframes release {
127
+ 0% {
128
+ transform: translate3d(0,${vDistanceY}, 0);
129
+ }
130
+ 70% {
131
+ transform: translate3d(0,${vDistanceY}, 0);
132
+ }
133
+ 80%{
134
+ transform: translate3d(0, 0, 0);
135
+ }
136
+
137
+ 100% {
138
+ transform: translate3d(0, 0, 0);
139
+ }
140
+ }`;
141
+ vContract = `@keyframes contract {
142
+ 0% {
143
+ transform: translate3d(0, 0, 0);
144
+ }
145
+ 30% {
146
+ transform: translate3d($0, 0, 0);
147
+ }
148
+ 40%{
149
+ transform: translate3d($0, ${vDistanceY}, 0);
150
+ }
151
+ 100% {
152
+ transform: translate3d(0, ${vDistanceY}, 0);
153
+ }
154
+ }`;
155
+
156
+ vShaderMode = genieTop;
157
+
158
+ vRange1 = (props.position.x + 1) / props.width;
159
+ vRange2 = props.position.x / props.width;
160
+ } else if (props.position.x > props.width && props.position.y < 0) {
161
+ //右上角
162
+ if (props.direction == "horizontal") {
163
+ vDistanceX = props.position.x - props.width;
164
+ vDistanceY = props.position.y;
165
+ vShaderMode = genieRight;
166
+ vRange1 = 1 - 1 / props.height;
167
+ vRange2 = 1 - 2 / props.height;
168
+ } else if (props.direction == "vertical") {
169
+ vDistanceX = props.position.x - props.width;
170
+ vDistanceY = props.position.y;
171
+ vShaderMode = genieTop;
172
+ vRange2 = 1 - 2 / props.width;
173
+ vRange1 = 1 - 1 / props.width;
174
+ }
175
+ //释放的动画
176
+ vRelease = `@keyframes release {
177
+ 0% {
178
+ transform: translate3d(${vDistanceX},${vDistanceY}, 0);
179
+ }
180
+ 70% {
181
+ transform: translate3d(${vDistanceX},${vDistanceY}, 0);
182
+ }
183
+ 80%{
184
+ transform: translate3d(0, 0, 0);
185
+ }
186
+ 100% {
187
+ transform: translate3d(0, 0, 0);
188
+ }
189
+ }`;
190
+ vContract = `@keyframes contract {
191
+ 0% {
192
+ transform: translate3d(0, 0, 0);
193
+ }
194
+ 30% {
195
+ transform: translate3d(0, 0, 0);
196
+ }
197
+ 40%{
198
+ transform: translate3d(${vDistanceX}, ${vDistanceY}, 0);
199
+ }
200
+ 100% {
201
+ transform: translate3d(${vDistanceX}, ${vDistanceY}, 0);
202
+ }
203
+ }`;
204
+ } else if (
205
+ props.position.x < 0 &&
206
+ props.position.y > 0 &&
207
+ props.position.y <= props.height
208
+ ) {
209
+ //正左边
210
+ vDistanceX = props.position.x;
211
+ //释放的动画
212
+ vRelease = `@keyframes release {
213
+ 0% {
214
+ transform: translate3d(${vDistanceX},0, 0);
215
+ }
216
+ 70% {
217
+ transform: translate3d(${vDistanceX},0, 0);
218
+ }
219
+ 80%{
220
+ transform: translate3d(0, 0, 0);
221
+ }
222
+ 100% {
223
+ transform: translate3d(0, 0, 0);
224
+ }
225
+ }`;
226
+ vContract = `@keyframes contract {
227
+ 0% {
228
+ transform: translate3d(0, 0, 0);
229
+ }
230
+ 30% {
231
+ transform: translate3d(0, 0, 0);
232
+ }
233
+ 40%{
234
+ transform: translate3d(${vDistanceX},0, 0);
235
+ }
236
+ 100% {
237
+ transform: translate3d(${vDistanceX},0, 0);
238
+ }
239
+ }`;
240
+
241
+ vShaderMode = genieLeft;
242
+
243
+ vRange2 = 1 - props.position.y / props.height;
244
+ vRange1 = 1 - (props.position.y + 1) / props.height;
245
+ } else if (
246
+ props.position.x > props.width &&
247
+ props.position.y > 0 &&
248
+ props.position.y <= props.height
249
+ ) {
250
+ //正右边
251
+ vDistanceX = props.position.x - props.width;
252
+ vDistanceY = props.position.y;
253
+ vShaderMode = genieRight;
254
+ vRange1 = 1 - props.position.y / props.height;
255
+ vRange2 = 1 - (1 + props.position.y) / props.height;
256
+ //释放的动画
257
+ vRelease = `@keyframes release {
258
+ 0% {
259
+ transform: translate3d(${vDistanceX},0, 0);
260
+ }
261
+ 70% {
262
+ transform: translate3d(${vDistanceX},0, 0);
263
+ }
264
+ 80%{
265
+ transform: translate3d(0, 0, 0);
266
+ }
267
+ 100% {
268
+ transform: translate3d(0, 0, 0);
269
+ }
270
+ }`;
271
+ vContract = `@keyframes contract {
272
+ 0% {
273
+ transform: translate3d(0, 0, 0);
274
+ }
275
+ 30% {
276
+ transform: translate3d(0, 0, 0);
277
+ }
278
+ 40%{
279
+ transform: translate3d(${vDistanceX},0, 0);
280
+ }
281
+ 100% {
282
+ transform: translate3d(${vDistanceX},0, 0);
283
+ }
284
+ }`;
285
+ } else if (props.position.x < 0 && props.position.y > props.height) {
286
+ //左下方
287
+ if (props.direction == "horizontal") {
288
+ vDistanceX = props.position.x;
289
+ vDistanceY = props.position.y - props.height;
290
+ vShaderMode = genieLeft;
291
+ vRange2 = 1 / props.height;
292
+ vRange1 = (1 + 1) / props.height;
293
+ } else if (props.direction == "vertical") {
294
+ vDistanceX = props.position.x;
295
+ vDistanceY = props.position.y - props.height;
296
+ vShaderMode = genieBottom;
297
+ vRange1 = 1 / props.width;
298
+ vRange2 = (1 + 1) / props.width;
299
+ }
300
+ //释放的动画
301
+ vRelease = `@keyframes release {
302
+ 0% {
303
+ transform: translate3d(${vDistanceX},${vDistanceY}, 0);
304
+ }
305
+ 70% {
306
+ transform: translate3d(${vDistanceX},${vDistanceY}, 0);
307
+ }
308
+ 80%{
309
+ transform: translate3d(0, 0, 0);
310
+ }
311
+ 100% {
312
+ transform: translate3d(0, 0, 0);
313
+ }
314
+ }`;
315
+ vContract = `@keyframes contract {
316
+ 0% {
317
+ transform: translate3d(0, 0, 0);
318
+ }
319
+ 30% {
320
+ transform: translate3d(0, 0, 0);
321
+ }
322
+ 40%{
323
+ transform: translate3d(${vDistanceX}, ${vDistanceY}, 0);
324
+ }
325
+ 100% {
326
+ transform: translate3d(${vDistanceX}, ${vDistanceY}, 0);
327
+ }
328
+ }`;
329
+ } else if (
330
+ props.position.x > 0 &&
331
+ props.position.x < props.width &&
332
+ props.position.y > props.height
333
+ ) {
334
+ //正下方
335
+ vDistanceY = props.position.y - props.height;
336
+ //释放的动画
337
+ vRelease = `@keyframes release {
338
+ 0% {
339
+ transform: translate3d(0,${vDistanceY}, 0);
340
+ }
341
+ 70% {
342
+ transform: translate3d(0,${vDistanceY}, 0);
343
+ }
344
+ 80%{
345
+ transform: translate3d(0, 0, 0);
346
+ }
347
+ 100% {
348
+ transform: translate3d(0, 0, 0);
349
+ }
350
+ }`;
351
+ vContract = `@keyframes contract {
352
+ 0% {
353
+ transform: translate3d(0, 0, 0);
354
+ }
355
+ 30% {
356
+ transform: translate3d(0, 0, 0);
357
+ }
358
+ 40%{
359
+ transform: translate3d($0, ${vDistanceY}, 0);
360
+ }
361
+ 100% {
362
+ transform: translate3d(0, ${vDistanceY}, 0);
363
+ }
364
+ }`;
365
+
366
+ vShaderMode = genieBottom;
367
+
368
+ vRange1 = props.position.x / props.width;
369
+ vRange2 = (props.position.x - 1) / props.width;
370
+ } else if (props.position.x > props.width && props.position.y > props.height) {
371
+ //右下方
372
+ if (props.direction == "horizontal") {
373
+ vDistanceX = props.position.x - props.width;
374
+ vDistanceY = props.position.y - props.height;
375
+ vShaderMode = genieRight;
376
+ vRange2 = 1 / props.height;
377
+ vRange1 = (1 + 1) / props.height;
378
+ } else if (props.direction == "vertical") {
379
+ vDistanceX = props.position.x - props.width;
380
+ vDistanceY = props.position.y - props.height;
381
+ vShaderMode = genieBottom;
382
+ vRange2 = 1 - 2 / props.width;
383
+ vRange1 = 1 - 1 / props.width;
384
+ }
385
+ //释放的动画
386
+ vRelease = `@keyframes release {
387
+ 0% {
388
+ transform: translate3d(${vDistanceX},${vDistanceY}, 0);
389
+ }
390
+ 70% {
391
+ transform: translate3d(${vDistanceX},${vDistanceY}, 0);
392
+ }
393
+ 80%{
394
+ transform: translate3d(0, 0, 0);
395
+ }
396
+ 100% {
397
+ transform: translate3d(0, 0, 0);
398
+ }
399
+ }`;
400
+ vContract = `@keyframes contract {
401
+ 0% {
402
+ transform: translate3d(0, 0, 0);
403
+ }
404
+ 30% {
405
+ transform: translate3d(0, 0, 0);
406
+ }
407
+ 40%{
408
+ transform: translate3d(${vDistanceX}, ${vDistanceY}, 0);
409
+ }
410
+ 100% {
411
+ transform: translate3d(${vDistanceX}, ${vDistanceY}, 0);
412
+ }
413
+ }`;
414
+ } else {
415
+ //在组件内
416
+ //根据传入进来的方向和中心点位置确定缩放动画
417
+ if (props.direction == "vertical") {
418
+ if (props.position.y < props.height / 2) {
419
+ vTransformDirection = "bottom center";
420
+ vShaderMode = genieTop;
421
+ vTransformScale = 1 - props.position.y / props.height;
422
+ } else {
423
+ vTransformDirection = "top center";
424
+ vShaderMode = genieBottom;
425
+ vTransformScale = props.position.y / props.height;
426
+ }
427
+ vRange1 = props.position.x / props.width;
428
+ vRange2 = (props.position.x - 1) / props.width;
429
+ } else if (props.direction == "horizontal") {
430
+ //解析坐标位置是否要进行移动动画
431
+ if (props.position.x < props.width / 2) {
432
+ vTransformDirection = "center right";
433
+ vShaderMode = genieLeft;
434
+ vTransformScale = 1 - props.position.x / props.width;
435
+ } else {
436
+ vTransformDirection = "center left";
437
+ vShaderMode = genieRight;
438
+ vTransformScale = props.position.x / props.width;
439
+ }
440
+ vRange1 = 1 - props.position.y / props.height;
441
+ vRange2 = 1 - (props.position.y + 1) / props.height;
442
+ }
443
+
444
+ if (props.direction == "horizontal") {
445
+ // //收的动画
446
+ vContract = `@keyframes contract {
447
+ 0% {
448
+ transform: scale3d(1, 1, 1);
449
+ transform-origin:${vTransformDirection};
450
+ }
451
+ 30% {
452
+ transform: scale3d(${vTransformScale}, 1, 1);
453
+ transform-origin:${vTransformDirection};
454
+ }
455
+ 100% {
456
+ transform: scale3d(${vTransformScale}, 1, 1);
457
+ transform-origin:${vTransformDirection};
458
+ }
459
+ }`;
460
+ // //释放的动画
461
+ vRelease = `@keyframes release {
462
+ 0% {
463
+ transform: scale3d(${vTransformScale}, 1, 1);
464
+ transform-origin:${vTransformDirection};
465
+ }
466
+ 70% {
467
+ transform: scale3d(${vTransformScale}, 1, 1);
468
+ transform-origin:${vTransformDirection};
469
+ }
470
+ 100% {
471
+ transform: scale3d(1, 1, 1);
472
+ transform-origin:${vTransformDirection};
473
+ }
474
+ }`;
475
+ } else if (props.direction == "vertical") {
476
+ //收的动画
477
+ vContract = `@keyframes contract {
478
+ 0% {
479
+ transform: scale3d(1, 1, 1);
480
+ transform-origin:${vTransformDirection};
481
+ }
482
+ 30% {
483
+ transform: scale3d(1,${vTransformScale}, 1);
484
+ transform-origin:${vTransformDirection};
485
+ }
486
+ 100% {
487
+ transform: scale3d(1, ${vTransformScale}, 1);
488
+ transform-origin:${vTransformDirection};
489
+ }
490
+ }`;
491
+ //释放的动画
492
+ vRelease = `@keyframes release {
493
+ 0% {
494
+ transform: scale3d(1,${vTransformScale}, 1);
495
+ transform-origin:${vTransformDirection};
496
+ }
497
+ 70% {
498
+ transform: scale3d(1,${vTransformScale}, 1);
499
+ transform-origin:${vTransformDirection};
500
+ }
501
+ 100% {
502
+ transform: scale3d(1, 1, 1);
503
+ transform-origin:${vTransformDirection};
504
+ }
505
+ }`;
506
+ }
507
+ }
508
+ //根据初始状态展示
509
+ if (props.initShow) {
510
+ rShow.value = true;
511
+ rFlag.value = false;
512
+ rAniStr.value = "contract";
513
+ vTempMode = vShaderMode.replace(/\$\{myTime\}/g, "iTime / iDuration");
514
+ } else {
515
+ rShow.value = false;
516
+ rFlag.value = false;
517
+ rAniStr.value = "release";
518
+ vTempMode = vShaderMode.replace(
519
+ /\$\{myTime\}/g,
520
+ "(iDuration - iTime) / iDuration"
521
+ );
522
+ }
523
+ rReplacedShader = vTempMode
524
+ .replace(/\$\{RANGE_1\}/g, vRange1)
525
+ .replace(/\$\{RANGE_2\}/g, vRange2);
526
+
527
+ //结束动画函数
528
+ const EndAni = () => {
529
+ if (rAniStr.value == "release") {
530
+ rFlag.value = false;
531
+ rShow.value = true;
532
+ } else {
533
+ rFlag.value = false;
534
+ rShow.value = false;
535
+ }
536
+ };
537
+ //配置
538
+ const cShaderSettings = {
539
+ name: "genieLeft",
540
+ shader: rReplacedShader,
541
+ uniforms: [],
542
+ textures: [
543
+ {
544
+ name: "iChannel0",
545
+ resource: null,
546
+ },
547
+ ],
548
+ duration: props.time * 1000,
549
+ onEnd: EndAni,
550
+ };
551
+
552
+ cStyleShell.insertRule(vContract);
553
+ cStyleShell.insertRule(vRelease);
554
+ let rWidgetRef = shallowRef(null);
555
+ const rShaderInfo = computed(() => {
556
+ return cShaderSettings;
557
+ });
558
+
559
+ let vNextTickStartAnimTimer = -1;
560
+
561
+ function doAnim() {
562
+ if (initAni) {
563
+ rFlag.value = true;
564
+ if (vNextTickStartAnimTimer != -1) {
565
+ clearTimeout(vNextTickStartAnimTimer);
566
+ }
567
+ vNextTickStartAnimTimer = setTimeout(() => {
568
+ rShow.value = false;
569
+ rWidgetRef.value?.startAnim();
570
+ vNextTickStartAnimTimer = -1;
571
+ }, 0);
572
+ initAni = false;
573
+ } else {
574
+ rFlag.value = true;
575
+ if (rAniStr.value == "release") {
576
+ rAniStr.value = "contract";
577
+ rReplacedShader = rReplacedShader.replace(
578
+ "(iDuration - iTime) / iDuration",
579
+ "iTime / iDuration"
580
+ );
581
+ cShaderSettings.shader = rReplacedShader;
582
+ } else {
583
+ rAniStr.value = "release";
584
+ rReplacedShader = rReplacedShader.replace(
585
+ "iTime / iDuration",
586
+ "(iDuration - iTime) / iDuration"
587
+ );
588
+ cShaderSettings.shader = rReplacedShader;
589
+ }
590
+ if (vNextTickStartAnimTimer != -1) {
591
+ clearTimeout(vNextTickStartAnimTimer);
592
+ }
593
+ vNextTickStartAnimTimer = setTimeout(() => {
594
+ rShow.value = false;
595
+ rWidgetRef.value?.startAnim();
596
+ }, 0);
597
+ }
598
+ }
599
+
600
+ const switcher = () => {
601
+ JsvTextureStoreApi.capture2Texture(
602
+ slotRootRef.value,
603
+ (textureName, autoRecycle, w, h) => {
604
+ cShaderSettings.textures[0].resource = `jsvtexturestore://${textureName}`;
605
+
606
+ if (autoRecycle) {
607
+ // 已经是设置了texture的自动回收,所以不再需要主动调用 JsvTextureStoreApi.deleteTexture 来释放内存
608
+ }
609
+ doAnim();
610
+ },
611
+ true // 自动回收, 不填也行,默认为true
612
+ );
613
+ };
614
+
615
+ //截屏处理
616
+ const slotRootRef = shallowRef(null);
617
+
618
+ onMounted(() => {
619
+ window.JsvCoreApi.enableFpsDisplay(true);
620
+ });
621
+
622
+ onUnmounted(() => {
623
+ if (vNextTickStartAnimTimer != -1) {
624
+ clearTimeout(vNextTickStartAnimTimer);
625
+ vNextTickStartAnimTimer = -1;
626
+ }
627
+
628
+ window.JsvCoreApi.enableFpsDisplay(false);
629
+ });
630
+ onBeforeUnmount(() => {
631
+ cStyleShell.removeRule("contract");
632
+ cStyleShell.removeRule("release");
633
+ });
634
+
635
+ defineExpose({
636
+ switcher,
637
+ });
638
+ </script>
639
+ <template>
640
+ <div
641
+ :style="{
642
+ left: props.left,
643
+ top: props.top,
644
+ }"
645
+ >
646
+ <div
647
+ v-if="rFlag"
648
+ :style="{
649
+ width: props.width,
650
+ height: props.height,
651
+ animation: `${rAniStr} ${props.time}s`,
652
+ transformOrigin: vTransformDirection,
653
+ }"
654
+ @animationend="props.onAnimEnd"
655
+ >
656
+ <jsv-frag-shader-view
657
+ ref="rWidgetRef"
658
+ :style="{
659
+ width: props.width,
660
+ height: props.height,
661
+ }"
662
+ :duration="rShaderInfo.duration"
663
+ :shaderStr="rShaderInfo.shader"
664
+ :autoplay="false"
665
+ :textures="rShaderInfo.textures"
666
+ :onEnd="rShaderInfo.onEnd"
667
+ >
668
+ </jsv-frag-shader-view>
669
+ </div>
670
+ <div
671
+ v-if="!rShow"
672
+ :style="{
673
+ width: 1,
674
+ height: 1,
675
+ overflow: 'hidden',
676
+ }"
677
+ >
678
+ <div
679
+ ref="slotRootRef"
680
+ :style="{
681
+ width: props.width,
682
+ height: props.height,
683
+ }"
684
+ >
685
+ <slot></slot>
686
+ </div>
687
+ </div>
688
+ <div
689
+ v-else
690
+ ref="slotRootRef"
691
+ :style="{
692
+ width: props.width,
693
+ height: props.height,
694
+ }"
695
+ >
696
+ <slot></slot>
697
+ </div>
698
+ </div>
699
+ </template>