@shijiu/jsview-vue 0.9.631 → 0.9.684

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 (55) 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/bin/jsview-engine-js-browser.min.js +1 -0
  4. package/dom/target_core_revision.js +4 -4
  5. package/package.json +1 -1
  6. package/samples/Basic/components/text/TextOverflow.vue +8 -3
  7. package/samples/DemoHomepage/router.js +5 -0
  8. package/samples/Marquee/App.vue +176 -40
  9. package/samples/Marquee/longText.js +14 -0
  10. package/samples/MetroWidgetDemos/Advanced/App.vue +5 -6
  11. package/samples/MetroWidgetDemos/Advanced/ButtonItem.vue +1 -1
  12. package/samples/MetroWidgetDemos/Advanced/Buttons.vue +5 -5
  13. package/samples/MetroWidgetDemos/Advanced/Mixed.vue +4 -4
  14. package/samples/MetroWidgetDemos/Advanced/widgets/Item.vue +83 -0
  15. package/samples/MetroWidgetDemos/Advanced/widgets/WidgetItem.vue +89 -0
  16. package/samples/MetroWidgetDemos/Advanced/{Widgets.vue → widgets/Widgets.vue} +56 -11
  17. package/samples/MetroWidgetDemos/Advanced/widgets/focus1.png +0 -0
  18. package/samples/MetroWidgetDemos/Item.vue +20 -2
  19. package/samples/MetroWidgetDemos/Simple/AbsoluteTemplate.vue +2 -2
  20. package/samples/MetroWidgetDemos/Simple/App.vue +2 -2
  21. package/samples/MetroWidgetDemos/Simple/RelativeTemplate.vue +4 -4
  22. package/samples/MetroWidgetDemos/data.js +2 -1
  23. package/samples/ScaleDownNeon/App.vue +107 -0
  24. package/samples/TextBox/App.vue +7 -81
  25. package/samples/TextBox/RenderCenter.vue +40 -16
  26. package/samples/TextBox/RenderLeft.vue +48 -19
  27. package/samples/TextBox/RenderOneLine.vue +30 -49
  28. package/samples/TextBox/RenderRight.vue +40 -16
  29. package/samples/TextShadowDemo/App.vue +11 -17
  30. package/samples/TextureSize/App.vue +3 -3
  31. package/utils/JsViewEngineWidget/MetroWidget/Const.js +11 -0
  32. package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +188 -80
  33. package/utils/JsViewEngineWidget/TemplateParser.js +89 -32
  34. package/utils/JsViewEngineWidget/WidgetCommon.js +3 -4
  35. package/utils/JsViewEngineWidget/index.js +3 -2
  36. package/utils/JsViewPlugin/JsvPlayer/JsvMedia.js +61 -12
  37. package/utils/JsViewPlugin/JsvPlayer/JsvPlayer.vue +8 -1
  38. package/utils/JsViewPlugin/JsvPlayer/index.js +14 -0
  39. package/utils/JsViewPlugin/JsvPlayer/version.js +4 -4
  40. package/utils/JsViewVueWidget/JsvMarquee.vue +178 -205
  41. package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +35 -27
  42. package/utils/JsViewVueWidget/JsvNinePatch.vue +1 -2
  43. package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +18 -2
  44. package/utils/JsViewVueWidget/JsvSwiper3D/JsvSwiper.vue +22 -2
  45. package/utils/JsViewVueWidget/JsvTextBox.vue +35 -72
  46. package/utils/JsViewVueWidget/JsvTouchContainer.vue +3 -4
  47. package/utils/JsViewVueWidget/utils/index.js +8 -0
  48. package/utils/JsViewVueWidget/utils/text.js +19 -0
  49. package/utils/JsViewEngineWidget/MetroPage.js +0 -2128
  50. package/utils/JsViewEngineWidget/SimpleWidget/ContentView.vue +0 -51
  51. package/utils/JsViewEngineWidget/SimpleWidget/Dispatcher.js +0 -19
  52. package/utils/JsViewEngineWidget/SimpleWidget/DivWrapper.vue +0 -53
  53. package/utils/JsViewEngineWidget/SimpleWidget/ItemView.vue +0 -142
  54. package/utils/JsViewEngineWidget/SimpleWidget/RootView.vue +0 -140
  55. package/utils/JsViewEngineWidget/SimpleWidget/SimpleWidget.vue +0 -1629
