@shijiu/jsview-vue-samples 2.1.367-test.0 → 2.1.435

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 (37) hide show
  1. package/CoupletsTest/App.vue +37 -52
  2. package/CoupletsTest/widget/Fireworks/Fireworks.vue +173 -45
  3. package/DemoHomepage/router.js +21 -5
  4. package/FlexCellDemo/App.vue +315 -0
  5. package/FlexCellDemo/images/1.png +0 -0
  6. package/FlexCellDemo/images/2.png +0 -0
  7. package/FlexCellDemo/images/3.png +0 -0
  8. package/FlexCellDemo/images/4.jpg +0 -0
  9. package/FlexCellDemo/images/5.png +0 -0
  10. package/GradientTexture/App.vue +135 -0
  11. package/ImpactStop/App.vue +1 -1
  12. package/LongText/LongTextScroll.vue +3 -7
  13. package/QrcodeDemo/App.vue +37 -9
  14. package/SceneTransition/App.vue +268 -0
  15. package/SceneTransition/JsvSceneTransition.vue +167 -0
  16. package/SceneTransition/images/mask/1.png +0 -0
  17. package/SceneTransition/images/mask/10.png +0 -0
  18. package/SceneTransition/images/mask/11.png +0 -0
  19. package/SceneTransition/images/mask/12.png +0 -0
  20. package/SceneTransition/images/mask/2.png +0 -0
  21. package/SceneTransition/images/mask/3.png +0 -0
  22. package/SceneTransition/images/mask/4.png +0 -0
  23. package/SceneTransition/images/mask/5.png +0 -0
  24. package/SceneTransition/images/mask/6.png +0 -0
  25. package/SceneTransition/images/mask/7.png +0 -0
  26. package/SceneTransition/images/mask/8.png +0 -0
  27. package/SceneTransition/images/mask/9.png +0 -0
  28. package/SceneTransition/maskConfig/config1.js +101 -0
  29. package/SceneTransition/maskConfig/config2.js +88 -0
  30. package/SceneTransition/maskConfig/config3.js +102 -0
  31. package/SecTorTest/App.vue +145 -23
  32. package/SwiperTest/App.vue +4 -4
  33. package/TextureStoreTest/App.vue +111 -45
  34. package/TouchWidget/App.vue +95 -0
  35. package/TouchWidget/Item.vue +64 -0
  36. package/TouchWidget/WidgetItem.vue +96 -0
  37. package/package.json +1 -1
@@ -0,0 +1,102 @@
1
+ const ArraySet3 = [
2
+ {
3
+ left: 0,
4
+ top: 0,
5
+ width: 232,
6
+ height: 287,
7
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/1.png",
8
+ },
9
+ {
10
+ left: 213,
11
+ top: 0,
12
+ width: 588,
13
+ height: 315,
14
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/2.png",
15
+ },
16
+ {
17
+ left: 223,
18
+ top: 0,
19
+ width: 582,
20
+ height: 316,
21
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/3.png",
22
+ },
23
+ {
24
+ left: 811,
25
+ top: 62,
26
+ width: 469,
27
+ height: 257,
28
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/4.png",
29
+ },
30
+ {
31
+ left: 943,
32
+ top: 0,
33
+ width: 337,
34
+ height: 162,
35
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/5.png",
36
+ },
37
+ {
38
+ left: 0,
39
+ top: 260,
40
+ width: 272,
41
+ height: 460,
42
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/6.png",
43
+ },
44
+ {
45
+ left: 86,
46
+ top: 168,
47
+ width: 728,
48
+ height: 350,
49
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/7.png",
50
+ },
51
+ {
52
+ left: 806,
53
+ top: 223,
54
+ width: 474,
55
+ height: 133,
56
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/8.png",
57
+ },
58
+ {
59
+ left: 706,
60
+ top: 0,
61
+ width: 295,
62
+ height: 319,
63
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/9.png",
64
+ },
65
+ {
66
+ left: 51,
67
+ top: 319,
68
+ width: 765,
69
+ height: 401,
70
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/10.png",
71
+ },
72
+ {
73
+ left: 688,
74
+ top: 321,
75
+ width: 304,
76
+ height: 399,
77
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/11.png",
78
+ },
79
+ {
80
+ left: 814,
81
+ top: 320,
82
+ width: 345,
83
+ height: 400,
84
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/12.png",
85
+ },
86
+ {
87
+ left: 816,
88
+ top: 315,
89
+ width: 464,
90
+ height: 211,
91
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/13.png",
92
+ },
93
+ {
94
+ left: 979,
95
+ top: 413,
96
+ width: 301,
97
+ height: 307,
98
+ url: "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/SceneTransition/mask2/14.png",
99
+ },
100
+ ];
101
+
102
+ export { ArraySet3 }
@@ -5,30 +5,33 @@
5
5
  :centerPosition="center"
