优化推荐位置居中显示逻辑,计算画布偏移量以提升用户交互体验。

This commit is contained in:
zihanjian
2025-06-06 19:02:20 +08:00
parent bcd824bd98
commit 8630e9ff7f

View File

@@ -264,16 +264,44 @@ export default function FocusMode() {
// 处理定位到推荐位置
const handleLocateRecommended = useCallback(() => {
if (focusState.recommendedCell) {
// 计算需要的偏移量使推荐格子居中
if (focusState.recommendedCell && gridDimensions) {
const { row, col } = focusState.recommendedCell;
// 这里简化处理,实际需要根据画布尺寸计算
// 计算格子大小与FocusCanvas中的计算保持一致
const cellSize = Math.max(15, Math.min(40, 300 / Math.max(gridDimensions.N, gridDimensions.M)));
// 计算推荐格子在画布上的像素位置(格子中心)
const targetX = (col + 0.5) * cellSize;
const targetY = (row + 0.5) * cellSize;
// 计算画布总尺寸
const canvasWidth = gridDimensions.N * cellSize;
const canvasHeight = gridDimensions.M * cellSize;
// 假设可视区域的尺寸减去UI元素的空间
const viewportWidth = window.innerWidth;
const viewportHeight = window.innerHeight - 200; // 减去顶部和底部UI的高度
// 计算需要的偏移量,使目标位置居中显示
// 考虑到transform: scale() translate()的顺序offset是在缩放后应用的
// 我们需要让画布中心对齐到视口中心,然后再偏移到目标位置
const canvasCenterX = canvasWidth / 2;
const canvasCenterY = canvasHeight / 2;
// 目标位置相对画布中心的偏移
const targetOffsetX = targetX - canvasCenterX;
const targetOffsetY = targetY - canvasCenterY;
// 最终偏移量:让画布中心对齐视口中心,然后减去目标偏移
const offsetX = (viewportWidth / 2) / focusState.canvasScale - canvasCenterX - targetOffsetX;
const offsetY = (viewportHeight / 2) / focusState.canvasScale - canvasCenterY - targetOffsetY;
setFocusState(prev => ({
...prev,
canvasOffset: { x: -col * 20, y: -row * 20 } // 假设每个格子20px
canvasOffset: { x: offsetX, y: offsetY }
}));
}
}, [focusState.recommendedCell]);
}, [focusState.recommendedCell, focusState.canvasScale, gridDimensions]);
if (!mappedPixelData || !gridDimensions) {
return (