@shijiu/jsview-vue 1.9.648 → 1.9.719
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/package.json +7 -18
- package/samples/AnimPicture/App.vue +5 -5
- package/samples/Basic/components/div/DivLayout.vue +1 -1
- package/samples/Basic/components/text/TextOverflow.vue +10 -5
- package/samples/BasicFocusControl/components/BaseBlock.vue +2 -2
- package/samples/Collision/App.vue +452 -0
- package/samples/DemoHomepage/components/BodyFrame.vue +2 -0
- package/samples/DemoHomepage/router.js +21 -1
- package/samples/DemoHomepage/views/Homepage.vue +3 -7
- package/samples/FilterDemo/App.vue +1 -1
- package/samples/FlipCard/App.vue +2 -2
- package/samples/FlipCard/FlipCard.vue +2 -2
- 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 +435 -0
- package/samples/Input/App.vue +8 -17
- package/samples/Input/InputPanel.vue +19 -12
- 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 +3 -3
- 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/PerformanceTest/App.vue +4 -4
- package/samples/MetroWidgetDemos/PerformanceTest/components/ContentItem.vue +1 -1
- package/samples/MetroWidgetDemos/PerformanceTest/components/MyTab.vue +1 -1
- package/samples/MetroWidgetDemos/PingPong/App.vue +3 -3
- package/samples/MetroWidgetDemos/PingPong/AppPage.vue +17 -2
- package/samples/MetroWidgetDemos/PingPong/AppTab.vue +3 -10
- package/samples/MetroWidgetDemos/PingPong/{Item.vue → TabItem.vue} +3 -11
- package/samples/MetroWidgetDemos/PingPong/ViewSwiper.vue +2 -2
- 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 -2
- package/samples/MetroWidgetDemos/data.js +2 -1
- package/samples/NinePatchDemo/App.vue +2 -2
- package/samples/NinePatchDemo/Item.vue +1 -1
- package/samples/Preload/App.vue +17 -12
- 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 +1 -1
- 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 +43 -15
- package/samples/TextureAnimation/assets/light.png +0 -0
- package/samples/TextureAnimation/assets/light2.png +0 -0
- package/samples/TextureSize/App.vue +3 -3
- 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/VisibleSensorDemo/App.vue +94 -27
- package/tsconfig.json +6 -6
- package/utils/JsViewEngineWidget/JsvFocusBlock.vue +55 -59
- package/utils/JsViewEngineWidget/JsvFocusManager.js +1 -1
- package/utils/JsViewEngineWidget/MetroWidget/Const.js +11 -0
- package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +226 -107
- package/utils/JsViewEngineWidget/TemplateParser.js +227 -178
- package/utils/JsViewEngineWidget/WidgetCommon.js +13 -5
- package/utils/JsViewEngineWidget/index.js +3 -2
- package/utils/JsViewPlugin/BrowserPluginLoader.js +1 -1
- package/utils/JsViewPlugin/JsvPlayer/JsvMedia.js +95 -12
- package/utils/JsViewPlugin/JsvPlayer/JsvPlayer.vue +23 -2
- package/utils/JsViewPlugin/JsvPlayer/JsvPlayerBrowser.vue +1 -1
- package/utils/JsViewPlugin/JsvPlayer/index.js +22 -1
- package/utils/JsViewPlugin/JsvPlayer/version.js +4 -4
- package/utils/JsViewVueTools/JsvImpactTracer.js +113 -0
- package/utils/JsViewVueTools/JsvStyleClass.js +1 -1
- package/utils/JsViewVueTools/index.js +2 -1
- package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserPreload.vue +11 -1
- package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserSpray.vue +1 -1
- package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserTextureAnim.vue +7 -9
- package/utils/JsViewVueWidget/JsvActorMove/ActorControlBase.js +1 -1
- package/utils/JsViewVueWidget/JsvActorMove/JsvActorMove.vue +3 -3
- package/utils/JsViewVueWidget/JsvActorMove/JsvActorMoveControl.js +1 -1
- package/utils/JsViewVueWidget/JsvApic/JsvApic.vue +5 -5
- package/utils/JsViewVueWidget/JsvFilterView.vue +1 -1
- package/utils/JsViewVueWidget/JsvGrid.vue +3 -11
- package/utils/JsViewVueWidget/JsvInput/Cursor.vue +5 -3
- package/utils/JsViewVueWidget/JsvInput/JsvInput.vue +15 -14
- package/utils/JsViewVueWidget/JsvMarquee.vue +180 -207
- package/utils/JsViewVueWidget/JsvMaskClipDiv.vue +2 -2
- package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +35 -27
- package/utils/JsViewVueWidget/JsvNinePatch.vue +1 -2
- package/utils/JsViewVueWidget/JsvPreload/JsvPreload.vue +38 -42
- package/utils/JsViewVueWidget/JsvQrcode/JsvQrcode.vue +1 -1
- package/utils/JsViewVueWidget/JsvSpray/JsvSpray.vue +1 -1
- package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +24 -8
- package/utils/JsViewVueWidget/JsvSwiper3D/JsvSwiper.vue +23 -3
- package/utils/JsViewVueWidget/JsvTextBox.vue +20 -86
- package/utils/JsViewVueWidget/JsvTextureAnim/JsvTextureAnim.vue +2 -9
- package/utils/JsViewVueWidget/JsvTouchContainer.vue +6 -7
- package/utils/JsViewVueWidget/JsvTransparentDiv.vue +1 -1
- package/utils/JsViewVueWidget/JsvVisibleSensor/JsvVisibleSensor.vue +6 -6
- package/utils/JsViewVueWidget/index.js +8 -8
- package/utils/JsViewVueWidget/utils/index.js +8 -0
- package/utils/JsViewVueWidget/utils/text.js +19 -0
- package/dom/bin/jsview-browser-debug-dom.min.js +0 -1
- package/dom/bin/jsview-dom.min.js +0 -1
- package/dom/bin/jsview-forge-define.min.js +0 -1
- package/dom/browser-root-style.css +0 -21
- package/dom/jsv-browser-debug-dom.js +0 -8
- package/dom/jsv-dom.js +0 -6
- package/dom/jsv-forge-define.js +0 -6
- package/dom/target_core_revision.mjs +0 -15
- package/loader/header_script_loader.js +0 -134
- package/loader/jsview-main.js +0 -42
- package/loader/jsview.config.default.js +0 -37
- package/loader/jsview.default.config.js +0 -37
- package/loader/loader.js +0 -179
- package/loader/loader_webkit.js +0 -40
- package/patches/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js +0 -17609
- package/patches/node_modules/@vue/compiler-sfc/dist/jsview-css-to-js.js +0 -335
- package/patches/node_modules/@vue/compiler-sfc/dist/jsview-style-format.js +0 -446
- package/patches/node_modules/@vue/compiler-sfc/dist/jsview-style-types.js +0 -91
- package/patches/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js +0 -8038
- package/patches/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js +0 -1700
- package/patches/node_modules/postcss-js/objectifier.js +0 -90
- package/patches/node_modules/vite/dist/node/chunks/dep-0fc8e132.js +0 -63147
- package/patches/node_modules/vite/dist/node/jsview.vite.config.js +0 -50
- package/patches/node_modules/vue-router/dist/vue-router.mjs +0 -3595
- package/scripts/common.js +0 -58
- package/scripts/jsview-install-local-packages.js +0 -73
- package/scripts/jsview-jsmap-serve.js +0 -105
- package/scripts/jsview-post-build.js +0 -183
- package/scripts/jsview-post-install.js +0 -102
- package/scripts/jsview-run-android.js +0 -67
- 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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import Scroll from "./Scroll.vue";
|
|
3
|
-
import { ref, onMounted } from "vue";
|
|
3
|
+
import { ref, shallowRef, onMounted } from "vue";
|
|
4
4
|
import { useFocusHub } from "jsview";
|
|
5
5
|
|
|
6
6
|
const props = defineProps({
|
|
@@ -12,7 +12,7 @@ const props = defineProps({
|
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
const focusHub = useFocusHub();
|
|
15
|
-
const element =
|
|
15
|
+
const element = shallowRef(null);
|
|
16
16
|
const scrollY = ref(0);
|
|
17
17
|
const textY = ref(0);
|
|
18
18
|
const onAction = {
|
package/samples/LongText/App.vue
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
import LongTextScroll from "./LongTextScroll.vue";
|
|
28
28
|
import Button from "./Button.vue";
|
|
29
29
|
import { jJsvRuntimeBridge } from "jsview";
|
|
30
|
-
import { onMounted, ref } from "vue";
|
|
30
|
+
import { onMounted, ref, shallowRef } from "vue";
|
|
31
31
|
import { useRouter } from "vue-router";
|
|
32
32
|
|
|
33
33
|
const router = useRouter();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import Scroll from "./Scroll.vue";
|
|
3
|
-
import { ref, onMounted } from "vue";
|
|
3
|
+
import { ref, shallowRef, onMounted } from "vue";
|
|
4
4
|
|
|
5
5
|
const props = defineProps({
|
|
6
6
|
step: Number,
|
|
@@ -10,8 +10,8 @@ const props = defineProps({
|
|
|
10
10
|
textStyle: Object,
|
|
11
11
|
});
|
|
12
12
|
|
|
13
|
-
const rootRef =
|
|
14
|
-
const element =
|
|
13
|
+
const rootRef = shallowRef(null);
|
|
14
|
+
const element = shallowRef(null);
|
|
15
15
|
const scrollY = ref(0);
|
|
16
16
|
const textY = ref(0);
|
|
17
17
|
|
package/samples/Marquee/App.vue
CHANGED
|
@@ -2,23 +2,31 @@
|
|
|
2
2
|
* @Author: ChenChanghua
|
|
3
3
|
* @Date: 2022-01-18 18:24:18
|
|
4
4
|
* @LastEditors: ChenChanghua
|
|
5
|
-
* @LastEditTime: 2022-
|
|
5
|
+
* @LastEditTime: 2022-11-10 15:29:12
|
|
6
6
|
* @Description: file content
|
|
7
7
|
-->
|
|
8
8
|
<script setup>
|
|
9
9
|
import { jJsvRuntimeBridge, JsvMarquee } from "jsview";
|
|
10
10
|
import { useRouter } from "vue-router";
|
|
11
11
|
import { onMounted } from "vue";
|
|
12
|
+
import { longLongText, rtlLongLongText } from "./longText";
|
|
12
13
|
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
const slideSpeed = 240;
|
|
15
|
+
const width = 600,
|
|
16
|
+
height = 70;
|
|
17
|
+
const style = {
|
|
18
|
+
width,
|
|
19
|
+
height,
|
|
20
|
+
lineHeight: 70,
|
|
17
21
|
fontSize: 50,
|
|
22
|
+
color: "#000000",
|
|
18
23
|
};
|
|
19
24
|
const longText =
|
|
20
25
|
"石室诗士施氏,嗜狮,誓食十狮。施氏时时适市视狮。十时,适十狮适市。是时,适施氏适市。施氏视是十狮,恃矢势,使是十狮逝世。氏拾是十狮尸,适石室。石室湿,氏使侍拭石室。石室拭,施氏始试食是十狮尸。食时,始识是十狮尸,实十石狮尸。试释是事。";
|
|
21
26
|
const shortText = "测试文字";
|
|
27
|
+
|
|
28
|
+
const rtlText = 'ABC انجليزي "abc" سعر الملابس 180 ';
|
|
29
|
+
|
|
22
30
|
const router = useRouter();
|
|
23
31
|
|
|
24
32
|
const _onKeyDown = (ev) => {
|
|
@@ -37,6 +45,11 @@ onMounted(() => {
|
|
|
37
45
|
:onAction="{
|
|
38
46
|
onKeyDown: _onKeyDown,
|
|
39
47
|
}"
|
|
48
|
+
:style="{
|
|
49
|
+
width: 1920,
|
|
50
|
+
height: 1080,
|
|
51
|
+
backgroundColor: '#007788',
|
|
52
|
+
}"
|
|
40
53
|
>
|
|
41
54
|
<div
|
|
42
55
|
:style="{
|
|
@@ -44,68 +57,191 @@ onMounted(() => {
|
|
|
44
57
|
top: 50,
|
|
45
58
|
width: width,
|
|
46
59
|
height: height,
|
|
47
|
-
backgroundColor: '#
|
|
60
|
+
backgroundColor: '#FFFFFF',
|
|
48
61
|
}"
|
|
49
62
|
>
|
|
50
63
|
<jsv-marquee
|
|
51
|
-
:
|
|
52
|
-
width: width,
|
|
53
|
-
height: height,
|
|
54
|
-
}"
|
|
55
|
-
:fontStyles="fontStyle"
|
|
64
|
+
:style="style"
|
|
56
65
|
:text="longText"
|
|
57
|
-
:slideSpeed="
|
|
66
|
+
:slideSpeed="slideSpeed"
|
|
58
67
|
:forceSlide="false"
|
|
59
68
|
/>
|
|
69
|
+
<div :style="{
|
|
70
|
+
left: width + 20,
|
|
71
|
+
height: height,
|
|
72
|
+
color: '#ffffff',
|
|
73
|
+
fontSize: 50,
|
|
74
|
+
lineHeight: 50,
|
|
75
|
+
}">
|
|
76
|
+
长文字滚动
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
<div
|
|
80
|
+
:style="{
|
|
81
|
+
left: 50,
|
|
82
|
+
top: 130,
|
|
83
|
+
width: width,
|
|
84
|
+
height: height,
|
|
85
|
+
backgroundColor: '#FFFFFF',
|
|
86
|
+
}"
|
|
87
|
+
>
|
|
88
|
+
<jsv-marquee :style="style" :text="shortText" :forceSlide="false" />
|
|
89
|
+
<div :style="{
|
|
90
|
+
left: width + 20,
|
|
91
|
+
height: height,
|
|
92
|
+
color: '#ffffff',
|
|
93
|
+
fontSize: 50,
|
|
94
|
+
lineHeight: 50,
|
|
95
|
+
}">
|
|
96
|
+
短文字不滚动
|
|
97
|
+
</div>
|
|
60
98
|
</div>
|
|
61
99
|
<div
|
|
62
100
|
:style="{
|
|
63
101
|
left: 50,
|
|
64
|
-
top:
|
|
102
|
+
top: 210,
|
|
65
103
|
width: width,
|
|
66
104
|
height: height,
|
|
67
|
-
backgroundColor: '#
|
|
105
|
+
backgroundColor: '#FFFFFF',
|
|
68
106
|
}"
|
|
69
107
|
>
|
|
70
108
|
<jsv-marquee
|
|
71
|
-
:
|
|
72
|
-
width: width,
|
|
73
|
-
height: height,
|
|
74
|
-
}"
|
|
75
|
-
:fontStyles="fontStyle"
|
|
109
|
+
:style="style"
|
|
76
110
|
:text="shortText"
|
|
77
|
-
:
|
|
111
|
+
:slideSpeed="slideSpeed"
|
|
112
|
+
:forceSlide="true"
|
|
78
113
|
/>
|
|
114
|
+
<div :style="{
|
|
115
|
+
left: width + 20,
|
|
116
|
+
height: height,
|
|
117
|
+
color: '#ffffff',
|
|
118
|
+
fontSize: 50,
|
|
119
|
+
lineHeight: 50,
|
|
120
|
+
}">
|
|
121
|
+
短文字滚动
|
|
122
|
+
</div>
|
|
79
123
|
</div>
|
|
80
124
|
<div
|
|
81
125
|
:style="{
|
|
82
126
|
left: 50,
|
|
83
|
-
top:
|
|
127
|
+
top: 290,
|
|
84
128
|
width: width,
|
|
85
129
|
height: height,
|
|
86
|
-
backgroundColor: '#
|
|
130
|
+
backgroundColor: '#FFFFFF',
|
|
87
131
|
}"
|
|
88
132
|
>
|
|
89
133
|
<jsv-marquee
|
|
90
|
-
:
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
134
|
+
:style="{
|
|
135
|
+
width,
|
|
136
|
+
height,
|
|
137
|
+
lineHeight: 70,
|
|
138
|
+
fontSize: 50,
|
|
139
|
+
color: '#000000',
|
|
140
|
+
direction: 'rtl',
|
|
141
|
+
}"
|
|
142
|
+
:text="rtlText"
|
|
143
|
+
:slideSpeed="slideSpeed"
|
|
144
|
+
/>
|
|
145
|
+
<div :style="{
|
|
146
|
+
left: width + 20,
|
|
147
|
+
height: height,
|
|
148
|
+
color: '#ffffff',
|
|
149
|
+
fontSize: 50,
|
|
150
|
+
lineHeight: 50,
|
|
151
|
+
}">
|
|
152
|
+
rtl文字
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
<div
|
|
156
|
+
:style="{
|
|
157
|
+
left: 50,
|
|
158
|
+
top: 370,
|
|
159
|
+
width: width,
|
|
160
|
+
height: height,
|
|
161
|
+
backgroundColor: '#FFFFFF',
|
|
162
|
+
}"
|
|
163
|
+
>
|
|
164
|
+
<jsv-marquee
|
|
165
|
+
:style="{
|
|
166
|
+
width,
|
|
167
|
+
height,
|
|
168
|
+
lineHeight: 70,
|
|
169
|
+
fontSize: 50,
|
|
170
|
+
color: '#000000',
|
|
171
|
+
direction: 'rtl',
|
|
172
|
+
}"
|
|
173
|
+
text="انجليزي"
|
|
174
|
+
:slideSpeed="slideSpeed"
|
|
98
175
|
:forceSlide="true"
|
|
99
|
-
className="test-font"
|
|
100
176
|
/>
|
|
177
|
+
<div :style="{
|
|
178
|
+
left: width + 20,
|
|
179
|
+
height: height,
|
|
180
|
+
color: '#ffffff',
|
|
181
|
+
fontSize: 50,
|
|
182
|
+
lineHeight: 50,
|
|
183
|
+
}">
|
|
184
|
+
rtl短文字滚动
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
<div
|
|
189
|
+
:style="{
|
|
190
|
+
left: 50,
|
|
191
|
+
top: 450,
|
|
192
|
+
width: width,
|
|
193
|
+
height: height,
|
|
194
|
+
backgroundColor: '#FFFFFF',
|
|
195
|
+
}"
|
|
196
|
+
>
|
|
197
|
+
<jsv-marquee
|
|
198
|
+
:style="style"
|
|
199
|
+
:text="longLongText"
|
|
200
|
+
:slideSpeed="2000"
|
|
201
|
+
:forceSlide="false"
|
|
202
|
+
/>
|
|
203
|
+
<div :style="{
|
|
204
|
+
left: width + 20,
|
|
205
|
+
height: height,
|
|
206
|
+
color: '#ffffff',
|
|
207
|
+
fontSize: 50,
|
|
208
|
+
lineHeight: 50,
|
|
209
|
+
}">
|
|
210
|
+
超长文字
|
|
211
|
+
</div>
|
|
101
212
|
</div>
|
|
102
|
-
</jsv-focus-block>
|
|
103
|
-
</template>
|
|
104
213
|
|
|
105
|
-
<
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
214
|
+
<div
|
|
215
|
+
:style="{
|
|
216
|
+
left: 50,
|
|
217
|
+
top: 530,
|
|
218
|
+
width: width,
|
|
219
|
+
height: height,
|
|
220
|
+
backgroundColor: '#FFFFFF',
|
|
221
|
+
}"
|
|
222
|
+
>
|
|
223
|
+
<jsv-marquee
|
|
224
|
+
:style="{
|
|
225
|
+
width,
|
|
226
|
+
height,
|
|
227
|
+
lineHeight: 70,
|
|
228
|
+
fontSize: 50,
|
|
229
|
+
color: '#000000',
|
|
230
|
+
direction: 'rtl',
|
|
231
|
+
}"
|
|
232
|
+
:text="rtlLongLongText"
|
|
233
|
+
:slideSpeed="2000"
|
|
234
|
+
:forceSlide="false"
|
|
235
|
+
/>
|
|
236
|
+
<div :style="{
|
|
237
|
+
left: width + 20,
|
|
238
|
+
height: height,
|
|
239
|
+
color: '#ffffff',
|
|
240
|
+
fontSize: 50,
|
|
241
|
+
lineHeight: 50,
|
|
242
|
+
}">
|
|
243
|
+
超长rtl文字
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
</jsv-focus-block>
|
|
247
|
+
</template>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @Author: ChenChanghua
|
|
3
|
+
* @Date: 2022-11-10 15:08:28
|
|
4
|
+
* @LastEditors: ChenChanghua
|
|
5
|
+
* @LastEditTime: 2022-11-21 17:47:57
|
|
6
|
+
* @Description: file content
|
|
7
|
+
*/
|
|
8
|
+
const longLongText =
|
|
9
|
+
"艾因小萌班用户服务协议及隐私权保护政策特别提示:欢迎您使用“艾因小萌班”。本用户服务协议及隐私权保护政策(下称“本协议”)是您与运营方之间订立的具有法律效力的合同。请您仔细阅读并充分理解本协议各条款内容,特别是涉及免除或者限制责任的条款、权利许可和信息使用的条款、同意开通和使用特殊单项服务的条款、法律适用和争议解决条款等。其中,免除或者限制责任条款等重要内容可能以下划线/加粗进行提示您,您应重点阅读。未成年人用户请在法定监护人陪同下仔细阅读并充分理解本协议,并征得法定监护人的同意后使用“艾因小萌班”。除非您完全接受本协议的全部内容,否则您无权下载、注册、登录、使用(以下统称“使用”)“艾因小萌班”,或者通过任何方式使用“艾因小萌班”服务,或者获得“艾因小萌班”提供的任何服务(本协议中统称“使用”)。若您使用“艾因小萌班”及相关服务,则视为您已充分理解本协议并承诺作为本协议的一方当事人接受协议的约束,您不得以未仔细阅读、未充分理解等理由拒绝接受本协议的约束。本协议内容或不能保证完全符合未来业务发展需求。为此,您同意运营方保留随时修改本协议的权利。本协议条款修改后,运营方将及时公布,您同意予以密切关注。如果您继续使用艾因小萌班,即视为您完全接受修改后的协议。如果您不接受修改后的协议,请立即停止使用艾因小萌班。关于艾因小萌班的使用您使用“艾因小萌班”及相关服务,登录后,系统将为您自动匹配一个不可更改的用户ID,您应妥善保管该用户ID并对以您用户ID所进行的所有活动负法律责任。";
|
|
10
|
+
|
|
11
|
+
const rtlLongLongText =
|
|
12
|
+
"نحن لا نضع أي فرضيات مسبقة عن التكنولوجيا الأخرى التي تستخدمها، فلهذا يمكنك تطوير ميزات و إضافات باستخدام دون الحاجة الى إعادة كتابة أي شيفرة مكتوبة سابقاً الواجهات المُعرّفة (التصريحية)، تجعل الشيفرة الخاصة بالبرنامج سهلة التوقع عند تنفيذها و سهلة التصحيح في حالة وجود أخطاء للغاية، ﻻ يجب عليك سوى أن تصمم واجهة بسيطة لكل حالة من حالات التطبيق و بعدها React يتكفل وبفاعلية بتحديث و إعادة رسم المكّون المعني بالتحديث فقط عند تغيُّر البيانات تُدير حالتها الخاصّة، ومن ثمّ تُركِّب هذه المكوّنات مع بعضها لإنشاء واجهات مستخدم مُعقّدة نحن لا نضع أي فرضيات مسبقة عن التكنولوجيا الأخرى التي تستخدمها، فلهذا يمكنك تطوير ميزات و إضافات باستخدام";
|
|
13
|
+
|
|
14
|
+
export { longLongText, rtlLongLongText };
|
|
@@ -2,22 +2,21 @@
|
|
|
2
2
|
* @Author: ChenChanghua
|
|
3
3
|
* @Date: 2022-07-11 13:31:36
|
|
4
4
|
* @LastEditors: ChenChanghua
|
|
5
|
-
* @LastEditTime: 2022-
|
|
5
|
+
* @LastEditTime: 2022-11-02 14:51:40
|
|
6
6
|
* @Description: file content
|
|
7
7
|
-->
|
|
8
8
|
<script setup>
|
|
9
|
-
import { MetroWidget, VERTICAL, EdgeDirection } from "jsview";
|
|
9
|
+
import { MetroWidget, VERTICAL, EdgeDirection, useFocusHub } from "jsview";
|
|
10
10
|
import { useRouter } from "vue-router";
|
|
11
|
-
import { useFocusHub } from "jsview";
|
|
12
11
|
import Buttons from "./Buttons.vue";
|
|
13
12
|
import Mixed from "./Mixed.vue";
|
|
14
|
-
import Widgets from "./Widgets.vue";
|
|
13
|
+
import Widgets from "./widgets/Widgets.vue";
|
|
15
14
|
|
|
16
15
|
const router = useRouter();
|
|
17
|
-
const
|
|
16
|
+
const focusHub = useFocusHub();
|
|
18
17
|
|
|
19
18
|
const onFocus = () => {
|
|
20
|
-
|
|
19
|
+
focusHub.setFocus("mwButton");
|
|
21
20
|
};
|
|
22
21
|
const onKeyDown = (ev) => {
|
|
23
22
|
if (ev.keyCode == 8 || ev.keyCode == 27 || ev.keyCode == 10000) {
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* @Author: ChenChanghua
|
|
3
3
|
* @Date: 2022-07-11 13:26:24
|
|
4
4
|
* @LastEditors: ChenChanghua
|
|
5
|
-
* @LastEditTime: 2022-
|
|
5
|
+
* @LastEditTime: 2022-11-02 15:37:33
|
|
6
6
|
* @Description: file content
|
|
7
7
|
-->
|
|
8
8
|
<script setup>
|
|
9
|
-
import { ref } from "vue";
|
|
9
|
+
import { ref, shallowRef } from "vue";
|
|
10
10
|
import { useFocusHub } from "jsview";
|
|
11
11
|
|
|
12
12
|
const props = defineProps({
|
|
@@ -19,7 +19,7 @@ const focusHub = useFocusHub();
|
|
|
19
19
|
|
|
20
20
|
let focusIndex = ref(0);
|
|
21
21
|
let focused = ref(false);
|
|
22
|
-
let focusBlock =
|
|
22
|
+
let focusBlock = shallowRef(null);
|
|
23
23
|
|
|
24
24
|
const onFocus = () => {
|
|
25
25
|
//onFocus时, 获得焦点, 以处理自己内部的焦点逻辑
|
|
@@ -11,7 +11,7 @@ import { useFocusHub } from "jsview";
|
|
|
11
11
|
import { advanceButton } from "../data";
|
|
12
12
|
import ButtonItem from "./ButtonItem.vue";
|
|
13
13
|
|
|
14
|
-
const
|
|
14
|
+
const focusHub = useFocusHub();
|
|
15
15
|
|
|
16
16
|
//item为Buttonitem的一些回调
|
|
17
17
|
const provideData = () => {
|
|
@@ -27,9 +27,9 @@ const measures = (item) => {
|
|
|
27
27
|
};
|
|
28
28
|
const onEdge = (edgeInfo) => {
|
|
29
29
|
if (edgeInfo.direction == EdgeDirection.right) {
|
|
30
|
-
|
|
30
|
+
focusHub.setFocus("mwWidget");
|
|
31
31
|
} else if (edgeInfo.direction == EdgeDirection.bottom) {
|
|
32
|
-
|
|
32
|
+
focusHub.setFocus("mwMix");
|
|
33
33
|
}
|
|
34
34
|
};
|
|
35
35
|
</script>
|
|
@@ -38,7 +38,7 @@ const onEdge = (edgeInfo) => {
|
|
|
38
38
|
<div
|
|
39
39
|
:style="{
|
|
40
40
|
left: 50,
|
|
41
|
-
top:
|
|
41
|
+
top: 20,
|
|
42
42
|
width: 300,
|
|
43
43
|
height: 400,
|
|
44
44
|
fontSize: 30,
|
|
@@ -49,7 +49,7 @@ const onEdge = (edgeInfo) => {
|
|
|
49
49
|
</div>
|
|
50
50
|
<metro-widget
|
|
51
51
|
name="mwButton"
|
|
52
|
-
:top="
|
|
52
|
+
:top="120"
|
|
53
53
|
:left="50"
|
|
54
54
|
:provideData="provideData"
|
|
55
55
|
:width="220"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @Author: ChenChanghua
|
|
3
3
|
* @Date: 2022-07-11 13:31:36
|
|
4
4
|
* @LastEditors: ChenChanghua
|
|
5
|
-
* @LastEditTime: 2022-
|
|
5
|
+
* @LastEditTime: 2022-11-02 15:37:40
|
|
6
6
|
* @Description: file content
|
|
7
7
|
-->
|
|
8
8
|
<script setup>
|
|
@@ -12,7 +12,7 @@ import { advanceMix } from "../data";
|
|
|
12
12
|
import ButtonItem from "./ButtonItem.vue";
|
|
13
13
|
import Item from "../Item.vue";
|
|
14
14
|
|
|
15
|
-
const
|
|
15
|
+
const focusHub = useFocusHub();
|
|
16
16
|
|
|
17
17
|
//item混排的回调
|
|
18
18
|
const provideData = () => {
|
|
@@ -28,9 +28,9 @@ const measures = (item) => {
|
|
|
28
28
|
};
|
|
29
29
|
const onEdge = (edgeInfo) => {
|
|
30
30
|
if (edgeInfo.direction == EdgeDirection.right) {
|
|
31
|
-
|
|
31
|
+
focusHub.setFocus("mwWidget");
|
|
32
32
|
} else if (edgeInfo.direction == EdgeDirection.top) {
|
|
33
|
-
|
|
33
|
+
focusHub.setFocus("mwButton");
|
|
34
34
|
}
|
|
35
35
|
};
|
|
36
36
|
</script>
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
* @Author: ChenChanghua
|
|
3
|
+
* @Date: 2022-11-01 15:30:14
|
|
4
|
+
* @LastEditors: ChenChanghua
|
|
5
|
+
* @LastEditTime: 2022-11-02 15:39:17
|
|
6
|
+
* @Description: file content
|
|
7
|
+
-->
|
|
8
|
+
<!--
|
|
9
|
+
* @Author: ChenChanghua
|
|
10
|
+
* @Date: 2022-05-10 15:21:24
|
|
11
|
+
* @LastEditors: ChenChanghua
|
|
12
|
+
* @LastEditTime: 2022-11-01 15:24:26
|
|
13
|
+
* @Description: file content
|
|
14
|
+
-->
|
|
15
|
+
<script setup>
|
|
16
|
+
import { ref, shallowRef, inject } from "vue";
|
|
17
|
+
|
|
18
|
+
const props = defineProps({
|
|
19
|
+
data: Object,
|
|
20
|
+
query: Object,
|
|
21
|
+
onAction: Object,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const divRef = shallowRef(null);
|
|
25
|
+
const focused = ref(false);
|
|
26
|
+
|
|
27
|
+
const focusSize = inject("focusSize");
|
|
28
|
+
|
|
29
|
+
// 自身的焦点状态自己记录, 通过回调来改变
|
|
30
|
+
const onFocus = () => {
|
|
31
|
+
focused.value = true;
|
|
32
|
+
if (focusSize) {
|
|
33
|
+
divRef.value?.getBoundingClientRect().then(
|
|
34
|
+
(data) => {
|
|
35
|
+
focusSize.width = data.width;
|
|
36
|
+
focusSize.height = data.height;
|
|
37
|
+
focusSize.left = data.left;
|
|
38
|
+
focusSize.top = data.top;
|
|
39
|
+
},
|
|
40
|
+
(error) => {
|
|
41
|
+
console.log("get absolute position failed", error);
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const onBlur = () => {
|
|
47
|
+
focused.value = false;
|
|
48
|
+
};
|
|
49
|
+
const onClick = () => {
|
|
50
|
+
console.log("item onclick ", props.data);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// 一般在create的时候进行回调的注册, 使用 option api的可以在created时进行注册
|
|
54
|
+
props.onAction.register("onFocus", onFocus);
|
|
55
|
+
props.onAction.register("onBlur", onBlur);
|
|
56
|
+
props.onAction.register("onClick", onClick);
|
|
57
|
+
</script>
|
|
58
|
+
|
|
59
|
+
<template>
|
|
60
|
+
<div
|
|
61
|
+
:style="{
|
|
62
|
+
width: data.width,
|
|
63
|
+
height: data.height,
|
|
64
|
+
transform: focused ? 'scale3d(1.2, 1.2, 1.2)' : '',
|
|
65
|
+
transition: 'transform 0.2s linear',
|
|
66
|
+
}"
|
|
67
|
+
>
|
|
68
|
+
<div
|
|
69
|
+
ref="divRef"
|
|
70
|
+
:style="{
|
|
71
|
+
width: data.width,
|
|
72
|
+
height: data.height,
|
|
73
|
+
fontSize: '30px',
|
|
74
|
+
color: '#FFFFFF',
|
|
75
|
+
backgroundColor: data.color,
|
|
76
|
+
borderRadius: '10px',
|
|
77
|
+
animation: animation,
|
|
78
|
+
}"
|
|
79
|
+
>
|
|
80
|
+
{{ data.content }}
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
</template>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
|
|
2
|
+
<script setup>
|
|
3
|
+
import { HORIZONTAL, MetroWidget, useFocusHub } from "jsview";
|
|
4
|
+
import { ref, shallowRef } from "vue";
|
|
5
|
+
import Item from "./Item.vue";
|
|
6
|
+
|
|
7
|
+
const props = defineProps({
|
|
8
|
+
data: Object,
|
|
9
|
+
query: Object,
|
|
10
|
+
onItemEdge: Function,
|
|
11
|
+
onAction: Object,
|
|
12
|
+
});
|
|
13
|
+
const focusHub = useFocusHub();
|
|
14
|
+
const mwRef = shallowRef(null);
|
|
15
|
+
|
|
16
|
+
const measures = (item) => {
|
|
17
|
+
return item;
|
|
18
|
+
};
|
|
19
|
+
const randomColor = () => {
|
|
20
|
+
let randomColor = Math.round(Math.random() * 2 ** 24).toString(16);
|
|
21
|
+
return (
|
|
22
|
+
"#" + new Array(6 - randomColor.length).fill("0").join("") + randomColor
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
const provideData = () => {
|
|
26
|
+
const data = [];
|
|
27
|
+
for (let i = 0; i < 10; i++) {
|
|
28
|
+
data.push({
|
|
29
|
+
width: (i + props.data.index) % 2 == 0 ? 90 : 180,
|
|
30
|
+
height: 90,
|
|
31
|
+
marginRight: 10,
|
|
32
|
+
marginBottom: 10,
|
|
33
|
+
content: i,
|
|
34
|
+
color: randomColor(),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return data;
|
|
38
|
+
};
|
|
39
|
+
const onFocus = (rect) => {
|
|
40
|
+
//获得焦点时需要做就近移动的处理, 因此需要通过setEnterFocusRect设置寻找最近焦点的区域
|
|
41
|
+
mwRef.value?.setEnterFocusRect(rect);
|
|
42
|
+
focusHub.setFocus(props.data.name);
|
|
43
|
+
};
|
|
44
|
+
const onBlur = () => {
|
|
45
|
+
//onBlur时需要返还焦点给父MetroWidget
|
|
46
|
+
mwRef.value?.getFocusBlockRef().returnFocusToParent();
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
props.onAction.register("onFocus", onFocus);
|
|
50
|
+
props.onAction.register("onBlur", onBlur);
|
|
51
|
+
</script>
|
|
52
|
+
|
|
53
|
+
<template>
|
|
54
|
+
<div
|
|
55
|
+
:style="{
|
|
56
|
+
width: 900,
|
|
57
|
+
height: 50,
|
|
58
|
+
fontSize: 30,
|
|
59
|
+
color: '#FFFFFF',
|
|
60
|
+
}"
|
|
61
|
+
>
|
|
62
|
+
{{ data.name }}
|
|
63
|
+
</div>
|
|
64
|
+
<!-- sendFocusRectEvent可以让MetroWidget的item在获焦时发送事件, 通知父的MetroWidget进行滚动 -->
|
|
65
|
+
<!-- onItemEdge直接作为onEdge回调, 既子MetroWidget到达边缘时触发父的onItemEdge -->
|
|
66
|
+
<metro-widget
|
|
67
|
+
ref="mwRef"
|
|
68
|
+
:top="50"
|
|
69
|
+
:name="data.name"
|
|
70
|
+
:provideData="provideData"
|
|
71
|
+
:width="data.width"
|
|
72
|
+
:height="data.height"
|
|
73
|
+
:direction="HORIZONTAL"
|
|
74
|
+
:padding="{
|
|
75
|
+
left: 30,
|
|
76
|
+
right: 30,
|
|
77
|
+
top: 10,
|
|
78
|
+
bottom: 10,
|
|
79
|
+
}"
|
|
80
|
+
:measures="measures"
|
|
81
|
+
:slideSetting="seamlessSlide"
|
|
82
|
+
:onEdge="onItemEdge"
|
|
83
|
+
:sendFocusRectEvent="true"
|
|
84
|
+
>
|
|
85
|
+
<template #renderItem="{ data, query, onAction }">
|
|
86
|
+
<item :data="data" :query="query" :onAction="onAction" />
|
|
87
|
+
</template>
|
|
88
|
+
</metro-widget>
|
|
89
|
+
</template>
|