问题
之所以进行自定义 Shape 方案的优化,主要是为了解决以下问题:
- 降低用户的使用门槛,尽可能得减少新概念。
目前自定义 Shape 的接口定义如下,相比于 3.x 新增了update()、destroy()和setState()接口,这次优化在考虑是否有必要释放? 
/** 注册具体 shape 需要实现的接口 */export interface RegisterShape {/** 计算绘制需要的关键点,在注册具体的 shape 时由开发者自己定义 */readonly getPoints?: (pointInfo: ShapePoint) => Point[];/** 获取 shape 对应的缩略图样式配置,在注册具体的 shape 时由开发者自己定义 */readonly getMarker?: (color: string, isInPolar: boolean) => ShapeMarkerCfg;/** 绘制 */readonly draw: (cfg: ShapeDrawCFG, container: Element) => IShape | IGroup;/** 更新 shape */readonly update: (cfg: ShapeDrawCFG, container: Element) => void;/** 销毁 */readonly destroy?: (cfg: ShapeDrawCFG, container: Element) => void;/** 响应状态量 */readonly setState?: (stateName: string, stateStatus: boolean, element: Element) => void;}
- 动画,主要是整体动画的支持。
因为 Geometry 层添加了数据更新机制,同时在自定义 Shape 层面开放了draw()
、update()、destroy()接口,所以目前的设计是将所有的动画在自定义 Shape 中实现。但是这个方案就导致了以下问题:- 不支持整体动画,只支持 Shape 自己的动画,这样就导致了 3.x 很多图表丑陋的出场动画无力优化…
 - 由于在 draw()/update() 阶段,用户可以对 shape 进行动画操作,而有的动画操作会改变 shape 原本的图形属性,这样就导致了用户获取到的 shape 原始属性不正确,这个对交互的影响较大。
 
 - 如何保存 shape 的原始样式,用于状态量管理(
setState()) 
方案
虚拟 Group
- 自定义 Shape  只开放 
draw()和getMarker()方法,降低开发编码和用户使用问题 - element 上进行个体动画,Geometry 层开放入场的整体动画
 - element 上的更新以及 setState() 方法使用虚拟 Group 的方式创建 Shape,解决 originStyle 的问题。
 
