|
了解ZRender
317 了解ZRenderhttp://zoo.zhengcaiyun.cn/blog/article/zrender前言ZRender(https://github.com/ecomfe/zrender) 是二维绘图引擎,是轻量级的 Canvas 类库,它提供 Canvas、SVG、VML 等多种渲染方式,它可以用于绘制各种图形,包括线条、矩形、圆形、多边形等。ZRender 也是 ECharts(http://echarts.baidu.com/) 的渲染器。在 ZRender 的基础上开发的专门用于可视化数据的库,它提供了很多预定义的图表类型,如折线图、柱状图、散点图、饼图等,同时还支持动态更新数据和交互事件。一、ZRender1. ZRender 的特性ZRender 提供了以下主要特性:轻量级:ZRender 是一个轻量级的绘图库,它的代码大小只有 100KB 左右,可以快速地加载并运行。高性能:ZRender 可以在大规模数据的情况下保持高性能,能够支持高速绘制大量的图形元素。易扩展:ZRender 提供了一系列的扩展机制,可以方便地添加新的图形元素、渲染器和事件处理器等。多种图形元素支持:ZRender 支持多种图形元素,包括线段、矩形、圆形、文本、图片、路径等,可以满足各种绘图需求。多种渲染器支持:ZRender 支持多种渲染器,包括 Canvas 渲染器、SVG 渲染器和 WebGL 渲染器等。丰富的事件处理机制:ZRender 提供了丰富的事件处理机制,可以方便地处理用户交互事件,包括鼠标点击、鼠标移动、键盘事件等。ZRender 的优势 相比于其他绘图库,ZRender 具有以下优势:性能优越:ZRender 能够快速地绘制大量的图形元素,具有较高的性能,可以满足大规模数据的绘图需求。扩展性强:ZRender 提供了丰富的扩展机制,可以方便地添加新的图形元素、渲染器和事件处理器等,具有很强的灵活性。使用方便:ZRender 的 API 简单易懂,使用方便,可以快速上手。跨平台支持:ZRender 支持多种渲染器,可以在不同的平台上运行,具有很好的跨平台支持性。2. 基本用法2.1 安装 ZRendernpm install zrender --save2.2 创建画布在这个例子中,我们创建了一个 div 元素,并将其添加到页面中。然后使用 ZRender 的 init 方法初始化画布,将其赋值给变量 zr。const canvas = document.createElement('div');document.body.appendChild(canvas);const zr = zrender.init(canvas);2.3 绘制图形ZRender 可以绘制各种图形,例如矩形、圆形、文本等。在这个例子中,我们创建了一个矩形对象,设置其坐标、宽度、高度和填充颜色,并通过 zr.add 方法将其添加到画布中。下面是绘制一个矩形的代码示例:const rect = new zrender.Rect({ shape: { x: 100, y: 100, width: 400, height:300, }, style: { fill: "green", stroke: 'black', lineWidth:3 }});zr.add(rect);2.4 修改图形元素属性const rect = new zrender.Rect({ shape: { x: 100, y: 100, width: 400, height:300, }, style: { fill: "green", stroke: 'black', lineWidth:5 }});zr.add(rect);console.log(rect.shape.width); // 400rect.attr('shape', { width: 50 // 只更新 width。其余将保持不变。对于组或者整个zrender对象重绘调用dirty()方法触发});2.5 实现交互效果ZRender 提供了事件系统,可以方便地实现交互效果。在这个例子中,我们为矩形添加了一个点击事件,在点击矩形时会打印出一条消息。例如,我们可以为矩形添加点击事件:const rect = new zrender.Rect({ shape: { x: 100, y: 100, width: 400, height:300, }, style: { fill: "green", stroke: 'black', lineWidth:5 }});rect.on('click', () => { //.off()取消绑定事件 console.log('rect clicked');});zr.add(rect);2.6 绘制柱状图const zr = zrender.init(chartRef.current);const rectWidth = 30;const rectGap = 10;const rectCount = data.length;const maxData = Math.max(...data);const rectHeight = 200;for (let i = 0; i
|
|