mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-04-19 17:16:08 +08:00
174 lines
3.8 KiB
Markdown
174 lines
3.8 KiB
Markdown
# g-path 标签 API 文档
|
||
|
||
本文档由 `DeepSeek R1` 模型生成并微调。
|
||
|
||
---
|
||
|
||
```mermaid
|
||
graph LR
|
||
PathProps --> GraphicBaseProps --> BaseProps
|
||
|
||
click GraphicBaseProps "./GraphicBaseProps"
|
||
click BaseProps "./BaseProps"
|
||
```
|
||
|
||
---
|
||
|
||
## 接口定义
|
||
|
||
```typescript
|
||
interface PathProps extends GraphicBaseProps {
|
||
path?: Path2D; // 自定义路径对象
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 核心属性说明
|
||
|
||
| 属性 | 类型 | 默认值 | 说明 |
|
||
| -------------- | -------------------------- | ----------- | -------------------------------------------------- |
|
||
| `path` | `Path2D` | - | 自定义矢量路径(支持多路径、贝塞尔曲线等复杂形状) |
|
||
| `fillRule` | `"nonzero"` \| `"evenodd"` | `"evenodd"` | 填充规则(影响路径重叠区域的渲染) |
|
||
| `actionStroke` | `boolean` | `false` | 设为 `true` 时,交互事件仅检测描边区域 |
|
||
|
||
---
|
||
|
||
## 完整示例集
|
||
|
||
### 示例 1:复杂星形路径
|
||
|
||
```tsx
|
||
// 创建五角星路径
|
||
const starPath = new Path2D();
|
||
for (let i = 0; i < 5; i++) {
|
||
const angle = (i * 2 * Math.PI) / 5 - Math.PI / 2;
|
||
const x = 100 + Math.cos(angle) * 50;
|
||
const y = 100 + Math.sin(angle) * 50;
|
||
if (i === 0) starPath.moveTo(x, y);
|
||
else starPath.lineTo(x, y);
|
||
}
|
||
starPath.closePath();
|
||
|
||
<g-path
|
||
x={200}
|
||
y={200}
|
||
path={starPath}
|
||
fill
|
||
stroke
|
||
fillStyle="#f1c40f"
|
||
fillRule="evenodd" // 使用奇偶环绕原则,使中心镂空
|
||
strokeStyle="#e67e22"
|
||
strokeWidth={3}
|
||
/>;
|
||
```
|
||
|
||
**效果说明**:
|
||
|
||
- 使用`evenodd`规则自动产生星形镂空效果
|
||
- 金色填充+橙色描边的五角星
|
||
|
||
---
|
||
|
||
### 示例 2:交互式描边检测
|
||
|
||
```tsx
|
||
import { ref } from 'vue';
|
||
const [clicked, setClicked] = useState(false);
|
||
|
||
const clicked = ref(false);
|
||
|
||
// 创建对话气泡路径
|
||
const bubblePath = new Path2D();
|
||
bubblePath.moveTo(50, 20);
|
||
bubblePath.quadraticCurveTo(25, 0, 0, 20);
|
||
bubblePath.quadraticCurveTo(25, 40, 50, 20);
|
||
bubblePath.rect(0, 20, 200, 100);
|
||
|
||
const click = () => void (clicked.value = !click.value);
|
||
|
||
<g-path
|
||
path={bubblePath}
|
||
fillStyle={clicked.value ? '#ffffff' : '#ecf0f1'}
|
||
strokeStyle="#bdc3c7"
|
||
strokeWidth={2}
|
||
actionStroke // 仅描边区域可交互
|
||
onClick={click}
|
||
/>;
|
||
```
|
||
|
||
**交互特性**:
|
||
|
||
- 点击描边区域切换填充颜色
|
||
- 内部区域不响应点击事件
|
||
|
||
---
|
||
|
||
### 示例 3:组合路径(齿轮造型)
|
||
|
||
```tsx
|
||
const gearPath = new Path2D();
|
||
// 主体圆形
|
||
gearPath.arc(100, 100, 80, 0, Math.PI * 2);
|
||
// 添加8个齿牙
|
||
for (let i = 0; i < 8; i++) {
|
||
const angle = ((Math.PI * 2) / 8) * i;
|
||
gearPath.moveTo(100 + Math.cos(angle) * 90, 100 + Math.sin(angle) * 90);
|
||
gearPath.lineTo(
|
||
100 + Math.cos(angle + Math.PI / 8) * 110,
|
||
100 + Math.sin(angle + Math.PI / 8) * 110
|
||
);
|
||
gearPath.lineTo(
|
||
100 + Math.cos(angle - Math.PI / 8) * 110,
|
||
100 + Math.sin(angle - Math.PI / 8) * 110
|
||
);
|
||
}
|
||
|
||
<g-path
|
||
path={gearPath}
|
||
fill
|
||
stroke
|
||
fillStyle="#2c3e50"
|
||
fillRule="nonzero" // 非零规则填充
|
||
strokeStyle="#34495e"
|
||
strokeWidth={5}
|
||
lineJoin="miter" // 尖角连接
|
||
/>;
|
||
```
|
||
|
||
---
|
||
|
||
## 高级用法示例
|
||
|
||
### SVG 路径转换
|
||
|
||
```tsx
|
||
// 将SVG路径转换为Path2D
|
||
const svgPath = 'M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80';
|
||
const path = new Path2D(svgPath);
|
||
|
||
<g-path
|
||
path={path}
|
||
stroke
|
||
strokeStyle="#e74c3c"
|
||
strokeWidth={3}
|
||
lineDash={[10, 5]}
|
||
lineCap="round"
|
||
/>;
|
||
```
|
||
|
||
---
|
||
|
||
## 注意事项
|
||
|
||
1. **路径闭合**:
|
||
|
||
```tsx
|
||
// 必须显式闭合路径才能正确填充
|
||
const path = new Path2D();
|
||
path.moveTo(0, 0);
|
||
path.lineTo(100, 0);
|
||
path.lineTo(100, 100);
|
||
path.closePath(); // 关键闭合操作
|
||
```
|