1.1.2 • Published 10 months ago

svg-painter v1.1.2

Weekly downloads
-
License
MIT
Repository
github
Last release
10 months ago

功能安装

npm install svg-painter

基本原理依赖于:Paper.js

使用方法

初始化

在HTML模版中添加SVG元素依赖

说明:需要有一个区域用于canvas的绘制

如果需要绘制多个区域,可以添加多个canvas

<canvas id="myCanvas" width="800" height="600"></canvas>

配置SVG使用元素

import svgInit from 'svg-painter';
const svgPainter = svgInit()

svgPainter.EXP_init({
  canvasSelector: '#myCanvas', // svg的选择器,默认为 #myCanvas
  drawEnable: false, // 启用绘制,默认为false
  dragMoveBgEnable: false, // 是否可以拖拽背景,缩放大背景:注意:这个和拖动绘制会产生冲突,拖拽结束后记得关
  dragMoveOptions: {
    minScale: 1, // 最小缩放比例
    maxScale: 3, // 最大缩放比例
  }
})

设置背景图

说明:背景图加载的尺寸会是直接铺面目标canvas,自动大小缩放,所以尽量贴合比例

svgPainter.EXP_loadBackground('cat.jpg', async (img) => {
  console.log('背景图加载完成')
})

添加普通图片区域

说明:绘制普通图片区域,绘制之后的图片可以拖拽更换位置;支持事件

  svgPainter.EXP_drawImage(imgPath, positionX, positionY, imgName)
  svgPainter.EXP_drawImage('./Camera.png', 100, 100, '图标2')

绘制线条

说明:绘制普通线条;支持事件。线条有一些基本属性,具体参考官网地址

path属性参照:http://paperjs.org/reference/path/#strokecolor

const path = svgPainter1.EXP_drawLine([{x: 0, y: 0}, {x: 50, y: 50}, {x: 30, y: 90}], '标记-直线1', {
  strokeColor: '#ff0000',
  strokeWidth: 8,
})
path.smooth() // 曲线
path.closed() // 控制是否闭合
path.strokeWidth = 10 // 线宽
path.fillColor = '#ff0000' // 填充颜色
path.opacity = 0.5 // 透明度
// path.simplify(level=0) // 用于点位的自动缩减,一般用不上

添加区域线条绘制 - 贝塞尔曲线

说明:尝试用线条去拟合已有的区域,形成画线效果;支持事件

svgPainter1.EXP_drawAreaLine([areaName1, areaName2, areaName3], lineName)
const path2 = svgPainter1.EXP_drawAreaLine(['图标1', '图标2', '图标3'], '标记-线条1', {
  strokeColor: '#00ff00',
  strokeWidth: 8,
})
path2.strokeWidth = 10 // 线宽
path2.fillColor = '#ff0000' // 填充颜色

添加文字标记

说明:添加普通文字绘制;支持事件

const path3 = svgPainter1.EXP_drawText('你好,我是测试文字', 50, 50, '标记-文字1', {
  strokeColor: '#0000ff',
})

添加绘制区域 - 用户一次性绘制,绘制完成之后用户可以自己调整边界;

单击边缘会添加一个节点 shift + 单击,会删除一个节点

const area1 = svgPainter.EXP_startDraw(areaName, fillColor = randomColor)
const area2 = svgPainter.EXP_startDraw('区域-头部', '#ccaabb88')

特殊绘制功能

说明:绘制区域,绘制完成之后用户可以自己调整边界;支持事件 用于绘制一些目前不支持的元素,例如Rectangle、Path.Circle等

// 主体对象在:svgPainter.svgConfig.scope上
svgPainter.svgConfig.scope.activate()
const rect = svgPainter.svgConfig.scope.Rectangle([0, 0], [25, 25])
rect.center = view.center // 绘制在正中间

// 自定义数据的绑定 rect.data = { area_name: '区域的名字', // 区域名会用于查询 area_type: '自己取一个类名-用来给自己看的', } // 自定义数据进一步绑定 for(const name in rect.data) { rectname = rect.dataname } // 事件绑定,否则无法触发事件 svgPainter.bindPathEvent(rect)

