@shijiu/jsview-vue 0.0.1-beta.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 (252) hide show
  1. package/docs/IMPORT_CHANGE_LOG.txt +3 -0
  2. package/docs/git_commit.md +15 -0
  3. package/docs/test_version_up.txt +1 -0
  4. package/dom/bin/jsview-dom-1.0.313.tgz +0 -0
  5. package/dom/browser-root-style.css +21 -0
  6. package/dom/jsv-browser-debug-dom.js +8 -0
  7. package/dom/jsv-dom.js +6 -0
  8. package/dom/jsv-forge-define.js +6 -0
  9. package/dom/target_core_revision.js +14 -0
  10. package/load/header_script_loader.js +134 -0
  11. package/load/jsview-main.js +42 -0
  12. package/load/jsview.config.default.js +37 -0
  13. package/load/jsview.default.config.js +37 -0
  14. package/load/loader.js +172 -0
  15. package/load/loader_webkit.js +40 -0
  16. package/package.json +27 -0
  17. package/patch/node_modules/@babel/preset-env/lib/available-plugins.js +219 -0
  18. package/patch/node_modules/@vue/cli-plugin-typescript/index.js +100 -0
  19. package/patch/node_modules/@vue/cli-service/lib/commands/serve.js +395 -0
  20. package/patch/node_modules/@vue/cli-service/lib/config/app.js +272 -0
  21. package/patch/node_modules/@vue/cli-service/lib/config/assets.js +70 -0
  22. package/patch/node_modules/@vue/cli-service/lib/config/base.js +212 -0
  23. package/patch/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js +2566 -0
  24. package/patch/node_modules/@vue/compiler-sfc/dist/jsview-css-to-js.js +274 -0
  25. package/patch/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js +1596 -0
  26. package/patch/node_modules/postcss-js/objectifier.js +90 -0
  27. package/patch/node_modules/vue-loader/dist/resolveScript.js +70 -0
  28. package/patch/package-lock.json +30051 -0
  29. package/samples/AdvanceMetroWidget/App.vue +123 -0
  30. package/samples/AdvanceMetroWidget/Frame.vue +101 -0
  31. package/samples/AdvanceMetroWidget/Item.vue +58 -0
  32. package/samples/AdvanceMetroWidget/data.js +137 -0
  33. package/samples/AnimPicture/App.vue +224 -0
  34. package/samples/AnimPicture/assets/animated_webp.webp +0 -0
  35. package/samples/AnimPicture/assets/ball_3.webp +0 -0
  36. package/samples/AnimPicture/assets/girl_run.gif +0 -0
  37. package/samples/AnimPicture/assets/quan.webp +0 -0
  38. package/samples/Basic/App.vue +129 -0
  39. package/samples/Basic/assets/border.png +0 -0
  40. package/samples/Basic/assets/border2.png +0 -0
  41. package/samples/Basic/assets/icon.png +0 -0
  42. package/samples/Basic/assets/test.jpg +0 -0
  43. package/samples/Basic/components/ContentBlock.vue +36 -0
  44. package/samples/Basic/components/FontStyle.css +10 -0
  45. package/samples/Basic/components/TitleBar.vue +29 -0
  46. package/samples/Basic/components/anim/AnimGroup.vue +68 -0
  47. package/samples/Basic/components/anim/AnimKeyframeBasic.vue +102 -0
  48. package/samples/Basic/components/anim/AnimKeyframeComposite.vue +53 -0
  49. package/samples/Basic/components/anim/AnimTransition.vue +116 -0
  50. package/samples/Basic/components/div/DivBackground.vue +15 -0
  51. package/samples/Basic/components/div/DivClip.vue +81 -0
  52. package/samples/Basic/components/div/DivCssScoped.vue +27 -0
  53. package/samples/Basic/components/div/DivCssVar.vue +50 -0
  54. package/samples/Basic/components/div/DivGroup1.vue +33 -0
  55. package/samples/Basic/components/div/DivGroup2.vue +41 -0
  56. package/samples/Basic/components/div/DivLayout.vue +12 -0
  57. package/samples/Basic/components/div/DivRadius.vue +47 -0
  58. package/samples/Basic/components/text/TextAlign.vue +48 -0
  59. package/samples/Basic/components/text/TextFontStyle.vue +58 -0
  60. package/samples/Basic/components/text/TextGroup.vue +32 -0
  61. package/samples/Basic/components/text/TextOverflow.vue +78 -0
  62. package/samples/BasicFocusControl/App.vue +125 -0
  63. package/samples/BasicFocusControl/components/BaseBlock.vue +51 -0
  64. package/samples/BasicFocusControl/components/MainArea.vue +98 -0
  65. package/samples/BasicFocusControl/components/MainAreaLeftBlock.vue +21 -0
  66. package/samples/BasicFocusControl/components/MainAreaRightBlock.vue +30 -0
  67. package/samples/BasicFocusControl/components/SideBar.vue +73 -0
  68. package/samples/BasicFocusControl/components/SideBarBlock.vue +30 -0
  69. package/samples/ClassNameDemo/App.vue +119 -0
  70. package/samples/ClassNameDemo/assets/bg.jpg +0 -0
  71. package/samples/ClassNameDemo/assets/coupon_content.png +0 -0
  72. package/samples/ClassNameDemo/assets/coupon_left.png +0 -0
  73. package/samples/ClassNameDemo/assets/coupon_mid.png +0 -0
  74. package/samples/ClassNameDemo/assets/coupon_right.png +0 -0
  75. package/samples/ClassNameDemo/assets/focus_border.png +0 -0
  76. package/samples/ClassNameDemo/assets/holder_logo.png +0 -0
  77. package/samples/ClassNameDemo/assets/jrbm.png +0 -0
  78. package/samples/ClassNameDemo/assets/line_left.png +0 -0
  79. package/samples/ClassNameDemo/assets/line_mid.png +0 -0
  80. package/samples/ClassNameDemo/assets/line_right.png +0 -0
  81. package/samples/ClassNameDemo/assets/loading.png +0 -0
  82. package/samples/ClassNameDemo/assets/logo.png +0 -0
  83. package/samples/ClassNameDemo/assets/mcjx.png +0 -0
  84. package/samples/ClassNameDemo/assets/tao.png +0 -0
  85. package/samples/ClassNameDemo/assets/tmall.png +0 -0
  86. package/samples/ClassNameDemo/components/ContentItem.vue +253 -0
  87. package/samples/ClassNameDemo/components/LoadingView.vue +43 -0
  88. package/samples/ClassNameDemo/components/TitleView.vue +24 -0
  89. package/samples/ClassNameDemo/data.js +24 -0
  90. package/samples/ColorSpace/App.vue +135 -0
  91. package/samples/ColorSpace/bmpDemo.bmp +0 -0
  92. package/samples/ColorSpace/jpegDemo.jpeg +0 -0
  93. package/samples/ColorSpace/pngDemo.png +0 -0
  94. package/samples/ColorSpace/pngNoAlphaDemo.png +0 -0
  95. package/samples/DemoHomepage/App.vue +31 -0
  96. package/samples/DemoHomepage/components/BodyFrame.vue +82 -0
  97. package/samples/DemoHomepage/components/Dialog.vue +94 -0
  98. package/samples/DemoHomepage/components/Item.vue +77 -0
  99. package/samples/DemoHomepage/components/TabFrame.vue +86 -0
  100. package/samples/DemoHomepage/router.js +132 -0
  101. package/samples/DemoHomepage/views/Homepage.vue +186 -0
  102. package/samples/FlipCard/App.vue +80 -0
  103. package/samples/FlipCard/FlipCard.vue +124 -0
  104. package/samples/FlipCard/assets/blue_egg.png +0 -0
  105. package/samples/FlipCard/assets/red_egg.png +0 -0
  106. package/samples/FlipCard/data.js +13 -0
  107. package/samples/FlowMultiWidget/App.vue +91 -0
  108. package/samples/FlowMultiWidget/assets/nine_patch_focus.png +0 -0
  109. package/samples/FlowMultiWidget/components/Block.vue +107 -0
  110. package/samples/FlowMultiWidget/components/FlowPage.vue +60 -0
  111. package/samples/FlowMultiWidget/components/Item.vue +103 -0
  112. package/samples/FlowMultiWidget/components/MenuItem.vue +72 -0
  113. package/samples/FlowMultiWidget/components/MyMenu.vue +90 -0
  114. package/samples/FlowMultiWidget/data.js +446 -0
  115. package/samples/HashHistory/App.vue +124 -0
  116. package/samples/HashHistory/components/HorizontalButtonList.vue +114 -0
  117. package/samples/HashHistory/components/Item.vue +74 -0
  118. package/samples/HashHistory/router.js +30 -0
  119. package/samples/HashHistory/views/BasePage.vue +19 -0
  120. package/samples/HashHistory/views/MainPage.vue +68 -0
  121. package/samples/HashHistory/views/SubPage.vue +79 -0
  122. package/samples/HashHistory/views/SubPageFirst.vue +10 -0
  123. package/samples/HashHistory/views/SubPageSecond.vue +10 -0
  124. package/samples/LongImage/App.vue +96 -0
  125. package/samples/LongImage/Button.vue +153 -0
  126. package/samples/LongImage/LongImageScroll.vue +127 -0
  127. package/samples/LongImage/Scroll.vue +16 -0
  128. package/samples/LongImage/assets/1280x7200.jpg +0 -0
  129. package/samples/LongText/App.vue +111 -0
  130. package/samples/LongText/Button.vue +153 -0
  131. package/samples/LongText/LongTextScroll.vue +225 -0
  132. package/samples/LongText/Scroll.vue +16 -0
  133. package/samples/Preload/App.vue +146 -0
  134. package/samples/Preload/data.js +23 -0
  135. package/samples/Preload/images/awesomeface.png +0 -0
  136. package/samples/Preload/images/cat.jpg +0 -0
  137. package/samples/Preload/images/rank.png +0 -0
  138. package/samples/Preload/images/rank_focus.png +0 -0
  139. package/samples/Preload/images/rule.png +0 -0
  140. package/samples/Preload/images/rule_focus.png +0 -0
  141. package/samples/Preload/images/start.png +0 -0
  142. package/samples/Preload/images/start_focus.png +0 -0
  143. package/samples/Preload/preloadItem.vue +22 -0
  144. package/samples/QrcodeDemo/App.vue +73 -0
  145. package/samples/SimpleWidgetDemo/App.vue +204 -0
  146. package/samples/SimpleWidgetDemo/Item.vue +83 -0
  147. package/samples/SimpleWidgetDemo/assets/bg.jpg +0 -0
  148. package/samples/SimpleWidgetDemo/assets/coupon_content.png +0 -0
  149. package/samples/SimpleWidgetDemo/assets/coupon_left.png +0 -0
  150. package/samples/SimpleWidgetDemo/assets/coupon_mid.png +0 -0
  151. package/samples/SimpleWidgetDemo/assets/coupon_right.png +0 -0
  152. package/samples/SimpleWidgetDemo/assets/focus_border.png +0 -0
  153. package/samples/SimpleWidgetDemo/assets/holder_logo.png +0 -0
  154. package/samples/SimpleWidgetDemo/assets/jrbm.png +0 -0
  155. package/samples/SimpleWidgetDemo/assets/line_left.png +0 -0
  156. package/samples/SimpleWidgetDemo/assets/line_mid.png +0 -0
  157. package/samples/SimpleWidgetDemo/assets/line_right.png +0 -0
  158. package/samples/SimpleWidgetDemo/assets/loading.png +0 -0
  159. package/samples/SimpleWidgetDemo/assets/logo.png +0 -0
  160. package/samples/SimpleWidgetDemo/assets/mcjx.png +0 -0
  161. package/samples/SimpleWidgetDemo/assets/tao.png +0 -0
  162. package/samples/SimpleWidgetDemo/assets/tmall.png +0 -0
  163. package/samples/SimpleWidgetDemo/border.png +0 -0
  164. package/samples/SimpleWidgetDemo/components/ContentItem.vue +412 -0
  165. package/samples/SimpleWidgetDemo/components/MyTab.vue +117 -0
  166. package/samples/SimpleWidgetDemo/data.js +110 -0
  167. package/samples/SprayView/App.vue +270 -0
  168. package/samples/SprayView/assets/snow.png +0 -0
  169. package/samples/SpriteImage/App.vue +174 -0
  170. package/samples/SpriteImage/images/cat_run.png +0 -0
  171. package/samples/SpriteImage/images/egg_break.json +116 -0
  172. package/samples/SpriteImage/images/egg_break.png +0 -0
  173. package/samples/SpriteImage/images/sprite.png +0 -0
  174. package/samples/TextBox/App.vue +179 -0
  175. package/samples/TextBox/RenderCenter.vue +109 -0
  176. package/samples/TextBox/RenderLeft.vue +109 -0
  177. package/samples/TextBox/RenderOneLine.vue +120 -0
  178. package/samples/TextBox/RenderRight.vue +107 -0
  179. package/samples/TextShadowDemo/App.vue +98 -0
  180. package/samples/TextureSize/App.vue +142 -0
  181. package/samples/TextureSize/bmpDemo.bmp +0 -0
  182. package/samples/TextureSize/jpegDemo.jpeg +0 -0
  183. package/samples/TextureSize/jpgDemo.jpg +0 -0
  184. package/samples/TextureSize/pngDemo.png +0 -0
  185. package/samples/TextureSize/pngNoAlphaDemo.png +0 -0
  186. package/samples/ThrowMoveDemo/AccelerateDemo.vue +118 -0
  187. package/samples/ThrowMoveDemo/App.vue +114 -0
  188. package/samples/ThrowMoveDemo/LRParabolicDemo.vue +116 -0
  189. package/samples/ThrowMoveDemo/TargetDemo.vue +117 -0
  190. package/samples/ThrowMoveDemo/UDParabolicDemo.vue +122 -0
  191. package/samples/TransitPage/App.vue +41 -0
  192. package/samples/VideoDemo/App.vue +137 -0
  193. package/samples/VideoDemo/components/Button.vue +69 -0
  194. package/samples/VideoDemo/components/Controllor.vue +195 -0
  195. package/samples/VideoDemo/components/VideoFrame.vue +152 -0
  196. package/scripts/git-commit-empty.js +21 -0
  197. package/scripts/install-local-packages.js +121 -0
  198. package/scripts/make-js.sh +181 -0
  199. package/scripts/post-build.js +132 -0
  200. package/scripts/post-install.js +127 -0
  201. package/scripts/pre-pack.js +2 -0
  202. package/scripts/run-android.js +64 -0
  203. package/utils/JsViewEngineWidget/bin/shijiu-jsview-vue-widget-1.0.1.tgz +0 -0
  204. package/utils/JsViewEngineWidget/index.d.ts +32 -0
  205. package/utils/JsViewEngineWidget/index.js +6 -0
  206. package/utils/JsViewVueTools/DebugContentShellJBridge.js +16 -0
  207. package/utils/JsViewVueTools/DebugTool.js +21 -0
  208. package/utils/JsViewVueTools/DefaultKeyMap.js +12 -0
  209. package/utils/JsViewVueTools/JsvDynamicCssStyle.js +73 -0
  210. package/utils/JsViewVueTools/JsvDynamicKeyFrames.js +128 -0
  211. package/utils/JsViewVueTools/JsvHashHistory.js +112 -0
  212. package/utils/JsViewVueTools/JsvRuntimeBridge.js +417 -0
  213. package/utils/JsViewVueTools/JsvStyleClass.js +290 -0
  214. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserPreload.vue +80 -0
  215. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserQrcode.vue +148 -0
  216. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserSpray.vue +55 -0
  217. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/ApicDataBase.js +29 -0
  218. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/BrowserApic.vue +124 -0
  219. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/GifData.js +83 -0
  220. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/LoopToolBase.js +25 -0
  221. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/NormalLoopTool.js +61 -0
  222. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/PartLoopTool.js +119 -0
  223. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/Viewer.js +106 -0
  224. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/WebpData.js +141 -0
  225. package/utils/JsViewVueWidget/BrowserDebugWidget/WidgetLoader.js +20 -0
  226. package/utils/JsViewVueWidget/BrowserDebugWidget/WidgetWrapper.js +11 -0
  227. package/utils/JsViewVueWidget/JsvActorMove/ActorControlBase.js +204 -0
  228. package/utils/JsViewVueWidget/JsvActorMove/JsvActorMove.vue +64 -0
  229. package/utils/JsViewVueWidget/JsvActorMove/JsvActorMoveControl.js +427 -0
  230. package/utils/JsViewVueWidget/JsvActorMove/index.js +12 -0
  231. package/utils/JsViewVueWidget/JsvApic/JsvApic.vue +179 -0
  232. package/utils/JsViewVueWidget/JsvApic/index.js +17 -0
  233. package/utils/JsViewVueWidget/JsvMarquee.vue +197 -0
  234. package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +92 -0
  235. package/utils/JsViewVueWidget/JsvNinePatch.vue +76 -0
  236. package/utils/JsViewVueWidget/JsvPreload/JsvPreload.vue +351 -0
  237. package/utils/JsViewVueWidget/JsvPreload/index.js +21 -0
  238. package/utils/JsViewVueWidget/JsvQrcode/JsvQrcode.vue +140 -0
  239. package/utils/JsViewVueWidget/JsvQrcode/index.js +18 -0
  240. package/utils/JsViewVueWidget/JsvSpray/JsvSpray.vue +140 -0
  241. package/utils/JsViewVueWidget/JsvSpray/index.js +15 -0
  242. package/utils/JsViewVueWidget/JsvSpriteAnim/JsvSpriteAnim.vue +448 -0
  243. package/utils/JsViewVueWidget/JsvSpriteAnim/SpriteController.js +57 -0
  244. package/utils/JsViewVueWidget/JsvSpriteAnim/index.js +6 -0
  245. package/utils/JsViewVueWidget/JsvSwiper/Indicator.vue +35 -0
  246. package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +495 -0
  247. package/utils/JsViewVueWidget/JsvSwiper/index.js +10 -0
  248. package/utils/JsViewVueWidget/JsvSwiper3D/Indicator.vue +35 -0
  249. package/utils/JsViewVueWidget/JsvSwiper3D/JsvSwiper.vue +404 -0
  250. package/utils/JsViewVueWidget/JsvSwiper3D/index.js +10 -0
  251. package/utils/JsViewVueWidget/JsvTextBox.vue +111 -0
  252. package/utils/JsViewVueWidget/JsvVideo.vue +36 -0