6
6
  :radius="360"
7
7
  :data="data"
8
+ :animationTime="0.5"
8
9
  ></JsvPieChart>
9
10
  <!-- 文字说明 -->
10
11
  <div class="text">
11
12
  {{
12
- "图为圆心在(400,400)位置,半径为360的饼图。"
13
+ "图为圆心在(400,400)位置,半径为360的饼图。此样例限制最多六个扇形。"
13
14
  }}
14
15
  </div>
15
16
  <!-- 操作说明 -->
16
17
  <div class="text1">
17
- {{ "按上方向键随机板块增加百分比,按下方向键随机减小板块百分比" }}
18
+ {{
19
+ "按【上】键随机板块增加百分比,按【下】键随机减小板块百分比,按【左】键删除项,按【右】键增加项"
20
+ }}
18
21
  </div>
19
22
  </div>
20
23
  </jsv-focus-block>
21
24
  </template>
22
25
 
23
26
  <script setup>
24
- import { reactive } from "vue";
27
+ import { reactive, shallowRef } from "vue";
25
28
  import { JsvPieChart } from "jsview";
26
29
  const center = {
27
30
  x: 400,
28
31
  y: 400,
29
32
  };
30
33
 
31
- let data = reactive([
34
+ let data = shallowRef([
32
35
  {
33
36
  percent: 23.33,
34
37
  color: "#0000FF",
@@ -50,28 +53,147 @@ let data = reactive([
50
53
  color: "#6EFFE1",
51
54
  },
52
55
  ]);
53
-
56
+ let TempData = reactive([]);
57
+ for (let i = 0; i < data.value.length; i++) {
58
+ TempData.push({
59
+ percent: data.value[i].percent,
60
+ color: data.value[i].color,
61
+ });
62
+ }
54
63
  // 生成随机整数
55
64
  const randomNumber = () => {
56
- const randomInt = Math.floor(Math.random() * 4) + 1;
65
+ const randomInt = Math.floor(Math.random() * data.value.length) + 1;
57
66
  return randomInt;
58
67
  };
59
- const onKeyDown = (ev) => {
60
- if (ev.keyCode === 38) {
61
- let total = 0;
62
- for (let i = 0; i < data.length - 1; i++) {
63
- data[i].percent += randomNumber();
64
- total += data[i].percent;
65
- }
66
- data[4].percent = 100 - total;
67
- } else if (ev.keyCode === 40) {
68
- // 随机减;
69
- let total = 0;
70
- for (let i = 0; i < data.length - 1; i++) {
71
- data[i].percent -= randomNumber();
72
- total += data[i].percent;
68
+ //随机颜色函数
69
+ const randomColor = () => {
70
+ let randomColor = Math.round(Math.random() * 2 ** 24).toString(16);
71
+ return (
72
+ "#" + new Array(6 - randomColor.length).fill("0").join("") + randomColor
73
+ );
74
+ };
75
+ //找出最大的百分比
76
+ const findMaxPercentItem = (data) => {
77
+ let maxPercent = 0;
78
+ let maxItem = null;
79
+
80
+ for (let i = 0; i < data.length; i++) {
81
+ if (data[i].percent > maxPercent) {
82
+ maxPercent = data[i].percent;
83
+ maxItem = data[i];
73
84
  }
74
- data[4].percent = 100 - total;
85
+ }
86
+
87
+ return maxItem;
88
+ };
89
+
90
+ const onKeyDown = (ev) => {
91
+ switch (ev.keyCode) {
92
+ //删除项
93
+ case 37:
94
+ if (data.value.length >= 2) {
95
+ const tempPercent = TempData[TempData.length - 1].percent;
96
+ TempData.pop();
97
+ TempData[TempData.length - 1].percent += tempPercent;
98
+ data.value = TempData;
99
+ }
100
+ break;
101
+ case 38:
102
+ //最后一项随机增加
103
+ const random = randomNumber();
104
+ TempData[TempData.length - 1].percent += random;
105
+ if (TempData[TempData.length - 1].percent > 100) {
106
+ TempData[TempData.length - 1].percent = 100;
107
+ for (let i = 0; i < TempData.length - 1; i++) {
108
+ TempData[i].percent = 0;
109
+ }
110
+ } else {
111
+ for (let i = 0; i < TempData.length - 1; i++) {
112
+ TempData[i].percent -= random / (TempData.length - 1);
113
+ if (TempData[i].percent < 0) {
114
+ let tempPercent = TempData[i].percent;
115
+ TempData[i].percent = 0;
116
+ let maxItem = findMaxPercentItem(TempData);
117
+ maxItem.percent += tempPercent;
118
+ }
119
+ }
120
+ }
121
+ data.value = TempData;
122
+ break;
123
+ case 39:
124
+ //增加项
125
+ if (data.value.length >= 1 && data.value.length <= 5) {
126
+ TempData.push({
127
+ percent: 10,
128
+ color: randomColor(),
129
+ });
130
+ let maxItem = findMaxPercentItem(TempData);
131
+ maxItem.percent -= 10;
132
+ data.value = TempData;
133
+ }
134
+ break;
135
+ case 40:
136
+ // 随机减;
137
+ if (data.value[data.value.length - 1].percent == 0) {
138
+ // 随机减少百分比
139
+ let randomDecrement = randomNumber();
140
+ let adjusted = false;
141
+
142
+ for (let i = TempData.length - 1; i >= 0; i--) {
143
+ if (TempData[i].percent > 0) {
144
+ if (TempData[i].percent >= randomDecrement) {
145
+ TempData[i].percent -= randomDecrement;
146
+ adjusted = true;
147
+ break; // 成功减少,结束循环
148
+ } else {
149
+ // 如果当前项百分比不足以减去randomDecrement,则全部减去并尝试从前一个元素继续减少
150
+ randomDecrement -= TempData[i].percent;
151
+ TempData[i].percent = 0;
152
+ }
153
+ }
154
+ }
155
+
156
+ if (!adjusted) {
157
+ // 如果没有成功减少(所有项都为0或randomDecrement大于所有项的总和),可以选择忽略剩余的randomDecrement
158
+ // 或者根据需求进行特殊处理
159
+ }
160
+
161
+ // 确保总和为100%
162
+ let totalPercent = TempData.reduce(
163
+ (total, item) => total + item.percent,
164
+ 0
165
+ );
166
+ let diff = 100 - totalPercent; // 计算差异
167
+
168
+ if (diff !== 0) {
169
+ // 如果总和不为100%,则尝试平衡,优先从前往后增加
170
+ for (let i = 0; i < TempData.length && diff !== 0; i++) {
171
+ let availableIncrease = 100 - TempData[i].percent; // 计算当前项可增加的最大值
172
+ let increment = Math.min(diff, availableIncrease); // 确定实际增加的值
173
+ TempData[i].percent += increment;
174
+ diff -= increment; // 更新剩余差异
175
+ }
176
+ }
177
+ } else {
178
+ const random = randomNumber();
179
+ if (TempData[TempData.length - 1].percent - random < 0) {
180
+ const shouldNumber = TempData[TempData.length - 1].percent;
181
+ TempData[TempData.length - 1].percent = 0;
182
+ for (let i = 0; i < TempData.length - 2; i++) {
183
+ TempData[i].percent += shouldNumber / (TempData.length - 2);
184
+ }
185
+ } else {
186
+ TempData[TempData.length - 1].percent -= random;
187
+ for (let i = 0; i < TempData.length - 1; i++) {
188
+ TempData[i].percent += random / (TempData.length - 1);
189
+ }
190
+ }
191
+ }
192
+ data.value = TempData;
193
+ break;
194
+
195
+ default:
196
+ break;
75
197
  }
76
198
  };
77
199
  let actionDefines = {
@@ -86,7 +208,7 @@ let actionDefines = {
86
208
  background-color: #007788;
87
209
  }
88
210
  .text {
89
- width: 280;
211
+ width: 500;
90
212
  height: 60;
91
213
  left: 700;
92
214
  top: 300;
@@ -96,7 +218,7 @@ let actionDefines = {
96
218
  }
97
219
  .text1 {
98
220
  width: 500;
99
- height: 60;
221
+ height: 90;
100
222
  left: 700;
101
223
  top: 440;
102
224
  background-color: rgba(255, 255, 255, 0.5);
@@ -13,12 +13,12 @@
13
13
  :onClick="onClick"
14
14
  :onChange="onChange"
15
15
  >
16
- <template #itemView="{ item, dataIndex }">
16
+ <template #itemView="{ propsItem,defineSize,dataIndex }">
17
17
  <div
18
18
  :style="{
19
- width: item.width,
20
- height: item.height,
21
- backgroundImage: item.backgroundImage,
19
+ width: defineSize.width,
20
+ height: defineSize.height,
21
+ backgroundImage: items[dataIndex].image,
22
22
  fontSize: 40,
23
23
  }"
24
24
  ></div>
@@ -7,12 +7,16 @@
7
7
  left: 200,
8
8
  }"
9
9
  >
10
- <img :src="`jsvtexturestore://${sourceId}`" class="logo-size" :style="{
11
- left:50,
12
- top:50
13
- }" />
10
+ <img
11
+ :src="`jsvtexturestore://${sourceId}`"
12
+ class="logo-size"
13
+ :style="{
14
+ left: 50,
15
+ top: 50,
16
+ }"
17
+ />
14
18
  </div>
15
- <!-- 圆框点九 -->
19
+ <!-- 圆框点九-底色 -->
16
20
  <div
17
21
  class="logo-bg"
18
22
  :style="{
@@ -28,24 +32,24 @@
28
32
  backgroundColor: '#FF1213',
29
33
  top: 50,
30
34
  }"
31
- >
32
- <JsvNinePatch
33
- :style="{
34
- left: 0,
35
- top: 0,
36
- width: 200,
37
- height: 200,
38
- }"
39
- :imageUrl="`jsvtexturestore://${sourceId2}`"
40
- :imageWidth="136"
41
- :centerWidth="1"
42
- :imageDspWidth="136"
43
- :borderOutset="8"
44
- :animTime="0"
45
- />
46
- </div>
35
+ ></div>
47
36
  </div>
48
- <!-- 方框点九 -->
37
+ <!-- 圆框点九-框 -->
38
+ <JsvNinePatch
39
+ :style="{
40
+ left: 750,
41
+ top: 50,
42
+ width: 200,
43
+ height: 200,
44
+ }"
45
+ :imageUrl="`jsvtexturestore://${sourceId2}`"
46
+ :imageWidth="136"
47
+ :centerWidth="1"
48
+ :imageDspWidth="136"
49
+ :borderOutset="8"
50
+ :animTime="0"
51
+ />
52
+ <!-- 方框点九-底色 -->
49
53
  <div class="logo-bg" :style="{ left: 200, top: 360 }">
50
54
  <div
51
55
  class="logo-size"
@@ -54,27 +58,67 @@
54
58
  backgroundColor: '#FF1213',
55
59
  top: 50,
56
60
  }"
57
- >
58
- <JsvNinePatch
59
- :style="{
60
- left: 0,
61
- top: 0,
62
- width: 200,
63
- height: 200,
64
- }"
65
- :imageUrl="`jsvtexturestore://${sourceId3}`"
66
- :imageWidth="136"
67
- :centerWidth="1"
68
- :imageDspWidth="136"
69
- :borderOutset="6"
70
- :animTime="0"
71
- />
72
- </div>
61
+ ></div>
62
+ </div>
63
+ <!-- 方框点九-框 -->
64
+ <JsvNinePatch
65
+ :style="{
66
+ left: 250,
67
+ top: 410,
68
+ width: 200,
69
+ height: 200,
70
+ }"
71
+ :imageUrl="`jsvtexturestore://${sourceId3}`"
72
+ :imageWidth="136"
73
+ :centerWidth="1"
74
+ :imageDspWidth="136"
75
+ :borderOutset="6"
76
+ :animTime="0"
77
+ />
78
+ <!-- 渐变点九-底色 -->
79
+ <div
80
+ class="logo-bg"
81
+ :style="{
82
+ left: 700,
83
+ top: 360,
84
+ }"
85
+ >
86
+ <div
87
+ class="logo-size"
88
+ :style="{
89
+ borderRadius: 60,
90
+ left: 50,
91
+ backgroundImage: `jsvtexturestore://${sourceId4}`,
92
+ top: 50,
93
+ }"
94
+ ></div>
73
95
  </div>
