import { _decorator, Component, UITransform, Graphics, Color, Mask } from 'cc'; const { ccclass, property } = _decorator; /** * 圆角矩形遮罩组件 * 使用 Graphics + Mask 绘制圆角矩形作为遮罩 * * 使用方法: * 1. 将此组件添加到需要圆角的节点上 * 2. 设置圆角半径 * 3. 该节点及其子节点会被裁剪为圆角矩形 */ @ccclass('RoundedRectMask') export class RoundedRectMask extends Component { @property({ tooltip: '圆角半径(像素)' }) radius: number = 20; private _graphics: Graphics | null = null; private _mask: Mask | null = null; private _uiTransform: UITransform | null = null; onLoad() { this._uiTransform = this.getComponent(UITransform); this.setupComponents(); } /** * 设置组件 */ private setupComponents() { // 获取或添加 Graphics 组件 this._graphics = this.getComponent(Graphics); if (!this._graphics) { this._graphics = this.addComponent(Graphics); } // 获取或添加 Mask 组件 this._mask = this.getComponent(Mask); if (!this._mask) { this._mask = this.addComponent(Mask); } // 设置 Mask 使用 Graphics 类型 this._mask.type = Mask.Type.GRAPHICS_STENCIL; this.drawRoundedRect(); } /** * 绘制圆角矩形 */ private drawRoundedRect() { if (!this._graphics || !this._uiTransform) return; const width = this._uiTransform.width; const height = this._uiTransform.height; const r = Math.min(this.radius, Math.min(width, height) / 2); // 清除之前的绘制 this._graphics.clear(); // 设置填充颜色 this._graphics.fillColor = new Color(255, 255, 255, 255); // 绘制圆角矩形路径 const halfW = width / 2; const halfH = height / 2; // 使用 lineTo 和 arc 绘制圆角矩形 // 从左下角开始,逆时针绘制 this._graphics.moveTo(-halfW + r, -halfH); // 下边 this._graphics.lineTo(halfW - r, -halfH); // 右下角圆角 (90度弧,从 -90度 到 0度) this._graphics.arc(halfW - r, -halfH + r, r, -Math.PI / 2, 0, false); // 右边 this._graphics.lineTo(halfW, halfH - r); // 右上角圆角 (90度弧,从 0度 到 90度) this._graphics.arc(halfW - r, halfH - r, r, 0, Math.PI / 2, false); // 上边 this._graphics.lineTo(-halfW + r, halfH); // 左上角圆角 (90度弧,从 90度 到 180度) this._graphics.arc(-halfW + r, halfH - r, r, Math.PI / 2, Math.PI, false); // 左边 this._graphics.lineTo(-halfW, -halfH + r); // 左下角圆角 (90度弧,从 180度 到 270度) this._graphics.arc(-halfW + r, -halfH + r, r, Math.PI, Math.PI * 1.5, false); // 填充 this._graphics.fill(); } /** * 设置圆角半径 */ setRadius(radius: number) { this.radius = radius; this.drawRoundedRect(); } }