import { _decorator, Component, Label, Node, Overflow, Size, UITransform, } from "cc"; import Tools from "../../utils/tools"; const { ccclass, property } = _decorator; @ccclass("DialogBubble") export class DialogBubble extends Component { @property(UITransform) bg: UITransform = null; @property(Label) content: Label = null; @property(UITransform) contentT: UITransform = null; fixMaxWidth: number; init(maxWidth: number = 650) { this.fixMaxWidth = maxWidth; } updateBubbleContent(str: string, callback?: (actualHeight: number) => void) { this.content.overflow = Overflow.NONE; // 设置文本内容 this.content.string = str; // 计算最大宽度(估算) const lines = str.split("\n"); let maxWidth = 0; for (const line of lines) { let lineWidth = 0; if (Tools.IsChinese(line)) { lineWidth = 30 * line.length; } else { lineWidth = 18 * line.length; } maxWidth = Math.max(maxWidth, lineWidth); } if (maxWidth > this.fixMaxWidth) this.content.overflow = Overflow.RESIZE_HEIGHT; // 限制最大宽度 const contentWidth = Math.min(maxWidth, this.fixMaxWidth); // 设置内容区域宽度,让Label自动计算高度 this.contentT.setContentSize(new Size(contentWidth, 0)); this.bg.setContentSize(new Size(contentWidth + 17, 0)); // 强制更新Label的渲染数据以获取正确的高度 this.content.updateRenderData(true); // 等待一帧后获取Label的实际高度 this.scheduleOnce(() => { const actualSize = this.content.node.getComponent(UITransform).contentSize; // 更新内容区域的实际大小 //this.contentT.setContentSize(new Size(contentWidth, actualHeight)); // 根据内容大小调整背景大小,添加适当的内边距 //const bgHeight = actualHeight + 17; this.bg.setContentSize(new Size(actualSize.x + 30, actualSize.y + 10)); // 回调通知实际高度 if (callback) { callback(actualSize.y); } }, 0); // 返回预估的背景高度(用于同步计算) const estimatedHeight = Math.max(lines.length * 35 + 20, 60); // 最小高度60 return estimatedHeight; } }