|
|
@@ -1,6 +1,7 @@
|
|
|
import Taro from '@tarojs/taro';
|
|
|
import { Canvas, View } from '@tarojs/components';
|
|
|
import { useEffect, useRef } from 'react';
|
|
|
+import Timeline from '@/components/Timeline';
|
|
|
|
|
|
export default function Demo() {
|
|
|
const canvasRef = useRef<any>(null);
|
|
|
@@ -20,8 +21,8 @@ export default function Demo() {
|
|
|
|
|
|
var currentContext;
|
|
|
|
|
|
- var startAngle = 45*Math.PI/180;
|
|
|
- var endAngle = 120*Math.PI/180;
|
|
|
+ var startAngle = 45 * Math.PI / 180;
|
|
|
+ var endAngle = 120 * Math.PI / 180;
|
|
|
var lastAngle;
|
|
|
var lastDuration = 0;
|
|
|
|
|
|
@@ -56,7 +57,7 @@ export default function Demo() {
|
|
|
|
|
|
|
|
|
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
|
|
|
-
|
|
|
+
|
|
|
|
|
|
ctx.beginPath();
|
|
|
ctx.arc(centerX, centerY, radius, 0, 2 * Math.PI);
|
|
|
@@ -66,7 +67,7 @@ export default function Demo() {
|
|
|
|
|
|
ctx.beginPath();
|
|
|
ctx.arc(centerX, centerY, radius, startAngle, endAngle);
|
|
|
- ctx.strokeStyle = canRingDrag?"red":"rgba(255,0,0,0.5)";
|
|
|
+ ctx.strokeStyle = canRingDrag ? "red" : "rgba(255,0,0,0.5)";
|
|
|
ctx.lineWidth = 10;
|
|
|
ctx.stroke();
|
|
|
|
|
|
@@ -95,87 +96,87 @@ export default function Demo() {
|
|
|
return dep;
|
|
|
}
|
|
|
|
|
|
- function limitAngle(start,end) {
|
|
|
- var angle1 = start<0?start+2*Math.PI:start;
|
|
|
- var angle2 = end<0?end+2*Math.PI:end;
|
|
|
- if (angle2<angle1){
|
|
|
- angle2 = angle2+2*Math.PI;
|
|
|
+ function limitAngle(start, end) {
|
|
|
+ var angle1 = start < 0 ? start + 2 * Math.PI : start;
|
|
|
+ var angle2 = end < 0 ? end + 2 * Math.PI : end;
|
|
|
+ if (angle2 < angle1) {
|
|
|
+ angle2 = angle2 + 2 * Math.PI;
|
|
|
}
|
|
|
|
|
|
- var leftAngle = angle2-angle1;
|
|
|
- if (leftAngle>Math.PI*23/12){
|
|
|
+ var leftAngle = angle2 - angle1;
|
|
|
+ if (leftAngle > Math.PI * 23 / 12) {
|
|
|
return 1;
|
|
|
}
|
|
|
- else if (leftAngle<Math.PI/12){
|
|
|
+ else if (leftAngle < Math.PI / 12) {
|
|
|
return 2;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- function durationAngle(end,start) {
|
|
|
- var angle1 = start<0?start+2*Math.PI:start;
|
|
|
- var angle2 = end<0?end+2*Math.PI:end;
|
|
|
- if (angle2<angle1){
|
|
|
- angle2 = angle2+2*Math.PI;
|
|
|
+ function durationAngle(end, start) {
|
|
|
+ var angle1 = start < 0 ? start + 2 * Math.PI : start;
|
|
|
+ var angle2 = end < 0 ? end + 2 * Math.PI : end;
|
|
|
+ if (angle2 < angle1) {
|
|
|
+ angle2 = angle2 + 2 * Math.PI;
|
|
|
}
|
|
|
|
|
|
- return angle2-angle1;
|
|
|
+ return angle2 - angle1;
|
|
|
}
|
|
|
|
|
|
const handleTouchMove = (e: any) => {
|
|
|
const ctx = currentContext;//canvasRef.current.getContext('2d');
|
|
|
- if (!canStartDrag && !canEndDrag && !canRingDrag){
|
|
|
+ if (!canStartDrag && !canEndDrag && !canRingDrag) {
|
|
|
drawCanvas(ctx);
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
const { x, y } = e.touches[0];
|
|
|
|
|
|
- let angle = Math.atan2(y-canvasWidth/2.0, x-canvasWidth/2.0)
|
|
|
+ let angle = Math.atan2(y - canvasWidth / 2.0, x - canvasWidth / 2.0)
|
|
|
|
|
|
- if (canStartDrag){
|
|
|
- if (Math.abs(durationAngle(endAngle,angle)-lastDuration)>Math.PI){
|
|
|
+ if (canStartDrag) {
|
|
|
+ if (Math.abs(durationAngle(endAngle, angle) - lastDuration) > Math.PI) {
|
|
|
//禁止跨越
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- var result = limitAngle(angle,endAngle);
|
|
|
- switch (result){
|
|
|
+ var result = limitAngle(angle, endAngle);
|
|
|
+ switch (result) {
|
|
|
case 0:
|
|
|
startAngle = angle;
|
|
|
break;
|
|
|
case 1:
|
|
|
- startAngle = endAngle-23*Math.PI/12;
|
|
|
+ startAngle = endAngle - 23 * Math.PI / 12;
|
|
|
break;
|
|
|
case 2:
|
|
|
- startAngle = endAngle-Math.PI/12;
|
|
|
+ startAngle = endAngle - Math.PI / 12;
|
|
|
break;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- if (canEndDrag){
|
|
|
- if (Math.abs(durationAngle(angle,startAngle)-lastDuration)>Math.PI){
|
|
|
+ if (canEndDrag) {
|
|
|
+ if (Math.abs(durationAngle(angle, startAngle) - lastDuration) > Math.PI) {
|
|
|
//禁止跨越
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- var result = limitAngle(startAngle,angle);
|
|
|
- switch (result){
|
|
|
+ var result = limitAngle(startAngle, angle);
|
|
|
+ switch (result) {
|
|
|
case 0:
|
|
|
endAngle = angle;
|
|
|
break;
|
|
|
case 1:
|
|
|
- endAngle = startAngle+23*Math.PI/12;
|
|
|
+ endAngle = startAngle + 23 * Math.PI / 12;
|
|
|
break;
|
|
|
case 2:
|
|
|
- endAngle = startAngle+Math.PI/12;
|
|
|
+ endAngle = startAngle + Math.PI / 12;
|
|
|
break;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- if (canRingDrag){
|
|
|
+ if (canRingDrag) {
|
|
|
let delta = angle - lastAngle;
|
|
|
startAngle += delta;
|
|
|
endAngle += delta;
|
|
|
@@ -184,7 +185,7 @@ export default function Demo() {
|
|
|
|
|
|
drawCanvas(ctx);
|
|
|
|
|
|
- lastDuration = durationAngle(endAngle,startAngle);
|
|
|
+ lastDuration = durationAngle(endAngle, startAngle);
|
|
|
};
|
|
|
|
|
|
const handleClick = (e) => {
|
|
|
@@ -220,14 +221,14 @@ export default function Demo() {
|
|
|
canEndDrag = false;
|
|
|
}
|
|
|
|
|
|
- if (canStartDrag || canEndDrag){
|
|
|
+ if (canStartDrag || canEndDrag) {
|
|
|
canRingDrag = false;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- const distance3 = twoPointDistance({x:canvasX,y:canvasY},{x:centerX,y:centerY});
|
|
|
- let angle = Math.atan2(canvasY-canvasWidth/2.0, canvasX-canvasWidth/2.0)
|
|
|
- if (distance3>80&& distance3<105 && startAngle<angle && angle<endAngle){
|
|
|
+ const distance3 = twoPointDistance({ x: canvasX, y: canvasY }, { x: centerX, y: centerY });
|
|
|
+ let angle = Math.atan2(canvasY - canvasWidth / 2.0, canvasX - canvasWidth / 2.0)
|
|
|
+ if (distance3 > 80 && distance3 < 105 && startAngle < angle && angle < endAngle) {
|
|
|
canRingDrag = true;
|
|
|
}
|
|
|
lastAngle = angle;
|
|
|
@@ -235,19 +236,39 @@ export default function Demo() {
|
|
|
drawCanvas(currentContext);
|
|
|
};
|
|
|
|
|
|
- const handleTouchEnd = (e) =>{
|
|
|
+ const handleTouchEnd = (e) => {
|
|
|
canStartDrag = false;
|
|
|
canEndDrag = false;
|
|
|
canRingDrag = false;
|
|
|
handleTouchMove(e)
|
|
|
}
|
|
|
|
|
|
- return <View style={{ width: '100%', height: 600, backgroundColor: 'white' }}>
|
|
|
+ const timelineItems = [
|
|
|
+ {
|
|
|
+ status: 'padding',
|
|
|
+ content: 'Item 1',
|
|
|
+ time: '10:00 AM',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ status: 'done',
|
|
|
+ content: 'Item 2',
|
|
|
+ time: '11:00 AM',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ status: 'un_done',
|
|
|
+ content: 'Item 3',
|
|
|
+ time: '12:00 PM',
|
|
|
+ },
|
|
|
+ ];
|
|
|
+
|
|
|
+ return <View style={{ width: '100%', height: 600, backgroundColor: 'white',display:'flex',flexDirection:'column' }}>
|
|
|
<Canvas canvasId={canvasId} id={canvasId} className={canvasId} type="2d"
|
|
|
style={{ width: 300, height: 300, zIndex: 0, backgroundColor: 'yellow' }}
|
|
|
onTouchMove={handleTouchMove}
|
|
|
onTouchEnd={handleTouchEnd}
|
|
|
onTouchStart={handleClick}
|
|
|
ref={canvasRef} />
|
|
|
+ <Timeline items={timelineItems} />
|
|
|
+
|
|
|
</View>
|
|
|
}
|