96
+ <!-- 渐变点九-框(同圆框点九框) -->
97
+ <JsvNinePatch
98
+ :style="{
99
+ left: 750,
100
+ top: 410,
101
+ width: 200,
102
+ height: 200,
103
+ }"
104
+ :imageUrl="`jsvtexturestore://${sourceId2}`"
105
+ :imageWidth="136"
106
+ :centerWidth="1"
107
+ :imageDspWidth="136"
108
+ :borderOutset="8"
109
+ :animTime="0"
110
+ />
74
111
  <!-- 文字说明 -->
75
- <div class="text" :style="{top:320,left:200}">{{ '半圆' }}</div>
76
- <div class="text" :style="{top:320,left:700}">{{ '圆角NinePatch' }}</div>
77
- <div class="text" :style="{top:680,left:200}">{{ '直角NinePatch' }}</div>
112
+ <div class="text" :style="{ top: 320, left: 200 }">{{ "半圆" }}</div>
113
+ <div class="text" :style="{ top: 320, left: 700 }">
114
+ {{ "圆角NinePatch" }}
115
+ </div>
116
+ <div class="text" :style="{ top: 680, left: 200 }">
117
+ {{ "直角NinePatch" }}
118
+ </div>
119
+ <div class="text" :style="{ top: 680, left: 700 }">
120
+ {{ "渐变圆角NinePatch" }}
121
+ </div>
78
122
  </div>