### 修改区域填充颜色
```js
const area = svgPainter.EXP_changeAreaFillColor(areaName, fillColor = randomColor)
const area = svgPainter.EXP_changeAreaFillColor('区域-头部', '#ff0000')

获取所有区域 - 一般用于调试用

svgPainter.EXP_areaGetAll()

获取单个区域(包括图片区域) - 一般用于调试用

const area = svgPainter.EXP_findAreaByName('区域-头部')

调整绘制区域为可缩放、可拖拽 - 使用鼠标滚轮缩放(1-3倍),之后就可以随意拖拽

注意:启用可以拖拽之后会和绘制功能有冲突,因为肯定会争抢鼠标,所以拖拽结束后,需要禁用拖拽功能

// 启用缩放、拖拽
svgPainter.EXP_enableDragMoveBg()
// 禁用缩放、拖拽
svgPainter.EXP_disableDragMoveBg()

导出JSON结果 - 推荐

svgPainter.EXP_exportJSON()
// 或者
svgPainter.svgConfig.scope.activate() // 需要先激活scope,否则多个会出现冲突
svgPainter.svgConfig.scope.paper.project.exportJSON()

导入JSON结果 - 推荐

svgPainter.EXP_importJSON(exported_json)
// 或者下面方法(注意有缺陷)
svgPainter.svgConfig.scope.activate() // 需要先激活scope,否则多个会出现冲突
svgPainter.svgConfig.scope.paper.project.importJSON(exported_json) // 但是这种方法会丢失函数触发

导出完整SVG

建议使用JSON方案,SVG方案需要图片支持跨域

svgPainter.EXP_exportAllSVG()

导出部分SVG

svgPainter.EXP_exportAreaSVG(area_names = ['区域-头部', '区域-身体'])

事件触发

取消所有元素的选中

svgPainter.EXP_deselectAll()

区域点击

svgPainter.EXP_areaEvent('click', (event, path) => {
  console.log('我的自定义函数Click:' + path.area_name, event)
})

鼠标进入区域

svgPainter.EXP_areaEvent('mouseenter', (event, path) => {
  console.log('我的自定义函数Enter:' + path.area_name, event)
})

鼠标移出区域

svgPainter.EXP_areaEvent('mouseleave', (event, path) => {
  console.log('我的自定义函数Leave:' + path.area_name, event)
})

区域内鼠标移动

svgPainter.EXP_areaEvent('mousemove', (event, path) => {
  console.log('我的自定义函数Leave:' + path.area_name, event)
})

区域拖拽事件

注意:缩放比例为1的时候,不会有拖拽事件触发(因为肯定拖不动)

// 这个函数可以用于html元素不跟随,此时,可以用回调来销毁html元素
svgPainter.EXP_areaEvent('dragmove', (event) => {
  console.log('我的自定义函数dragmove:', event)
})

区域缩放事件

// 这个函数可以用于html元素不跟随,此时,可以用回调来销毁html元素
svgPainter.EXP_areaEvent('wheel', (event) => {
  console.log('我的自定义函数wheel:', event)
})

其他说明

图层优先级

【图片 = 文字】 > 【画线|直线|曲线】 > 【手绘区域】 > 【背景图】

事件触发

点击顶层元素,不会穿透到下一层 其次不存在事件层级关系,只有绘制元素的层级关系,所以也不存在时间冒泡等

缩放说明

缩放参数:svgPainter.svgConfig.curDrawScale = 当前缩放比例 get|set 缩放中心:svgPainter.svgConfig.curDrawScaleCenter = 当前缩放中心点 get|set

1.1.1

10 months ago

1.1.0

10 months ago

1.0.9

10 months ago

1.0.8

10 months ago

1.0.7

10 months ago

1.1.2

10 months ago

1.0.6

10 months ago

1.0.5

10 months ago

1.0.4

10 months ago

1.0.3

10 months ago

1.0.2

10 months ago

1.0.1

10 months ago

1.0.0

10 months ago