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