@shijiu/jsview-vue 0.9.490 → 0.9.590

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 (220) hide show
  1. package/dom/bin/jsview-browser-debug-dom.min.js +1 -1
  2. package/dom/bin/jsview-dom.min.js +1 -1
  3. package/dom/target_core_revision.js +4 -3
  4. package/index.js +10 -0
  5. package/package.json +8 -1
  6. package/patches/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js +20 -6
  7. package/samples/AnimPicture/App.vue +89 -106
  8. package/samples/Basic/App.vue +65 -68
  9. package/samples/Basic/components/ContentBlock.vue +31 -36
  10. package/samples/Basic/components/anim/AnimGroup.vue +61 -75
  11. package/samples/Basic/components/anim/AnimKeyframeBasic.vue +54 -43
  12. package/samples/Basic/components/anim/AnimKeyframeComposite.vue +25 -31
  13. package/samples/Basic/components/anim/AnimTransition.vue +142 -105
  14. package/samples/Basic/components/div/DivBackground.vue +38 -16
  15. package/samples/Basic/components/div/DivClip.vue +143 -78
  16. package/samples/Basic/components/div/DivCssScoped.vue +10 -10
  17. package/samples/Basic/components/div/DivCssVar.vue +40 -42
  18. package/samples/Basic/components/div/DivGroup1.vue +45 -39
  19. package/samples/Basic/components/div/DivGroup2.vue +56 -45
  20. package/samples/Basic/components/div/DivLayout.vue +34 -5
  21. package/samples/Basic/components/div/DivRadius.vue +51 -42
  22. package/samples/Basic/components/div/DivTransform.vue +21 -16
  23. package/samples/Basic/components/panel/Panel1.vue +46 -44
  24. package/samples/Basic/components/panel/Panel2.vue +22 -26
  25. package/samples/Basic/components/panel/TitleBar.vue +12 -12
  26. package/samples/Basic/components/text/TextAlign.vue +54 -44
  27. package/samples/Basic/components/text/TextEmoji.vue +16 -20
  28. package/samples/Basic/components/text/TextFontStyle.vue +77 -53
  29. package/samples/Basic/components/text/TextGroup1.vue +46 -38
  30. package/samples/Basic/components/text/TextGroup2.vue +25 -28
  31. package/samples/Basic/components/text/TextOverflow.vue +76 -57
  32. package/samples/BasicFocusControl/App.vue +22 -43
  33. package/samples/BasicFocusControl/components/BaseBlock.vue +42 -43
  34. package/samples/BasicFocusControl/components/MainArea.vue +55 -70
  35. package/samples/BasicFocusControl/components/MainAreaLeftBlock.vue +11 -15
  36. package/samples/BasicFocusControl/components/MainAreaRightBlock.vue +21 -24
  37. package/samples/BasicFocusControl/components/SideBar.vue +32 -47
  38. package/samples/BasicFocusControl/components/SideBarBlock.vue +20 -23
  39. package/samples/ColorSpace/App.vue +15 -24
  40. package/samples/DemoHomepage/App.vue +7 -11
  41. package/samples/DemoHomepage/components/BodyFrame.vue +19 -9
  42. package/samples/DemoHomepage/components/TabFrame.vue +7 -8
  43. package/samples/DemoHomepage/router.js +33 -34
  44. package/samples/DemoHomepage/views/Homepage.vue +24 -8
  45. package/samples/FilterDemo/AnimatePic.vue +58 -0
  46. package/samples/FilterDemo/App.vue +99 -61
  47. package/samples/FilterDemo/VideoLayer.vue +62 -0
  48. package/samples/FlipCard/App.vue +32 -41
  49. package/samples/FlipCard/FlipCard.vue +48 -54
  50. package/samples/GridDemo/App.vue +109 -77
  51. package/samples/GridDemo/ButtonBlock.vue +50 -49
  52. package/samples/GridDemo/FocusItem.vue +19 -38
  53. package/samples/GridDemo/Item.vue +46 -54
  54. package/samples/HashHistory/App.vue +63 -79
  55. package/samples/HashHistory/components/HorizontalButtonList.vue +72 -95
  56. package/samples/HashHistory/components/Item.vue +42 -56
  57. package/samples/HashHistory/router.js +23 -12
  58. package/samples/HashHistory/views/MainPage.vue +35 -46
  59. package/samples/HashHistory/views/SubPage.vue +34 -47
  60. package/samples/Input/App.vue +2 -3
  61. package/samples/Input/FullKeyboard.vue +2 -6
  62. package/samples/Input/InputPanel.vue +2 -3
  63. package/samples/Input/KeyboardItem.vue +1 -1
  64. package/samples/LongImage/App.vue +11 -27
  65. package/samples/LongImage/Button.vue +50 -145
  66. package/samples/LongImage/ButtonItem.vue +44 -0
  67. package/samples/LongImage/LongImageScroll.vue +71 -106
  68. package/samples/LongImage/Scroll.vue +7 -9
  69. package/samples/LongText/App.vue +13 -28
  70. package/samples/LongText/Button.vue +43 -145
  71. package/samples/LongText/ButtonItem.vue +44 -0
  72. package/samples/LongText/LongTextScroll.vue +68 -101
  73. package/samples/LongText/Scroll.vue +7 -9
  74. package/samples/Marquee/App.vue +34 -37
  75. package/samples/MaskClip/App.vue +17 -30
  76. package/samples/MetroWidgetDemos/Advanced/App.vue +211 -0
  77. package/samples/MetroWidgetDemos/Advanced/ButtonItem.vue +90 -0
  78. package/samples/MetroWidgetDemos/Item.vue +67 -0
  79. package/samples/{SimpleWidgetDemo → MetroWidgetDemos/PerformanceTest}/App.vue +80 -104
  80. package/samples/{SimpleWidgetDemo → MetroWidgetDemos/PerformanceTest}/Item.vue +7 -0
  81. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/bg.jpg +0 -0
  82. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/coupon_content.png +0 -0
  83. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/coupon_left.png +0 -0
  84. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/coupon_mid.png +0 -0
  85. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/coupon_right.png +0 -0
  86. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/focus_border.png +0 -0
  87. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/holder_logo.png +0 -0
  88. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/jrbm.png +0 -0
  89. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/line_left.png +0 -0
  90. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/line_mid.png +0 -0
  91. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/line_right.png +0 -0
  92. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/loading.png +0 -0
  93. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/logo.png +0 -0
  94. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/mcjx.png +0 -0
  95. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/tao.png +0 -0
  96. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/tmall.png +0 -0
  97. package/samples/{SimpleWidgetDemo → MetroWidgetDemos/PerformanceTest}/border.png +0 -0
  98. package/samples/{SimpleWidgetDemo → MetroWidgetDemos/PerformanceTest}/components/ContentItem.vue +60 -86
  99. package/samples/{SimpleWidgetDemo → MetroWidgetDemos/PerformanceTest}/components/MyTab.vue +0 -0
  100. package/samples/MetroWidgetDemos/PerformanceTest/data.js +45 -0
  101. package/samples/MetroWidgetDemos/PingPong/App.vue +135 -0
  102. package/samples/MetroWidgetDemos/PingPong/AppPage.vue +58 -0
  103. package/samples/MetroWidgetDemos/PingPong/AppTab.vue +69 -0
  104. package/samples/MetroWidgetDemos/PingPong/Item.vue +92 -0
  105. package/samples/MetroWidgetDemos/PingPong/ViewSwiper.vue +214 -0
  106. package/samples/MetroWidgetDemos/Simple/App.vue +194 -0
  107. package/samples/MetroWidgetDemos/WidgetItem.vue +89 -0
  108. package/samples/MetroWidgetDemos/data.js +204 -0
  109. package/samples/NinePatchDemo/App.vue +114 -115
  110. package/samples/NinePatchDemo/Item.vue +7 -8
  111. package/samples/NinePatchDemo/assets/border.png +0 -0
  112. package/samples/Preload/App.vue +61 -63
  113. package/samples/Preload/Item.vue +21 -29
  114. package/samples/QrcodeDemo/App.vue +24 -29
  115. package/samples/SoundPool/App.vue +77 -106
  116. package/samples/SprayView/App.vue +10 -8
  117. package/samples/SpriteImage/App.vue +1 -2
  118. package/samples/TextBox/App.vue +86 -101
  119. package/samples/TextBox/RenderCenter.vue +1 -1
  120. package/samples/TextBox/RenderLeft.vue +1 -1
  121. package/samples/TextBox/RenderOneLine.vue +1 -1
  122. package/samples/TextBox/RenderRight.vue +1 -1
  123. package/samples/TextShadowDemo/App.vue +1 -2
  124. package/samples/TextureAnimation/App.vue +16 -13
  125. package/samples/TextureSize/App.vue +15 -25
  126. package/samples/ThrowMoveDemo/AccelerateDemo.vue +2 -4
  127. package/samples/ThrowMoveDemo/LRParabolicDemo.vue +2 -3
  128. package/samples/ThrowMoveDemo/TargetDemo.vue +3 -4
  129. package/samples/ThrowMoveDemo/UDParabolicDemo.vue +2 -3
  130. package/samples/TouchSample/App.vue +2 -3
  131. package/samples/TouchSample/Item.vue +15 -13
  132. package/samples/TouchSample/MetroWidgetHorizontal.vue +2 -2
  133. package/samples/TouchSample/MetroWidgetVertical.vue +1 -1
  134. package/samples/TouchSample/TouchContainerHorizontal.vue +4 -3
  135. package/samples/TouchSample/TouchContainerVertical.vue +3 -2
  136. package/samples/TransitPage/App.vue +20 -32
  137. package/samples/VideoDemo/App.vue +65 -81
  138. package/samples/VideoDemo/components/Button.vue +41 -52
  139. package/samples/VideoDemo/components/Controllor.vue +171 -169
  140. package/samples/VideoDemo/components/VideoFrame.vue +87 -99
  141. package/samples/VisibleSensorDemo/App.vue +167 -0
  142. package/scripts/jsview-jsmap-serve.js +42 -0
  143. package/scripts/jsview-post-build.js +6 -1
  144. package/scripts/jsview-post-install.js +1 -1
  145. package/tsconfig.json +3 -0
  146. package/utils/JsViewEngineWidget/JsvFocusBlock.vue +204 -193
  147. package/utils/JsViewEngineWidget/JsvFocusManager.js +30 -17
  148. package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +1557 -1656
  149. package/utils/JsViewEngineWidget/MetroWidget/PageUpdater.js +136 -0
  150. package/utils/JsViewEngineWidget/MetroWidget/ToolFunctions.js +18 -0
  151. package/utils/JsViewEngineWidget/SimpleWidget/SimpleWidget.vue +2 -0
  152. package/utils/JsViewEngineWidget/TemplateParser.js +111 -1
  153. package/utils/JsViewEngineWidget/WidgetCommon.js +8 -2
  154. package/utils/JsViewEngineWidget/index.js +4 -4
  155. package/utils/JsViewPlugin/JsvPlayer/GetVersion.js +1 -1
  156. package/utils/JsViewPlugin/JsvPlayer/JsvMedia.js +284 -57
  157. package/utils/JsViewPlugin/JsvPlayer/JsvPlayer.vue +5 -1
  158. package/utils/JsViewPlugin/JsvPlayer/JsvPlayerBrowser.vue +25 -12
  159. package/utils/JsViewPlugin/JsvPlayer/version.js +5 -5
  160. package/utils/JsViewVueTools/JsvRefTaker.js +35 -0
  161. package/utils/JsViewVueTools/index.js +19 -0
  162. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserQrcode.vue +25 -10
  163. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/BrowserApic.vue +1 -1
  164. package/utils/JsViewVueWidget/JsvFilterView.vue +59 -51
  165. package/utils/JsViewVueWidget/JsvGrid.vue +140 -42
  166. package/utils/JsViewVueWidget/JsvMaskClipDiv.vue +3 -1
  167. package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +8 -17
  168. package/utils/JsViewVueWidget/JsvNinePatch.vue +1 -1
  169. package/utils/JsViewVueWidget/JsvPosterDiv.vue +37 -7
  170. package/utils/JsViewVueWidget/JsvPosterImage.vue +34 -13
  171. package/utils/JsViewVueWidget/JsvPreload/JsvPreload.vue +2 -12
  172. package/utils/JsViewVueWidget/JsvQrcode/JsvQrcode.vue +13 -4
  173. package/utils/JsViewVueWidget/JsvSpray/JsvSpray.vue +13 -10
  174. package/utils/JsViewVueWidget/JsvSpriteAnim/index.js +2 -3
  175. package/utils/JsViewVueWidget/JsvTextureAnim/JsvTextureAnim.vue +25 -21
  176. package/utils/JsViewVueWidget/JsvTransparentDiv.vue +7 -8
  177. package/utils/JsViewVueWidget/JsvVisibleSensor/JsvVisibleSensor.vue +141 -0
  178. package/utils/JsViewVueWidget/JsvVisibleSensor/index.js +9 -0
  179. package/utils/JsViewVueWidget/index.js +42 -0
  180. package/samples/AdvanceMetroWidget/App.vue +0 -123
  181. package/samples/AdvanceMetroWidget/Frame.vue +0 -102
  182. package/samples/AdvanceMetroWidget/Item.vue +0 -63
  183. package/samples/AdvanceMetroWidget/data.js +0 -137
  184. package/samples/ClassNameDemo/App.vue +0 -119
  185. package/samples/ClassNameDemo/components/ContentItem.vue +0 -253
  186. package/samples/ClassNameDemo/components/LoadingView.vue +0 -43
  187. package/samples/ClassNameDemo/components/TitleView.vue +0 -24
  188. package/samples/ClassNameDemo/data.js +0 -24
  189. package/samples/FlowMultiWidget/App.vue +0 -91
  190. package/samples/FlowMultiWidget/assets/nine_patch_focus.png +0 -0
  191. package/samples/FlowMultiWidget/components/Block.vue +0 -107
  192. package/samples/FlowMultiWidget/components/FlowPage.vue +0 -60
  193. package/samples/FlowMultiWidget/components/Item.vue +0 -103
  194. package/samples/FlowMultiWidget/components/MenuItem.vue +0 -72
  195. package/samples/FlowMultiWidget/components/MyMenu.vue +0 -90
  196. package/samples/FlowMultiWidget/data.js +0 -446
  197. package/samples/HashHistory/views/BasePage.vue +0 -19
  198. package/samples/HashHistory/views/SubPageFirst.vue +0 -10
  199. package/samples/HashHistory/views/SubPageSecond.vue +0 -10
  200. package/samples/SimpleWidgetDemo/assets/bg.jpg +0 -0
  201. package/samples/SimpleWidgetDemo/assets/coupon_content.png +0 -0
  202. package/samples/SimpleWidgetDemo/assets/coupon_left.png +0 -0
  203. package/samples/SimpleWidgetDemo/assets/coupon_mid.png +0 -0
  204. package/samples/SimpleWidgetDemo/assets/coupon_right.png +0 -0
  205. package/samples/SimpleWidgetDemo/assets/focus_border.png +0 -0
  206. package/samples/SimpleWidgetDemo/assets/holder_logo.png +0 -0
  207. package/samples/SimpleWidgetDemo/assets/jrbm.png +0 -0
  208. package/samples/SimpleWidgetDemo/assets/line_left.png +0 -0
  209. package/samples/SimpleWidgetDemo/assets/line_mid.png +0 -0
  210. package/samples/SimpleWidgetDemo/assets/line_right.png +0 -0
  211. package/samples/SimpleWidgetDemo/assets/loading.png +0 -0
  212. package/samples/SimpleWidgetDemo/assets/logo.png +0 -0
  213. package/samples/SimpleWidgetDemo/assets/mcjx.png +0 -0
  214. package/samples/SimpleWidgetDemo/assets/tao.png +0 -0
  215. package/samples/SimpleWidgetDemo/assets/tmall.png +0 -0
  216. package/samples/SimpleWidgetDemo/data.js +0 -124
  217. package/utils/JsViewEngineWidget/MetroWidget/ContentView.vue +0 -63
  218. package/utils/JsViewEngineWidget/MetroWidget/DivWrapper.vue +0 -51
  219. package/utils/JsViewEngineWidget/MetroWidget/ItemView.vue +0 -213
  220. package/utils/JsViewEngineWidget/MetroWidget/RootView.vue +0 -154
