mxgraph介绍
github地址:https://github.com/jgraph/mxg...,源码地址:https://github.com/jgraph/mxg... javascript
效果能够参考 [https://app.diagrams.net/],实现相似 visio 画图的效果,流程图是它主要的一个用途
mxgraph 是一个绘图框架,除了javascript版本,还有java版本,c#版本等 html
咱们使用的是javascript版本用于web端,mxgraph 只实现了画图最核心的功能, 官方内置了不少简单的demo,也有grapheditor等复杂的带快捷键、工具栏,菜单功能的demojava
mxgraph 能兼容 ie8 等比较老的浏览器,所以代码中也有不少处理兼容性的代码,在主流浏览器中使用 svg 实现绘图,但代码中使用了 canvas 做为变量,可能容易误觉得是 canvas 来实现的。 git
根据业务需求,咱们须要进行大量的自定义扩展(oop方式),因此须要进行大量的源码阅读,理解其实现方式,并扩展实现本身的功能。github
网上关于mxgraph的介绍可参考: [mxGraph 入门实例教程]: https://segmentfault.com/a/11...web
官方文档: https://jgraph.github.io/mxgr... json
官方api说明:https://jgraph.github.io/mxgr...canvas
mxgraph源码目录结构
1. view
负责图形的渲染,内部逻辑控制,对外提供api
- 核心类 mxGraph,使用了调停者模式,经过扩展这个类,能够自定义不少功能, 咱们外部使用的不少 api 都在这个文件内
- mxGraphView: 元件从新渲染逻辑,计算元件位置、背景网格等
- mxCell:保存元件的位置信息(geometry)
- mxCellState: 根据mxCell数据,保存元件真实位置,mxGraphView每次从新渲染会从新生成
- mxCellRenderer: 根据mxCellState信息渲染出svg图形、label、control
- mxEdgeStyle: 链接线的形状,支持直线、折线等其余形状,目前使用的是 elbowEdgeStyle
- mxPerimeter: 不一样形状的边缘位置计算方法
2. util
主要工具类实现:日志打印、底层画图api、工具栏、撤销、请求、拖拽
mxPoint、mxRectangle等基本数据类型
mxEventSource,mxEventObject 实现发布订阅模式c#
3. model
核心模块mxGraphModel,全部对mxCell的操做都都由这个模块负责,改变mxCell的geometry、父元素、value、style等,撤销功能主要由mxUndoManager、mxUndoableEdit、和这个目录下的文件实现segmentfault
4. handle
文件夹内包含了处理鼠标事件的类,好比鼠标选中、图形放大、缩小、鼠标拖动选中多个图形效果等
5. shape
文件夹下包含了常见的形状、正方形、圆形、椭圆、多边形、还能够自定义各类形状、基类 mxShape
mxSwimlane 是流程图中比较常见的一种形状:泳道,目前没有使用到,代码中有出现相关逻辑,须要注意下
6. layout
包含了处理图形展现的类,各类布局方式,树形布局、圆形布局等,暂时不须要了解
7. io
内部的序列化实现,采用xml形式,目前已实现了json格式的序列化方式,暂不须要关心这部分
8. editor
简单快捷键、菜单支持,这部分功能将本身实现,暂不须要关心这部分
mxgraph架构及运行流程
- mxGraph: 启动模块,负责关联内部其余模块,实现总体功能,控制画布的api都在这个模块
- mxGraphView: 计算元件位置,调用mxCellRenderer渲染元件,控制总体渲染逻辑
- mxGraphModel:处理mxCell属性,元件父子关系,实现撤销功能等,全部对mxCell的修改操做都由这个模块完成
- mxCell: 表明一个图形元件,能够是图形,也能够是边,vertex表明元件,edge表明边
- mxCellState: 根据mxCell中的位置,计算出的真实位置保存在这个模块
- mxConnectionHandler: 负责2个元件以前的链接线,自带的鼠标hover链接点效果
- mxGraphHandler: 元件选中效果
- mxVertexHandler: 元件resize效果
- mxRubberband: 鼠标按住左键,批量选中效果
- mxPanningHandler: 鼠标按住右键拖动画布效果
- mxEdgeHandler:链接线移动,改变线段位置
- mxCellMarker: 元件高亮效果
- mxPerimeter: 计算元件的边缘,用来计算链接线的起始点位置和终点位置
- mxGeometry: 坐标、宽度、高度,用于mxCell,relative属性表示相对于父容器布局,区间为0-1,[0,0]表明父容器左上角,[1,1]表明父容器右下角
- mxGuide:元件和其余元件出现水平或垂直对齐时,将出现对齐线段
- mxConstraintHandler: 框架内置的元件链接点,目前没有使用这个功能,不知足需求
- mxUndoManager:配合mxGraphModel、mxUndoableEdit实现撤销功能
其中不少模块都继承了mxEventSource,以实现发布订阅模式,内部也很是多的使用了这个模式。
好比mxGraphView监听鼠标事件,而后通知全部的handler处理这些事件,以实现对应的交互效果。
每次添加元件、删除元件、撤销操做、移动,都会触发对应的事件,外部只须要监听对应模块的对应事件,就能够作一些特殊判断等。
主要流程:
- mxGraph初始化,生成内部实例mxGraphView、mxGraphModel、各类须要的handler等
- mxGraph调用mxGraphView初始化dom容器,mxGraphView绑定鼠标点击事件,并生成背景网格
- 触发外部事件:
3.1 外部添加、删除元件,调用mxGraph.importCells、removeCells等方法,触发mxGraphModel修改mxCell属性,而后通知mxGraphView从新渲染整个画布,从新计算mxCellState,调用mxCellRenderer渲染单个元件
3.2 鼠标选中等事件,mxGraphView监听鼠标事件,通知对应的handler模块,handler模块调用mxGraph模块,mxGraph通知mxGraphModel修改mxCell属性,从新渲染
撤销功能实现原理:
- mxGraphModel有2个使用频率很高的api,beginUpdate和endUpdate,各个demo中都使用了这2个api,能够嵌套使用,用来记录一次操做,以支持撤销。
- 因为mxCell保存了画布全部元件,每次新增元件、移动位置操做都将经过mxGraphModel生成一个mxUndoableEdit对象,里面维护了多个修改操做,由各类Change组成,
model文件夹下的各个Change模块是实际执行撤销操做的,内部维护了previous属性,用来进行撤销操做。
mxgraph 经常使用函数、属性、style属性
mxGraph
表明一个画布实例,能够对画布放大、缩小、移动、撤销、
使用到的方法介绍:
- insertVertex: 插入元件
- insertEdge: 插入链接线
- setPanning:支持按住鼠标右键移动
- groupCells:将元件封装成一个新的元件
- cellsAdded:当新的元件添加到画布时触发
- translateCell:移动指定元件
- resizeCell: 缩放元件
- getBoundingBoxFromGeometry:获取指定元件组成的范围大小
- center: 将画布位置居中显示
- setCellStyles: 给元件设置新的样式,改变元件颜色,宽高等
- zoomIn: 放大画布
- zoomOut: 缩小画布
mxCellRenderer
- redrawLabel: 控制元件的label是否显示
- isShapeEvent: 控制是否响应元件的事件
- redraw: 从新渲染单个元件
mxConnectionHandler
mxGraphView
- validate:从新渲染画布
- validateCellState: 从新计算元件的真实宽高
- getPerimeterPoint: 计算链接点的起始点、终点位置
mxGraphModel(这个模块的函数主要由mxGraph调用)
- cloneCells: clone元件
- remove: 删除元件
- add: 添加元件
- setVisible: 设置是否可见
- beginUpdate: 开始一个事物(撤销功能)
- endUpdate: 结束一个事物(撤销功能)
mxCellMarker(引用mxCellHighlight实现高亮效果)
- process: 处理鼠标事件,判断是否高亮元件
- intersects: 判断鼠标是否在元件的中心
mxCell(表明一个图形,包括元件和链接线)
- value: 元件的label值
- style: 当前图形的样式
- vertex: 是不是元件
- edge: 是不是链接线
- children: 列表,当前图形的子图形
元件style属性列表,不一样元件会有本身的私有属性,下面是通用的一些属性
- width 元件宽度
- height 元件高度
- shape 当前元件的形状
- fillColor 元件填充颜色
- strokeColor 元件图形颜色
- align label对齐方式
- opacity 透明度
- flipH 水平翻转
- rotation 选择角度