@shijiu/jsview-vue-samples 2.3.151-test.0 → 2.3.728-alpha.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 (244) hide show
  1. package/ABImageAlt/App.vue +114 -0
  2. package/ABImageAlt/Item.vue +133 -0
  3. package/{MetroWidgetDemos/SkeletonDiagram/assets/imageList.json → ABImageAlt/assets/imageList.js} +9 -1
  4. package/ABImageAlt/data.js +17 -0
  5. package/AI_Check_Rules.txt +5 -0
  6. package/AnimPicture/App.vue +20 -10
  7. package/ApicSwitch/App.vue +90 -0
  8. package/ApicSwitch/TabItem.vue +65 -0
  9. package/ApicSwitch/WebpShow.vue +24 -0
  10. package/ApicSwitch/data.js +50 -0
  11. package/Basic/AI_skills_update.md +1 -0
  12. package/Basic/components/div/ColorFormatTest.vue +93 -0
  13. package/Basic/components/div/DivRadius.vue +97 -15
  14. package/Basic/components/div/DivTag3Group.vue +30 -0
  15. package/Basic/components/img/ImageType.vue +65 -0
  16. package/Basic/components/panel/Panel2.vue +13 -1
  17. package/Basic/components/text/TextAlign.vue +7 -1
  18. package/BlobLoadTest/App.vue +201 -0
  19. package/BreakLinesApi/App.vue +82 -0
  20. package/CanvasDrawChart/App.vue +11 -0
  21. package/CanvasDrawChart/Graph1.vue +104 -0
  22. package/CanvasDrawChart/Graph2.vue +115 -0
  23. package/DemoForOperator/Blur/Blur.vue +1 -1
  24. package/DemoForOperator/Blur/BlurInOut/BlurInOut.vue +49 -23
  25. package/DemoForOperator/Blur/BlurInOut/StaticBgSlide.vue +1 -1
  26. package/DemoForOperator/Blur/BlurPopup/BlurPopup.vue +156 -20
  27. package/DemoForOperator/BookFlip/App.vue +1 -1
  28. package/DemoForOperator/Bounce/FreeMoveBuilder.js +1 -1
  29. package/DemoForOperator/Firework1/App.vue +12 -1
  30. package/DemoForOperator/Firework1/Fireworks.vue +18 -0
  31. package/DemoForOperator/FlipPage/FlipPage/FlipPage.vue +1 -0
  32. package/DemoForOperator/Focus/Alpha/Item.vue +1 -0
  33. package/DemoForOperator/Focus/Light/Item.vue +1 -0
  34. package/DemoForOperator/Focus/Normal/Item.vue +1 -0
  35. package/DemoForOperator/Genie/App.vue +20 -6
  36. package/DemoForOperator/Genie/App2.vue +61 -0
  37. package/DemoForOperator/Genie/geniePakcer/GenieImage.vue +298 -0
  38. package/DemoForOperator/Genie/geniePakcer/GenieSlot.vue +292 -0
  39. package/DemoForOperator/Genie/geniePakcer/GenieTools.ts +463 -0
  40. package/DemoForOperator/Jigsaw/JigsawFull.vue +12 -7
  41. package/DemoForOperator/Jigsaw/JigsawSingle.vue +13 -7
  42. package/DemoForOperator/LongChatBox/App.vue +13 -13
  43. package/DemoForOperator/LongChatBox/Bubble.vue +78 -66
  44. package/DemoForOperator/LongChatBox/LongChat.vue +67 -36
  45. package/DemoForOperator/LongChatBox/testData.js +7 -44
  46. package/DemoForOperator/Sound/Bounce/FreeMoveBuilder.js +1 -1
  47. package/DemoForOperator/routeList.js +8 -2
  48. package/DemoHomepage/App.vue +74 -1
  49. package/DemoHomepage/components/BodyFrame.vue +5 -0
  50. package/DemoHomepage/components/TabFrame.vue +1 -1
  51. package/DemoHomepage/router.js +749 -165
  52. package/DemoHomepage/views/Homepage.vue +60 -2
  53. package/DemoHomepage/watchTest.vue +50 -0
  54. package/DomRenderer/App.vue +133 -0
  55. package/FilterDemo/AnimatePic.vue +63 -17
  56. package/FilterDemo/App.vue +3 -3
  57. package/FlexCellDemo/AI_skills_update.md +4 -0
  58. package/FlexCellDemo/TestFrame1.vue +12 -2
  59. package/FlexCellDemo/TestFrame2.vue +10 -1
  60. package/FlexCellDemo/TestFrame3.vue +114 -59
  61. package/FpsLimit/App.vue +102 -0
  62. package/FreeMove/App.vue +24 -279
  63. package/FreeMove/TestScene1.vue +260 -0
  64. package/FreeMove/TestScene3.vue +431 -0
  65. package/FreeMoveChildAttract/App.vue +18 -8
  66. package/FreeMoveLink/App.vue +51 -22
  67. package/Hover/App.vue +144 -0
  68. package/HttpRequestSSE/SSEReader.js +200 -0
  69. package/ImpactStop/App.vue +2 -2
  70. package/Input/FullKeyboard.vue +3 -3
  71. package/Input/InputPanel.vue +63 -3
  72. package/JsvLine/App.vue +53 -38
  73. package/LatexDemo/App.vue +3 -1
  74. package/LatexFormula/App.vue +196 -0
  75. package/LongImage/App.vue +1 -1
  76. package/LongImage/LongImageScroll.vue +111 -46
  77. package/LongImage/Scroll.vue +28 -9
  78. package/LongText/LongTextScroll.vue +14 -1
  79. package/Markdown/App.vue +36 -0
  80. package/Markdown/Bubble.vue +109 -0
  81. package/Markdown/LongChat.vue +216 -0
  82. package/Markdown/data.js +633 -0
  83. package/MetroWidgetDemos/AI_skills_update.md +2 -0
  84. package/MetroWidgetDemos/EpgFlowListType/App.vue +206 -0
  85. package/MetroWidgetDemos/EpgFlowListType/components/ContentCard.vue +105 -0
  86. package/MetroWidgetDemos/EpgFlowListType/components/FloorSection.vue +131 -0
  87. package/MetroWidgetDemos/EpgFlowListType/components/LeftTabItem.vue +41 -0
  88. package/MetroWidgetDemos/EpgFlowListType/data.js +78 -0
  89. package/MetroWidgetDemos/ListExpand/ChildItem.vue +130 -0
  90. package/MetroWidgetDemos/ListExpand/ExpandItem.vue +375 -0
  91. package/MetroWidgetDemos/ListExpand/ExpandItem1.vue +403 -0
  92. package/MetroWidgetDemos/ListExpand/assets/arrow-down.png +0 -0
  93. package/MetroWidgetDemos/ListExpand/assets/up-arrow.png +0 -0
  94. package/MetroWidgetDemos/ListExpand/components/WidgetListHandler.vue +150 -0
  95. package/MetroWidgetDemos/ListExpand/index.vue +88 -0
  96. package/MetroWidgetDemos/ListExpand/list.js +2421 -0
  97. package/MetroWidgetDemos/RefreshDemo/App.vue +14 -1
  98. package/MetroWidgetDemos/RenderAccelerate/App.vue +142 -0
  99. package/MetroWidgetDemos/RenderAccelerate/AppPage.vue +78 -0
  100. package/MetroWidgetDemos/RenderAccelerate/AppTab.vue +62 -0
  101. package/MetroWidgetDemos/RenderAccelerate/ContentItem.vue +409 -0
  102. package/MetroWidgetDemos/RenderAccelerate/Item.vue +67 -0
  103. package/MetroWidgetDemos/RenderAccelerate/TabItem.vue +100 -0
  104. package/MetroWidgetDemos/RenderAccelerate/ViewSwiper.vue +215 -0
  105. package/MetroWidgetDemos/RenderAccelerate/WidgetItem.vue +107 -0
  106. package/MetroWidgetDemos/SkeletonDiagram/App.vue +35 -8
  107. package/MetroWidgetDemos/SkeletonDiagram/Item.vue +11 -2
  108. package/MetroWidgetDemos/SkeletonDiagram/assets/imageList.js +245 -0
  109. package/MetroWidgetDemos/SkeletonDiagram/data.js +3 -3
  110. package/MetroWidgetDemos/SpatialNav/App.vue +177 -0
  111. package/MetroWidgetDemos/SpatialNav/Buttons.vue +83 -0
  112. package/MetroWidgetDemos/SpatialNav/CustomFocus.vue +57 -0
  113. package/MetroWidgetDemos/{TripleWidget → SpatialNav}/Item.vue +1 -8
  114. package/MetroWidgetDemos/{TripleWidget/WidgetItem.vue → SpatialNav/SimpleFloor.vue} +14 -45
  115. package/MetroWidgetDemos/SpatialNav/StepMw.vue +113 -0
  116. package/MetroWidgetDemos/SpatialNav/TabContent/TabContent.vue +185 -0
  117. package/MetroWidgetDemos/SpatialNav/TripleSection/TripleSection.vue +69 -0
  118. package/MetroWidgetDemos/SpatialNav/TripleSection/WidgetItem.vue +100 -0
  119. package/MetroWidgetDemos/SpatialNav/TvSection/List.vue +75 -0
  120. package/MetroWidgetDemos/SpatialNav/TvSection/TvSection.vue +91 -0
  121. package/MetroWidgetDemos/basic2/App.vue +407 -0
  122. package/MetroWidgetDemos/basic2/Item.vue +68 -0
  123. package/MetroWidgetDemos/direction/App.vue +22 -0
  124. package/MetroWidgetDemos/gazeFocusDiff/App.vue +126 -0
  125. package/MetroWidgetDemos/gazeFocusDiff/Item.vue +87 -0
  126. package/MetroWidgetDemos/minimalUsage/App.vue +66 -0
  127. package/MetroWidgetDemos/minimalUsage/Item.vue +54 -0
  128. package/MetroWidgetDemos/ninePatchFocusPage/App.vue +23 -7
  129. package/MetroWidgetDemos/ninePatchFocusPage/Item.vue +7 -5
  130. package/MetroWidgetDemos/ninePatchFocusPage/focusConstants.js +2 -0
  131. package/MetroWidgetDemos/routeList.js +216 -12
  132. package/MetroWidgetDemos/slideSetting/App.vue +288 -99
  133. package/MetroWidgetDemos/zIndex/App.vue +117 -0
  134. package/MetroWidgetDemos/zIndex/Item.vue +61 -0
  135. package/NinePatchTester/App.vue +24 -31
  136. package/PreDecode/App.vue +140 -0
  137. package/ReactiveTest/App.vue +115 -0
  138. package/ReactiveTest/Item.vue +92 -0
  139. package/ReactiveTest/assets/imageList.js +245 -0
  140. package/ReactiveTest/component/TestSmartDiv.vue +50 -0
  141. package/ReactiveTest/component/TestSmartDivSrcList.vue +74 -0
  142. package/ReactiveTest/component/TestSmartImage.vue +46 -0
  143. package/ReactiveTest/component/TestSmartImageSrcList.vue +90 -0
  144. package/ReactiveTest/component/TestSmartImageStyle.vue +41 -0
  145. package/ReactiveTest/data.js +49 -0
  146. package/ScreenToBlob/App.vue +250 -0
  147. package/ScrollBoxTest/App.vue +52 -28
  148. package/ScrollBoxTest/ClipBar.vue +64 -2
  149. package/ScrollBoxTest/NinePatchBar.vue +64 -2
  150. package/ScrollBoxTest/SizeDivBar.vue +64 -2
  151. package/SecTorTest/App.vue +9 -3
  152. package/SpringFestival/SpringFestivalScene/FreeMoveBuilder.js +3 -3
  153. package/SyncDecode/App.vue +137 -0
  154. package/TextSizeLimit/App.vue +211 -0
  155. package/TextureAnimation/App3.vue +11 -1
  156. package/TouchWidget/App.vue +90 -5
  157. package/TouchWidget/WidgetItem.vue +1 -0
  158. package/TransitPage/App.vue +2 -0
  159. package/assets/logo.png +0 -0
  160. package/package.json +1 -1
  161. package/DemoForOperator/BookFlip/BookFlip/FlipPage.vue +0 -179
  162. package/DemoForOperator/BookFlip/BookFlip/FlippingBook.vue +0 -310
  163. package/DemoForOperator/BookFlip/BookFlip/flip.glsl +0 -135
  164. package/DemoForOperator/Genie/geniePakcer/Genie.vue +0 -741
  165. package/DemoForOperator/LongChatBox/TextManager.ts +0 -147
  166. package/DemoForOperator/LongChatBox/VirtualList.vue +0 -298
  167. package/DemoForOperator/LongChatBox/utile.js +0 -331
  168. package/DivMetroPerformance/App.vue +0 -157
  169. package/DivMetroPerformance/Item.vue +0 -58
  170. package/DivMetroPerformance/assets/bg.jpg +0 -0
  171. package/DivMetroPerformance/assets/coupon_content.png +0 -0
  172. package/DivMetroPerformance/assets/coupon_left.png +0 -0
  173. package/DivMetroPerformance/assets/coupon_mid.png +0 -0
  174. package/DivMetroPerformance/assets/coupon_right.png +0 -0
  175. package/DivMetroPerformance/assets/focus_border.png +0 -0
  176. package/DivMetroPerformance/assets/holder_logo.png +0 -0
  177. package/DivMetroPerformance/assets/jrbm.png +0 -0
  178. package/DivMetroPerformance/assets/line_left.png +0 -0
  179. package/DivMetroPerformance/assets/line_mid.png +0 -0
  180. package/DivMetroPerformance/assets/line_right.png +0 -0
  181. package/DivMetroPerformance/assets/loading.png +0 -0
  182. package/DivMetroPerformance/assets/logo.png +0 -0
  183. package/DivMetroPerformance/assets/mcjx.png +0 -0
  184. package/DivMetroPerformance/assets/tao.png +0 -0
  185. package/DivMetroPerformance/assets/tmall.png +0 -0
  186. package/DivMetroPerformance/border.png +0 -0
  187. package/DivMetroPerformance/components/ContentItem.vue +0 -384
  188. package/DivMetroPerformance/components/MyTab.vue +0 -129
  189. package/DivMetroPerformance/data.js +0 -124
  190. package/DivMetroPerformance/utils/GridItem.vue +0 -28
  191. package/DivMetroPerformance/utils/GridPlate.vue +0 -85
  192. package/MediaDemo/App.vue +0 -127
  193. package/MediaDemo/assets/audio-poster.png +0 -0
  194. package/MediaDemo/components/Button.vue +0 -69
  195. package/MediaDemo/components/Controllor.vue +0 -286
  196. package/MediaDemo/components/StatusBar.vue +0 -100
  197. package/MediaDemo/components/frames/AudioFrame.vue +0 -39
  198. package/MediaDemo/components/frames/AudioPoster.vue +0 -48
  199. package/MediaDemo/components/frames/MediaFrame.vue +0 -153
  200. package/MediaDemo/components/frames/VideoFrame.vue +0 -39
  201. package/MetroWidgetDemos/TripleWidget/App.vue +0 -87
  202. package/MetroWidgetDemos/TripleWidget/SWidgetItem.vue +0 -99
  203. package/Parkour/App.vue +0 -13
  204. package/Parkour/Common/Context.js +0 -21
  205. package/Parkour/Common/MatchmanInfo.js +0 -62
  206. package/Parkour/Common/Random.js +0 -61
  207. package/Parkour/Common/Sound.js +0 -50
  208. package/Parkour/appConfig/HOW_TO_CONFIG.md +0 -20
  209. package/Parkour/appConfig/app.config.mjs +0 -5
  210. package/Parkour/appConfig/app_sign_private_key_sample.crt +0 -28
  211. package/Parkour/appConfig/app_sign_public_key_sample.pem +0 -9
  212. package/Parkour/appConfig/jsview.config.mjs +0 -39
  213. package/Parkour/assets/Bgimages/bg1.png +0 -0
  214. package/Parkour/assets/Bgimages/bg2.png +0 -0
  215. package/Parkour/assets/Bgimages/bg3.png +0 -0
  216. package/Parkour/assets/Bgimages/bg4.png +0 -0
  217. package/Parkour/assets/Bgimages/bg5.png +0 -0
  218. package/Parkour/assets/audio/jump.mp3 +0 -0
  219. package/Parkour/assets/audio/lose.mp3 +0 -0
  220. package/Parkour/assets/role_skin1/fail.json +0 -44
  221. package/Parkour/assets/role_skin1/fail.png +0 -0
  222. package/Parkour/assets/role_skin1/jump_down.json +0 -20
  223. package/Parkour/assets/role_skin1/jump_down.png +0 -0
  224. package/Parkour/assets/role_skin1/jump_up.json +0 -44
  225. package/Parkour/assets/role_skin1/jump_up.png +0 -0
  226. package/Parkour/assets/role_skin1/roll.json +0 -44
  227. package/Parkour/assets/role_skin1/roll.png +0 -0
  228. package/Parkour/assets/role_skin1/run.json +0 -52
  229. package/Parkour/assets/role_skin1/run.png +0 -0
  230. package/Parkour/components/Backdrop.vue +0 -61
  231. package/Parkour/components/GameSence.vue +0 -602
  232. package/Parkour/components/Matchman.vue +0 -85
  233. package/TextureAnimation/utils/FrameCanvasStore.ts +0 -68
  234. package/TextureAnimation/utils/RotateFrame.vue +0 -146
  235. package/TextureAnimation/utils/circleHaloMask.png +0 -0
  236. package/ThrowMoveDemo/AccelerateDemo.vue +0 -85
  237. package/ThrowMoveDemo/App.vue +0 -104
  238. package/ThrowMoveDemo/LRParabolicDemo.vue +0 -101
  239. package/ThrowMoveDemo/TargetDemo.vue +0 -87
  240. package/ThrowMoveDemo/UDParabolicDemo.vue +0 -92
  241. /package/{AnimPicture/assets → assets}/animated_webp.webp +0 -0
  242. /package/{AnimPicture/assets → assets}/ball_3.webp +0 -0
  243. /package/{AnimPicture/assets → assets}/girl_run.gif +0 -0
  244. /package/{AnimPicture/assets → assets}/quan.webp +0 -0
@@ -1,741 +0,0 @@
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>