@@ -0,0 +1,448 @@
1
+ <!--
2
+ * 【模块 export 内容】
3
+ * JsvSpriteAnim: React高阶组件,描画动态的精灵图(雪碧图)
4
+ * prop说明:
5
+ * spriteInfo {object} (必需)精灵图配置信息
6
+ * { frames: [
7
+ * {
8
+ * source:{w,h},
9
+ * target:{w,h},
10
+ * },
11
+ * ...
12
+ * ],
13
+ * meta:{w,h}
14
+ * }
15
+ * viewSize {object} (必需){w:0, h:0}
16
+ * imageUrl {string} (必需)图片地址,另外,为了减小无效的解析处理,规定只有image的URL变更时才重新解析spriteInfo
17
+ * duration {float} (动图必需)动图的时间
18
+ * onAnimEnd {function} 动图结束回调
19
+ * autostart {string} 启动动图,默认none,
20
+ * 传入为bool类型时,兼容老版本:true为start、false为none
21
+ * 自动启动模式:start:精灵图自动启动,结束后显示第一帧内容、
22
+ * end:精灵图自动启动,结束后显示最后一帧内容,
23
+ * none:不自动启动
24
+ * loop {string} 动图的循环次数 infinite/数字,默认为infinite
25
+ * spriteName {string} 动图的名称,默认为null
26
+ * controller {SpriteController} 控制动图start,stop的对象
27
+ *
28
+ * SpriteController: 面向对象类,精灵图动作控制器
29
+ * 功能函数:(参数说明见函数本体)
30
+ * start()
31
+ * 功能: 启动精灵图动画
32
+ * stop(end_frame)
33
+ * 功能: 停止精灵图动画,可选择静止在第一帧或最后一帧
34
+ -->
35
+ <script>
36
+ import {Options, Vue} from "vue-class-component";
37
+ import { getKeyFramesGroup } from '../../JsViewVueTools/JsvDynamicKeyFrames.js'
38
+
39
+
40
+
41
+ function _getTransformInfo(source_obj, target_obj, canvas_width, canvas_height) {
42
+ const result = { csw: 1, csh: 1, cx: 0, cy: 0, sw: 1, sh: 1, x: 0, y: 0 };
43
+
44
+ // Clip在Canvas div之内,以Canvas为基准进行缩放和平移
45
+ // 图形左上角远离原点后再缩放,所以需要进行缩放补偿
46
+ const clip_scale_w = target_obj.w / canvas_width;
47
+ const clip_scale_h = target_obj.h / canvas_height;
48
+ result.csw = clip_scale_w;
49
+ result.csh = clip_scale_h;
50
+ result.cx = target_obj.x / clip_scale_w;
51
+ result.cy = target_obj.y / clip_scale_h;
52
+
53
+ // Image在Clip div之内,所以以Clip为基准进行缩放和平移, 对clip的缩放进行反处理以还原尺寸
54
+ // 将子图左上角对齐原点后再缩放,所以x,y不需要进行举例缩放补偿
55
+ result.sw = source_obj.w / target_obj.w / clip_scale_w;
56
+ result.sh = source_obj.h / target_obj.h / clip_scale_h;
57
+ result.x = -source_obj.x;
58
+ result.y = -source_obj.y;
59
+
60
+ return result;
61
+ }
62
+
63
+ function _createTransformStyle(w_scale, h_scale, x, y) {
64
+ let output = "";
65
+ output = `${output}scale3d(${
66
+ parseFloat(w_scale).toPrecision(5)},${
67
+ parseFloat(h_scale).toPrecision(5)},1) `
68
+ + `translate3d(${
69
+ parseFloat(x).toPrecision(5)}px,${
70
+ parseFloat(y).toPrecision(5)}px,0)`;
71
+ return output;
72
+ }
73
+
74
+ @Options({
75
+ props: {
76
+ spriteInfo: Object,
77
+ viewSize: Object,
78
+ imageUrl: String,
79
+ duration: Number,
80
+ onAnimEnd: Function,
81
+ autostart: [Boolean, String],
82
+ loop: Number,
83
+ spriteName: String,
84
+ controller: Object,
85
+ }
86
+ })
87
+ class JsvSpriteAnim extends Vue {
88
+ constructor(props) {
89
+ super(props);
90
+ let stopFrame = "start";
91
+ if (typeof this.$props.autostart === "string" && this.$props.autostart !== "none") {
92
+ stopFrame = this.$props.autostart;
93
+ }
94
+ this.TRANSFORM_ORIGIN_LEFT_TOP = "left top";
95
+ this.keyFrameNames = {
96
+ clip: null,
97
+ image: null,
98
+ valid: false
99
+ };
100
+ this.frozeFrameCache = {
101
+ clipStyle: {},
102
+ transStyle: {},
103
+ imageStyle: {
104
+ backgroundImage: null,
105
+ }
106
+ };
107
+ this.animateFrameCache = {
108
+ clipStyle: {},
109
+ transStyle: {},
110
+ imageStyle: {
111
+ backgroundImage: null,
112
+ },
113
+ clipAnimName: null,
114
+ imageAnimName: null,
115
+ };
116
+ this.keyFrameStyleSheet = getKeyFramesGroup(null);
117
+ this.innerId = 0;
118
+ this.stopped = false;
119
+ this.spriteDuration = this.$props.duration;
120
+ this.stopFrame = stopFrame;
121
+ this.blinkAnim = null;
122
+ this.blinkAnimCache = null;
123
+ this.transform_style = this._AnalyzeProp();
124
+ this.sAnimationToken = 0;
125
+ }
126
+
127
+ stop(end_frame) {
128
+ if (this.$props.spriteInfo.frames && this.$props.spriteInfo.frames.length === 1) {
129
+ return;
130
+ }
131
+ this.stopped = true;
132
+ this.stopFrame = end_frame || this.stopFrame;
133
+ }
134
+
135
+ start(end_frame, duration) {
136
+ if (this.$props.spriteInfo.frames && this.$props.spriteInfo.frames.length === 1) {
137
+ return;
138
+ }
139
+ this.innerId += 1;
140
+ this.stopped = false;
141
+ this.spriteDuration = duration || this.$props.duration;
142
+ this.stopFrame = end_frame || this.stopFrame;
143
+ }
144
+
145
+ blink(alphas, duration, ease, delay, repeat) {
146
+ // 注意:比较数组是否相同仅在此场景下使用toString,其他场景
147
+ if (!this.blinkAnimCache
148
+ || (this.blinkAnimCache.alphas.toString() !== alphas.toString()
149
+ || this.blinkAnimCache.duration !== duration
150
+ || this.blinkAnimCache.ease !== ease
151
+ || this.blinkAnimCache.delay !== delay
152
+ || this.blinkAnimCache.repeat !== repeat)) {
153
+ const anim_name_base = this._getAnimNameBase();
154
+ const anim_name_blink = `${anim_name_base}-blink`;
155
+ let image_keyframs = `@keyframes ${anim_name_blink} {`;
156
+ const frame_percent = 1 / (alphas.length);
157
+ for (let i = 0; i < alphas.length; i++) {
158
+ const alpha = alphas[i];
159
+ let header;
160
+ if (i !== alphas.length - 1) {
161
+ header = `${parseFloat(frame_percent * i * 100).toFixed(2)}% {`;
162
+ } else {
163
+ header = '100% {';
164
+ }
165
+ image_keyframs += header;
166
+
167
+ if (alpha) {
168
+ const tr_str = ` opacity:${alpha};`;
169
+ image_keyframs += tr_str;
170
+ }
171
+
172
+ image_keyframs += '}';
173
+ image_keyframs += "\n";
174
+ }
175
+ image_keyframs += '}';
176
+ if (this.keyFrameStyleSheet) {
177
+ this.keyFrameStyleSheet.insertRule(image_keyframs);
178
+ }
179
+ this.blinkAnimCache = {
180
+ alphas,
181
+ duration,
182
+ ease,
183
+ delay,
184
+ repeat,
185
+ blinkAnimName: anim_name_blink
186
+ };
187
+ }
188
+
189
+ // 参数格式化
190
+ ease = ease || "";
191
+ delay = delay || 0;
192
+ repeat = (repeat === -1) ? "infinite" : (repeat || 1);
193
+
194
+ const animName = `${this.blinkAnimCache.blinkAnimName} ${duration}s ${ease} ${delay}s ${repeat}`;
195
+ this.blinkAnim = animName;
196
+ this.stopped = true;
197
+ }
198
+
199
+ _getAnimNameBase() {
200
+ return this.$props.spriteName ? this.$props.spriteName : `sprite-anim-name-${this.sAnimationToken++}`;
201
+ }
202
+
203
+ _updateFrozeFrameCache(image_url, frame_info_list,
204
+ canvas_width, canvas_height,
205
+ source_width, source_height) {
206
+ const cache = this.frozeFrameCache;
207
+
208
+ const index = this.stopFrame === "start" ? 0 : frame_info_list.length - 1;
209
+ const tr = _getTransformInfo(
210
+ frame_info_list[index].source,
211
+ frame_info_list[index].target,
212
+ canvas_width,
213
+ canvas_height
214
+ );
215
+
216
+ cache.clipStyle = {
217
+ transform: _createTransformStyle(tr.csw, tr.csh, tr.cx, tr.cy),
218
+ transformOrigin: this.TRANSFORM_ORIGIN_LEFT_TOP,
219
+ overflow: "hidden",
220
+ left: 0,
221
+ top: 0,
222
+ width: canvas_width,
223
+ height: canvas_height,
224
+ };
225
+
226
+ cache.transStyle = {
227
+ transformOrigin: this.TRANSFORM_ORIGIN_LEFT_TOP,
228
+ transform: _createTransformStyle(tr.sw, tr.sh, tr.x, tr.y),
229
+ width: source_width,
230
+ height: source_height,
231
+ };
232
+
233
+ cache.imageStyle = {
234
+ backgroundImage: image_url,
235
+ width: source_width,
236
+ height: source_height,
237
+ };
238
+ }
239
+
240
+ _updateAnimateFrameCache(image_url, frame_info_list,
241
+ canvas_width, canvas_height,
242
+ source_width, source_height) {
243
+ this._clearExpiredKeyFrames();
244
+
245
+ if (!frame_info_list) { return; }
246
+ const anim_name_base = this._getAnimNameBase();
247
+ const frame_percent = 1 / (frame_info_list.length);
248
+ const anim_name_clip = `${anim_name_base}-clip`;
249
+ const anim_name_image = `${anim_name_base}-image`;
250
+ let image_keyframs = `@keyframes ${anim_name_image} {`;
251
+ let clip_keyframs = `@keyframes ${anim_name_clip} {`;
252
+
253
+ for (let i = 0; i < frame_info_list.length + 1; i++) {
254
+ let item;
255
+ if (i !== frame_info_list.length) {
256
+ item = frame_info_list[i];
257
+ } else {
258
+ // 追加一个最后一帧以保证最后一帧可见
259
+ item = frame_info_list[frame_info_list.length - 1];
260
+ }
261
+
262
+ // Header
263
+ let header;
264
+ if (i !== frame_info_list.length) {
265
+ header = `${parseFloat(frame_percent * i * 100).toFixed(2)}% {`;
266
+ } else {
267
+ header = '100% {';
268
+ }
269
+ image_keyframs += header;
270
+ clip_keyframs += header;
271
+
272
+ if (item.source) {
273
+ const tr = _getTransformInfo(item.source, item.target, canvas_width, canvas_height);
274
+ const clip_trans = _createTransformStyle(tr.csw, tr.csh, tr.cx, tr.cy);
275
+ const image_trans = _createTransformStyle(tr.sw, tr.sh, tr.x, tr.y);
276
+
277
+ let tr_str = "";
278
+ tr_str = `${tr_str}transform:${clip_trans};transform-origin:left top;`;
279
+ clip_keyframs += tr_str;
280
+
281
+ tr_str = "";
282
+ tr_str = `${tr_str}transform:${image_trans};transform-origin:left top;`;
283
+ image_keyframs += tr_str;
284
+ }
285
+
286
+ image_keyframs += '}';
287
+ clip_keyframs += '}';
288
+ }
289
+
290
+ image_keyframs += '}';
291
+ clip_keyframs += '}';
292
+
293
+ if (this.keyFrameStyleSheet) {
294
+ this.keyFrameStyleSheet.insertRule(image_keyframs);
295
+ this.keyFrameStyleSheet.insertRule(clip_keyframs);
296
+
297
+ // 记录Keyframe设置,以便于界面关闭时进行清理
298
+ this.keyFrameNames.clip = anim_name_clip;
299
+ this.keyFrameNames.image = anim_name_image;
300
+ this.keyFrameNames.valid = true;
301
+ }
302
+ const cache = this.animateFrameCache;
303
+
304
+ cache.clipAnimName = `${anim_name_base}-clip`;
305
+ cache.imageAnimName = `${anim_name_base}-image`;
306
+
307
+ cache.clipStyle = {
308
+ overflow: "hidden",
309
+ width: canvas_width,
310
+ height: canvas_height,
311
+ transform: null, // 重置 transform,以免影响keyframe动画
312
+ transformOrigin: this.TRANSFORM_ORIGIN_LEFT_TOP,
313
+ animation: null, // 外部设置,需要时间和loop信息
314
+ };
315
+
316
+ cache.transStyle = {
317
+ transform: null, // 重置 transform,以免影响keyframe动画
318
+ transformOrigin: this.TRANSFORM_ORIGIN_LEFT_TOP,
319
+ animation: null, // 外部设置,需要时间和loop信息
320
+ width: source_width,
321
+ height: source_height,
322
+ };
323
+
324
+ cache.imageStyle = {
325
+ backgroundImage: image_url,
326
+ width: source_width,
327
+ height: source_height,
328
+ };
329
+ }
330
+
331
+ _clearExpiredKeyFrames() {
332
+ if (this.keyFrameNames.valid) {
333
+ this._removeKeyFrame([this.keyFrameNames.clip, this.keyFrameNames.image]);
334
+ this.keyFrameNames.valid = false;
335
+ }
336
+ }
337
+
338
+ _removeKeyFrame(names_array) {
339
+ if (this.keyFrameStyleSheet) {
340
+ this.keyFrameStyleSheet.removeMultiRules(names_array);
341
+ }
342
+ }
343
+
344
+ _IsAutoStart() {
345
+ let autoStart = false;
346
+ if (typeof this.$props.autostart === "boolean") {
347
+ autoStart = this.$props.autostart;
348
+ } if (typeof this.$props.autostart === "string" && this.$props.autostart !== "none") {
349
+ autoStart = true;
350
+ }
351
+ return autoStart;
352
+ }
353
+
354
+ _AnalyzeProp() {
355
+ const used = this.$props.controller && this.$props.controller.Used;
356
+ if (this.$props.spriteInfo.frames.length === 1 || (!used && !this._IsAutoStart()) || this.stopped) {
357
+ // 单图模式
358
+ // 解析图片信息
359
+ this._updateFrozeFrameCache(
360
+ this.$props.imageUrl,
361
+ this.$props.spriteInfo.frames,
362
+ this.$props.viewSize.w,
363
+ this.$props.viewSize.h,
364
+ this.$props.spriteInfo.meta.size.w,
365
+ this.$props.spriteInfo.meta.size.h
366
+ );
367
+
368
+ return {
369
+ clipStyle: this.frozeFrameCache.clipStyle,
370
+ transStyle: this.frozeFrameCache.transStyle,
371
+ imageStyle: this.frozeFrameCache.imageStyle,
372
+ };
373
+ }
374
+
375
+
376
+ // 动画模式
377
+ if (this.animateFrameCache.imageStyle.backgroundImage !== this.$props.imageUrl) {
378
+ // 解析图片信息
379
+ this._updateAnimateFrameCache(
380
+ this.$props.imageUrl,
381
+ this.$props.spriteInfo.frames,
382
+ this.$props.viewSize.w,
383
+ this.$props.viewSize.h,
384
+ this.$props.spriteInfo.meta.size.w,
385
+ this.$props.spriteInfo.meta.size.h
386
+ );
387
+ }
388
+
389
+ // 使用duration和loop信息更新动画设定
390
+ this.animateFrameCache.clipStyle.animation =
391
+ `${this.animateFrameCache.clipAnimName} ${this.spriteDuration}s steps(1,end) ${this.$props.loop}`;
392
+ this.animateFrameCache.transStyle.animation =
393
+ `${this.animateFrameCache.imageAnimName} ${this.spriteDuration}s steps(1,end) ${this.$props.loop}`;
394
+
395
+ return {
396
+ clipStyle: this.animateFrameCache.clipStyle,
397
+ transStyle: this.animateFrameCache.transStyle,
398
+ imageStyle: this.animateFrameCache.imageStyle,
399
+ };
400
+ }
401
+
402
+ // shouldComponentUpdate(next_props, next_state) {
403
+ // return (
404
+ // (this.$props.imageUrl !== next_props.imageUrl)
405
+ // || (this.$props.onAnimEnd !== next_props.onAnimEnd)
406
+ // || (this.$props.loop !== next_props.loop)
407
+ // || (this.spriteDuration !== next_state.duration)
408
+ // || (this.$props.autostart !== next_props.autostart)
409
+ // || this.innerId !== next_state.innerId
410
+ // || this.stopped !== next_state.stopped
411
+ // || this.blinkAnim !== next_state.blinkAnim
412
+ // );
413
+ // }
414
+
415
+ onAnimEndDelegate() {
416
+ // 在onAnimEnd之前进行Stop,以防onAnimEnd内部继续发生别的操作
417
+ this.stopped = true;
418
+ if (this.$props.onAnimEnd) {
419
+ this.$props.onAnimEnd();
420
+ }
421
+ }
422
+
423
+ onBlinkAnimEnd() {
424
+ // 在onAnimEnd之前进行Stop,以防onAnimEnd内部继续发生别的操作
425
+ this.blinkAnim = null;
426
+ }
427
+
428
+ unmounted() {
429
+ this._clearExpiredKeyFrames();
430
+ }
431
+
432
+ }
433
+ export default JsvSpriteAnim;
434
+ </script>
435
+
436
+ <template>
437
+ <div id="canvas">
438
+ <div id="clip" :style="{...transform_style.clipStyle}">
439
+ <div id="trans" :style="{...transform_style.transStyle}" :onAnimationEnd="onAnimEndDelegate">
440
+ <div id="image" :style="{...transform_style.imageStyle, animation: blinkAnim}" :onAnimationEnd="onBlinkAnimEnd"></div>
441
+ </div>
442
+ </div>
443
+ </div>
444
+ </template>
445
+
446
+ <style scoped>
447
+ @keyframes sprite-tag{}
448
+ </style>
@@ -0,0 +1,57 @@
1
+ class SpriteController {
2
+ /**
3
+ * 方法说明
4
+ * start() 启动动图
5
+ * stop(end_frame) 停止动图 end_frame: "start", "end"
6
+ */
7
+ constructor() {
8
+ this._SpriteImage = null;
9
+ this.Used = false;
10
+ }
11
+
12
+ _setSpriteImg(sprite) {
13
+ this._SpriteImage = sprite;
14
+ }
15
+
16
+ /*
17
+ * start() 启动精灵图
18
+ * 参数说明:
19
+ * end_frame {String} 输入'start'时,停止在第一帧,输入'end'时,停止在最后一帧
20
+ * duration {int} 指定精灵图运行时间
21
+ */
22
+ start(end_frame, duration) {
23
+ if (!this.Used) { this.Used = true; }
24
+ if (this._SpriteImage) {
25
+ this._SpriteImage.start(end_frame, duration);
26
+ }
27
+ }
28
+
29
+ /*
30
+ * stop(end_frame) 停止精灵图
31
+ * 参数说明:
32
+ * end_frame {String} 输入'start'时,停止在第一帧,输入'end'时,停止在最后一帧
33
+ */
34
+ stop(end_frame) {
35
+ if (!this.Used) { this.Used = true; }
36
+ if (this._SpriteImage) {
37
+ this._SpriteImage.stop(end_frame);
38
+ }
39
+ }
40
+
41
+ /**
42
+ * blink() 对精灵图做闪烁动画(忽隐忽现)
43
+ * 参数说明:
44
+ * alpha {Array} 透明度变化
45
+ * duration {int} 时长(秒)
46
+ * delay {int} 时长(秒)
47
+ * ease {string}
48
+ * repeat {int} 动画完成后是否应该自动重新启动?如果要使其永久运行,请设置为-1
49
+ */
50
+ blink(alpha, duration, ease, delay, repeat) {
51
+ if (!this.Used) { this.Used = true; }
52
+ if (this._SpriteImage) {
53
+ this._SpriteImage.blink(alpha, duration, ease, delay, repeat);
54
+ }
55
+ }
56
+ }
57
+ export { SpriteController };
@@ -0,0 +1,6 @@
1
+ import JsvSpriteAnim from './JsvSpriteAnim.vue';
2
+ import SpriteController from './SpriteController.js';
3
+
4
+ export default JsvSpriteAnim;
5
+ export { SpriteController };
6
+
@@ -0,0 +1,35 @@
1
+ <!--
2
+ * @Author: ChenChanghua
3
+ * @Date: 2021-11-23 09:44:44
4
+ * @LastEditors: ChenChanghua
5
+ * @LastEditTime: 2021-11-23 17:11:08
6
+ * @Description: file content
7
+ -->
8
+ <script>
9
+ export default {
10
+ props: {
11
+ number: Number,
12
+ vertical: Boolean,
13
+ itemSize: Number,
14
+ current: Number,
15
+ },
16
+ computed: {
17
+ indexList() {
18
+ return new Array(this.number).fill(0).map((_, index) => {
19
+ return index;
20
+ });
21
+ },
22
+ },
23
+ };
24
+ </script>
25
+
26
+ <template>
27
+ <div
28
+ v-for="index in indexList"
29
+ :key="index"
30
+ :style="vertical ? { top: itemSize * index } : { left: itemSize * index }"
31
+ >
32
+ <slot v-if="index == current" name="current"></slot>
33
+ <slot v-else name="normal"></slot>
34
+ </div>
35
+ </template>