ICanvas - 图形系统
警告
此图形是所有图形的继承类,不能创建和使用,只能继承本图形使用(即自定义图形)
Shape
这是所有图形的基类,所有的元素都会继承本元素属性及方法。 其中IShape为底层图形接口,外部实际使用不到。如果你要自定义图形,只要继承Shape即可。
属性
警告
下面除了基础属性,其它所有特定的属性只有对应的图形才会起效,每一个图形有它特定对应指定相同下面的属性。
基础属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
x | number | 0 | X坐标位置 |
y | number | 0 | Y坐标位置 |
width | number | 0 | 图形宽度 |
height | number | 0 | 图形高度 |
fill | string | "" | 填充颜色 |
stroke | string | "" | 描边颜色 |
strokeWidth | number | 0 | 描边宽度 |
opacity | number | 1 | 透明度 (0-1) |
visible | boolean | true | 是否可见 |
rotation | number | 0 | 旋转角度(度) |
scaleX | number | 1 | X轴缩放比例 |
scaleY | number | 1 | Y轴缩放比例 |
offsetX | number | 0 | X轴偏移量 |
offsetY | number | 0 | Y轴偏移量 |
draggable | boolean | false | 是否可拖拽 |
draggableing | boolean | false | 是否正在拖拽 |
bubbleEvent | boolean | false | 是否允许事件冒泡 |
toggleStatus | boolean | false | 切换状态 |
zIndex | number | 0 | 层级索引 |
clip | boolean | false | 是否裁剪 |
id | string | "shape-" + random | 唯一标识符 |
type | string | "" | 图形类型 |
rotateCenter | string | "topLeft" | 旋转中心点 |
needsUpdate | boolean | false | 是否需要更新 |
线条样式属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
lineJoin | string | "round" | 线条连接方式 |
lineDashOffset | number | 0 | 虚线偏移量 |
lineDash | number[] | [] | 虚线样式数组 |
lineCap | string | "butt" | 线条端点样式 |
文本属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
text | string | "" | 文本内容 |
fontSize | number | 12 | 字体大小 |
fontFamily | string | "Arial" | 字体族 |
textAlign | string | "left" | 文本对齐方式 |
textBaseline | string | "top" | 文本基线 |
padding | number | 0 | 内边距 |
lineHeight | number | 1.2 | 行高 |
textBgColor | string | "" | 文本背景色 |
图形特定属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
radius | number | 0 | 半径 |
radiusX | number | 20 | 水平半径 |
radiusY | number | 80 | 垂直半径 |
innerRadius | number | 10 | 内圆半径 |
outerRadius | number | 20 | 外圆半径 |
startAngle | number | 0 | 起始角度 |
endAngle | number | 360 | 结束角度 |
sides | number | 3 | 边数 |
numPoints | number | 5 | 星形角数 |
points | number[] | [] | 点坐标数组 |
closed | boolean | true | 是否闭合 |
tension | number | 0 | 线条张力 |
bezier | boolean | false | 是否使用贝塞尔曲线 |
pointStart | object | {x: 0, y: 0} | 起点坐标 |
pointEnd | object | {x: 0, y: 0} | 终点坐标 |
strokeGradient | string[] | [] | 描边渐变色数组 |
fillGradient | string[] | [] | 填充渐变色数组 |
方法
构造函数
typescript
constructor(config: IShapeOptional, canvas: ICanvas)config: 可选的配置对象canvas: 画布实例
绘制方法
draw(ctx: CanvasRenderingContext2D): void
绘制图形到画布上下文
ctx: Canvas 2D 渲染上下文
isPointInPath(x: number, y: number, shapeId: string): boolean
检测点是否在图形内
x: 点的X坐标y: 点的Y坐标shapeId: 图形ID(可选)- 返回值: 是否在图形内
设置方法
元素迭代
clone(count: number,actions:null|(el:Shape,index:number) => void): Shape[]
位置和尺寸
setX(value: number): ShapesetY(value: number): ShapesetWidth(value: number): ShapesetHeight(value: number): Shape
样式设置
setFill(value: string): ShapesetStroke(value: string): ShapesetStrokeWidth(value: number): ShapesetOpacity(value: number): ShapesetVisible(value: boolean): Shape
变换设置
setRotation(value: number): ShapesetScaleX(value: number): ShapesetScaleY(value: number): ShapesetOffsetX(value: number): ShapesetOffsetY(value: number): ShapesetRotateCenter(center: CanvasRotateCenter): Shape
交互设置
setDraggable(value: boolean): ShapesetBubbleEvent(value: boolean): ShapesetZindex(value: number): ShapesetClip(value: boolean): Shape
线条样式
setLineDash(value: number[]): Shape
事件方法
addEventListener(eventName: CanvasEventType, listener: IEventShapeListener): Shape
添加事件监听器
eventName: 事件类型listener: 事件处理函数- 返回值: 当前Shape实例
removeEventListener(eventName: CanvasEventType, listener: IEventShapeListener): Shape
移除事件监听器
eventName: 事件类型listener: 事件处理函数- 返回值: 当前Shape实例
toggle(call: (status: boolean, target: any) => void): void
设置切换回调函数
call: 切换状态回调函数
工具方法
setAttr(key: string, value: any): void
设置属性值
key: 属性名value: 属性值
getAttr(key: string): any | null
获取属性值
key: 属性名- 返回值: 属性值
getBoundRect(): IShapeBoundRect
获取边界矩形
- 返回值: 边界矩形对象
update(): Shape
更新图形状态
- 返回值: 当前Shape实例
使用示例
typescript
// 创建基础图形配置
const config = {
x: 100,
y: 100,
width: 200,
height: 150,
fill: "#ff0000",
stroke: "#000000",
strokeWidth: 2,
opacity: 0.8,
rotation: 45,
draggable: true
};
// 创建图形实例
const shape = new Shape(config, canvas);
// 添加事件监听
shape.addEventListener('click', (event) => {
console.log('图形被点击了', event);
});
// 设置切换回调
shape.toggle((status, target) => {
console.log('图形状态切换:', status);
});
// 修改图形属性
shape.setFill("#00ff00")
.setRotation(90)
.setOpacity(0.5);注意事项
- 所有图形类都继承自Shape基类
- 支持链式调用设置属性
- 事件系统支持冒泡机制
- 支持多种变换操作(旋转、缩放、偏移)
- 渐变效果通过数组配置
- 自定义图形需要继承Shape并实现draw方法
- 点击检测需要考虑旋转和缩放变换
- 边界矩形计算基于实际绘制区域
