@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.
- package/dom/bin/jsview-browser-debug-dom.min.js +1 -1
- package/dom/bin/jsview-dom.min.js +1 -1
- package/dom/bin/jsview-engine-js-browser.min.js +1 -0
- package/dom/target_core_revision.js +4 -4
- package/package.json +1 -1
- package/samples/Basic/components/text/TextOverflow.vue +8 -3
- package/samples/DemoHomepage/router.js +5 -0
- package/samples/Marquee/App.vue +176 -40
- package/samples/Marquee/longText.js +14 -0
- package/samples/MetroWidgetDemos/Advanced/App.vue +5 -6
- package/samples/MetroWidgetDemos/Advanced/ButtonItem.vue +1 -1
- package/samples/MetroWidgetDemos/Advanced/Buttons.vue +5 -5
- package/samples/MetroWidgetDemos/Advanced/Mixed.vue +4 -4
- package/samples/MetroWidgetDemos/Advanced/widgets/Item.vue +83 -0
- package/samples/MetroWidgetDemos/Advanced/widgets/WidgetItem.vue +89 -0
- package/samples/MetroWidgetDemos/Advanced/{Widgets.vue → widgets/Widgets.vue} +56 -11
- package/samples/MetroWidgetDemos/Advanced/widgets/focus1.png +0 -0
- package/samples/MetroWidgetDemos/Item.vue +20 -2
- package/samples/MetroWidgetDemos/Simple/AbsoluteTemplate.vue +2 -2
- package/samples/MetroWidgetDemos/Simple/App.vue +2 -2
- package/samples/MetroWidgetDemos/Simple/RelativeTemplate.vue +4 -4
- package/samples/MetroWidgetDemos/data.js +2 -1
- package/samples/ScaleDownNeon/App.vue +107 -0
- package/samples/TextBox/App.vue +7 -81
- package/samples/TextBox/RenderCenter.vue +40 -16
- package/samples/TextBox/RenderLeft.vue +48 -19
- package/samples/TextBox/RenderOneLine.vue +30 -49
- package/samples/TextBox/RenderRight.vue +40 -16
- package/samples/TextShadowDemo/App.vue +11 -17
- package/samples/TextureSize/App.vue +3 -3
- package/utils/JsViewEngineWidget/MetroWidget/Const.js +11 -0
- package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +188 -80
- package/utils/JsViewEngineWidget/TemplateParser.js +89 -32
- package/utils/JsViewEngineWidget/WidgetCommon.js +3 -4
- package/utils/JsViewEngineWidget/index.js +3 -2
- package/utils/JsViewPlugin/JsvPlayer/JsvMedia.js +61 -12
- package/utils/JsViewPlugin/JsvPlayer/JsvPlayer.vue +8 -1
- package/utils/JsViewPlugin/JsvPlayer/index.js +14 -0
- package/utils/JsViewPlugin/JsvPlayer/version.js +4 -4
- package/utils/JsViewVueWidget/JsvMarquee.vue +178 -205
- package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +35 -27
- package/utils/JsViewVueWidget/JsvNinePatch.vue +1 -2
- package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +18 -2
- package/utils/JsViewVueWidget/JsvSwiper3D/JsvSwiper.vue +22 -2
- package/utils/JsViewVueWidget/JsvTextBox.vue +35 -72
- package/utils/JsViewVueWidget/JsvTouchContainer.vue +3 -4
- package/utils/JsViewVueWidget/utils/index.js +8 -0
- package/utils/JsViewVueWidget/utils/text.js +19 -0
- package/utils/JsViewEngineWidget/MetroPage.js +0 -2128
- package/utils/JsViewEngineWidget/SimpleWidget/ContentView.vue +0 -51
- package/utils/JsViewEngineWidget/SimpleWidget/Dispatcher.js +0 -19
- package/utils/JsViewEngineWidget/SimpleWidget/DivWrapper.vue +0 -53
- package/utils/JsViewEngineWidget/SimpleWidget/ItemView.vue +0 -142
- package/utils/JsViewEngineWidget/SimpleWidget/RootView.vue +0 -140
- 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
|
|
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("
|
|
1351
|
+
logTrace("setJsvPlayerDebugMode, mode="+mode);
|
|
1325
1352
|
if(typeof window.jsvPlayerBridge !== "undefined"){
|
|
1326
|
-
|
|
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
|
-
versionCodeMin:
|
|
7
|
-
versionCodeMax:
|
|
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:"
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
return this.FontStyleClass ? this.FontStyleClass : this.className;
|
|
77
|
-
},
|
|
52
|
+
forceSlide: {
|
|
53
|
+
type: Boolean,
|
|
54
|
+
default: false,
|
|
78
55
|
},
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
133
|
+
},
|
|
134
|
+
null
|
|
135
|
+
)
|
|
136
|
+
);
|
|
137
|
+
toRaw(slideDiv.value.jsvMaskView).StartAnimation(anim);
|
|
138
|
+
animState = 0;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
194
141
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
|
|
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
|
|
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="
|
|
197
|
+
ref="slideDiv"
|
|
223
198
|
:style="{
|
|
224
|
-
left:
|
|
199
|
+
left: slideDivLeft,
|
|
225
200
|
top: 0,
|
|
226
|
-
width:
|
|
227
|
-
height:
|
|
201
|
+
width: style.width,
|
|
202
|
+
height: style.height,
|
|
228
203
|
}"
|
|
229
204
|
>
|
|
230
205
|
<div
|
|
231
|
-
ref="
|
|
232
|
-
:
|
|
233
|
-
:
|
|
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>
|