| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974 |
- [ENGLISH](./README_EN.md)
- <h1 align="center">CRender</h1>
- <p align="center">
- <a href="https://travis-ci.com/jiaming743/CRender"><img src="https://img.shields.io/travis/com/jiaming743/CRender.svg" alt="Travis CI"></a>
- <a href="https://github.com/jiaming743/CRender/blob/master/LICENSE"><img src="https://img.shields.io/github/license/jiaming743/CRender.svg" alt="LICENSE" /></a>
- <a href="https://www.npmjs.com/package/@jiaminghi/c-render"><img src="https://img.shields.io/npm/v/@jiaminghi/c-render.svg" alt="version" /></a>
- </p>
- ### CRender是干什么的?
- - 它是一个基于**canvas**的**矢量**图形渲染插件。
- - 它对图形提供动画和鼠标事件支持。
- ### npm安装
- ```shell
- $ npm install @jiaminghi/c-render
- ```
- ### 快速体验
- ```html
- <!--资源位于个人服务器仅供体验和测试,请勿在生产环境使用-->
- <!--调试版-->
- <script src="http://lib.jiaminghi.com/crender/crender.map.js"></script>
- <!--压缩版-->
- <script src="http://lib.jiaminghi.com/crender/crender.min.js"></script>
- <script>
- const { CRender, extendNewGraph } = window.CRender
- // do something
- </script>
- ```
- 详细文档及示例请移步[HomePage](http://crender.jiaminghi.com).
- - [使用](#使用)
- - [Class CRender](#class-crender)
- - [Class Graph](#class-graph)
- - [Class Style](#class-style)
- - [示例](#示例)
- - [扩展新图形](#扩展新图形)
- - [相关支持](#相关支持)
- ------
- <h3 align="center">使用</h3>
- ```javascript
- import CRender from '@jiaminghi/c-redner'
- const canvas = document.getElementById('canvas')
- // 实例化 CRender
- const render = new CRender(canvas)
- // 向render中添加图形
- const circle = render.add({ name: 'circle', ... })
- ```
- <h3 align="center">Class CRender</h3>
- ### 类
- ```javascript
- /**
- * @description Class of CRender
- * @param {Object} canvas Canvas 节点
- * @return {CRender} CRender实例
- */
- class CRender {
- // ...
- }
- ```
- ### 实例属性
- - [ctx](#ctx)
- - [area](#area)
- - [animationStatus](#animationStatus)
- - [graphs](#graphs)
- - [color](#color)
- - [bezierCurve](#bezierCurve)
- #### ctx
- ```javascript
- /**
- * @description canvas context
- * @type {Object}
- * @example ctx = canvas.getContext('2d')
- */
- ```
- #### area
- ```javascript
- /**
- * @description canvas宽高
- * @type {Array<Number>}
- * @example area = [300,100]
- */
- ```
- #### animationStatus
- ```javascript
- /**
- * @description render是否处于动画渲染中
- * @type {Boolean}
- * @example animationStatus = true|false
- */
- ```
- #### graphs
- ```javascript
- /**
- * @description 已添加的图形
- * @type {Array<Graph>}
- * @example graphs = [Graph, Graph, ...]
- */
- ```
- #### [color](https://github.com/jiaming743/color)
- ```javascript
- /**
- * @description 颜色插件
- * @type {Object}
- */
- ```
- #### [bezierCurve](https://github.com/jiaming743/BezierCurve)
- ```javascript
- /**
- * @description 贝塞尔曲线插件
- * @type {Object}
- */
- ```
- ### 原型方法
- - [add](#add)
- 向render中添加图形
- - [clone](#clone)
- 克隆一个图形
- - [delGraph](#delGraph)
- 删除render中的一个图形
- - [delAllGraph](#delAllGraph)
- 删除render中所有的图形
- - [drawAllGraph](#drawAllGraph)
- 渲染render中所有的图形
- - [clearArea](#clearArea)
- 擦除canvas绘制区域
- - [launchAnimation](#launchAnimation)
- 使动画队列不为空且animationPause不为false的图形进行动画
- #### add
- ```javascript
- /**
- * @description 向render中添加图形
- * @param {Object} config 图形配置
- * @return {Graph} 图形实例
- */
- CRender.prototype.add = function (config = {}) {
- // ...
- }
- ```
- #### Clone
- ```javascript
- /**
- * @description 克隆一个图形
- * @param {Graph} graph 将要被克隆的图形
- * @return {Graph} 克隆的图形
- */
- CRender.prototype.clone = function (graph) {
- }
- ```
- #### delGraph
- ```javascript
- /**
- * @description 删除render中的一个图形
- * @param {Graph} graph 将要删除的图形实例
- * @return {Undefined} 无返回值
- */
- CRender.prototype.delGraph = function (graph) {
- // ...
- }
- ```
- #### delAllGraph
- ```javascript
- /**
- * @description 删除render中所有的图形
- * @return {Undefined} 无返回值
- */
- CRender.prototype.delAllGraph = function () {
- // ...
- }
- ```
- #### drawAllGraph
- ```javascript
- /**
- * @description 渲染render中所有的图形
- * @return {Undefined} 无返回值
- */
- CRender.prototype.drawAllGraph = function () {
- // ...
- }
- ```
- #### clearArea
- ```javascript
- /**
- * @description 擦除canvas绘制区域
- * @return {Undefined} 无返回值
- */
- CRender.prototype.clearArea = function () {
- // ...
- }
- ```
- #### launchAnimation
- ```javascript
- /**
- * @description 使动画队列不为空且animationPause不为false的图形进行动画
- * @return {Promise} Animation Promise
- */
- CRender.prototype.launchAnimation = function () {
- // ...
- }
- ```
- <h3 align="center">Class Graph</h3>
- ### 实例属性
- **当添加一个图形时,你可以配置这些属性。**
- - [visible](#visible)
- - [shape](#shape)
- - [style](#style)
- - [drag](#drag)
- - [hover](#hover)
- - [index](#index)
- - [animationDelay](#animationDelay)
- - [animationFrame](#animationFrame)
- - [animationCurve](#animationCurve)
- - [animationPause](#animationPause)
- - [hoverRect](#hoverRect)
- - [mouseEnter](#mouseEnter)
- - [mouseOuter](#mouseOuter)
- - [click](#click)
- #### visible
- ```javascript
- /**
- * @description 该图形是否可被渲染
- * @type {Boolean}
- * @default visible = true
- */
- ```
- #### shape
- ```javascript
- /**
- * @description 图形形状数据
- * @type {Object}
- */
- ```
- #### [style](#Class-Style)
- ```javascript
- /**
- * @description 图形样式数据 (Style实例)
- * @type {Style}
- */
- ```
- #### drag
- ```javascript
- /**
- * @description 是否启用拖拽功能
- * @type {Boolean}
- * @default drag = false
- */
- ```
- #### hover
- ```javascript
- /**
- * @description 是否启用悬浮检测
- * @type {Boolean}
- * @default hover = false
- */
- ```
- #### index
- ```javascript
- /**
- * @description 图形渲染层级,层级高者优先渲染
- * @type {Number}
- * @default index = 1
- */
- ```
- #### animationDelay
- ```javascript
- /**
- * @description 动画延迟时间(ms)
- * @type {Number}
- * @default animationDelay = 0
- */
- ```
- #### animationFrame
- ```javascript
- /**
- * @description 动画帧数
- * @type {Number}
- * @default animationFrame = 30
- */
- ```
- #### [animationCurve](https://github.com/jiaming743/transition)
- ```javascript
- /**
- * @description 动画缓动曲线
- * @type {String}
- * @default animationCurve = 'linear'
- */
- ```
- #### animationPause
- ```javascript
- /**
- * @description 是否暂停图形动画
- * @type {Boolean}
- * @default animationPause = false
- */
- ```
- #### hoverRect
- ```javascript
- /**
- * @description 矩形悬浮检测盒,配置该项则优先使用其进行鼠标悬浮检测
- * @type {Null|Array<Number>}
- * @default hoverRect = null
- * @example hoverRect = [0, 0, 100, 100] // [矩形起始点 x, y 坐标, 矩形宽, 高]
- */
- ```
- #### mouseEnter
- ```javascript
- /**
- * @description 鼠标进入图形事件处理器
- * @type {Null|Function}
- * @default mouseEnter = null
- */
- ```
- #### mouseOuter
- ```javascript
- /**
- * @description 鼠标移出图形事件处理器
- * @type {Null|Function}
- * @default mouseOuter = null
- */
- ```
- #### click
- ```javascript
- /**
- * @description 鼠标点击图形事件处理器
- * @type {Null|Function}
- * @default click = null
- */
- ```
- #### Tip
- 启用图形的**mouseEnter**,**mouseOuter**,**click**等事件支持需要将`hover`属性配置为`true`。扩展的新图形需要配置**hoverCheck**方法以提供事件支持。
- ### 原型方法
- - [attr](#attr)
- 更新图形状态
- - [animation](#animation)
- 更新图形状态(伴随动画)
- - [animationEnd](#animationEnd)
- 跳至最后一帧动画
- - [pauseAnimation](#pauseAnimation)
- 暂停动画行为
- - [playAnimation](#playAnimation)
- 尝试动画行为
- #### attr
- ```javascript
- /**
- * @description 更新图形状态
- * @param {String} attrName 要更新的属性名
- * @param {Any} change 更新的值
- * @return {Undefined} 无返回值
- */
- Graph.prototype.attr = function (attrName, change = undefined) {
- // ...
- }
- ```
- #### animation
- ```javascript
- /**
- * @description 更新图形状态(伴随动画),仅支持shape和style属性
- * @param {String} attrName 要更新的属性名
- * @param {Any} change 更新的值
- * @param {Boolean} wait 是否存储动画队列,等待下次动画请求
- * @return {Promise} Animation Promise
- */
- Graph.prototype.animation = async function (attrName, change, wait = false) {
- // ...
- }
- ```
- #### animationEnd
- ```javascript
- /**
- * @description 跳至最后一帧动画
- * @return {Undefined} 无返回值
- */
- Graph.prototype.animationEnd = function () {
- // ...
- }
- ```
- #### pauseAnimation
- ```javascript
- /**
- * @description 暂停动画行为
- * @return {Undefined} 无返回值
- */
- Graph.prototype.pauseAnimation = function () {
- // ...
- }
- ```
- #### playAnimation
- ```javascript
- /**
- * @description 尝试动画行为
- * @return {Undefined} 无返回值
- */
- Graph.prototype.playAnimation = function () {
- // ...
- }
- ```
- ### 生命周期
- 当向**render**中添加图形时,你可以配置如下几个方法,它们将在特定时刻被调用。
- - [added](#added)
- 图形添加时被调用
- - [beforeDraw](#beforeDraw)
- 图形绘制前被调用
- - [drawed](#drawed)
- 图形绘制后被调用
- - [beforeMove](#beforeMove)
- 图形移动前被调用
- - [moved](#moved)
- 图形移动后被调用
- - [beforeDelete](#beforeDelete)
- 图形删除前被调用
- - [deleted](#deleted)
- 图形删除后被调用
- #### added
- ```javascript
- /**
- * @description 图形添加时被调用
- * @param {Graph} 图形实例
- */
- config = {
- //...,
- added ({ shape, style }) {
- // 一些操作...
- }
- }
- ```
- #### beforeDraw
- ```javascript
- /**
- * @description 图形绘制前被调用,图形样式已经初始化完毕
- * 你可以在此时修改ctx属性
- * @param {Graph} 图形实例
- * @param {CRender} CRender实例
- */
- config = {
- //...,
- beforeDraw ({ shape, style }, { ctx }) {
- // 一些操作...
- ctx.stroke = 'transparent'
- }
- }
- ```
- #### drawed
- ```javascript
- /**
- * @description 图形绘制后被调用
- * @param {Graph} 图形实例
- * @param {CRender} CRender实例
- */
- config = {
- //...,
- drawed ({ shape, style }, { ctx }) {
- // 一些操作...
- }
- }
- ```
- #### beforeMove
- ```javascript
- /**
- * @description 图形移动前被调用,移动行为发生前
- * @param {Event} 鼠标事件
- * @param {Graph} 图形实例
- */
- config = {
- //...,
- beforeMove ({ offsetX, offsetY }, { shape, style }) {
- // 一些操作...
- }
- }
- ```
- #### moved
- ```javascript
- /**
- * @description 图形移动后被调用,移动行为发生后
- * @param {Event} 鼠标事件
- * @param {Graph} 图形实例
- */
- config = {
- //...,
- moved ({ offsetX, offsetY }, { shape, style }) {
- // 一些操作...
- }
- }
- ```
- #### beforeDelete
- ```javascript
- /**
- * @description 图形删除前被调用
- * @param {Graph} 图形实例
- */
- config = {
- //...,
- beforeDelete ({ shape, style }) {
- // 一些操作...
- }
- }
- ```
- #### deleted
- ```javascript
- /**
- * @description 图形删除后被调用
- * @param {Graph} 图形实例
- */
- config = {
- //...,
- deleted ({ shape, style }) {
- // 一些操作...
- }
- }
- ```
- <h3 align="center">Class Style</h3>
- ### 实例属性
- - [fill](#fill)
- - [stroke](#stroke)
- - [opacity](#opacity)
- - [lineCap](#lineCap)
- - [lineJoin](#)
- - [lineDash](#lineDash)
- - [lineDashOffset](#lineDashOffset)
- - [shadowBlur](#shadowBlur)
- - [shadowColor](#shadowColor)
- - [shadowOffsetX](#shadowOffsetX)
- - [shadowOffsetY](#shadowOffsetY)
- - [lineWidth](#lineWidth)
- - [graphCenter](#graphCenter)
- - [scale](#scale)
- - [rotate](#rotate)
- - [translate](#translate)
- - [hoverCursor](#hoverCursor)
- - [fontStyle](#fontStyle)
- - [fontVarient](#fontVarient)
- - [fontWeight](#fontWeight)
- - [fontSize](#fontSize)
- - [fontFamily](#fontFamily)
- - [textAlign](#textAlign)
- - [textBaseline](#textBaseline)
- - [gradientColor](#gradientColor)
- - [gradientType](#gradientType)
- - [gradientParams](#gradientParams)
- - [gradientWith](#gradientWith)
- - [gradientStops](#gradientStops)
- - [colors](#colors)
- #### fill
- ```javascript
- /**
- * @description 图形填充颜色的Rgba值
- * @type {Array<Number>}
- * @default fill = [0, 0, 0, 1]
- */
- ```
- #### stroke
- ```javascript
- /**
- * @description 图形描边颜色的Rgba值
- * @type {Array<Number>}
- * @default stroke = [0, 0, 0, 1]
- */
- ```
- #### opacity
- ```javascript
- /**
- * @description 图形透明度
- * @type {Number}
- * @default opacity = 1
- */
- ```
- #### lineCap
- ```javascript
- /**
- * @description Ctx的lineCap属性值
- * @type {Null|String}
- * @default lineCap = null
- * @example lineCap = 'butt'|'round'|'square'
- */
- ```
- #### lineJoin
- ```javascript
- /**
- * @description Ctx的lineJoin属性值
- * @type {Null|String}
- * @default lineJoin = null
- * @example lineJoin = 'round'|'bevel'|'miter'
- */
- ```
- #### lineDash
- ```javascript
- /**
- * @description Ctx的lineDash属性值
- * @type {Null|Array<Number>}
- * @default lineDash = null
- * @example lineDash = [10, 10]
- */
- ```
- #### lineDashOffset
- ```javascript
- /**
- * @description Ctx的lineDashOffset属性值
- * @type {Null|Number}
- * @default lineDashOffset = null
- * @example lineDashOffset = 10
- */
- ```
- #### shadowBlur
- ```javascript
- /**
- * @description Ctx的shadowBlur属性值
- * @type {Number}
- * @default shadowBlur = 0
- */
- ```
- #### shadowColor
- ```javascript
- /**
- * @description 图形阴影颜色的Rgba值
- * @type {Array<Number>}
- * @default shadowColor = [0, 0, 0, 0]
- */
- ```
- #### shadowOffsetX
- ```javascript
- /**
- * @description Ctx的shadowOffsetX属性值
- * @type {Number}
- * @default shadowOffsetX = 0
- */
- ```
- #### shadowOffsetY
- ```javascript
- /**
- * @description Ctx的shadowOffsetY属性值
- * @type {Number}
- * @default shadowOffsetY = 0
- */
- ```
- #### lineWidth
- ```javascript
- /**
- * @description Ctx的lineWidth属性值
- * @type {Number}
- * @default lineWidth = 0
- */
- ```
- #### graphCenter
- ```javascript
- /**
- * @description 图形中心点
- * @type {Null|Array<Number>}
- * @default graphCenter = null
- * @example graphCenter = [10, 10]
- */
- ```
- #### scale
- ```javascript
- /**
- * @description 图形缩放倍数
- * @type {Null|Array<Number>}
- * @default scale = null
- * @example scale = [1.5, 1.5]
- */
- ```
- #### rotate
- ```javascript
- /**
- * @description 图形旋转角度
- * @type {Null|Number}
- * @default rotate = null
- * @example rotate = 10
- */
- ```
- #### translate
- ```javascript
- /**
- * @description 图形位移距离
- * @type {Null|Array<Number>}
- * @default translate = null
- * @example translate = [10, 10]
- */
- ```
- #### hoverCursor
- ```javascript
- /**
- * @description 鼠标悬浮在图形上时cursor的值
- * @type {String}
- * @default hoverCursor = 'pointer'
- * @example hoverCursor = 'default'|'pointer'|'auto'|'crosshair'|'move'|'wait'|...
- */
- ```
- #### fontStyle
- ```javascript
- /**
- * @description Ctx的fontStyle属性值
- * @type {String}
- * @default fontStyle = 'normal'
- * @example fontStyle = 'normal'|'italic'|'oblique'
- */
- ```
- #### fontVarient
- ```javascript
- /**
- * @description Ctx的fontVarient属性值
- * @type {String}
- * @default fontVarient = 'normal'
- * @example fontVarient = 'normal'|'small-caps'
- */
- ```
- #### fontWeight
- ```javascript
- /**
- * @description Ctx的fontWeight属性值
- * @type {String|Number}
- * @default fontWeight = 'normal'
- * @example fontWeight = 'normal'|'bold'|'bolder'|'lighter'|Number
- */
- ```
- #### fontSize
- ```javascript
- /**
- * @description Ctx的fontSize属性值
- * @type {Number}
- * @default fontSize = 10
- */
- ```
- #### fontFamily
- ```javascript
- /**
- * @description Ctx的fontFamily属性值
- * @type {String}
- * @default fontFamily = 'Arial'
- */
- ```
- #### textAlign
- ```javascript
- /**
- * @description Ctx的textAlign属性值
- * @type {String}
- * @default textAlign = 'center'
- * @example textAlign = 'start'|'end'|'left'|'right'|'center'
- */
- ```
- #### textBaseline
- ```javascript
- /**
- * @description Ctx的textBaseline属性值
- * @type {String}
- * @default textBaseline = 'middle'
- * @example textBaseline = 'top'|'bottom'|'middle'|'alphabetic'|'hanging'
- */
- ```
- #### gradientColor
- ```javascript
- /**
- * @description 用于创建渐变色的颜色
- * @type {Null|Array<String>}
- * @default gradientColor = null
- * @example gradientColor = ['#000', '#111', '#222']
- */
- ```
- #### gradientType
- ```javascript
- /**
- * @description 渐变类型
- * @type {String}
- * @default gradientType = 'linear'
- * @example gradientType = 'linear' | 'radial'
- */
- ```
- #### gradientParams
- ```javascript
- /**
- * @description 渐变参数
- * @type {Array<Number>}
- * @default gradientParams = null
- * @example gradientParams = [x0, y0, x1, y1] (线性渐变)
- * @example gradientParams = [x0, y0, r0, x1, y1, r1] (径向渐变)
- */
- ```
- #### gradientWith
- ```javascript
- /**
- * @description 使用渐变色的属性
- * @type {String}
- * @default gradientWith = 'stroke'
- * @example gradientWith = 'stroke' | 'fill'
- */
- ```
- #### gradientStops
- ```javascript
- /**
- * @description 渐变色位置
- * @type {String|Array<Number>}
- * @default gradientStops = 'auto'
- * @example gradientStops = 'auto' | [0, .2, .3, 1]
- */
- ```
- #### colors
- ```javascript
- /**
- * @description 支持动画过渡的颜色容器
- * @type {Array<String>|Object}
- * @default colors = null
- * @example colors = ['#000', '#111', '#222']
- * @example colors = { a: '#000', b: '#111' }
- */
- ```
- #### Tip
- `gradientColor`和`gradientParams`被配置后将自动启用**渐变**。
- ### 原型方法
- - [getStyle](#getStyle)
- 获取图形当前样式配置
- #### getStyle
- ```javascript
- /**
- * @description 获取图形当前样式配置
- * @return {Object} 样式配置
- */
- Style.prototype.getStyle = function () {
- }
- ```
- <h3 align="center">示例</h3>
- CRender提供如下基础矢量图形。
- - [圆形](#圆形)
- - [椭圆形](#椭圆形)
- - [矩形](#矩形)
- - [环形](#环形)
- - [弧形](#弧形)
- - [扇形](#扇形)
- - [正多边形](#正多边形)
- - [折线](#折线)
- - [折线(闭合)](#折线(闭合))
- - [光滑曲线](#光滑曲线)
- - [光滑曲线(闭合)](#光滑曲线(闭合))
- - [贝塞尔曲线](#贝塞尔曲线)
- - [贝塞尔曲线(闭合)](#贝塞尔曲线(闭合))
- - [文本](#文本)
- #### 圆形
- ##### shape属性
- | 属性名 | 类型 | 默认值 | 注解 |
- | :---: | :---: | :---: | :---: |
- | rx | `Number` | `0` | 圆心x轴坐标 |
- | ry | `Number` | `0` | 圆心y轴坐标 |
- | r | `Number` | `0` | 圆半径 |
- ```javascript
- const { area: [w, h] } = render
- const circleConfig = {
- name: 'circle',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- rx: w / 2,
- ry: h / 2,
- r: 50
- },
- style: {
- fill: '#9ce5f4',
- shadowBlur: 0,
- shadowColor: '#66eece',
- hoverCursor: 'pointer'
- },
- mouseEnter (e) {
- this.animation('shape', { r: 70 }, true)
- this.animation('style', { shadowBlur: 20 })
- },
- mouseOuter (e) {
- this.animation('shape', { r: 50 }, true)
- this.animation('style', { shadowBlur: 0 })
- }
- }
- const circle = render.add(circleConfig)
- ```
- #### 椭圆形
- ##### shape属性
- | 属性名 | 类型 | 默认值 | 注解 |
- | :---: | :---: | :---: | :---: |
- | rx | `Number` | `0` | 圆心x轴坐标 |
- | ry | `Number` | `0` | 圆心y轴坐标 |
- | hr | `Number` | `0` | 横轴半径 |
- | vr | `Number` | `0` | 竖轴半径 |
- ```javascript
- const { area: [w, h] } = render
- const ellipseConfig = {
- name: 'ellipse',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- rx: w / 2,
- ry: h / 2,
- hr: 80,
- vr: 30
- },
- style: {
- fill: '#9ce5f4',
- shadowBlur: 0,
- shadowColor: '#66eece',
- scale: [1, 1],
- hoverCursor: 'pointer'
- },
- mouseEnter (e) {
- this.animation('style', { scale: [1.5, 1.5], shadowBlur: 20 })
- },
- mouseOuter (e) {
- this.animation('style', { scale: [1, 1], shadowBlur: 0 })
- }
- }
- const ellipse = render.add(ellipseConfig)
- ```
- #### 矩形
- ##### shape属性
- | 属性名 | 类型 | 默认值 | 注解 |
- | :---: | :---: | :---: | :---: |
- | x | `Number` | `0` | 矩形左上角x轴坐标 |
- | y | `Number` | `0` | 矩形左上角y轴坐标 |
- | w | `Number` | `0` | 矩形宽度 |
- | h | `Number` | `0` | 矩形高度 |
- ```javascript
- const { area: [w, h] } = render
- const rectConfig = {
- name: 'rect',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- x: w / 2 - rectWidth / 2,
- y: h / 2 - rectHeight / 2,
- w: rectWidth,
- h: rectHeight
- },
- style: {
- fill: '#9ce5f4',
- shadowBlur: 0,
- shadowColor: '#66eece',
- hoverCursor: 'pointer',
- translate: [0, 0]
- },
- mouseEnter (e) {
- this.animation('shape', { w: 400 }, true)
- this.animation('style', { shadowBlur: 20, translate: [-100, 0] })
- },
- mouseOuter (e) {
- this.animation('shape', { w: 200 }, true)
- this.animation('style', { shadowBlur: 0, translate: [0, 0] })
- }
- }
- const rect = render.add(rectConfig)
- ```
- #### 环形
- ##### shape属性
- | 属性名 | 类型 | 默认值 | 注解 |
- | :---: | :---: | :---: | :---: |
- | rx | `Number` | `0` | 中心点x轴坐标 |
- | ry | `Number` | `0` | 中心点y轴坐标 |
- | r | `Number` | `0` | 环半径 |
- ```javascript
- const { area: [w, h] } = render
- const ringConfig = {
- name: 'ring',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- rx: w / 2,
- ry: h / 2,
- r: 50
- },
- style: {
- stroke: '#9ce5f4',
- lineWidth: 20,
- hoverCursor: 'pointer',
- shadowBlur: 0,
- shadowColor: '#66eece'
- },
- mouseEnter (e) {
- this.animation('style', { shadowBlur: 20, lineWidth: 30 })
- },
- mouseOuter (e) {
- this.animation('style', { shadowBlur: 0, lineWidth: 20 })
- }
- }
- const ring = render.add(ringConfig)
- ```
- #### 弧形
- ##### shape属性
- | 属性名 | 类型 | 默认值 | 注解 |
- | :---: | :---: | :---: | :---: |
- | rx | `Number` | `0` | 中心点x轴坐标 |
- | ry | `Number` | `0` | 中心点y轴坐标 |
- | r | `Number` | `0` | 弧半径 |
- | startAngle | `Number` | `0` | 弧起始弧度值 |
- | endAngle | `Number` | `0` | 弧结束弧度值 |
- | clockWise | `Boolean` | `true` | 是否顺时针 |
- ```javascript
- const { area: [w, h] } = render
- const arcConfig = {
- name: 'arc',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- rx: w / 2,
- ry: h / 2,
- r: 60,
- startAngle: 0,
- endAngle: Math.PI / 3
- },
- style: {
- stroke: '#9ce5f4',
- lineWidth: 20,
- shadowBlur: 0,
- rotate: 0,
- shadowColor: '#66eece',
- hoverCursor: 'pointer'
- },
- mouseEnter (e) {
- this.animation('shape', { endAngle: Math.PI }, true)
- this.animation('style', { shadowBlur: 20, rotate: -30, lineWidth: 30 })
- },
- mouseOuter (e) {
- this.animation('shape', { endAngle: Math.PI / 3 }, true)
- this.animation('style', { shadowBlur: 0, rotate: 0, lineWidth: 20 })
- }
- }
- const arc = render.add(arcConfig)
- ```
- #### 扇形
- ##### shape属性
- | 属性名 | 类型 | 默认值 | 注解 |
- | :---: | :---: | :---: | :---: |
- | rx | `Number` | `0` | 中心点x轴坐标 |
- | ry | `Number` | `0` | 中心点y轴坐标 |
- | r | `Number` | `0` | 扇形半径 |
- | startAngle | `Number` | `0` | 扇形起始弧度值 |
- | endAngle | `Number` | `0` | 扇形结束弧度值 |
- | clockWise | `Boolean` | `true` | 是否顺时针 |
- ```javascript
- const { area: [w, h] } = render
- const sectorConfig = {
- name: 'sector',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- rx: w / 2,
- ry: h / 2,
- r: 60,
- startAngle: 0,
- endAngle: Math.PI / 3
- },
- style: {
- fill: '#9ce5f4',
- shadowBlur: 0,
- rotate: 0,
- shadowColor: '#66eece',
- hoverCursor: 'pointer'
- },
- mouseEnter (e) {
- this.animation('shape', { endAngle: Math.PI, r: 70 }, true)
- this.animation('style', { shadowBlur: 20, rotate: -30, lineWidth: 30 })
- },
- mouseOuter (e) {
- this.animation('shape', { endAngle: Math.PI / 3, r: 60 }, true)
- this.animation('style', { shadowBlur: 0, rotate: 0, lineWidth: 20 })
- }
- }
- const sector = render.add(sectorConfig)
- ```
- #### 正多边形
- ##### shape属性
- | 属性名 | 类型 | 默认值 | 注解 |
- | :---: | :---: | :---: | :---: |
- | rx | `Number` | `0` | 中心点x轴坐标 |
- | ry | `Number` | `0` | 中心点y轴坐标 |
- | r | `Number` | `0` | 外接圆半径 |
- | side | `Number` | `0` | 边数 |
- ```javascript
- const { area: [w, h] } = render
- const regPolygonConfig = {
- name: 'regPolygon',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- rx: w / 2,
- ry: h / 2,
- r: 60,
- side: 6
- },
- style: {
- fill: '#9ce5f4',
- hoverCursor: 'pointer',
- shadowBlur: 0,
- rotate: 0,
- shadowColor: '#66eece'
- },
- mouseEnter (e) {
- this.animation('shape', { endAngle: Math.PI, r: 100 }, true)
- this.animation('style', { shadowBlur: 20, rotate: 180 })
- },
- mouseOuter (e) {
- this.animation('shape', { endAngle: Math.PI / 3, r: 60 }, true)
- this.animation('style', { shadowBlur: 0, rotate: 0 })
- }
- }
- const regPolygon = render.add(regPolygonConfig)
- ```
- #### 折线
- ##### shape属性
- | 属性名 | 类型 | 默认值 | 注解 |
- | :---: | :---: | :---: | :---: |
- | points | `Array` | `[]` | 构成折线的点 |
- | close | `Boolean` | `false` | 是否闭合折线 |
- ```javascript
- const { area: [w, h] } = render
- const top = h / 3
- const bottom = h / 3 * 2
- const gap = w / 10
- const beginX = w / 2 - gap * 2
- const points = new Array(5).fill('').map((t, i) =>
- [beginX + gap * i, i % 2 === 0 ? top : bottom])
- const polylineConfig = {
- name: 'polyline',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- points
- },
- style: {
- stroke: '#9ce5f4',
- shadowBlur: 0,
- lineWidth: 10,
- shadowColor: '#66eece',
- hoverCursor: 'pointer'
- },
- mouseEnter (e) {
- this.animation('style', { lineWidth: 20, shadowBlur: 20 })
- },
- mouseOuter (e) {
- this.animation('style', { lineWidth: 10, shadowBlur: 0 })
- }
- }
- const polyline = render.add(polylineConfig)
- ```
- #### 折线(闭合)
- ```javascript
- const { area: [w, h] } = render
- const top = h / 3
- const bottom = h / 3 * 2
- const gap = w / 10
- const beginX = w / 2 - gap * 2
- const points = new Array(5).fill('').map((t, i) =>
- [beginX + gap * i, i % 2 === 0 ? top : bottom])
- points[2][1] += top * 1.3
- const polylineClosedConfig = {
- name: 'polyline',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- points,
- close: true
- },
- style: {
- fill: '#9ce5f4',
- shadowBlur: 0,
- lineWidth: 10,
- shadowColor: '#66eece',
- hoverCursor: 'pointer'
- },
- mouseEnter (e) {
- this.animation('style', { shadowBlur: 20 }, true)
- const pointsCloned = deepClone(this.shape.points)
- pointsCloned[2][1] += top * 0.3
- this.animation('shape', { points: pointsCloned })
- },
- mouseOuter (e) {
- this.animation('style', { shadowBlur: 0 }, true)
- const pointsCloned = deepClone(this.shape.points)
- pointsCloned[2][1] -= top * 0.3
- this.animation('shape', { points: pointsCloned })
- }
- }
- const polylineClosed = render.add(polylineClosedConfig)
- ```
- #### 光滑曲线
- ##### shape属性
- | 属性名 | 类型 | 默认值 | 注解 |
- | :---: | :---: | :---: | :---: |
- | points | `Array` | `[]` | 构成光滑曲线的点 |
- | close | `Boolean` | `false` | 是否闭合光滑曲线 |
- ```javascript
- const { area: [w, h] } = render
- const top = h / 3
- const bottom = h / 3 * 2
- const gap = w / 10
- const beginX = w / 2 - gap * 2
- const points = new Array(5).fill('').map((t, i) =>
- [beginX + gap * i, i % 2 === 0 ? top : bottom])
- const smoothlineConfig = {
- name: 'smoothline',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- points
- },
- style: {
- stroke: '#9ce5f4',
- shadowBlur: 0,
- lineWidth: 10,
- shadowColor: '#66eece',
- hoverCursor: 'pointer'
- },
- mouseEnter (e) {
- this.animation('style', { lineWidth: 20, shadowBlur: 20 })
- },
- mouseOuter (e) {
- this.animation('style', { lineWidth: 10, shadowBlur: 0 })
- }
- }
- const smoothline = render.add(smoothlineConfig)
- ```
- #### 光滑曲线(闭合)
- ```javascript
- import { getCircleRadianPoint } from '../../CRender/lib/util'
- function getPoints (radius, centerPoint, pointNum) {
- const PIDived = Math.PI * 2 / pointNum
- const points = new Array(pointNum).fill('')
- .map((foo, i) =>
- getCircleRadianPoint(...centerPoint, radius, PIDived * i)
- )
- return points
- }
- const { area: [w, h] } = render
- const radius = h / 3
- const centerPoint = [w / 2, h / 2]
- const smoothlineClosedConfig = {
- name: 'smoothline',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- points: getPoints(radius, centerPoint, 3),
- close: true
- },
- style: {
- fill: '#9ce5f4',
- shadowBlur: 0,
- lineWidth: 10,
- shadowColor: '#66eece',
- hoverCursor: 'pointer'
- },
- mouseEnter (e) {
- this.animation('style', { lineWidth: 20, shadowBlur: 20, rotate: 120 })
- },
- mouseOuter (e) {
- this.animation('style', { lineWidth: 10, shadowBlur: 0, rotate: 0 })
- },
- setGraphCenter (e, { style }) {
- if (e) {
- const { movementX, movementY } = e
- const [cx, cy] = style.graphCenter
- style.graphCenter = [cx + movementX, cy + movementY]
- } else {
- style.graphCenter = [...centerPoint]
- }
- }
- }
- const smoothlineClosed = render.add(smoothlineClosedConfig)
- ```
- #### 贝塞尔曲线
- ##### shape属性
- | 属性名 | 类型 | 默认值 | 注解 |
- | :---: | :---: | :---: | :---: |
- | points | `Array` | `[]` | 构成贝塞尔曲线的点 |
- | close | `Boolean` | `false` | 是否闭合贝塞尔曲线 |
- ```javascript
- const { area: [w, h] } = render
- const offsetX = w / 2
- const offsetY = h / 2
- const points = [
- // 起始点
- [-100 + offsetX, -50 + offsetY],
- // 多段贝塞尔曲线
- [
- // 控制点1,控制点2,结束点
- [0 + offsetX, -50 + offsetY],
- [0 + offsetX, 50 + offsetY],
- [100 + offsetX, 50 + offsetY]
- ],
- // [...],[...]
- ]
- const bezierCurveConfig = {
- name: 'bezierCurve',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- points
- },
- style: {
- lineWidth: 10,
- stroke: '#9ce5f4',
- shadowBlur: 0,
- shadowColor: '#66eece',
- hoverCursor: 'pointer'
- },
- mouseEnter (e) {
- this.animation('style', { lineWidth: 20, shadowBlur: 20 })
- },
- mouseOuter (e) {
- this.animation('style', { lineWidth: 10, shadowBlur: 0 })
- }
- }
- const bezierCurve = render.add(bezierCurveConfig)
- ```
- #### 贝塞尔曲线(闭合)
- ```javascript
- import { getCircleRadianPoint } from '../../CRender/lib/util'
- function getPetalPoints (insideRadius, outsideRadius, petalNum, petalCenter) {
- const PI2Dived = Math.PI * 2 / (petalNum * 3)
- let points = new Array(petalNum * 3).fill('')
- .map((foo, i) =>
- getCircleRadianPoint(...petalCenter,
- i % 3 === 0 ? insideRadius : outsideRadius,
- PI2Dived * i)
- )
- const startPoint = points.shift()
- points.push(startPoint)
- points = new Array(petalNum).fill('')
- .map(foo => points.splice(0, 3))
- points.unshift(startPoint)
- return points
- }
- const { area: [w, h] } = render
- const petalCenter = [w / 2, h / 2]
- const [raidus1, raidus2, raidus3, raidus4] = [h / 6, h / 2.5, h / 3, h / 2]
- const bezierCurveClosedConfig = {
- name: 'bezierCurve',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- shape: {
- points: getPetalPoints(raidus1, raidus2, 6, petalCenter),
- close: true
- },
- style: {
- fill: '#9ce5f4',
- shadowBlur: 0,
- shadowColor: '#66eece',
- hoverCursor: 'pointer'
- },
- mouseEnter (e, { style: { graphCenter } }) {
- this.animation('style', { lineWidth: 20, shadowBlur: 20 }, true)
- this.animation('shape', { points: getPetalPoints(raidus3, raidus4, 6, graphCenter) })
- },
- mouseOuter (e, { style: { graphCenter } }) {
- this.animation('style', { lineWidth: 10, shadowBlur: 0 }, true)
- this.animation('shape', { points: getPetalPoints(raidus1, raidus2, 6, graphCenter) })
- },
- setGraphCenter (e, { style }) {
- if (e) {
- const { movementX, movementY } = e
- const [cx, cy] = style.graphCenter
- style.graphCenter = [cx + movementX, cy + movementY]
- } else {
- style.graphCenter = [...petalCenter]
- }
- }
- }
- const bezierCurveClosed = render.add(bezierCurveClosedConfig)
- ```
- #### 文本
- ##### shape属性
- | 属性名 | 类型 | 默认值 | 注解 |
- | :---: | :---: | :---: | :---: |
- | content | `String` | `''` | 文本内容 |
- | position | `Array` | `[0, 0]` | 文本起始位置 |
- | maxWidth | `Number` | `Undefined` | 文本最大宽度 |
- | rowGap | `Number` | `0` | 行间距 |
- ```javascript
- const { area: [w, h] } = render
- const centerPoint = [w / 2, h / 2]
- const hoverRect = [w / 2 - 100, h / 2 - 30 ,200, 60]
- const textConfig = {
- name: 'text',
- animationCurve: 'easeOutBack',
- hover: true,
- drag: true,
- hoverRect,
- shape: {
- content: 'CRender',
- position: centerPoint,
- maxWidth: 200
- },
- style: {
- fill: '#9ce5f4',
- fontSize: 50,
- shadowBlur: 0,
- rotate: 0,
- shadowColor: '#66eece',
- hoverCursor: 'pointer',
- scale: [1, 1],
- rotate: 0
- },
- mouseEnter (e) {
- this.animation('style', { shadowBlur: 20, scale: [1.5, 1.5], rotate: 30 })
- },
- mouseOuter (e) {
- this.animation('style', { shadowBlur: 0, scale: [1, 1], rotate: 0 })
- },
- moved (e, { hoverRect }) {
- const { movementX, movementY } = e
- hoverRect[0] += movementX
- hoverRect[1] += movementY
- }
- }
- const text = render.add(textConfig)
- ```
- ##### Tip
- * 图形**text**的鼠标事件依赖`hoverRect`属性,如需鼠标事件生效请对其配置
- * 文本中插入`\n`可以进行换行。
- <h3 align="center">扩展新图形</h3>
- CRender提供了一个方法去扩展新的图形,你可以**自定义**想要的图形。
- ```javascript
- import { extendNewGraph } from '@jiaminghi/c-render'
- const graphName = 'newGraph'
- const graphConfig = {
- shape: { ... },
- // ...
- }
- extendNewGraph(graphName, graphConfig)
- ```
- #### extendNewGraph
- ```javascript
- /**
- * @description 扩展新图形
- * @param {String} name 图形名称
- * @param {Object} config 图形配置
- * @return {Undefined} 无返回值
- */
- function extendNewGraph (name, config) {
- // ...
- }
- ```
- #### 图形配置属性
- - [shape](#shape-required)
- - [validator](#validator-required)
- - [draw](#draw-required)
- - [hoverCheck](#hoverCheck)
- - [setGraphCenter](#setGraphCenter)
- - [move](#move)
- - [扩展示例](#扩展示例)
- #### shape (必须)
- ```javascript
- /**
- * @type {Object}
- * @description 图形形状数据
- */
- config = {
- // ...,
- shape: {
- // 一些属性...
- }
- }
- ```
- #### validator (必须)
- ```javascript
- /**
- * @type {Function}
- * @description 图形添加时将被调用,用于检测图形配置是否合法,
- * 若返回值为false则终止添加行为
- * @param {Graph} 当前图形实例
- * @return {Boolean} 配置是否合法
- */
- config = {
- // ...,
- validator ({ shape }) {
- // 检查图形配置...
- // return true | false
- }
- }
- ```
- #### draw (必须)
- ```javascript
- /**
- * @type {Function}
- * @description 图形绘制器
- * @param {CRender} 当前CRender实例
- * @param {Graph} 当前图形实例
- * @return {Undefined} 无返回值
- */
- config = {
- // ...,
- draw ({ ctx }, { shape }) {
- // 绘制...
- }
- }
- ```
- #### hoverCheck (可选)
- ```javascript
- /**
- * @type {Function}
- * @description 通过鼠标位置去判断当前图形是否处于鼠标悬浮状态,
- * 用于给mouseEnter, mouseOuter, drag, click事件提供支持。
- * @param {Array<Number>} 鼠标位置
- * @param {Graph} 当前图形实例
- * @return {Boolean} 是否处于鼠标悬浮状态
- */
- config = {
- // ...,
- validator ([offsetX, offsetY], { shape }) {
- // 检测是否处于鼠标悬浮状态...
- // return true | false
- }
- }
- ```
- #### setGraphCenter (可选)
- ```javascript
- /**
- * @type {Function}
- * @description 设置图形中心点
- * 提供rotate, scale and translate支持
- * 添加图形及图形被拖动后将被调用
- * @param {Event} 鼠标事件 (图形被添加时调用,该参数为null)
- * @param {Graph} 当前图形实例
- * @return {Undefined} 无返回值
- */
- config = {
- // ...,
- setGraphCenter ([offsetX, offsetY], { style }) {
- // style.graphCenter = [offsetX, offsetY]
- }
- }
- ```
- #### move (Optional)
- ```javascript
- /**
- * @type {Function}
- * @description Moving graph,support for drag
- * @param {Event} Mouse move Event
- * @param {Graph} Current graph instance
- * @return {Undefined} Void
- */
- config = {
- // ...,
- move ([offsetX, offsetY], { shape }) {
- // 一些操作...
- }
- }
- ```
- #### 扩展示例
- ```javascript
- import { extendNewGraph } from '@jiaminghi/c-render'
- const circle = {
- shape: {
- rx: 0,
- ry: 0,
- r: 0
- },
- validator ({ shape }) {
- const { rx, ry, r } = shape
- if (typeof rx !== 'number' || typeof ry !== 'number' || typeof r !== 'number') {
- console.error('Shape configuration is abnormal!')
- return false
- }
- return true
- },
- draw ({ ctx }, { shape }) {
- ctx.beginPath()
- const { rx, ry, r } = shape
- ctx.arc(rx, ry, r, 0, Math.PI * 2)
- ctx.fill()
- ctx.stroke()
- ctx.closePath()
- },
- hoverCheck (position, { shape }) {
- const { rx, ry, r } = shape
- return checkPointIsInCircle(rx, ry, r, position)
- },
- setGraphCenter (e, { shape, style }) {
- const { rx, ry } = shape
- style.graphCenter = [rx, ry]
- },
- move ({ movementX, movementY }, { shape }) {
- this.attr('shape', {
- rx: shape.rx + movementX,
- ry: shape.ry + movementY
- })
- }
- }
- extendNewGraph('circle', circle)
- ```
- <h3 align="center">相关支持</h3>
- - [Transition](https://github.com/jiaming743/transition)
- 提供动画过渡数据 (animationCurve)。
- 如果你想扩展新的缓动曲线,请移步 [扩展新曲线](http://transition.jiaminghi.com/guide/#扩展缓动曲线).
- - [BezierCurve](https://github.com/jiaming743/bezierCurve)
- 提供贝塞尔曲线支持,例如计算曲线长度,曲线折线互转。
- - [Color](https://github.com/jiaming743/Color)
- 提供了颜色计算,例如获取颜色的rgba值,以便于颜色动画状态的计算。
|