79
123
  </template>
80
124
 
@@ -85,9 +129,11 @@ import { JsvTextureStoreApi } from "jsview";
85
129
  let canvasRef;
86
130
  let canvasRef2;
87
131
  let canvasRef3;
132
+ let canvasRef4;
88
133
  let sourceId = shallowRef("");
89
134
  let sourceId2 = shallowRef("");
90
135
  let sourceId3 = shallowRef("");
136
+ let sourceId4 = shallowRef("");
91
137
  let bitmap = {
92
138
  width: 150,
93
139
  height: 150,
@@ -100,9 +146,14 @@ let bitmap3 = {
100
146
  width: 136,
101
147
  height: 136,
102
148
  };
149
+ let bitmap4 = {
150
+ width: 136,
151
+ height: 136,
152
+ };
103
153
  canvasRef = JsvTextureStoreApi.canvasTexture(bitmap.width, bitmap.height);
104
154
  canvasRef2 = JsvTextureStoreApi.canvasTexture(bitmap2.width, bitmap2.height);
105
155
  canvasRef3 = JsvTextureStoreApi.canvasTexture(bitmap3.width, bitmap3.height);
156
+ canvasRef4 = JsvTextureStoreApi.canvasTexture(bitmap4.width, bitmap4.height);
106
157
  //第一个图
107
158
  let centerX = bitmap.width / 2;
108
159
  let centerY = bitmap.height / 2;
@@ -134,11 +185,26 @@ sourceId2.value = canvasRef2.commit();
134
185
  let customPath3 = canvasRef3.rectPath(3, 3, 133, 133);
135
186
  customPath3.stroke(6, "#87CEEB");
136
187
  sourceId3.value = canvasRef3.commit();
188
+ //第四个图(底色即使用渐变色接口描绘)
189
+ const multiColorSet = {
190
+ color: ["#ff0000", "#0000ff", "#00ff00", "#ff00ff"],
191
+ position: [0, 0.3, 0.8, 1],
192
+ };
193
+ canvasRef4.drawLinearGradientRect(
194
+ 0,
195
+ 0,
196
+ 0,
197
+ 136,
198
+ multiColorSet.color,
199
+ multiColorSet.position
200
+ );
201
+ sourceId4.value = canvasRef4.commit();
137
202
 
138
203
  onBeforeUnmount(() => {
139
204
  JsvTextureStoreApi.deleteTexture(sourceId.value);
140
205
  JsvTextureStoreApi.deleteTexture(sourceId2.value);
141
206
  JsvTextureStoreApi.deleteTexture(sourceId3.value);
207
+ JsvTextureStoreApi.deleteTexture(sourceId4.value);
142
208
  });
143
209
  </script>
144
210
 
@@ -157,12 +223,12 @@ onBeforeUnmount(() => {
157
223
  height: 300;
158
224
  background-color: #007f00;
159
225
  }
160
- .text{
161
- width:300;
162
- height:30;
226
+ .text {
227
+ width: 300;
228
+ height: 30;
163
229
  font-size: 28;
164
230
  line-height: 30;
165
- color: #FFFFFF;
231
+ color: #ffffff;
166
232
  text-align: center;
167
233
  }
168
234
  </style>
@@ -0,0 +1,95 @@
1
+ <!--
2
+ * @Author: ChenChanghua
3
+ * @Date: 2022-07-11 13:31:36
4
+ * @Description: file content
5
+ -->
6
+ <script setup>
7
+ import { MetroWidget, VERTICAL, useFocusHub, METRO_WIDGET_CONST } from "jsview";
8
+ import WidgetItem from "./WidgetItem.vue";
9
+ import { onMounted } from "vue";
10
+
11
+ const focusHub = useFocusHub();
12
+
13
+ const provideData = () => {
14
+ const data = [];
15
+ for (let i = 0; i < 10; i++) {
16
+ data.push({
17
+ width: 500,
18
+ height: 190,
19
+ name: "widget_" + i,
20
+ marginBottom: 10,
21
+ index: i,
22
+ });
23
+ }
24
+ return data;
25
+ };
26
+
27
+ const measures = (item) => {
28
+ return {
29
+ width: item.width,
30
+ height: item.height,
31
+ marginRight: item.marginRight,
32
+ marginBottom: item.marginBottom,
33
+ /**重要代码: itemSlide设置为ACT_FOCUS_RECT_EVENT, 由子MetroWidget控制滚动 */
34
+ itemSlide: METRO_WIDGET_CONST.ITEM_SLIDE.ACT_FOCUS_RECT_EVENT,
35
+ };
36
+ };
37
+
38
+ onMounted(() => {
39
+ focusHub.setFocus("mwWidget");
40
+ });
41
+ </script>
42
+
43
+ <template>
44
+ <div :style="{ width: 1280, height: 720, backgroundColor: '#007788' }" />
45
+ <div
46
+ :style="{
47
+ left: 100,
48
+ top: 20,
49
+ width: 800,
50
+ height: 400,
51
+ fontSize: 30,
52
+ color: '#FFFFFF',
53
+ }"
54
+ >
55
+ {{ `MetroWidget的item是包含MetroWidget的组件` }}
56
+ </div>
57
+ <!-- 为了保证边缘的item缩放后依旧完整显示, 需要设置padding, 注意width/height是包含padding的 -->
58
+ <metro-widget
59
+ name="mwWidget"
60
+ :top="10"
61
+ :left="50"
62
+ :width="660"
63
+ :height="600"
64
+ :provideData="provideData"
65
+ :padding="{ left: 30, right: 30 }"
66
+ :direction="VERTICAL"
67
+ :measures="measures"
68
+ :touchFlag="1"
69
+ >
70
+ <!-- 重要代码: 为了实现焦点就近移动, 需要传递onItemEdge回调 -->
71
+ <template #renderItem="{ data, onAction, onItemEdge }">
72
+ <widget-item :data="data" :onAction="onAction" :onItemEdge="onItemEdge" />
73
+ </template>
74
+ </metro-widget>
75
+
76
+ <div
77
+ :style="{
78
+ width: 50,
79
+ height: 50,
80
+ backgroundColor: '#ff000055',
81
+ animation: 'testRotate 2s infinite',
82
+ }"
83
+ ></div>
84
+ </template>
85
+
86
+ <style scoped>
87
+ @keyframes testRotate {
88
+ from {
89
+ transform: rotate3d(0, 0, 1, 0deg);
90
+ }
91
+ to {
92
+ transform: rotate3d(0, 0, 1, 360deg);
93
+ }
94
+ }
95
+ </style>