From 2467041138d38320f9d4d3894a42a9108bd0ee02 Mon Sep 17 00:00:00 2001 From: "lixuefei.1313" Date: Fri, 12 Dec 2025 16:06:42 +0800 Subject: [PATCH] feat: support autoLabelMaxWidth in circleAxis --- .../vrender-components/src/axis/circle.ts | 37 +++++++++++++++++++ packages/vrender-components/src/axis/type.ts | 9 +++++ 2 files changed, 46 insertions(+) diff --git a/packages/vrender-components/src/axis/circle.ts b/packages/vrender-components/src/axis/circle.ts index d6e7d5e72..10ece98db 100644 --- a/packages/vrender-components/src/axis/circle.ts +++ b/packages/vrender-components/src/axis/circle.ts @@ -257,6 +257,43 @@ export class CircleAxis extends AxisBase { layer: number, layerCount: number ): void { + /** + * 基于布局矩形与文本对齐方式设置标签最大行宽: + * - left:可用宽度为到矩形右边界的水平距离(rectRight - x) + * - right:可用宽度为到矩形左边界的水平距离(x - rectLeft) + * - center:取左右两侧最小距离的两倍(2 * min(x - rectLeft, rectRight - x)) + */ + const { layoutRect, autoLabelMaxWidth } = this.attribute as CircleAxisAttributes; + if (!autoLabelMaxWidth || !layoutRect || !labelShapes || labelShapes.length === 0) { + return; + } + + const rectLeft = 0; + const rectRight = 0 + layoutRect.width; + + for (let i = 0; i < labelShapes.length; i++) { + const label = labelShapes[i]; + const x = label.attribute.x; + const align = (label.attribute.textAlign as TextAlignType) ?? 'center'; + + let maxWidth = 0; + if (align === 'left') { + maxWidth = rectRight - x; + } else if (align === 'right') { + maxWidth = x - rectLeft; + } else { + const leftDist = x - rectLeft; + const rightDist = rectRight - x; + maxWidth = 2 * Math.max(0, Math.min(leftDist, rightDist)); + } + + if (maxWidth > 0) { + label.setAttributes({ maxLineWidth: maxWidth }); + } else { + label.setAttributes({ maxLineWidth: 0 }); + } + } + return; } diff --git a/packages/vrender-components/src/axis/type.ts b/packages/vrender-components/src/axis/type.ts index 1861fc2e6..60c18e56c 100644 --- a/packages/vrender-components/src/axis/type.ts +++ b/packages/vrender-components/src/axis/type.ts @@ -280,6 +280,15 @@ export interface CircleAxisAttributes extends AxisBaseAttributes { * @since 0.19.24 */ sides?: number; + + /** + * 坐标轴可用布局区域的大小 + */ + layoutRect?: { x: number; y: number; width: number; height: number }; + /** + * 是否自动调整标签宽度以适应布局区域 + */ + autoLabelMaxWidth?: boolean; } // 坐标轴标题配置