@@ -1,194 +1,196 @@
1
- <script>
2
- import { inject } from 'vue'
3
- import { Options, Vue } from "vue-class-component";
1
+ <script setup>
2
+ import { inject } from "vue";
3
+ import { useRouter } from "vue-router";
4
4
  import Button from "./Button.vue";
5
5
 
6
- @Options({
7
- props: {
8
- style: { type: Object, default: {width:1400,height:50} },
6
+ const props = defineProps({
7
+ style: {
8
+ type: Object,
9
+ default() {
10
+ return { width: 1400, height: 50 };
11
+ },
9
12
  },
10
- components: {
11
- Button,
13
+ });
14
+ const router = useRouter();
15
+
16
+ const useTexture = inject("useTexture");
17
+ const objectFit = inject("objectFit");
18
+ const videoRect = inject("videoRect");
19
+ const playVideo = inject("playVideo");
20
+ const seekVideo = inject("seekVideo");
21
+ const enableAnimation = inject("enableAnimation");
22
+ const videoTime = inject("videoTime");
23
+ const objectFitTitle = inject("objectFitTitle");
24
+ let objectFitIndex = 0;
25
+ let focusedItemIndex = 0;
26
+
27
+ const setObjectFit = (index) => {
28
+ if (typeof index === "number") {
29
+ objectFitIndex = index;
30
+ } else {
31
+ objectFitIndex = ++objectFitIndex % objectFitData.length;
32
+ }
33
+ const data = objectFitData[objectFitIndex];
34
+ objectFit.value = data.objectFit;
35
+ objectFitTitle.value = data.name;
36
+ videoRect.value = {
37
+ left: (1280 - data.width) / 2,
38
+ top: 50,
39
+ width: data.width,
40
+ height: 500,
41
+ };
42
+ };
43
+
44
+ const buttonList = [
45
+ {
46
+ name: "ToVideoMode",
47
+ onClick: () => {
48
+ playVideo.value = null; // 停止并初始化播放
49
+ enableAnimation.value = false;
50
+ videoTime.currentTime = 0;
51
+ videoTime.duration = 0;
52
+ useTexture.value = !useTexture.value;
53
+ },
54
+ isModeButton: true,
12
55
  },
13
- })
14
-
15
- class Controllor extends Vue {
16
- constructor(props) {
17
- super(props);
18
- this.useTexture = inject('useTexture');
19
- this.objectFit = inject('objectFit');
20
- this.videoRect = inject('videoRect');
21
- this.playVideo = inject('playVideo');
22
- this.seekVideo = inject('seekVideo');
23
- this.enableAnimation = inject('enableAnimation');
24
- this.videoTime = inject('videoTime');
25
- this.objectFitTitle = inject('objectFitTitle');
26
-
27
- this.buttonList = this.getButtonList();
28
-
29
- this.objectFitData = [
30
- { name: "contain-horizontal", objectFit: "contain", width: 1200 },
31
- { name: "contain-vertical", objectFit: "contain", width: 400 },
32
- { name: "fill", objectFit: "fill", width: 1200 },
33
- { name: "none-horizontal", objectFit: "none", width: 1200 },
34
- { name: "none-vertical", objectFit: "none", width: 400 },
35
- { name: "cover-horizontal", objectFit: "cover", width: 1200 },
36
- { name: "cover-vertical", objectFit: "cover", width: 400 },
37
- ];
38
- this.objectFitIndex = 0;
39
-
40
- this.focusedItemIndex = 0;
56
+ {
57
+ name: "Play",
58
+ onClick: () => {
59
+ playVideo.value = !playVideo.value;
60
+ },
61
+ isPlayButton: true,
62
+ },
63
+ {
64
+ name: "Forward",
65
+ onClick: () => {
66
+ seekVideo.value = seekVideo.value !== 5 ? 5 : 5.1 /* 为了触发ref更新 */;
67
+ },
68
+ },
69
+ {
70
+ name: "Rewind",
71
+ onClick: () => {
72
+ seekVideo.value =
73
+ seekVideo.value !== -5 ? -5 : -5.1 /* 为了触发ref更新 */;
74
+ },
75
+ },
76
+ {
77
+ name: "ObjectFit",
78
+ onClick: setObjectFit,
79
+ },
80
+ {
81
+ name: "StartAnimation",
82
+ onClick: () => {
83
+ enableAnimation.value = !enableAnimation.value;
84
+ },
85
+ isAnimationButton: true,
86
+ },
87
+ ];
88
+ const objectFitData = [
89
+ { name: "contain-horizontal", objectFit: "contain", width: 1200 },
90
+ { name: "contain-vertical", objectFit: "contain", width: 400 },
91
+ { name: "fill", objectFit: "fill", width: 1200 },
92
+ { name: "none-horizontal", objectFit: "none", width: 1200 },
93
+ { name: "none-vertical", objectFit: "none", width: 400 },
94
+ { name: "cover-horizontal", objectFit: "cover", width: 1200 },
95
+ { name: "cover-vertical", objectFit: "cover", width: 400 },
96
+ ];
97
+
98
+ const getButtonData = () => {
99
+ let length = buttonList.length;
100
+ if (!useTexture.value) {
101
+ // 只有texture方式可以做animation
102
+ length -= 1;
41
103
  }
42
104
 
43
- created() {
44
- this.useTexture = true;
45
- this.setObjectFit(0);
46
- this.playVideo = !window.jsvIsBrowserDebug; // jsview自动播放该视频 TODO h5需做相应调整;
47
- this.enableAnimation = false;
105
+ let data = [];
106
+ for (let idx = 0; idx < length; idx++) {
107
+ const button = buttonList[idx];
108
+ data.push({
109
+ ...button,
110
+ size: {
111
+ width: 180,
112
+ height: 40,
113
+ },
114
+ });
48
115
  }
49
-
50
- onKeyDown(ev) {
51
- // 8:Backspace, 27:Escape, 10000:盒子返回键
52
- if(ev.keyCode == 8 || ev.keyCode == 27 || ev.keyCode == 10000) {
53
- this.$router?.go(-1); // 有router时,回退
54
- return true;
55
- }
56
-
57
- let changeFocusTo = -1;
58
- const buttonCount = this.getButtonDataLength();
59
- switch (ev.keyCode) {
60
- case 37: // Left
61
- changeFocusTo = (this.focusedItemIndex - 1 + buttonCount) % buttonCount;
62
- break;
63
- case 39: // Right
64
- changeFocusTo = (this.focusedItemIndex + 1) % buttonCount;
65
- break;
66
- default:
67
- break;
68
- }
69
- if (changeFocusTo >= 0) {
70
- ev.ownerNode.findBlockByName((changeFocusTo+10).toString()).requestFocus();
71
- this.focusedItemIndex = changeFocusTo;
72
- return true;
73
- }
74
-
75
- return false;
116
+ return data;
117
+ };
118
+ const getButtonDataLength = () => {
119
+ let length = buttonList.length;
120
+ if (!useTexture.value) {
121
+ // 只有texture方式可以做animation
122
+ length -= 1;
76
123
  }
77
124
 
78
- getButtonList() {
79
- const buttonList = [{
80
- name: "ToVideoMode",
81
- onClick: () => {
82
- this.playVideo = null; // 停止并初始化播放
83
- this.enableAnimation = false;
84
- this.videoTime.currentTime = 0;
85
- this.videoTime.duration = 0;
86
- this.useTexture = !this.useTexture;
87
- },
88
- isModeButton: true,
89
- }, {
90
- name: "Play",
91
- onClick: () => {
92
- this.playVideo = !this.playVideo;
93
- },
94
- isPlayButton: true,
95
- }, {
96
- name: "Forward",
97
- onClick: () => {
98
- this.seekVideo = (this.seekVideo !== 5 ? 5 : 5.1/* 为了触发ref更新 */);
99
- }
100
- }, {
101
- name: "Rewind",
102
- onClick: () => {
103
- this.seekVideo = (this.seekVideo !== -5 ? -5 : -5.1/* 为了触发ref更新 */);
104
- }
105
- }, {
106
- name: "ObjectFit",
107
- onClick: this.setObjectFit.bind(this)
108
- }, {
109
- name: "StartAnimation",
110
- onClick: () => {
111
- this.enableAnimation = !this.enableAnimation
112
- },
113
- isAnimationButton: true,
114
- },
115
- ];
116
-
117
- return buttonList;
125
+ return length;
126
+ };
127
+ const onKeyDown = (ev) => {
128
+ // 8:Backspace, 27:Escape, 10000:盒子返回键
129
+ if (ev.keyCode == 8 || ev.keyCode == 27 || ev.keyCode == 10000) {
130
+ router?.go(-1); // 有router时,回退
131
+ return true;
118
132
  }
119
133
 
120
- getButtonData() {
121
- let length = this.buttonList.length;
122
- if(!this.useTexture) { // 只有texture方式可以做animation
123
- length -= 1;
124
- }
125
-
126
- let data = [];
127
- for(let idx = 0; idx < length; idx++) {
128
- const button = this.buttonList[idx];
129
- data.push({
130
- ...button,
131
- size: {
132
- width: 180,
133
- height: 40,
134
- }
135
- });
136
- }
137
- return data;
134
+ let changeFocusTo = -1;
135
+ const buttonCount = getButtonDataLength();
136
+ switch (ev.keyCode) {
137
+ case 37: // Left
138
+ changeFocusTo = (focusedItemIndex - 1 + buttonCount) % buttonCount;
139
+ break;
140
+ case 39: // Right
141
+ changeFocusTo = (focusedItemIndex + 1) % buttonCount;
142
+ break;
143
+ default:
144
+ break;
138
145
  }
139
-
140
- getButtonDataLength() {
141
- let length = this.buttonList.length;
142
- if(!this.useTexture) { // 只有texture方式可以做animation
143
- length -= 1;
144
- }
145
-
146
- return length;
146
+ if (changeFocusTo >= 0) {
147
+ ev.ownerNode
148
+ .findBlockByName("video-" + (changeFocusTo + 10).toString())
149
+ .requestFocus();
150
+ focusedItemIndex = changeFocusTo;
151
+ return true;
147
152
  }
148
153
 
149
- setObjectFit(index) {
150
- if(typeof index === 'number') {
151
- this.objectFitIndex = index;
152
- } else {
153
- this.objectFitIndex = (++this.objectFitIndex % this.objectFitData.length);
154
- }
155
- const data = this.objectFitData[this.objectFitIndex];
156
- this.objectFit = data.objectFit;
157
- this.objectFitTitle = data.name;
158
- this.videoRect = {
159
- left: (1280 - data.width) / 2, top: 50,
160
- width: data.width, height: 500,
161
- }
162
- }
154
+ return false;
155
+ };
163
156
 
164
- getShowName(item) {
165
- if(item.isModeButton) {
166
- return this.useTexture ? "ToVideoMode" : "ToOffscreenMode";
167
- } else if(item.isPlayButton) {
168
- return this.playVideo ? 'Pause' : 'Play'
169
- } else if(item.isAnimationButton) {
170
- return this.enableAnimation ? "StopAnimation" : "StartAnimation";
171
- }
172
- return item.name;
157
+ const getShowName = (item) => {
158
+ if (item.isModeButton) {
159
+ return useTexture.value ? "ToVideoMode" : "ToOffscreenMode";
160
+ } else if (item.isPlayButton) {
161
+ return playVideo.value ? "Pause" : "Play";
162
+ } else if (item.isAnimationButton) {
163
+ return enableAnimation.value ? "StopAnimation" : "StartAnimation";
173
164
  }
174
- }
165
+ return item.name;
166
+ };
175
167
 
176
- export default Controllor;
168
+ useTexture.value = false;
169
+ setObjectFit(0);
170
+ playVideo.value = !window.jsvIsBrowserDebug; // jsview自动播放该视频 TODO h5需做相应调整;
171
+ enableAnimation.value = false;
177
172
  </script>
178
173
 
179
174
  <template>
180
- <div :style="style" :key="useTexture" :set="leftOffset=0">
181
- <jsv-focus-block :namespace="controllor" :onKeyDown="onKeyDown">
182
- <Button v-for="(item,index) in getButtonData()" :key="index" :set="leftOffset+=(item.size.width+10)"
183
- :style="{ left: leftOffset-item.size.width, width:item.size.width, height:item.size.height }"
175
+ <div :style="style" :key="useTexture" :set="(leftOffset = 0)">
176
+ <jsv-focus-block :namespace="controllor" :onKeyDown="onKeyDown">
177
+ <Button
178
+ v-for="(item, index) in getButtonData()"
179
+ :key="index"
180
+ :set="(leftOffset += item.size.width + 10)"
181
+ :style="{
182
+ left: leftOffset - item.size.width,
183
+ width: item.size.width,
184
+ height: item.size.height,
185
+ }"
184
186
  :autoFocus="index === 0"
185
- :name="(index+10).toString()"
187
+ :name="'video-' + (index + 10).toString()"
186
188
  :onClick="item.onClick"
187
- >
188
- {{ getShowName(item) }}
189
- </Button>
190
- </jsv-focus-block>
191
- </div>
189
+ >
190
+ {{ getShowName(item) }}
191
+ </Button>
192
+ </jsv-focus-block>
193
+ </div>
192
194
  </template>
193
195
 
194
196
  <style scoped>
@@ -1,121 +1,109 @@
1
- <script>
2
- import { inject, watch } from 'vue'
3
- import { Options, Vue } from "vue-class-component";
4
- import JsvVideo from "jsview/utils/JsViewVueWidget/JsvVideo.vue"
5
-
6
- @Options({
7
- components: {
8
- JsvVideo
1
+ <script setup>
2
+ import { inject, watch, onMounted } from "vue";
3
+ import { JsvVideo } from "jsview";
4
+
5
+ const useTexture = inject("useTexture");
6
+ const objectFit = inject("objectFit");
7
+ const videoRect = inject("videoRect");
8
+ const playVideo = inject("playVideo");
9
+ const seekVideo = inject("seekVideo");
10
+ const enableAnimation = inject("enableAnimation");
11
+ const videoTime = inject("videoTime");
12
+ const playStatus = inject("playStatus");
13
+ const videoUrl =
14
+ "http://qcast-image.oss-cn-qingdao.aliyuncs.com/homepage/20190726/4cc4e6a8fd7d9d9c707ed4c4da27ca9d.mp4";
15
+ const canAutoPlay = !window.jsvIsBrowserDebug; // jsview自动播放该视频 TODO h5需做相应调整
16
+ const rect = {
17
+ top: 50,
18
+ left: 40,
19
+ width: 1200,
20
+ height: 500,
21
+ };
22
+ let video = null;
23
+
24
+ const onVideoRef = (ele) => {
25
+ video = ele;
26
+ };
27
+
28
+ const setPlayState = (play) => {
29
+ if (play) {
30
+ video?.play();
31
+ } else {
32
+ video?.pause();
9
33
  }
10
- })
11
-
12
- class VideoFrame extends Vue {
13
- constructor(props) {
14
- super(props);
15
- this.useTexture = inject('useTexture');
16
- this.objectFit = inject('objectFit');
17
- this.videoRect = inject('videoRect');
18
- this.playVideo = inject('playVideo');
19
- this.seekVideo = inject('seekVideo');
20
- this.enableAnimation = inject('enableAnimation');
21
- this.videoTime = inject('videoTime');
22
- this.playStatus = inject('playStatus')
23
- watch(this.playVideo, this.setPlayState.bind(this));
24
- watch(this.seekVideo, this.seekVideoStep.bind(this));
25
-
26
- this.videoUrl = "http://qcast-image.oss-cn-qingdao.aliyuncs.com/homepage/20190726/4cc4e6a8fd7d9d9c707ed4c4da27ca9d.mp4";
27
- this.canAutoPlay = !window.jsvIsBrowserDebug; // jsview自动播放该视频 TODO h5需做相应调整
28
-
29
- this.video = null;
30
-
31
- this.rect = {
32
- top: 50, left: 40,
33
- width: 1200, height: 500,
34
+ };
35
+
36
+ const seekVideoStep = (time) => {
37
+ if (video) {
38
+ let playEnd = false;
39
+ let seekTime = video.currentTime + Math.ceil(time);
40
+ if (seekTime < 0) {
41
+ seekTime = 0;
42
+ } else if (seekTime > videoTime.duration) {
43
+ seekTime = videoTime.duration;
44
+ if (video.currentTime != videoTime.duration) {
45
+ // 触发一次播放,收到ended事件
46
+ playEnd = true;
47
+ }
34
48
  }
35
-
36
- this.textureAnim = null;
37
- }
38
-
39
- mounted() {
40
- if(this.canAutoPlay) {
41
- this.playVideo = true;
49
+ video.currentTime = seekTime;
50
+ if (playEnd) {
51
+ this.setPlayState(true);
42
52
  }
43
53
  }
44
-
45
- onVideoRef(ele) {
46
- this.video = ele;
54
+ };
55
+
56
+ const onPlayStateChange = (event) => {
57
+ console.log("VideoFrame.onPlayStateChangeEvent()", event);
58
+ playVideo.value = event.type === "play" ? true : false;
59
+ if (!(playStatus.value == "ended" && event.type == "pause")) {
60
+ // 忽略播放结束后的pause事件
61
+ playStatus.value = event.type;
47
62
  }
63
+ };
48
64
 
49
- setPlayState(play) {
50
- if(play) {
51
- this.video?.play();
52
- } else {
53
- this.video?.pause();
54
- }
55
- }
65
+ const onTimeUpdate = (event) => {
66
+ console.log("VideoFrame.onTimeUpdateEvent()", event);
67
+ videoTime.currentTime = video.currentTime;
68
+ };
56
69
 
57
- seekVideoStep(time) {
58
- if(this.video) {
59
- let playEnd = false;
60
- let seekTime = this.video.currentTime + Math.ceil(time);
61
- if(seekTime < 0) {
62
- seekTime = 0;
63
- } else if(seekTime > this.videoTime.duration) {
64
- seekTime = this.videoTime.duration;
65
- if(this.video.currentTime != this.videoTime.duration) { // 触发一次播放,收到ended事件
66
- playEnd = true;
67
- }
68
- }
69
- this.video.currentTime = seekTime;
70
- if(playEnd) {
71
- this.setPlayState(true);
72
- }
73
- }
74
- }
70
+ const onDurationChange = (event) => {
71
+ console.log("VideoFrame.onDurationChangeEvent()", event);
72
+ videoTime.duration = video.duration;
73
+ };
75
74
 
76
- onPlayStateChange(event) {
77
- console.log("VideoFrame.onPlayStateChangeEvent()", event);
78
- this.playVideo = (event.type === 'play' ? true : false);
79
- if(!(this.playStatus == 'ended' && event.type == 'pause')) { // 忽略播放结束后的pause事件
80
- this.playStatus = event.type;
81
- }
82
- }
75
+ const onEvent = (event) => {
76
+ console.log("VideoFrame.onEvent()", event);
77
+ };
83
78
 
84
- onTimeUpdate(event) {
85
- console.log("VideoFrame.onTimeUpdateEvent()", event);
86
- this.videoTime.currentTime = this.video.currentTime;
87
- }
88
-
89
- onDurationChange(event) {
90
- console.log("VideoFrame.onDurationChangeEvent()", event);
91
- this.videoTime.duration = this.video.duration;
92
- }
79
+ watch(playVideo, setPlayState);
80
+ watch(seekVideo, seekVideoStep);
93
81
 
94
- onEvent(event) {
95
- console.log("VideoFrame.onEvent()", event);
82
+ onMounted(() => {
83
+ if (canAutoPlay) {
84
+ playVideo.value = true;
96
85
  }
97
- }
98
-
99
- export default VideoFrame;
86
+ });
100
87
  </script>
101
88
 
102
89
  <template>
103
- <div>
104
- <div
90
+ <div>
91
+ <div
105
92
  :style="{
106
93
  ...videoRect,
107
- backgroundColor: 'rgb(200,100,100)'
94
+ backgroundColor: 'rgb(200,100,100)',
108
95
  }"
109
- />
110
- <JsvVideo
96
+ ></div>
97
+ <JsvVideo
111
98
  :onRef="onVideoRef"
112
99
  :useTexture="useTexture"
113
100
  :src="videoUrl"
114
- :autoplay="canAutoPlay ? 'autoplay' : undefined"
101
+ :autoplay="canAutoPlay ? 'autoplay' : undefined"
115
102
  :style="{
116
103
  ...videoRect,
117
104
  objectFit: objectFit,
118
- animation: (useTexture&&enableAnimation ? 'offscreenAnim 3s infinite' : null),
105
+ animation:
106
+ useTexture && enableAnimation ? 'offscreenAnim 3s infinite' : null,
119
107
  borderRadius: '80px 80px 160px 240px',
120
108
  }"
121
109
  :onCanPlay="onEvent"
@@ -134,18 +122,18 @@ export default VideoFrame;
134
122
  :onSeeked="onTimeUpdate"
135
123
  :onStalled="onEvent"
136
124
  :onTimeUpdate="onTimeUpdate"
137
- />
138
- </div>
125
+ />
126
+ </div>
139
127
  </template>
140
128
 
141
129
  <style scoped>
142
130
  @keyframes offscreenAnim {
143
131
  from {
144
- transform:scale3d(1, 1, 1) rotate3d(0, 0, 1, -360deg);
132
+ transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, -360deg);
145
133
  transform-origin: center center;
146
134
  }
147
135
  to {
148
- transform:scale3d(0.4, 0.4, 0) rotate3d(0, 0, 1, 0);
136
+ transform: scale3d(0.4, 0.4, 0) rotate3d(0, 0, 1, 0);
149
137
  transform-origin: center center;
150
138
  }
151
139
  }