change animate mode
This commit is contained in:
@@ -115,7 +115,10 @@ function Blocks(props: PropsWithChildren<BlockProps>) {
|
||||
const [animateProps, animationEdit]: [CSSProperties, CSSProperties] = useMemo(() => {
|
||||
const [normal, editProps] = mergeAnimate(props.data.animate, {
|
||||
isPause: props.config.timelineNeedleConfig.status === 'pause' ? true : false,
|
||||
delay: props.config.timelineNeedleConfig.current,
|
||||
delay:
|
||||
props.config.timelineNeedleConfig.status === 'stop'
|
||||
? props.config.timelineNeedleConfig.current
|
||||
: 0,
|
||||
});
|
||||
return [
|
||||
{
|
||||
|
@@ -45,6 +45,7 @@ export interface TimeLineNeedleConfigType {
|
||||
status: 'stop' | 'start' | 'pause';
|
||||
runFunc: Function;
|
||||
resetFunc: Function;
|
||||
pauseFunc: Function;
|
||||
current: number;
|
||||
}
|
||||
|
||||
@@ -169,7 +170,70 @@ let cacheBlock: IBlockType[] = [];
|
||||
|
||||
const needleWidth = 2;
|
||||
const initialLeft = 20 - needleWidth / 2;
|
||||
const needleHeadWidth = 15;
|
||||
const needleHeadHeight = 22;
|
||||
|
||||
let timer: number | null = null;
|
||||
|
||||
const needleState = {
|
||||
isDrag: false,
|
||||
startX: 0,
|
||||
origin: 0,
|
||||
};
|
||||
|
||||
const needleHeadEvent = (
|
||||
setNeedle: React.Dispatch<React.SetStateAction<number>>,
|
||||
config: UserConfig
|
||||
) => {
|
||||
return {
|
||||
onMouseDown: (e: React.MouseEvent) => {
|
||||
console.log('down', setNeedle, config, e.clientX);
|
||||
// 调整为stop模式,
|
||||
e.stopPropagation();
|
||||
setNeedle((p) => {
|
||||
needleState.origin = p;
|
||||
return p;
|
||||
});
|
||||
needleState.isDrag = true;
|
||||
needleState.startX = e.clientX;
|
||||
if (timer) {
|
||||
window.clearInterval(timer);
|
||||
}
|
||||
},
|
||||
};
|
||||
};
|
||||
const needleMoveEvent = (
|
||||
setNeedle: React.Dispatch<React.SetStateAction<number>>,
|
||||
config: UserConfig
|
||||
) => {
|
||||
return {
|
||||
onMouseMove: (e: React.MouseEvent) => {
|
||||
if (needleState.isDrag) {
|
||||
console.log('move', e.clientX, config);
|
||||
const diff = e.clientX - needleState.startX;
|
||||
setNeedle(() => {
|
||||
const shouldMoveX = needleState.origin + diff;
|
||||
if (shouldMoveX < initialLeft) {
|
||||
return initialLeft;
|
||||
} else if (shouldMoveX > ruleWidth) {
|
||||
return ruleWidth;
|
||||
} else {
|
||||
return shouldMoveX;
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
onMouseUp: () => {
|
||||
console.log('up');
|
||||
needleState.isDrag = false;
|
||||
needleState.startX = 0;
|
||||
},
|
||||
onDoubleClick: (e: React.MouseEvent) => {
|
||||
console.log('dbclick', e.clientX, (e.target as HTMLDivElement).getBoundingClientRect().width);
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export function TimeLine(props: TimeLineProps) {
|
||||
const store = props.config.getStore();
|
||||
const data = store.getData().block;
|
||||
@@ -257,6 +321,12 @@ export function TimeLine(props: TimeLineProps) {
|
||||
});
|
||||
};
|
||||
|
||||
const refreshBlock = () => {
|
||||
const cloneData: IStoreData = deepcopy(store.getData());
|
||||
store.setData(cloneData);
|
||||
store.cleanLast();
|
||||
};
|
||||
|
||||
const needlePlay = async () => {
|
||||
if (timer) {
|
||||
window.clearInterval(timer);
|
||||
@@ -265,33 +335,40 @@ export function TimeLine(props: TimeLineProps) {
|
||||
if (props.config.timelineNeedleConfig.status !== 'pause') {
|
||||
await needleReset();
|
||||
}
|
||||
props.config.timelineNeedleConfig.status = 'start';
|
||||
refreshBlock();
|
||||
setTimeout(() => {
|
||||
timer = window.setInterval(() => {
|
||||
if (needle < ruleWidth) {
|
||||
setNeedle((pre) => {
|
||||
setNeedle((pre) => {
|
||||
if (pre < ruleWidth) {
|
||||
props.config.timelineNeedleConfig.current = (pre - initialLeft) / 20;
|
||||
return pre + 2;
|
||||
});
|
||||
props.config.blockForceUpdate.forEach((v) => v());
|
||||
}
|
||||
} else {
|
||||
if (timer) {
|
||||
window.clearInterval(timer);
|
||||
}
|
||||
return pre;
|
||||
}
|
||||
});
|
||||
// props.config.blockForceUpdate.forEach((v) => v());
|
||||
}, 100);
|
||||
});
|
||||
};
|
||||
|
||||
const needleReset = async () => {
|
||||
const needleReset = async (needResetAnimate = true) => {
|
||||
if (timer) {
|
||||
window.clearInterval(timer);
|
||||
}
|
||||
props.config.timelineNeedleConfig.status = 'start';
|
||||
await resetAnimate();
|
||||
if (needResetAnimate) {
|
||||
await resetAnimate();
|
||||
}
|
||||
return new Promise<void>((res) => {
|
||||
setTimeout(() => {
|
||||
props.config.timelineNeedleConfig.status = 'pause';
|
||||
props.config.timelineNeedleConfig.current = 0;
|
||||
setNeedle(initialLeft);
|
||||
const cloneData: IStoreData = deepcopy(store.getData());
|
||||
store.setData(cloneData);
|
||||
store.cleanLast();
|
||||
refreshBlock();
|
||||
res();
|
||||
});
|
||||
});
|
||||
@@ -302,13 +379,12 @@ export function TimeLine(props: TimeLineProps) {
|
||||
if (timer) {
|
||||
window.clearInterval(timer);
|
||||
}
|
||||
const cloneData: IStoreData = deepcopy(store.getData());
|
||||
store.setData(cloneData);
|
||||
store.cleanLast();
|
||||
refreshBlock();
|
||||
};
|
||||
|
||||
props.config.timelineNeedleConfig.resetFunc = needleReset;
|
||||
// props.config.timelineNeedleConfig.runFunc = needleStart;
|
||||
props.config.timelineNeedleConfig.runFunc = needlePlay;
|
||||
props.config.timelineNeedleConfig.pauseFunc = needlePause;
|
||||
|
||||
return (
|
||||
<div
|
||||
@@ -402,8 +478,27 @@ export function TimeLine(props: TimeLineProps) {
|
||||
overflow: 'hidden',
|
||||
position: 'relative',
|
||||
}}
|
||||
{...needleMoveEvent(setNeedle, props.config)}
|
||||
>
|
||||
<div
|
||||
className="yh-timeline-needle-head"
|
||||
style={{
|
||||
position: 'absolute',
|
||||
transform: `translate(-${scrollx}px, 0px)`,
|
||||
width: needleHeadWidth,
|
||||
height: needleHeadHeight,
|
||||
backgroundColor: '#ff5722',
|
||||
zIndex: 3,
|
||||
left: needle - needleHeadWidth / 2,
|
||||
transition: 'left linear',
|
||||
willChange: 'left',
|
||||
borderRadius: '2px',
|
||||
cursor: 'col-resize',
|
||||
}}
|
||||
{...needleHeadEvent(setNeedle, props.config)}
|
||||
></div>
|
||||
<div
|
||||
className="yh-timeline-needle"
|
||||
style={{
|
||||
position: 'absolute',
|
||||
transform: `translate(-${scrollx}px, 0px)`,
|
||||
|
@@ -60,7 +60,7 @@ const resizeMouseDown = (
|
||||
left: boolean
|
||||
) => {
|
||||
e.stopPropagation();
|
||||
resizeState.startX = e.screenX;
|
||||
resizeState.startX = e.clientX;
|
||||
resizeState.uid = v.uid;
|
||||
resizeState.isMove = true;
|
||||
resizeState.left = left;
|
||||
@@ -73,7 +73,7 @@ export const TimeLineItemMouseMove = function (
|
||||
) {
|
||||
if (moveState.isMove) {
|
||||
//修改源属性
|
||||
const diff = e.screenX - moveState.startX;
|
||||
const diff = e.clientX - moveState.startX;
|
||||
animate.forEach((v) => {
|
||||
if (v.uid === moveState.uid) {
|
||||
const f = parseFloat((v.animationDelay + diff / times).toFixed(1));
|
||||
@@ -81,9 +81,9 @@ export const TimeLineItemMouseMove = function (
|
||||
forceUpdate((p) => p + 1);
|
||||
}
|
||||
});
|
||||
moveState.startX = e.screenX;
|
||||
moveState.startX = e.clientX;
|
||||
} else if (resizeState.isMove) {
|
||||
const diff = e.screenX - resizeState.startX;
|
||||
const diff = e.clientX - resizeState.startX;
|
||||
if (resizeState.left) {
|
||||
animate.forEach((v) => {
|
||||
if (v.uid === resizeState.uid) {
|
||||
@@ -107,7 +107,7 @@ export const TimeLineItemMouseMove = function (
|
||||
}
|
||||
});
|
||||
}
|
||||
resizeState.startX = e.screenX;
|
||||
resizeState.startX = e.clientX;
|
||||
}
|
||||
};
|
||||
export const TimeLineItemMouseOver = function () {
|
||||
@@ -142,7 +142,7 @@ export function TimeLineItem(props: TimeLineItemProps) {
|
||||
<div
|
||||
key={v.uid}
|
||||
onMouseDown={(e) => {
|
||||
moveState.startX = e.screenX;
|
||||
moveState.startX = e.clientX;
|
||||
moveState.uid = v.uid;
|
||||
moveState.isMove = true;
|
||||
}}
|
||||
|
@@ -359,6 +359,7 @@ export class UserConfig {
|
||||
status: 'stop',
|
||||
runFunc: () => {},
|
||||
resetFunc: () => {},
|
||||
pauseFunc: () => {},
|
||||
current: 0,
|
||||
};
|
||||
public blockForceUpdate: Array<Function> = [];
|
||||
|
Reference in New Issue
Block a user