@shijiu/jsview-vue 0.9.631 → 0.9.766
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/bin/jsview-forge-define.min.js +1 -1
- package/dom/jsv-engine-js-browser.js +6 -0
- package/dom/target_core_revision.js +4 -4
- package/loader/loader.js +4 -0
- package/package.json +1 -1
- package/patches/node_modules/@vue/cli-service/lib/config/base.js +1 -1
- package/samples/AnimPicture/App.vue +5 -5
- package/samples/Basic/components/div/DivLayout.vue +1 -1
- package/samples/Basic/components/img/ImageGroup.vue +2 -2
- package/samples/Basic/components/img/ImgLayout.vue +79 -15
- package/samples/Basic/components/text/TextDirection.vue +104 -0
- package/samples/Basic/components/text/TextEmoji.vue +1 -1
- package/samples/Basic/components/text/TextGroup1.vue +1 -1
- package/samples/Basic/components/text/TextGroup2.vue +11 -1
- package/samples/Basic/components/text/TextOverflow.vue +8 -3
- package/samples/BasicFocusControl/components/BaseBlock.vue +2 -2
- package/samples/Collision/App.vue +11 -11
- package/samples/DemoHomepage/App.vue +43 -8
- package/samples/DemoHomepage/router.js +18 -10
- package/samples/DemoHomepage/views/Homepage.vue +83 -96
- package/samples/FilterDemo/App.vue +1 -1
- package/samples/FlipCard/App.vue +2 -2
- package/samples/FlipCard/FlipCard.vue +3 -3
- package/samples/GridDemo/App.vue +3 -3
- package/samples/GridDemo/ButtonBlock.vue +2 -2
- package/samples/GridDemo/FocusItem.vue +2 -2
- package/samples/GridDemo/Item.vue +1 -1
- package/samples/HashHistory/App.vue +10 -3
- package/samples/HashHistory/components/Item.vue +1 -1
- package/samples/ImpactStop/App.vue +15 -11
- package/samples/Input/InputPanel.vue +1 -1
- package/samples/LongImage/Button.vue +1 -1
- package/samples/LongImage/ButtonItem.vue +1 -1
- package/samples/LongImage/LongImageScroll.vue +2 -2
- package/samples/LongText/App.vue +1 -1
- package/samples/LongText/Button.vue +1 -1
- package/samples/LongText/ButtonItem.vue +1 -1
- package/samples/LongText/LongTextScroll.vue +3 -3
- 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 +4 -4
- package/samples/MetroWidgetDemos/Advanced/Buttons.vue +5 -5
- package/samples/MetroWidgetDemos/Advanced/Mixed.vue +4 -4
- package/samples/MetroWidgetDemos/Advanced/widgets/Item.vue +82 -0
- package/samples/MetroWidgetDemos/Advanced/widgets/WidgetItem.vue +88 -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 +4 -2
- package/samples/MetroWidgetDemos/PerformanceTest/App.vue +4 -4
- package/samples/MetroWidgetDemos/PerformanceTest/components/ContentItem.vue +1 -1
- package/samples/MetroWidgetDemos/PerformanceTest/components/MyTab.vue +3 -3
- package/samples/MetroWidgetDemos/PingPong/AppPage.vue +2 -2
- package/samples/MetroWidgetDemos/PingPong/TabItem.vue +1 -1
- package/samples/MetroWidgetDemos/PingPong/ViewSwiper.vue +3 -3
- package/samples/MetroWidgetDemos/Simple/AbsoluteTemplate.vue +2 -2
- package/samples/MetroWidgetDemos/Simple/App.vue +2 -2
- package/samples/MetroWidgetDemos/Simple/RelativeTemplate.vue +6 -6
- package/samples/MetroWidgetDemos/WidgetItem.vue +2 -3
- package/samples/MetroWidgetDemos/data.js +2 -1
- package/samples/NinePatchDemo/App.vue +2 -2
- package/samples/NinePatchDemo/Item.vue +2 -2
- package/samples/Preload/App.vue +1 -1
- package/samples/Preload/Item.vue +1 -1
- package/samples/QrcodeDemo/App.vue +1 -1
- package/samples/ScaleDownNeon/App.vue +107 -0
- package/samples/SoundPool/App.vue +3 -3
- package/samples/SpriteImage/App.vue +5 -0
- package/samples/TextBox/App.vue +9 -82
- 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/TextureAnimation/App2.vue +1 -1
- package/samples/TextureSize/App.vue +3 -3
- package/samples/ThrowMoveDemo/LRParabolicDemo.vue +33 -47
- package/samples/TouchSample/MetroWidgetHorizontal.vue +1 -1
- package/samples/TouchSample/MetroWidgetVertical.vue +1 -1
- package/samples/TransitPage/App.vue +1 -1
- package/samples/VideoDemo/App.vue +8 -8
- package/samples/VideoDemo/components/Button.vue +1 -1
- package/samples/VideoDemo/components/Controllor.vue +1 -1
- package/samples/VisibleSensorDemo/App.vue +3 -3
- package/scripts/jsview-run-android.js +5 -4
- package/utils/JsViewEngineWidget/JsvFocusBlock.vue +4 -4
- package/utils/JsViewEngineWidget/MetroWidget/Const.js +11 -0
- package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +245 -111
- package/utils/JsViewEngineWidget/TemplateParser.js +227 -178
- package/utils/JsViewEngineWidget/WidgetCommon.js +14 -6
- package/utils/JsViewEngineWidget/index.js +3 -2
- package/utils/JsViewPlugin/BrowserPluginLoader.js +4 -2
- package/utils/JsViewPlugin/JsvAudio/AudioProxy.js +302 -0
- package/utils/JsViewPlugin/JsvAudio/CheckType.js +68 -0
- package/utils/JsViewPlugin/JsvAudio/Events.js +17 -0
- package/utils/JsViewPlugin/JsvAudio/JsvAudio.vue +176 -0
- package/utils/JsViewPlugin/JsvAudio/JsvAudioBridgeProxy.js +40 -0
- package/utils/JsViewPlugin/JsvAudio/JsvAudioBrowser.vue +46 -0
- package/utils/JsViewPlugin/JsvAudio/PluginLoader.js +140 -0
- package/utils/JsViewPlugin/JsvAudio/index.js +26 -0
- package/utils/JsViewPlugin/JsvAudio/version.js +24 -0
- 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 +5 -5
- package/utils/JsViewVueTools/JsvHashHistory.js +34 -8
- package/utils/JsViewVueTools/JsvImpactTracer.js +2 -2
- package/utils/JsViewVueTools/JsvRuntimeBridge.js +46 -8
- package/utils/JsViewVueTools/JsvStyleClass.js +9 -0
- package/utils/JsViewVueTools/JsvTextTools.js +18 -0
- package/utils/JsViewVueTools/TypeCheckAndSet.js +3 -3
- package/utils/JsViewVueTools/index.js +2 -1
- package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserTextureAnim.vue +5 -7
- package/utils/JsViewVueWidget/JsvActorMove/JsvActorMove.vue +20 -22
- package/utils/JsViewVueWidget/JsvApic/JsvApic.vue +4 -4
- package/utils/JsViewVueWidget/JsvGrid.vue +1 -9
- package/utils/JsViewVueWidget/JsvInput/Cursor.vue +1 -1
- package/utils/JsViewVueWidget/JsvMarquee.vue +188 -205
- package/utils/JsViewVueWidget/JsvMaskClipDiv.vue +1 -1
- package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +35 -27
- package/utils/JsViewVueWidget/JsvNinePatch.vue +63 -54
- package/utils/JsViewVueWidget/JsvSpray/JsvSpray.vue +10 -5
- package/utils/JsViewVueWidget/JsvSpriteAnim/JsvSpriteAnim.vue +2 -2
- package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +21 -5
- package/utils/JsViewVueWidget/JsvSwiper3D/JsvSwiper.vue +23 -3
- package/utils/JsViewVueWidget/JsvTextBox.vue +27 -84
- package/utils/JsViewVueWidget/JsvTouchContainer.vue +5 -6
- package/utils/JsViewVueWidget/JsvTransparentDiv.vue +1 -1
- package/utils/JsViewVueWidget/JsvVisibleSensor/JsvVisibleSensor.vue +5 -5
- package/utils/JsViewVueWidget/index.js +8 -8
- 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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @Author: ChenChanghua
|
|
3
3
|
* @Date: 2021-09-22 16:08:58
|
|
4
4
|
* @LastEditors: ChenChanghua
|
|
5
|
-
* @LastEditTime: 2022-
|
|
5
|
+
* @LastEditTime: 2022-12-19 11:17:10
|
|
6
6
|
* @Description: file content
|
|
7
7
|
-->
|
|
8
8
|
|
|
@@ -23,7 +23,13 @@
|
|
|
23
23
|
* name {string} 用于设置焦点的名称
|
|
24
24
|
* padding {object} 控件内边距, 默认为{left: 0, right: 0, top: 0, bottom: 0}
|
|
25
25
|
* direction {enum} (必选)控件方向 HORIZONTAL/VERTICAL
|
|
26
|
-
*
|
|
26
|
+
* focusMoveType {int} 焦点移动的模式, 可通过 | 运算进行组合
|
|
27
|
+
NO_ADJUST: 无特殊处理
|
|
28
|
+
COLUMN_LOOP: 到达列首/尾后跳转到上/下一列, 只在水平滚动时生效
|
|
29
|
+
ROW_LOOP: 到达行首/尾后跳转到上/下一行, 只在竖直滚动时生效
|
|
30
|
+
COLUMN_FIND_NEAR: 一列中没有下一个元素时是否跳转到相邻列
|
|
31
|
+
ROW_FIND_NEAR: 一行中没有下一个元素时是否跳转到相邻行
|
|
32
|
+
|
|
27
33
|
* initFocusId {int} 初始焦点,默认为0
|
|
28
34
|
* slideSetting {SlideSetting} 页面滑动的设置, 目前SlideSetting有三个子类, 具体见 WidgetCommon 中的说明
|
|
29
35
|
WholePageSlide
|
|
@@ -52,15 +58,16 @@
|
|
|
52
58
|
* @params item {object} data中的数据
|
|
53
59
|
* @return 模板信息,
|
|
54
60
|
{
|
|
55
|
-
left: 绝对布局时的left,
|
|
56
|
-
top: 绝对布局时的top,
|
|
57
|
-
width: item的宽,
|
|
58
|
-
height: item的高,
|
|
59
|
-
focusable: item是否可以获得焦点,
|
|
60
|
-
marginBottom: item的下方margin,
|
|
61
|
-
marginRight: item的右方margin,
|
|
62
|
-
findNextAnchor: 自定义上下左右四条边寻找临近item的基准位置,值为0-1 {left: 0.5, right: 0.5, top: 0.5, bottom: 0.5}
|
|
63
|
-
doSlide: item获得焦点时是否滚动, 一般用于嵌套的情景,
|
|
61
|
+
left {int}: 绝对布局时的left,
|
|
62
|
+
top {int}: 绝对布局时的top,
|
|
63
|
+
width {int}: item的宽,
|
|
64
|
+
height {int}: item的高,
|
|
65
|
+
focusable {boolean}: item是否可以获得焦点,
|
|
66
|
+
marginBottom {int}: item的下方margin,
|
|
67
|
+
marginRight {int}: item的右方margin,
|
|
68
|
+
findNextAnchor {object}: 自定义上下左右四条边寻找临近item的基准位置,值为0-1 {left: 0.5, right: 0.5, top: 0.5, bottom: 0.5}
|
|
69
|
+
doSlide {boolean}: item获得焦点时是否滚动, 一般用于嵌套的情景, 由内部组件控制滚动,
|
|
70
|
+
zIndex {int | object}: item的zIndex, 为object时可以分别设置{focus: 0, normal: 0}, 为number时则同时设置获焦和不获焦的zIndex
|
|
64
71
|
}
|
|
65
72
|
*
|
|
66
73
|
* onFocus {function} 控件获取焦点的回调
|
|
@@ -79,6 +86,7 @@
|
|
|
79
86
|
* loadAll {boolean} 加载不显示的view,触控场景使用
|
|
80
87
|
* flingPageWidth {}
|
|
81
88
|
* flingPageEdge {}
|
|
89
|
+
* disableClip {boolean} 取消显示范围的clipView
|
|
82
90
|
* methods:
|
|
83
91
|
getFocusBlockRef 获取此MetroWidget的 jsv-focus-block句柄,可以使用requestFocus完成获焦
|
|
84
92
|
|
|
@@ -110,9 +118,25 @@
|
|
|
110
118
|
@params {int} id 焦点id
|
|
111
119
|
@params {boolean} needSlide 是否需要滚动
|
|
112
120
|
@params {boolean} doAnim 滚动时是否做动画
|
|
121
|
+
@params {object} extraSetting 额外的参数设置
|
|
122
|
+
{
|
|
123
|
+
lockChildSlideEvent: {boolean} 设置焦点时忽略子发过来的滚动事件
|
|
124
|
+
}
|
|
113
125
|
refreshData
|
|
114
126
|
@description 刷新数据, 只有存在provideData时才会生效
|
|
115
127
|
@params {boolean} forceUpdate 是否强制刷新
|
|
128
|
+
getVisibleItems
|
|
129
|
+
@description 获取可视item的列表信息
|
|
130
|
+
@return {start: 开始的index, end: 结束的index, dataList: 可视item的数据列表}
|
|
131
|
+
lock
|
|
132
|
+
@description 设置内部的锁
|
|
133
|
+
@params {int} type 锁的类型, 通过|来实现多个类型的复合
|
|
134
|
+
SLIDE: 滚动动画锁
|
|
135
|
+
CHILD_SLIDE_EVENT: 子组件发送的滚动事件锁
|
|
136
|
+
@return {function} 解锁的函数
|
|
137
|
+
unlock
|
|
138
|
+
@description 解锁
|
|
139
|
+
@params {int} type 参考lock的type参数
|
|
116
140
|
* 【技巧说明】
|
|
117
141
|
* Q: 插槽props如何使用?
|
|
118
142
|
* A: data: 当前item的数据
|
|
@@ -123,8 +147,6 @@
|
|
|
123
147
|
获取 item 相对 MetroWidget 左上角坐标
|
|
124
148
|
templatePosition: {Function} (index : int) => {left: 0, top: 0, width: 0, height: 0}
|
|
125
149
|
获取 item 的布局坐标, 一般用于自定义滚动
|
|
126
|
-
absolutePosition: {Function} (index : int) => {left: 0, top: 0, width: 0, height: 0}
|
|
127
|
-
获取 item 的绝对坐标, 一般用于控制焦点
|
|
128
150
|
getCurrentFocusId: {Function} () => {id: 0, index: 0}
|
|
129
151
|
获取当前焦点信息,id 为在可获得焦点元素列表中的索引,index 为在所有元素列表中的索引
|
|
130
152
|
slideTo: {Function} (targetPosition : int, doAnim : Boolean) => void
|
|
@@ -175,6 +197,7 @@ import { TemplateParser, TemplateItemAdder } from "../TemplateParser";
|
|
|
175
197
|
import { PageUpdater } from "./PageUpdater";
|
|
176
198
|
import { SingleRangeModel } from "../RangeModel";
|
|
177
199
|
import Dispatcher from "./Dispatcher";
|
|
200
|
+
import { METRO_WIDGET } from "./Const";
|
|
178
201
|
import {
|
|
179
202
|
EdgeDirection,
|
|
180
203
|
VERTICAL,
|
|
@@ -381,6 +404,14 @@ const props = defineProps({
|
|
|
381
404
|
onScroll: {
|
|
382
405
|
type: Function,
|
|
383
406
|
},
|
|
407
|
+
focusMoveType: {
|
|
408
|
+
type: Number,
|
|
409
|
+
default: 0,
|
|
410
|
+
},
|
|
411
|
+
disableClip: {
|
|
412
|
+
type: Boolean,
|
|
413
|
+
default: false,
|
|
414
|
+
},
|
|
384
415
|
});
|
|
385
416
|
|
|
386
417
|
let dataUpdateToken = ref(0);
|
|
@@ -407,8 +438,12 @@ let itemRender = ref(!props.enableItemRenderBreak);
|
|
|
407
438
|
let permanentItemList = [];
|
|
408
439
|
let preUpdateVisibleStart = 0;
|
|
409
440
|
let mounted = false;
|
|
410
|
-
let focusNode =
|
|
441
|
+
let focusNode = shallowRef(null);
|
|
411
442
|
let pageRange = vertical ? props.height : props.width;
|
|
443
|
+
|
|
444
|
+
let slideLock = false;
|
|
445
|
+
let childSlideEventLock = false;
|
|
446
|
+
|
|
412
447
|
let visibleInfo = {
|
|
413
448
|
_start: 0,
|
|
414
449
|
range: 0,
|
|
@@ -444,8 +479,8 @@ let visibleInfo = {
|
|
|
444
479
|
},
|
|
445
480
|
};
|
|
446
481
|
|
|
447
|
-
let locateDiv =
|
|
448
|
-
let slideDiv =
|
|
482
|
+
let locateDiv = shallowRef(null);
|
|
483
|
+
let slideDiv = shallowRef(null);
|
|
449
484
|
let renderData = shallowRef([]);
|
|
450
485
|
let slideDivLeft = ref(0);
|
|
451
486
|
let slideDivTop = ref(0);
|
|
@@ -463,7 +498,7 @@ const _onFocusChange = (id) => {
|
|
|
463
498
|
const _getCurrentId = () => {
|
|
464
499
|
return {
|
|
465
500
|
id: focusId,
|
|
466
|
-
index: templateParser.
|
|
501
|
+
index: templateParser.IdToIndex(focusId),
|
|
467
502
|
};
|
|
468
503
|
};
|
|
469
504
|
|
|
@@ -489,10 +524,6 @@ const _getTemplatePosition = (index) => {
|
|
|
489
524
|
};
|
|
490
525
|
};
|
|
491
526
|
|
|
492
|
-
const _getAbsolutePosition = (index, targetEle) => {
|
|
493
|
-
return getPositionRelativeToView(innerData[index].itemDivRef, targetEle);
|
|
494
|
-
};
|
|
495
|
-
|
|
496
527
|
const _dispatchEvent = (event) => {
|
|
497
528
|
switch (event.type) {
|
|
498
529
|
case Dispatcher.Type.setEnterFocusId:
|
|
@@ -539,12 +570,21 @@ const onItemFocus = (index, rect) => {
|
|
|
539
570
|
}
|
|
540
571
|
};
|
|
541
572
|
|
|
542
|
-
const setFocusId = (id, needSlide = true, doAnim = false) => {
|
|
573
|
+
const setFocusId = (id, needSlide = true, doAnim = false, extraSetting) => {
|
|
574
|
+
if (id == focusId) {
|
|
575
|
+
return;
|
|
576
|
+
}
|
|
543
577
|
templateItemAdder.tryAddItemById(id);
|
|
544
578
|
let next_focus_item = templateParser.GetItemById(id);
|
|
545
579
|
if (next_focus_item) {
|
|
546
580
|
if (needSlide) {
|
|
547
|
-
slideToItem(templateParser.
|
|
581
|
+
slideToItem(templateParser.IdToIndex(id), doAnim);
|
|
582
|
+
}
|
|
583
|
+
let unlock = null;
|
|
584
|
+
if (extraSetting) {
|
|
585
|
+
if (extraSetting.lockChildSlideEvent) {
|
|
586
|
+
unlock = lock(METRO_WIDGET.CHILD_SLIDE_EVENT);
|
|
587
|
+
}
|
|
548
588
|
}
|
|
549
589
|
|
|
550
590
|
const cur_focus_item = templateParser.GetItemById(focusId);
|
|
@@ -564,8 +604,39 @@ const setFocusId = (id, needSlide = true, doAnim = false) => {
|
|
|
564
604
|
};
|
|
565
605
|
_updateBlurItem();
|
|
566
606
|
_updateFocusItem();
|
|
567
|
-
onItemBlur(templateParser.
|
|
568
|
-
onItemFocus(templateParser.
|
|
607
|
+
onItemBlur(templateParser.IdToIndex(preFocusId));
|
|
608
|
+
onItemFocus(templateParser.IdToIndex(focusId), preEdgeRect);
|
|
609
|
+
unlock?.();
|
|
610
|
+
}
|
|
611
|
+
};
|
|
612
|
+
|
|
613
|
+
const lock = (type) => {
|
|
614
|
+
const unlocker = [];
|
|
615
|
+
if (type & METRO_WIDGET.SLIDE) {
|
|
616
|
+
slideLock = true;
|
|
617
|
+
unlocker.push(() => {
|
|
618
|
+
slideLock = false;
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
if (type & METRO_WIDGET.CHILD_SLIDE_EVENT) {
|
|
622
|
+
childSlideEventLock = true;
|
|
623
|
+
unlocker.push(() => {
|
|
624
|
+
childSlideEventLock = false;
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
return () => {
|
|
628
|
+
unlocker.map((item) => {
|
|
629
|
+
item();
|
|
630
|
+
});
|
|
631
|
+
};
|
|
632
|
+
};
|
|
633
|
+
|
|
634
|
+
const unlock = (type) => {
|
|
635
|
+
if (type & METRO_WIDGET.SLIDE) {
|
|
636
|
+
slideLock = true;
|
|
637
|
+
}
|
|
638
|
+
if (type & METRO_WIDGET.CHILD_SLIDE_EVENT) {
|
|
639
|
+
childSlideEventLock = true;
|
|
569
640
|
}
|
|
570
641
|
};
|
|
571
642
|
|
|
@@ -693,7 +764,8 @@ const refreshData = (force_update) => {
|
|
|
693
764
|
dataList,
|
|
694
765
|
props.measures,
|
|
695
766
|
pageRange,
|
|
696
|
-
_onTemplateAdd
|
|
767
|
+
_onTemplateAdd,
|
|
768
|
+
props.name
|
|
697
769
|
);
|
|
698
770
|
}
|
|
699
771
|
if (need_update_content) {
|
|
@@ -740,7 +812,7 @@ const refreshData = (force_update) => {
|
|
|
740
812
|
dataUpdateToken.value++;
|
|
741
813
|
pageUpdater.apply();
|
|
742
814
|
_updateFocusItem();
|
|
743
|
-
onItemFocus(templateParser.
|
|
815
|
+
onItemFocus(templateParser.IdToIndex(focusId), null);
|
|
744
816
|
if (needSlide) {
|
|
745
817
|
_slideTo(visibleInfo.start, null);
|
|
746
818
|
} else if (need_update_content) {
|
|
@@ -748,7 +820,24 @@ const refreshData = (force_update) => {
|
|
|
748
820
|
}
|
|
749
821
|
};
|
|
750
822
|
|
|
823
|
+
const getVisibleItems = () => {
|
|
824
|
+
const info = templateParser.GetVisibleItemList(
|
|
825
|
+
visibleInfo.startWithPadding,
|
|
826
|
+
visibleInfo.endWithPadding,
|
|
827
|
+
focusId,
|
|
828
|
+
false,
|
|
829
|
+
null
|
|
830
|
+
);
|
|
831
|
+
return {
|
|
832
|
+
start: info.visibleStart,
|
|
833
|
+
end: info.visibleEnd,
|
|
834
|
+
dataList: dataList.slice(info.visibleStart, info.visibleEnd + 1),
|
|
835
|
+
};
|
|
836
|
+
};
|
|
837
|
+
|
|
751
838
|
const exportObject = {
|
|
839
|
+
lock,
|
|
840
|
+
unlock,
|
|
752
841
|
slideTo,
|
|
753
842
|
setFocusId,
|
|
754
843
|
getFocusBlockRef,
|
|
@@ -757,7 +846,7 @@ const exportObject = {
|
|
|
757
846
|
slideToItem,
|
|
758
847
|
refreshData,
|
|
759
848
|
_dispatchEvent,
|
|
760
|
-
|
|
849
|
+
getVisibleItems,
|
|
761
850
|
};
|
|
762
851
|
|
|
763
852
|
const _calculateNearestItemByRect = (visible_range, enter_rect_info) => {
|
|
@@ -979,7 +1068,7 @@ const onKeyDown = (ev) => {
|
|
|
979
1068
|
_moveToNext(horizontal_direction, vertical_direction);
|
|
980
1069
|
break;
|
|
981
1070
|
case 13:
|
|
982
|
-
onItemClick(templateParser.
|
|
1071
|
+
onItemClick(templateParser.IdToIndex(focusId));
|
|
983
1072
|
break;
|
|
984
1073
|
default:
|
|
985
1074
|
//只接受上下左右确定键
|
|
@@ -1001,7 +1090,7 @@ const _onTemplateAdd = (item) => {
|
|
|
1001
1090
|
data: item,
|
|
1002
1091
|
index: innerData.length,
|
|
1003
1092
|
controller: reactive({
|
|
1004
|
-
zIndex: 0,
|
|
1093
|
+
zIndex: item.normalZIndex >= 0 ? item.normalZIndex : 0,
|
|
1005
1094
|
}),
|
|
1006
1095
|
mounted: false,
|
|
1007
1096
|
itemDivRef: null,
|
|
@@ -1019,7 +1108,7 @@ const _onTemplateAdd = (item) => {
|
|
|
1019
1108
|
this.slotMounted.value = true;
|
|
1020
1109
|
if (callFocusAfterUpdate && this.data.id === focusId) {
|
|
1021
1110
|
nextTick(() => {
|
|
1022
|
-
onItemFocus(templateParser.
|
|
1111
|
+
onItemFocus(templateParser.IdToIndex(focusId), preEdgeRect);
|
|
1023
1112
|
});
|
|
1024
1113
|
callFocusAfterUpdate = false;
|
|
1025
1114
|
}
|
|
@@ -1059,7 +1148,6 @@ const _onTemplateAdd = (item) => {
|
|
|
1059
1148
|
index: item.index,
|
|
1060
1149
|
position: _getPosition,
|
|
1061
1150
|
templatePosition: _getTemplatePosition,
|
|
1062
|
-
absolutePosition: _getAbsolutePosition,
|
|
1063
1151
|
getCurrentFocusId: _getCurrentId,
|
|
1064
1152
|
slideTo: slideTo,
|
|
1065
1153
|
},
|
|
@@ -1094,6 +1182,9 @@ const _itemOnFocusSideEffect = (item, edgeRect) => {
|
|
|
1094
1182
|
|
|
1095
1183
|
const _onCustomerEvent = (ev) => {
|
|
1096
1184
|
if (ev.type === "focusRect") {
|
|
1185
|
+
if (childSlideEventLock) {
|
|
1186
|
+
return true;
|
|
1187
|
+
}
|
|
1097
1188
|
if (ev.ownerNode == exportObject) {
|
|
1098
1189
|
return false;
|
|
1099
1190
|
}
|
|
@@ -1122,7 +1213,9 @@ const _onCustomerEvent = (ev) => {
|
|
|
1122
1213
|
yPos: item_layout.top,
|
|
1123
1214
|
width: item_layout.width,
|
|
1124
1215
|
height: item_layout.height,
|
|
1125
|
-
|
|
1216
|
+
centerYPos: Math.floor(item_layout.top + item_layout.height / 2),
|
|
1217
|
+
centerXPos: Math.floor(item_layout.left + item_layout.width / 2),
|
|
1218
|
+
index: templateParser.IdToIndex(focusId),
|
|
1126
1219
|
};
|
|
1127
1220
|
|
|
1128
1221
|
let cur_slide = _calculateVisibleStart(obj, direction);
|
|
@@ -1168,15 +1261,14 @@ const _moveToNext = (
|
|
|
1168
1261
|
item_edge_rect
|
|
1169
1262
|
) => {
|
|
1170
1263
|
let cur_focus_item = templateParser.GetItemById(focusId);
|
|
1171
|
-
let
|
|
1264
|
+
let next_focus_item = templateParser.GetNextItem(
|
|
1172
1265
|
focusId,
|
|
1173
1266
|
vertical_direction,
|
|
1174
1267
|
horizontal_direction,
|
|
1175
|
-
props.
|
|
1268
|
+
props.focusMoveType
|
|
1176
1269
|
);
|
|
1177
|
-
if (
|
|
1270
|
+
if (next_focus_item !== null) {
|
|
1178
1271
|
preFocusId = focusId;
|
|
1179
|
-
let next_focus_item = templateParser.GetItemById(next_item_id);
|
|
1180
1272
|
templateItemAdder.tryAddItem(next_focus_item, 1);
|
|
1181
1273
|
focusId = next_focus_item.id;
|
|
1182
1274
|
|
|
@@ -1185,8 +1277,7 @@ const _moveToNext = (
|
|
|
1185
1277
|
|
|
1186
1278
|
let cur_visible_start = _calculateVisibleStart(next_focus_item, direction);
|
|
1187
1279
|
if (
|
|
1188
|
-
!innerData[templateParser.
|
|
1189
|
-
?.takeOverSlide &&
|
|
1280
|
+
!innerData[templateParser.IdToIndex(focusId)].itemConfig?.takeOverSlide &&
|
|
1190
1281
|
visibleInfo.start !== cur_visible_start
|
|
1191
1282
|
) {
|
|
1192
1283
|
if (next_focus_item.doSlide) {
|
|
@@ -1198,21 +1289,31 @@ const _moveToNext = (
|
|
|
1198
1289
|
onend: _onSlideEnd,
|
|
1199
1290
|
};
|
|
1200
1291
|
_slideTo(visibleInfo.start, animObj);
|
|
1292
|
+
pageUpdater.update(
|
|
1293
|
+
templateParser,
|
|
1294
|
+
visibleInfo.startWithPadding - props.keepTraceRange * pageRange,
|
|
1295
|
+
Math.min(
|
|
1296
|
+
visibleInfo.startMax +
|
|
1297
|
+
visibleInfo.range +
|
|
1298
|
+
visibleInfo.padding.end -
|
|
1299
|
+
1,
|
|
1300
|
+
visibleInfo.endWithPadding + props.keepTraceRange * pageRange
|
|
1301
|
+
),
|
|
1302
|
+
next_focus_item.id,
|
|
1303
|
+
false,
|
|
1304
|
+
permanentItemList
|
|
1305
|
+
);
|
|
1306
|
+
} else {
|
|
1307
|
+
//不做滚动时,保证获焦的item创建
|
|
1308
|
+
pageUpdater.update(
|
|
1309
|
+
templateParser,
|
|
1310
|
+
cur_visible_start,
|
|
1311
|
+
cur_visible_start + visibleInfo.range + visibleInfo.padding.end - 1,
|
|
1312
|
+
next_focus_item.id,
|
|
1313
|
+
false,
|
|
1314
|
+
permanentItemList
|
|
1315
|
+
);
|
|
1201
1316
|
}
|
|
1202
|
-
pageUpdater.update(
|
|
1203
|
-
templateParser,
|
|
1204
|
-
visibleInfo.startWithPadding - props.keepTraceRange * pageRange,
|
|
1205
|
-
Math.min(
|
|
1206
|
-
visibleInfo.startMax +
|
|
1207
|
-
visibleInfo.range +
|
|
1208
|
-
visibleInfo.padding.end -
|
|
1209
|
-
1,
|
|
1210
|
-
visibleInfo.endWithPadding + props.keepTraceRange * pageRange
|
|
1211
|
-
),
|
|
1212
|
-
next_item_id,
|
|
1213
|
-
false,
|
|
1214
|
-
permanentItemList
|
|
1215
|
-
);
|
|
1216
1317
|
pageUpdater.applyTmp();
|
|
1217
1318
|
}
|
|
1218
1319
|
|
|
@@ -1247,8 +1348,8 @@ const _moveToNext = (
|
|
|
1247
1348
|
preEdgeRect = rect;
|
|
1248
1349
|
_updateBlurItem();
|
|
1249
1350
|
_updateFocusItem();
|
|
1250
|
-
onItemBlur(templateParser.
|
|
1251
|
-
onItemFocus(templateParser.
|
|
1351
|
+
onItemBlur(templateParser.IdToIndex(preFocusId));
|
|
1352
|
+
onItemFocus(templateParser.IdToIndex(focusId), preEdgeRect);
|
|
1252
1353
|
} else {
|
|
1253
1354
|
let x_off_set = props.direction === VERTICAL ? 0 : visibleInfo.start;
|
|
1254
1355
|
let y_off_set = props.direction === VERTICAL ? visibleInfo.start : 0;
|
|
@@ -1272,7 +1373,7 @@ const _moveToNext = (
|
|
|
1272
1373
|
height: cur_focus_item.height,
|
|
1273
1374
|
};
|
|
1274
1375
|
props.onEdge?.({ direction: edge, rect: rect });
|
|
1275
|
-
innerData[templateParser.
|
|
1376
|
+
innerData[templateParser.IdToIndex(focusId)].callbacks.onWidgetEdge?.({
|
|
1276
1377
|
direction: edge,
|
|
1277
1378
|
});
|
|
1278
1379
|
}
|
|
@@ -1298,45 +1399,63 @@ const _calculateVisibleStart = (target_item, direction) => {
|
|
|
1298
1399
|
);
|
|
1299
1400
|
break;
|
|
1300
1401
|
case SlideSetting.Type.WHOLE_PAGE:
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1402
|
+
if (typeof target_item.pageHeadIndex == "undefined") {
|
|
1403
|
+
//TODO 子控制滚动时whole page滚动
|
|
1404
|
+
console.error(
|
|
1405
|
+
"child controlled whole page slide type is not supported."
|
|
1406
|
+
);
|
|
1407
|
+
} else {
|
|
1408
|
+
new_visible_start = templateParser.GetItem(target_item.pageHeadIndex)[
|
|
1409
|
+
pos_key
|
|
1410
|
+
];
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1304
1413
|
break;
|
|
1305
1414
|
case SlideSetting.Type.SEAMLESS:
|
|
1306
|
-
if (
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
target_item[size_key] -
|
|
1314
|
-
visibleInfo.range * props.slideSetting.EndPercent;
|
|
1315
|
-
}
|
|
1316
|
-
} else if (direction < 0) {
|
|
1317
|
-
if (
|
|
1318
|
-
target_item[pos_key] <
|
|
1319
|
-
visibleInfo.start +
|
|
1320
|
-
visibleInfo.range * props.slideSetting.StartPercent
|
|
1321
|
-
) {
|
|
1322
|
-
new_visible_start =
|
|
1323
|
-
target_item[pos_key] -
|
|
1324
|
-
visibleInfo.range * props.slideSetting.StartPercent;
|
|
1325
|
-
}
|
|
1415
|
+
if (
|
|
1416
|
+
target_item[size_key] >=
|
|
1417
|
+
visibleInfo.range *
|
|
1418
|
+
(props.slideSetting.EndPercent - props.slideSetting.StartPercent)
|
|
1419
|
+
) {
|
|
1420
|
+
//尺寸较大的item
|
|
1421
|
+
new_visible_start = target_item[center_key] - visibleInfo.range * 0.5;
|
|
1326
1422
|
} else {
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1423
|
+
if (direction > 0) {
|
|
1424
|
+
if (
|
|
1425
|
+
target_item[pos_key] + target_item[size_key] >
|
|
1426
|
+
visibleInfo.start +
|
|
1427
|
+
visibleInfo.range * props.slideSetting.EndPercent
|
|
1428
|
+
) {
|
|
1429
|
+
new_visible_start =
|
|
1430
|
+
target_item[pos_key] +
|
|
1431
|
+
target_item[size_key] -
|
|
1432
|
+
visibleInfo.range * props.slideSetting.EndPercent;
|
|
1433
|
+
}
|
|
1434
|
+
} else if (direction < 0) {
|
|
1435
|
+
if (
|
|
1436
|
+
target_item[pos_key] <
|
|
1437
|
+
visibleInfo.start +
|
|
1438
|
+
visibleInfo.range * props.slideSetting.StartPercent
|
|
1439
|
+
) {
|
|
1440
|
+
new_visible_start =
|
|
1441
|
+
target_item[pos_key] -
|
|
1442
|
+
visibleInfo.range * props.slideSetting.StartPercent;
|
|
1443
|
+
}
|
|
1444
|
+
} else {
|
|
1445
|
+
//不是沿widget方向的移动
|
|
1446
|
+
if (target_item[pos_key] < visibleInfo.start) {
|
|
1447
|
+
new_visible_start =
|
|
1448
|
+
target_item[pos_key] -
|
|
1449
|
+
visibleInfo.range * props.slideSetting.StartPercent;
|
|
1450
|
+
} else if (
|
|
1451
|
+
target_item[pos_key] + target_item[size_key] >
|
|
1452
|
+
visibleInfo.end
|
|
1453
|
+
) {
|
|
1454
|
+
new_visible_start =
|
|
1455
|
+
target_item[pos_key] +
|
|
1456
|
+
target_item[size_key] -
|
|
1457
|
+
visibleInfo.range * props.slideSetting.EndPercent;
|
|
1458
|
+
}
|
|
1340
1459
|
}
|
|
1341
1460
|
}
|
|
1342
1461
|
break;
|
|
@@ -1403,9 +1522,16 @@ const _ifValidEnterRect = (rect_info) => {
|
|
|
1403
1522
|
return rect_info && rect_info.direction && rect_info.rect;
|
|
1404
1523
|
};
|
|
1405
1524
|
|
|
1406
|
-
const _setZIndex = (index, z_index) => {
|
|
1525
|
+
const _setZIndex = (index, z_index, is_focus) => {
|
|
1407
1526
|
if (innerData[index]) {
|
|
1408
|
-
innerData[index].
|
|
1527
|
+
let data = innerData[index].data,
|
|
1528
|
+
i = z_index;
|
|
1529
|
+
if (is_focus && data.focusZIndex >= 0) {
|
|
1530
|
+
i = data.focusZIndex;
|
|
1531
|
+
} else if (data.normalZIndex >= 0) {
|
|
1532
|
+
i = data.normalZIndex;
|
|
1533
|
+
}
|
|
1534
|
+
innerData[index].controller.zIndex = i;
|
|
1409
1535
|
}
|
|
1410
1536
|
};
|
|
1411
1537
|
|
|
@@ -1430,7 +1556,7 @@ const _onFocus = (params) => {
|
|
|
1430
1556
|
enterFocusId = -1;
|
|
1431
1557
|
enterFocusRect = null;
|
|
1432
1558
|
_updateFocusItem();
|
|
1433
|
-
onItemFocus(templateParser.
|
|
1559
|
+
onItemFocus(templateParser.IdToIndex(focusId), preEdgeRect);
|
|
1434
1560
|
props.onFocus?.();
|
|
1435
1561
|
};
|
|
1436
1562
|
|
|
@@ -1444,7 +1570,7 @@ const _onBlur = () => {
|
|
|
1444
1570
|
}
|
|
1445
1571
|
preFocusId = focusId;
|
|
1446
1572
|
_updateBlurItem();
|
|
1447
|
-
innerData[templateParser.
|
|
1573
|
+
innerData[templateParser.IdToIndex(preFocusId)].callbacks.onBlur();
|
|
1448
1574
|
|
|
1449
1575
|
props.onBlur?.();
|
|
1450
1576
|
};
|
|
@@ -1457,11 +1583,11 @@ const _onSlideEnd = (event) => {
|
|
|
1457
1583
|
};
|
|
1458
1584
|
|
|
1459
1585
|
const _updateFocusItem = () => {
|
|
1460
|
-
_setZIndex(templateParser.
|
|
1586
|
+
_setZIndex(templateParser.IdToIndex(focusId), innerData.length, true);
|
|
1461
1587
|
};
|
|
1462
1588
|
|
|
1463
1589
|
const _updateBlurItem = () => {
|
|
1464
|
-
_setZIndex(templateParser.
|
|
1590
|
+
_setZIndex(templateParser.IdToIndex(preFocusId), 0, false);
|
|
1465
1591
|
};
|
|
1466
1592
|
|
|
1467
1593
|
const _updateFocusByDragInfo = (viewX, viewY) => {
|
|
@@ -1607,21 +1733,23 @@ const _onScroll = () => {
|
|
|
1607
1733
|
|
|
1608
1734
|
//之前rootview相关的代码
|
|
1609
1735
|
const _updatePosition = (x, y, anim_info) => {
|
|
1736
|
+
if (slideLock) return;
|
|
1610
1737
|
if (toRaw(slideDiv.value)) {
|
|
1611
|
-
let
|
|
1738
|
+
let pre_left = slideDivLeft.value,
|
|
1739
|
+
pre_top = slideDivTop.value;
|
|
1612
1740
|
//jsvMaskView的位置更新时会被设置位0,因此不能通过ResetLayoutParams设置位置
|
|
1613
1741
|
slideDivLeft.value = x;
|
|
1614
1742
|
slideDivTop.value = y;
|
|
1615
1743
|
if (anim_info) {
|
|
1616
|
-
let delta_x = Math.abs(
|
|
1617
|
-
let delta_y = Math.abs(
|
|
1744
|
+
let delta_x = Math.abs(pre_left - x);
|
|
1745
|
+
let delta_y = Math.abs(pre_top - y);
|
|
1618
1746
|
let duration = Math.round(
|
|
1619
1747
|
delta_x === 0 ? delta_y / anim_info.speed : delta_x / anim_info.speed
|
|
1620
1748
|
);
|
|
1621
1749
|
let slide_animation = new Forge.TranslateAnimation(
|
|
1622
|
-
|
|
1750
|
+
pre_left - x,
|
|
1623
1751
|
0,
|
|
1624
|
-
|
|
1752
|
+
pre_top - y,
|
|
1625
1753
|
0,
|
|
1626
1754
|
duration,
|
|
1627
1755
|
anim_info.easing
|
|
@@ -1629,7 +1757,9 @@ const _updatePosition = (x, y, anim_info) => {
|
|
|
1629
1757
|
slide_animation.SetAnimationListener(
|
|
1630
1758
|
new Forge.AnimationListener(anim_info.onstart, anim_info.onend, null)
|
|
1631
1759
|
);
|
|
1632
|
-
toRaw(slideDiv.value)
|
|
1760
|
+
toRaw(slideDiv.value)
|
|
1761
|
+
.jsvGetProxyView(true)
|
|
1762
|
+
.StartAnimation(slide_animation);
|
|
1633
1763
|
}
|
|
1634
1764
|
_onScroll();
|
|
1635
1765
|
}
|
|
@@ -1637,7 +1767,7 @@ const _updatePosition = (x, y, anim_info) => {
|
|
|
1637
1767
|
|
|
1638
1768
|
const _initRootTouch = () => {
|
|
1639
1769
|
if (props.enableTouch && toRaw(slideDiv.value)) {
|
|
1640
|
-
let view = toRaw(slideDiv.value).
|
|
1770
|
+
let view = toRaw(slideDiv.value).jsvGetProxyView(true);
|
|
1641
1771
|
var drag_setting = new Forge.DragSetting(
|
|
1642
1772
|
dragDirection,
|
|
1643
1773
|
20,
|
|
@@ -1654,7 +1784,7 @@ const _initItemViewTouch = (itemDivRef, index) => {
|
|
|
1654
1784
|
if (props.enableTouch) {
|
|
1655
1785
|
if (itemDivRef) {
|
|
1656
1786
|
// 为view添加触控处理
|
|
1657
|
-
let view = itemDivRef.
|
|
1787
|
+
let view = itemDivRef.jsvGetProxyView(true);
|
|
1658
1788
|
let dragSetting = new Forge.DragSetting(
|
|
1659
1789
|
Forge.DragSetting.DIRECTION_DISABLE,
|
|
1660
1790
|
20,
|
|
@@ -1703,12 +1833,14 @@ templateParser = _getTemplateParser(
|
|
|
1703
1833
|
props.supportHistoryPath,
|
|
1704
1834
|
props.layoutType
|
|
1705
1835
|
);
|
|
1836
|
+
|
|
1706
1837
|
templateItemAdder = new TemplateItemAdder(
|
|
1707
1838
|
templateParser,
|
|
1708
1839
|
dataList,
|
|
1709
1840
|
props.measures,
|
|
1710
1841
|
pageRange,
|
|
1711
|
-
_onTemplateAdd
|
|
1842
|
+
_onTemplateAdd,
|
|
1843
|
+
props.name
|
|
1712
1844
|
);
|
|
1713
1845
|
if (props.onScroll) {
|
|
1714
1846
|
templateItemAdder.tryAddItemByIndex(dataList.length - 1);
|
|
@@ -1740,12 +1872,14 @@ slidePile = new Forge.RectArea(
|
|
|
1740
1872
|
let init_focus_id = 0;
|
|
1741
1873
|
let cur_visible_start = 0;
|
|
1742
1874
|
|
|
1743
|
-
if (props.initFocusId) {
|
|
1875
|
+
if (typeof props.initFocusId == "number") {
|
|
1744
1876
|
templateItemAdder.tryAddItemById(props.initFocusId);
|
|
1745
1877
|
const item = templateParser.GetItemById(props.initFocusId);
|
|
1746
1878
|
if (item) {
|
|
1747
1879
|
init_focus_id = props.initFocusId;
|
|
1748
|
-
|
|
1880
|
+
if (item.doSlide) {
|
|
1881
|
+
cur_visible_start = _calculateVisibleStart(item, 1);
|
|
1882
|
+
}
|
|
1749
1883
|
}
|
|
1750
1884
|
}
|
|
1751
1885
|
focusId = init_focus_id;
|
|
@@ -1776,7 +1910,7 @@ onMounted(() => {
|
|
|
1776
1910
|
_slideTo(visibleInfo.start, null);
|
|
1777
1911
|
}
|
|
1778
1912
|
|
|
1779
|
-
onItemFocus(templateParser.
|
|
1913
|
+
onItemFocus(templateParser.IdToIndex(focusId), preEdgeRect);
|
|
1780
1914
|
|
|
1781
1915
|
if (props.enableItemRenderBreak) {
|
|
1782
1916
|
nextTick(() => {
|
|
@@ -1810,7 +1944,7 @@ defineExpose(exportObject);
|
|
|
1810
1944
|
top: top,
|
|
1811
1945
|
width: width,
|
|
1812
1946
|
height: height,
|
|
1813
|
-
overflow: 'hidden',
|
|
1947
|
+
overflow: disableClip ? null : 'hidden',
|
|
1814
1948
|
}"
|
|
1815
1949
|
>
|
|
1816
1950
|
<div :style="{ left: innerPadding.left, top: innerPadding.top }">
|