optimize:web Optimize NestedSlider scrolling

This commit is contained in:
wangxiangyuan
2023-09-08 16:15:19 +08:00
committed by osborn
parent 0cf75592ae
commit b087730090
4 changed files with 146 additions and 80 deletions

View File

@@ -1,4 +1,6 @@
import { horizontalList } from 'doric';
import { DoricGroupViewNode } from "./DoricViewNode";
import { NestedSliderView } from '../widgets/NestedSliderView';
export class DoricNestedSliderNode extends DoricGroupViewNode {
onPageSelectedFuncId = "";
@@ -19,47 +21,13 @@ export class DoricNestedSliderNode extends DoricGroupViewNode {
}
build() {
const ret = document.createElement("div");
ret.style.overflow = "hidden";
ret.style.display = "inline";
ret.style.whiteSpace = "nowrap";
let touchStartX = 0;
let currentIndex = 0;
let isDragging = false;
const handleTouchStart = (x: number) => {
if (!this.scrollable) return;
currentIndex = Math.round(ret.scrollLeft / ret.offsetWidth);
touchStartX = x;
isDragging = true;
};
ret.onmousedown = (ev) => handleTouchStart(ev.pageX);
ret.ontouchstart = (ev) => handleTouchStart(ev.touches[0].pageX);
const handleTouchMove = (x: number) => {
if (!this.scrollable || !isDragging) return;
const offsetX = (touchStartX - x) * 3;
ret.scrollTo({
left: currentIndex * ret.offsetWidth + offsetX,
});
};
ret.onmousemove = (ev) => handleTouchMove(ev.pageX);
ret.ontouchmove = (ev) => handleTouchMove(ev.touches[0].pageX);
const handleTouchCancel = () => {
if (!this.scrollable) return;
isDragging = false;
let originInndex = currentIndex;
currentIndex = Math.round(ret.scrollLeft / ret.offsetWidth);
ret.scrollTo({
left: currentIndex * ret.offsetWidth,
behavior: "smooth",
});
if (originInndex !== currentIndex) {
return NestedSliderView({
scrollable: () => this.scrollable, onPageSelected: index => {
if (this.onPageSelectedFuncId.length > 0) {
this.callJSResponse(this.onPageSelectedFuncId, currentIndex);
this.callJSResponse(this.onPageSelectedFuncId, index);
}
}
};
ret.onmouseup = ret.ontouchcancel = ret.ontouchend = handleTouchCancel;
return ret;
});
}
layout(): void {