@@ -190,7 +190,7 @@ function findMediaObjectByKey(key){
190
190
  }
191
191
 
192
192
  class JsvBaseMedia {
193
- constructor(type, hole_id, player_type, key, background, design_map_width, decode_type) {
193
+ constructor(type, window_mode, hole_id, player_type, key, background, design_map_width, decode_type) {
194
194
  logTrace("Create JsvBaseMedia, type="+type+", hole_id="+hole_id+", player_type="+player_type+", key="+key+", background="+background+", design_map_width="+design_map_width+", decode_type="+decode_type);
195
195
 
196
196
  this.state = {
@@ -220,6 +220,7 @@ class JsvBaseMedia {
220
220
  this.type = type;
221
221
  this.playerCreate = false;
222
222
  this.key = key;
223
+ this.windowMode = window_mode;
223
224
  this.background = background;
224
225
  this.holeId = hole_id;
225
226
  this.holeIdModify = hole_id;
@@ -266,7 +267,7 @@ class JsvBaseMedia {
266
267
 
267
268
  let share_view = true;
268
269
 
269
- let result = window.jsvPlayerBridge.CreatePlayer(this.key, this.holeId, this.background, this.designMapWidth, share_view, this.playerType, this.decodeType, "top.CreatePlayerResult");
270
+ let result = window.jsvPlayerBridge.CreatePlayer(this.key, this.windowMode, this.holeId, this.background, this.designMapWidth, share_view, this.playerType, this.decodeType, "top.CreatePlayerResult");
270
271
  if(result > 0){
271
272
  this.initPlayer();
272
273
  }
@@ -846,7 +847,7 @@ class JsvBaseMedia {
846
847
  * 属性,string类型,播放地址,不支持读取。
847
848
  */
848
849
  set src(value) {
849
- this.setSrc(value, null, 1)
850
+ this.setSrc(value, null, null, 1)
850
851
  }
851
852
 
852
853
  /**
@@ -895,17 +896,26 @@ class JsvBaseMedia {
895
896
  /**
896
897
  * 设置播放地址。
897
898
  * @param {string} url 播放地址。
899
+ * @param {String} windowMode 播放器窗口模式。
900
+ * null:使用this.windowMode作为窗口模式。
901
+ * full:观影模式,全屏方式,不建议修改w/h/l/t,视频清晰度/流畅度最佳;
902
+ * resizable:可变窗口模式,可以随意修改w/h/l/t,支持动画效果,视频清晰度/流畅度表现可能不如full模式;
903
+ * pip:画中画模式,只在支持多路硬解的情况下使用,用户画中画的小窗播放,对清晰度/流畅度要求较差,可能会有反交错问题。
898
904
  * @param {string} head 网络请求的head信息,可以为NULL。
899
- * @param {int} type 类型,1表示点播,2表示直播,3表示时移,默认1。
905
+ * @param {int} type 类型,1表示点播,2表示直播,3表示时移,4表示回看,默认1。
900
906
  * @param {double} timeShift 时移时间,只有在type=3时才有效,表示从当前时间时移多长时间,单位秒。
901
907
  * @param {int} 分辨率类型 0:unknown或其它;1:标清;2:高清;3:超清(720P);4:蓝光(1080P);5:2K;6:4K;7:8K。
908
+ * @param {int} 用户频道号,只在直播回看状态下需要设置
902
909
  */
903
- setSrc(url, head, type, timeShift, resolution){
910
+ setSrc(url, windowMode, head, type, timeShift, resolution, mixNo){
904
911
  let src = {};
905
912
  src.url = url;
906
913
  if(head){
907
914
  src.head = head;
908
915
  }
916
+ if(windowMode){
917
+ src.windowMode = windowMode;
918
+ }
909
919
  if(type){
910
920
  src.type = type;
911
921
  }else{
@@ -919,6 +929,10 @@ class JsvBaseMedia {
919
929
  src.resolution = resolution;
920
930
  }
921
931
 
932
+ if(mixNo && typeof mixNo == "number"){
933
+ src.channelID = mixNo;
934
+ }
935
+
922
936
  this.currentEventStatus = EVENT_STATUS_NONE;
923
937
  this.setState("src", JSON.stringify(src), "string");
924
938
  this.eventReport = true;
@@ -1186,6 +1200,19 @@ class JsvBaseMedia {
1186
1200
  }
1187
1201
  }
1188
1202
 
1203
+ /**
1204
+ * 获取是否支持倍速设置,在onCanPlay事件发送以后,通过此接口查询。
1205
+ * @returns {boolean} true:支持播放倍速设置;false:不支持播放倍速设置。
1206
+ * */
1207
+ supportPlaybackRateSet(){
1208
+ logTrace("supportPlaybackRateSet, key="+this.key);
1209
+ if(typeof window.jsvPlayerBridge !== "undefined"){
1210
+ return window.jsvPlayerBridge.supportRateSet(this.key);
1211
+ }
1212
+
1213
+ return false;
1214
+ }
1215
+
1189
1216
  /**
1190
1217
  * 私有接口,外部不需要调用此接口。
1191
1218
  */
@@ -1241,21 +1268,21 @@ class JsvBaseMedia {
1241
1268
  }
1242
1269
 
1243
1270
  class JsvMedia extends JsvBaseMedia {
1244
- constructor(type, hole_id, player_type, key, background, design_map_width, decode_type) {
1245
- super(type, hole_id, player_type, key, background, design_map_width, decode_type);
1271
+ constructor(type, window_mode, hole_id, player_type, key, background, design_map_width, decode_type) {
1272
+ super(type, window_mode, hole_id, player_type, key, background, design_map_width, decode_type);
1246
1273
  //super.buildPlatformInstance(type);
1247
1274
  }
1248
1275
  }
1249
1276
 
1250
1277
  class JsvMediaAudio extends JsvMedia {
1251
1278
  constructor() {
1252
- super("audio", null, null, null, null, null, 0);
1279
+ super("audio", "resizable", null, null, null, null, null, 0);
1253
1280
  }
1254
1281
  }
1255
1282
 
1256
1283
  class JsvMediaVideo extends JsvMedia {
1257
- constructor(hole_id, player_type, key, background, design_map_width, decode_type) {
1258
- super("video", hole_id, player_type, key, background, design_map_width, decode_type);
1284
+ constructor(hole_id, window_mode, player_type, key, background, design_map_width, decode_type) {
1285
+ super("video", window_mode, hole_id, player_type, key, background, design_map_width, decode_type);
1259
1286
 
1260
1287
  this.state.aspectRatio = 'origin'; // 'origin', 'full', '16:9', '4:3',
1261
1288
  }
@@ -1321,16 +1348,36 @@ function setJsvPlayerNumber(videoType, num){
1321
1348
  }
1322
1349
 
1323
1350
  function setJsvPlayerDebugMode(mode){
1324
- logTrace("setDebugMode, mode="+mode);
1351
+ logTrace("setJsvPlayerDebugMode, mode="+mode);
1325
1352
  if(typeof window.jsvPlayerBridge !== "undefined"){
1326
- return window.jsvPlayerBridge.setDebugMode(null, mode);
1353
+ window.jsvPlayerBridge.setDebugMode(null, mode);
1327
1354
  }
1328
1355
  }
1329
1356
 
1357
+ function getJsvPlayerRunningNum(){
1358
+ logTrace("getJsvPlayerRunningNum");
1359
+ if(typeof window.jsvPlayerBridge !== "undefined"){
1360
+ return window.jsvPlayerBridge.getRunningPlayerNum();
1361
+ }
1362
+ return -1;
1363
+ }
1364
+
1365
+ function setOperator(operator){
1366
+ logTrace("setOperator");
1367
+ if(typeof window.jsvPlayerBridge !== "undefined"){
1368
+ return window.jsvPlayerBridge.setOperator(operator);
1369
+ }
1370
+ }
1371
+
1372
+ function globalLoadSetOperator(operator){
1373
+ setOperator(operator)
1374
+ }
1375
+
1330
1376
  export {
1331
1377
  JsvMediaVideo,
1332
1378
  JsvMediaAudio,
1333
1379
  globalLoadJsvPlayerPlugin,
1380
+ globalLoadSetOperator,
1334
1381
  findMediaObjectByKey,
1335
1382
  getJsvPlayerCapabilitySet,
1336
1383
  setJsvPlayerNumber,
@@ -1341,4 +1388,6 @@ export {
1341
1388
  logDebug,
1342
1389
  logTrace,
1343
1390
  setJsvPlayerDebugMode,
1391
+ getJsvPlayerRunningNum,
1392
+ setOperator,
1344
1393
  }
@@ -18,6 +18,13 @@ export default {
18
18
  * 属性,String类型,播放器实例索引,同样的key使用同一个播放器实例。
19
19
  */
20
20
  playerKey: { type: String, default: null},
21
+ /**
22
+ * 属性,String类型,播放器窗口模式,默认resizable模式。
23
+ * full:观影模式,全屏方式,不建议修改w/h/l/t,视频清晰度/流畅度最佳;
24
+ * resizable:可变窗口模式,可以随意修改w/h/l/t,支持动画效果,视频清晰度/流畅度表现可能不如full模式;
25
+ * pip:画中画模式,只在支持多路硬解的情况下使用,用户画中画的小窗播放,对清晰度/流畅度要求较差,可能会有反交错问题。
26
+ */
27
+ windowMode: {type: String, default: "resizable"},
21
28
  /**
22
29
  * 属性,int类型,底层使用的播放器类型。1:系统播放器;2:jsv播放器。默认2。
23
30
  */
@@ -236,7 +243,7 @@ export default {
236
243
  let first_create = true;
237
244
 
238
245
  if(!this.video){
239
- this.video = new JsvMediaVideo(this.holeId, player_type, key, background, designMap.width, this.decodeType);
246
+ this.video = new JsvMediaVideo(this.holeId, this.windowMode, player_type, key, background, designMap.width, this.decodeType);
240
247
  }else{
241
248
  this.video.setRef();
242
249
  first_create = false;
@@ -3,11 +3,15 @@ import * as JsvPlayer from "./JsvPlayer.vue";
3
3
  import { globalLoadJsvPlayerPlugin as initPlugin } from "./JsvMedia.js"
4
4
  import { getJsvPlayerCapabilitySet as getCapabilitySet } from "./JsvMedia.js"
5
5
  import { setJsvPlayerDebugMode as setDebugMode } from "./JsvMedia.js"
6
+ import { getJsvPlayerRunningNum as getRunningPlayerNum } from "./JsvMedia.js"
7
+ import { globalLoadSetOperator as setOperator } from"./JsvMedia.js"
6
8
  let _JsvPlayer = JsvPlayer;
7
9
 
8
10
  let globalLoadJsvPlayerPlugin = initPlugin;
9
11
  let getJsvPlayerCapabilitySet = getCapabilitySet;
10
12
  let setJsvPlayerDebugMode = setDebugMode;
13
+ let getJsvPlayerRunningNum = getRunningPlayerNum;
14
+ let globalLoadSetOperator = setOperator;
11
15
 
12
16
  if (window.JsvWidgetWrapperGroup?.BrowserJsvPlayer) {
13
17
  // 浏览器版本
@@ -26,6 +30,14 @@ if (window.JsvWidgetWrapperGroup?.BrowserJsvPlayer) {
26
30
  setJsvPlayerDebugMode = () => {
27
31
  console.log("Set debug mode");
28
32
  }
33
+
34
+ getJsvPlayerRunningNum = () => {
35
+ return -1;
36
+ }
37
+
38
+ globalLoadSetOperator = (operator)=>{
39
+
40
+ }
29
41
  }
30
42
 
31
43
  let component = _JsvPlayer.default;
@@ -35,4 +47,6 @@ export {
35
47
  globalLoadJsvPlayerPlugin, // 全局初始化播放器插件处理
36
48
  getJsvPlayerCapabilitySet, //获取设备能力集
37
49
  setJsvPlayerDebugMode, //设置调试模式,可以查看帧率等信息
50
+ getJsvPlayerRunningNum, //获取正在运行的播放器个数
51
+ globalLoadSetOperator,// 设置运营商
38
52
  }
@@ -2,16 +2,16 @@ let PluginInfo={
2
2
  // downloadUrl:"http://192.168.0.63:8080/plugin/JsvPlayer-164.zip", //插件下载地址
3
3
  packageName:"com.qcode.jsvplayer",
4
4
  name:"播放器插件",
5
- version:"1.6.7", //插件需要的版本号
6
- versionCodeMin:167,
7
- versionCodeMax:167,
5
+ version:"1.8.5", //插件需要的版本号
6
+ versionCodeMin:185,
7
+ versionCodeMax:185,
8
8
  bridgeName:"jsvPlayerBridge", //插件bridge注册到jsview的名称
9
9
  className:"com.qcode.jsvplayer.JsvPlayer", //插件初始化类名称
10
10
  initMethod:"createInstance", //插件初始化方法
11
11
  listener:"top.JsvPlayerPluginLoadResult", //插件加载结果回调
12
12
  listener2: "top.JsvPlayerPluginStatus",
13
13
  // debug:true,
14
- md5:"19b065b6d4d2acdbaf6093c4864fea22"
14
+ md5:"7419da6cf1d0fd294540044e90d1a0e7"
15
15
  };
16
16
 
17
17
  // 不要用export default,update-env脚本不能解析
@@ -3,236 +3,209 @@
3
3
  * JsvMarquee:Vue高阶组件,文字跑马灯
4
4
  * props说明:
5
5
  * text {String} 文字内容
6
- * layoutStyles {Array|Object} 控件位置信息 [{top: 0, left: 0, width: 0, height: 0}]
7
- * fontStyles {Array|Object} 文字样式
6
+ * style {Object} 样式
8
7
  * slideSpeed {int} 滚动速度 px/s, 默认60
9
8
  * forceSlide {boolean} 短文字是否滚动,默认false
10
9
  -->
11
10
 
12
- <script>
11
+ <script setup>
13
12
  import { Forge } from "../../dom/jsv-forge-define";
14
- import {
15
- JsvStyleClass,
16
- JsvTextStyleClass,
17
- combinedStyles,
18
- } from "../JsViewVueTools/JsvStyleClass";
13
+ import { getTextWidth } from "./utils";
14
+ import { ref, computed, toRaw, onMounted, onBeforeUnmount } from "vue";
19
15
 
20
- const sDefaultLayoutStyle = new JsvStyleClass({
21
- left: 0,
22
- top: 0,
23
- width: 0,
24
- height: 20,
25
- });
26
- const sDefaultFontStyle = new JsvTextStyleClass({
27
- color: "rgba(255,255,255,1.0)",
28
- fontSize: 10,
29
- textAlign: "center",
30
- lineHeight: "20px",
31
- });
32
- const sCommonFontStyle = new JsvTextStyleClass({
33
- whiteSpace: "nowrap",
34
- });
35
- export default {
36
- props: {
37
- text: {
38
- type: String,
39
- default: "",
40
- },
41
- layoutStyles: {
42
- type: [Array, Object],
43
- default: () => [sDefaultLayoutStyle],
44
- },
45
- fontStyles: {
46
- type: [Array, Object],
47
- },
48
- styleToken: String,
49
- slideSpeed: {
50
- // 60px per second
51
- type: Number,
52
- default: 60,
53
- },
54
- forceSlide: {
55
- type: Boolean,
56
- default: false,
57
- },
58
- className: {
59
- type: String,
16
+ const defaultFontStyle = () => {
17
+ return {
18
+ color: "rgba(255,255,255,1.0)",
19
+ fontSize: 10,
20
+ textAlign: "start",
21
+ lineHeight: "20px",
22
+ whiteSpace: "nowrap",
23
+ direction: 'ltr'
24
+ };
25
+ };
26
+ const props = defineProps({
27
+ text: {
28
+ type: String,
29
+ default: "",
30
+ },
31
+ style: {
32
+ type: Object,
33
+ default() {
34
+ return {
35
+ left: 0,
36
+ top: 0,
37
+ width: 0,
38
+ height: 20,
39
+ color: "rgba(255,255,255,1.0)",
40
+ fontSize: 10,
41
+ textAlign: "start",
42
+ lineHeight: "20px",
43
+ whiteSpace: "nowrap",
44
+ direction: 'ltr,'
45
+ };
60
46
  },
61
47
  },
62
- data() {
63
- return {
64
- asyncTextLenTimer: -1,
65
- rollTimeId: -1,
66
- animationCount: 0,
67
- LayoutStyle: null,
68
- FontStyle: null,
69
- FontStyleClass: null,
70
- TokenProcessed: null,
71
- };
48
+ slideSpeed: {
49
+ type: Number,
50
+ default: 60,
72
51
  },
73
- setup() {},
74
- computed: {
75
- _className() {
76
- return this.FontStyleClass ? this.FontStyleClass : this.className;
77
- },
52
+ forceSlide: {
53
+ type: Boolean,
54
+ default: false,
78
55
  },
79
- methods: {
80
- _asyncStartSlider() {
81
- // 清理之前的Slider处理
82
- this._resetSlider();
56
+ });
57
+ const slideDiv = ref(null);
58
+ const textDiv = ref(null);
59
+ let animState = 0;
60
+ let animIdleHandler = -1;
61
+ let asyncStartHandler = -1;
62
+ const fontStyle = computed(() => {
63
+ let { left, top, width, height, ...rest } = props.style;
64
+ let r = defaultFontStyle();
65
+ Object.assign(r, rest);
66
+ if (props.forceSlide) {
67
+ //滚送时必需start对齐
68
+ r.textAlign = "start";
69
+ }
70
+ return r;
71
+ });
72
+ //rtl文字需要先获得文字宽度
73
+ let textWidth =
74
+ fontStyle.value.direction == "rtl" ? getTextWidth(props.text, fontStyle.value) : 0;
75
+ const slideDivLeft = computed(() =>
76
+ fontStyle.value.direction == "rtl" && props.style.width < textWidth
77
+ ? props.style.width - textWidth
78
+ : 0
79
+ );
83
80
 
84
- // 稍进行延迟,以等待JsView的native端描绘文字并回传文字宽度
85
- if (this.asyncTextLenTimer < 0) {
86
- this.asyncTextLenTimer = setTimeout(() => {
87
- if (
88
- this.forceSlide ||
89
- this.$refs.textRef.clientWidth > this.LayoutStyle.width
90
- ) {
91
- this._slideNextStep();
92
- }
93
- this.asyncTextLenTimer = -1;
94
- }, 500);
95
- }
96
- },
97
- _resetSlider() {
98
- if (this.rollTimeId >= 0) {
99
- clearTimeout(this.rollTimeId);
100
- this.rollTimeId = -1;
101
- }
102
- this.animationCount = 0;
103
- this.$refs.sliderRef?.jsvMaskView?.StopAnimation();
104
- },
105
- _slideNextStep() {
106
- const text_width = this.$refs.textRef.clientWidth;
107
- if (this.animationCount % 2 === 0) {
108
- // 文字从原始位置,向左移动出屏幕(每次完整移动,停顿1秒)
109
- this.rollTimeId = setTimeout(() => {
110
- this.rollTimeId = -1;
111
- const anim = new Forge.TranslateFrameAnimation(
112
- 0,
113
- -text_width,
114
- this.$props.slideSpeed,
115
- true,
116
- 0,
117
- 0
118
- );
119
- anim.SetAnimationListener(
120
- new Forge.AnimationListener(
121
- null,
122
- (ended) => {
123
- if (ended) {
124
- // 正常结束,非Cancel时,进行下一个动作
125
- this._slideNextStep();
126
- }
127
- },
128
- null
129
- )
130
- );
131
- anim.Enable(Forge.AnimationEnable.ReleaseAfterEndCallback);
132
- this.$refs.sliderRef.jsvMaskView.StartAnimation(anim);
133
- this.animationCount += 1;
134
- }, 1000);
135
- } else {
136
- // 文字从右边屏幕外部,移动回屏幕中的文字原始位置
137
- const anim = new Forge.TranslateFrameAnimation(
138
- this.LayoutStyle.width,
139
- 0,
140
- this.$props.slideSpeed,
141
- true,
142
- this.LayoutStyle.width,
143
- 0
144
- );
145
- anim.SetAnimationListener(
146
- new Forge.AnimationListener(
147
- null,
148
- (ended) => {
149
- if (ended) {
150
- // 正常结束,非Cancel时,进行下一个动作
151
- this._slideNextStep();
152
- }
153
- },
154
- null
155
- )
156
- );
157
- this.$refs.sliderRef.jsvMaskView.StartAnimation(anim);
158
- this.animationCount += 1;
159
- }
160
- },
161
- _AnalyzeStyleChange() {
162
- if (this.$props.styleToken !== this.TokenProcessed) {
163
- // Token变化时,重新解析style array
164
- let style_list;
165
- if (this.layoutStyles instanceof Array) {
166
- style_list = this.layoutStyles;
167
- } else {
168
- style_list = [this.layoutStyles];
169
- }
170
- const layout_set = combinedStyles(style_list, true);
171
- this.LayoutStyle = layout_set.combinedStyle;
172
- if (this.fontStyles) {
173
- if (this.fontStyles instanceof Array) {
174
- if (this.fontStyles[0] instanceof JsvStyleClass) {
175
- style_list = [...this.fontStyles, sCommonFontStyle];
176
- } else {
177
- style_list = this.fontStyles.map(
178
- (item) => new JsvStyleClass(item)
179
- );
180
- style_list.push(sCommonFontStyle);
81
+ const slideStep = () => {
82
+ if (animState == 0) {
83
+ // 文字从原始位置,移动出屏幕(每次完整移动,停顿1秒)
84
+ let start = 0,
85
+ end = fontStyle.value.direction == "rtl" ? textWidth : -textWidth;
86
+ animIdleHandler = setTimeout(() => {
87
+ animIdleHandler = -1;
88
+ const anim = new Forge.TranslateFrameAnimation(
89
+ start,
90
+ end,
91
+ props.slideSpeed,
92
+ true,
93
+ 0,
94
+ 0
95
+ );
96
+ anim.SetAnimationListener(
97
+ new Forge.AnimationListener(
98
+ null,
99
+ (ended) => {
100
+ if (ended) {
101
+ // 正常结束,非Cancel时,进行下一个动作
102
+ slideStep();
181
103
  }
182
- } else {
183
- style_list = [
184
- this.fontStyles instanceof JsvStyleClass
185
- ? this.fontStyles
186
- : new JsvStyleClass(this.fontStyles),
187
- sCommonFontStyle,
188
- ];
104
+ },
105
+ null
106
+ )
107
+ );
108
+ anim.Enable(Forge.AnimationEnable.ReleaseAfterEndCallback);
109
+ toRaw(slideDiv.value.jsvMaskView).StartAnimation(anim);
110
+ animState = 1;
111
+ }, 1000);
112
+ } else {
113
+ // 文字从屏幕外部,移动回屏幕中的文字原始位置
114
+ let start =
115
+ fontStyle.value.direction == "rtl" ? -props.style.width : props.style.width,
116
+ end = 0;
117
+ const anim = new Forge.TranslateFrameAnimation(
118
+ start,
119
+ end,
120
+ props.slideSpeed,
121
+ true,
122
+ props.style.width,
123
+ 0
124
+ );
125
+ anim.SetAnimationListener(
126
+ new Forge.AnimationListener(
127
+ null,
128
+ (ended) => {
129
+ if (ended) {
130
+ // 正常结束,非Cancel时,进行下一个动作
131
+ slideStep();
189
132
  }
190
- const font_set = combinedStyles(style_list);
191
- this.FontStyle = font_set.combinedStyle;
192
- this.FontStyleClass = font_set.combinedClass;
193
- }
133
+ },
134
+ null
135
+ )
136
+ );
137
+ toRaw(slideDiv.value.jsvMaskView).StartAnimation(anim);
138
+ animState = 0;
139
+ }
140
+ };
194
141
 
195
- if (this.FontStyleClass && this.FontStyleClass.length === 0) {
196
- this.FontStyleClass = null;
197
- }
198
- this.TokenProcessed = this.styleToken;
199
- }
200
- },
201
- },
202
- created() {
203
- this._AnalyzeStyleChange();
204
- },
205
- mounted() {
206
- this._asyncStartSlider();
207
- },
208
- unmounted() {
209
- // 清理所有异步处理,并停止Slider动作
210
- if (this.asyncTextLenTimer >= 0) {
211
- clearTimeout(this.asyncTextLenTimer);
212
- this.asyncTextLenTimer = -1;
142
+ const stopSlide = () => {
143
+ if (animIdleHandler > 0) {
144
+ clearTimeout(animIdleHandler);
145
+ animIdleHandler = -1;
146
+ }
147
+ animState = 0;
148
+ toRaw(slideDiv.value?.jsvMaskView)?.StopAnimation();
149
+ };
150
+
151
+ const asyncStartAnim = () => {
152
+ stopSlide();
153
+ // 稍进行延迟,以等待JsView的native端描绘文字并回传文字宽度
154
+ if (asyncStartHandler > 0) {
155
+ clearTimeout(asyncStartHandler);
156
+ }
157
+ asyncStartHandler = setTimeout(() => {
158
+ if (textWidth <= 0) {
159
+ textWidth = textDiv.value.clientWidth;
213
160
  }
214
- this._resetSlider();
215
- },
161
+ if (props.forceSlide || textWidth > props.style.width) {
162
+ slideStep();
163
+ }
164
+ asyncStartHandler = -1;
165
+ }, 500);
216
166
  };
167
+
168
+ onMounted(() => {
169
+ if (fontStyle.value.direction == "ltr") {
170
+ //普通的ltr文字异步通过clientWidth获取文字宽度
171
+ asyncStartAnim();
172
+ } else {
173
+ if (props.forceSlide || textWidth > props.style.width) {
174
+ slideStep();
175
+ }
176
+ }
177
+ });
178
+
179
+ onBeforeUnmount(() => {
180
+ clearTimeout(asyncStartHandler);
181
+ asyncStartHandler = -1;
182
+ stopSlide();
183
+ });
217
184
  </script>
218
185
 
219
186
  <template>
220
- <div :style="{ ...LayoutStyle, overflow: 'hidden' }">
187
+ <div
188
+ :style="{
189
+ left: style.left,
190
+ top: style.top,
191
+ width: style.width,
192
+ height: style.height,
193
+ overflow: 'hidden',
194
+ }"
195
+ >
221
196
  <div
222
- ref="sliderRef"
197
+ ref="slideDiv"
223
198
  :style="{
224
- left: 0,
199
+ left: slideDivLeft,
225
200
  top: 0,
226
- width: LayoutStyle.width,
227
- height: LayoutStyle.height,
201
+ width: style.width,
202
+ height: style.height,
228
203
  }"
229
204
  >
230
205
  <div
231
- ref="textRef"
232
- :className="_className"
233
- :style="{ ...FontStyle, height: LayoutStyle.height }"
234
- :jsv_text_align_minwidth="LayoutStyle.width"
235
- jsv-inherit-class="2"
206
+ ref="textDiv"
207
+ :style="{ ...fontStyle, height: style.height }"
208
+ :jsv_text_align_minwidth="style.width"
236
209
  >
237
210
  {{ text }}
238
211
  </div>