二维绘图引擎ZRender

article/2025/9/21 5:01:23

1、开始使用
描述
ZRender是二维绘图引擎,它提供 Canvas、SVG、VML 等多种渲染方式。ZRender 也是 ECharts 的渲染器。
下载
ZRender 项目在 gitHub ,也可以使用 npm install zrender 下载。
在 dist 目录下找到 zrender.js 和 zrender.min.js,前者是开发版,后者是发布版。
初始化 ZRender
在使用 ZRender 前需要初始化实例,具体方式是传入一个 DOM 容器:

var zr = zrender.init(document.getElementById('main'));

创建出的这个实例对应文档中 zrender 实例部分的方法和属性。
在场景中添加元素
ZRender 提供了将近 20 种图形类型,可以在文档 zrender.Displayable 下找到。如果想创建其他图形,也可以通过 zrender.Path.extend 进行扩展。
以创建一个圆为例:

//圆
var circle = new zrender.Circle({shape: {cx: 150,cy: 50,r: 40},style: {fill: 'none',stroke: '#F00'}
});
zr.add(circle);//圆弧
var arc=new zrender.Arc({style:{stroke:'none',fill:'red'},shape:{cx:300,cy:300,r:140,startAngle:0,              //开始角度endAngle:Math.PI/3         //结束角度}});zr.add(arc);//扇形var sector=new zrender.Sector({style:{fill:'red'},shape:{cx:300,cy:300,r:80,                     //外半径r0:0,                    //内半径startAngle:0,             //开始角度endAngle:Math.PI/3,       //结束角度clockwise:true            //顺时针}});zr.add(sector);//椭圆var ellipse=new zrender.Ellipse({style:{fill:'red'},shape:{cx:200,cy:200,rx:80,         //横向半径ry:40           //纵向半径}})zr.add(ellipse);//心型var heart =new zrender.Heart({style:{fill:'red'},shape:{cx:200,cy:200,width:80,height:100}});zr.add(heart);//多边形var Polygon=new zrender.Polygon({style:{fill:'red'},shape:{points:[[100,100],[200,80],[300,160],[150,130],[20,300]]    //坐标集合}})zr.add(Polygon)

创建了一个圆心在 [150, 50] 位置,半径为 40 像素的圆,并将其添加到画布中。
修改图形元素属性
通过 a = new zrender.XXX 方法创建了图形元素之后,可以用 a.shape 等形式获取到创建时输入的属性,但是如果需要对其进行修改,应该使用 a.attr(key, value) 的形式修改,否则不会触发图形的重绘。例子:

var circle = new zrender.Circle({shape: {cx: 150,cy: 50,r: 40}
});
zr.add(circle);
console.log(circle.shape.r); // 40
circle.attr('shape', {r: 50 // 只更新 r。cx、cy 将保持不变。
});

图形里的文字
text:'图形文字', //文字
textFill:'#333', //文字颜色
fontSize:12, //文字大小
fontFamily:'', //字体
fontStyle:'normal', //字形
fontWeight:'normal', //加粗
textStroke:'yellow', //文字描边
textWidth:1, //字体线宽
textHeight:12, //字体高度
textLineWidth:1, //字体描边线宽
textLineHeight:14, //字体行高
textPosition:'inside', //字体位置
textPadding:[0,0,0,0], //文字内边距
transformText:true //字体跟随变换效果

//图形里的文字circle.attr({style:{text:'江西理工大学',   //文字textFill:'yellow',   //文字颜色fontSize:10,    //文字大小textPosition:'inside',    //字体位置textPadding:[3,3,3,3],    //文字内边距// transformText:true    //字体跟随变换效果}})

如何给图形添加事件响应?
ZRender支持的事件有: ‘click’、 ‘mousedown’、 ‘mouseup’、 ‘mousewheel’、 ‘dblclick’、 ‘contextmenu’。

//添加事件rect.on('click',function(e){alert('点击了矩形')})

完整代码:
在这里插入图片描述

<template><div id="zrCircle"></div>
</template>
<script>
import zrender from 'zrender'
export default {mounted(){//初始化zrendervar zr=zrender.init(document.getElementById("zrCircle"),{renderer:'canvas',   //渲染方式width:'600',     //画布宽度height:'600'     //画布高度});// opts.height=600//在场景中添加元素,一个半径为40的圆var circle=new zrender.Circle({shape:{cx:150,   cy:150,r:40},style:{fill:'none',     //圆背景色不设置,即白色stroke:'blue'    //圆的边框颜色}});//图形里的文字circle.attr({style:{text:'江西理工大学',   //文字textFill:'yellow',   //文字颜色fontSize:10,    //文字大小textPosition:'inside',    //字体位置textPadding:[3,3,3,3],    //文字内边距// transformText:true    //字体跟随变换效果}})//向画布中添加已经定义图形zr.add(circle); //修改图形元素属性   console.log('更新后:',circle.shape.r); // 40circle.attr('shape', {    //改变shape中的属性r: 50             // 只更新 r。cx、cy 将保持不变。});console.log('更新前:',circle.shape.r); // 40circle.attr('style',{     //改变style中的属性fill:'skyblue'})}
}
</script>

2、动画
给图形添加动画支持
animate函数 animate(path, loop):
path 对该对象的哪个元素执行动画
loop 为boolean类型,表示是否循环动画

 //给图形添加动画circle.animate('shape',true).when(1000,{cx:200,r:30}).when(2000,{cx:250,r:20}).when(3000,{cx:300,r:30}).when(4000,{cx:350,r:40}).start();   //表示动画开始执行circle.animate('style',true).when(1000,{opacity:0.8}).when(2000,{opacity:0.5}).when(3000,{opacity:0.3}).when(4000,{opacity:0.6}).when(4000,{opacity:0.9}).start();

animateTo 函数
animateTo(target, time, delay, easing, callback, forceAnimate):为属性设置动画。
部分参数可缺省,支持以下形式的调用:

animateTo(target, time, delay, easing, callback, forceAnimate)   //属性,时长,延迟,缓动函数。回调函数,相同属性是否强制执行
animateTo(target, time, delay, easing, callback)
animateTo(target, time, easing, callback)
animateTo(target, time, delay, callback)
animateTo(target, time, callback)
animateTo(target, callback)
animateTo(target)

参数
target 设置动画的对象
time 动画时长
delay 动画延迟执行的时长
easing 缓动函数名称
callback 动画执行完成后的回调函数
forceAnimate 对于相同的属性,是否强制执行

//将圆的半径缓慢的增加至100,颜色改变为红色circle.animateTo({shape:{r:100},style:{fill:'red'},position:[10,10]    //x,y轴分别平移10},3000,100,'cubicOut',function(){console.log('done')});

旋转,放大,缩小,平移

//旋转,放大,缩小,平移rect.animateTo({// rotation:Math.PI/3,     //正值代表逆时针旋转,负值代表顺时针旋转rotation:Math.PI,origin:[240,190],scale:[1.5,1.5],   //x,y轴方向放大至1.5倍position:[100,100]    //x,y轴分别平移100})

在这里插入图片描述
stopAnimation(forwardToLast)函数
.stopAnimation(Boolean) 是否将动画跳到最后一帧。 true为跳到最后,false为不跳,设置了该函数,不论Boolean为什么,动画停止

circle.stopAnimation(true);    //跳到动画最后一帧

animate函数 动画对象
delay(time) 延迟开始时间
done(callback) 设置动画结束的回调函数
during(callback) 为关键帧添加回调函数,在关键帧运行后执行
isPaused() 获得动画是否处于暂停状态。Boolean类型
pause() 暂停动画
resume() 恢复动画
start(easing) 执行动画(缓动函数)
stop(forwardToLast) 停止动画(boolean,是否将动画跳到最后一帧)
when(time,props) 定义关键帧,即动画对象在某个时刻的属性。

3、组的概念
组。Group 是一个容器,可以插入子节点,Group 的变换也会被应用到子节点上。

 //getBoundingRect() 获取元素包围盒var g=new zrender.Group({slient:true                   //组内子孙元素是否响应鼠标事件});var rect=new zrender.Rect({style:{fill:'blue'},shape:{x:10,y:10,width:50,height:40}});var circle=new zrender.Circle({style:{fill:'blue'},shape:{cx:200,cy:50,r:30}});g.add(rect);   //添加子节点g.add(circle);zr.add(g);//.getBoundingRect()得到组内所有元素的包围盒console.log(g.getBoundingRect());//返回所有子元素,类型:Element[]。console.log('cc',g.children());//返回特定名字的子元素console.log('circle',g.childOfName('circle'));//返回子元素个数console.log('num',g.childCount());//遍历所有子节点g.eachChild(function(item){ console.log('a',item);})    //在组内删除元素// g.remove(circle)   //指定删除// g.removeAll()      //清空组内所有元素//整体变换,如g.attr({position:[100,100],       //x轴,y轴分别平移100})      

4、线

 //直线var line =new zrender.Line({style:{stroke:'red',       //线的颜色lineWidth:3,        //线宽lineDash:[0]        //虚线样式},shape:{x1:30,              //起始点横坐标y1:30,              //起始点纵坐标x2:100,             //结束点横坐标y2:100,             //结束点横坐标percent:1         //已显示的百分比,用于绘制动画。}});zr.add(line);//多边形折线段var polyline=new zrender.Polyline({style:{stroke:'blue',       //线的颜色lineWidth:1,        //线宽lineDash:[0] },shape:{points:[[10,20],[100,120],[100,200]]     //点集}})zr.add(polyline)//贝塞尔曲线var bezierCurve=new zrender.BezierCurve({style:{stroke:'yellow',lineWidth:3},shape:{x1:70,            //起始点横坐标y1:10,            //起始点纵坐标x2:150,           //结束点横坐标y2:150,           //结束点横坐标cpx1:60,           //控制点横坐标cpy1:50            //控制点纵坐标}});zr.add(bezierCurve)

在这里插入图片描述
5、文字

 //初始化zrendervar zr=zrender.init(document.getElementById("zrCircle"),{renderer:'canvas',   //渲染方式width:'600',     //画布宽度height:'600'     //画布高度});var text=new zrender.Text({style:{text:'这是一段文字'+'\n'+'换行',textPadding:[3,5,3,5],fontSize:16}});zr.add(text);//可以通过getBoundingRect()获取文字所占的空间console.log('文字所占空间',text.getBoundingRect());//特别注意的是rect必须设置宽高,才能获取到其所占的空间var rect=new zrender.Rect({style:{text:'这是文字',fontSize:16,textFill:'skyblue'   //字体颜色},shape:{x:150,y:150}})zr.add(rect);console.log(rect.getBoundingRect())//返回{x: 10, y: 10, width: 0, height: 0}//文字包围盒var text=new zrender.Text({style:{text:'这是一段文字',textBackgroundColor:'red',     //包围盒背景textBorderColor:'#ccc',         //包围盒描边颜色textBorderWidth:1,             //包围盒描边线宽textPadding:[10,20,10,20]      //文字内边距,同css Padding}});

在这里插入图片描述
6、线性渐变
zrender.LinearGradient(x, y, x2, y2, colorStops, globalCoord) 起始横坐标,起始纵坐标,结束横坐标,结束纵坐标,组成渐变色的颜色,取值范围

//线性渐变var linearColor = new zrender.LinearGradient(0, 0, 0, 1, [{offset: 0,      color: '#efe3ff'},{offset: 1,color: '#6cb3e9'}]);var rect = new zrender.Rect({shape: {x: 0,    y: 0,    width: 100,     height:100},style: {fill:linearColor},position: [10,10]});zr.add(rect );

在这里插入图片描述


http://chatgpt.dhexx.cn/article/P95XNJhj.shtml

相关文章

MATLAB中求矩阵的特征值和特征向量

矩阵特征值的数学定义 设A是n阶方阵&#xff0c;如果存在常数λ和n维非零列向量x&#xff0c;使得等式Axλ x成立&#xff0c;则称λ为A的特征值&#xff0c;x是对应特征值λ的特征向量。 求特征值和特征向量&#xff1a; eig(A)&#xff1a;求矩阵A的全部特征值&#xff0c…

简单易懂的特征值与特征向量

特征值与特征向量是线性代数中一个很基础的知识&#xff0c;但是很多人对这两个概念没有一个直观的概念&#xff0c;从直觉上&#xff0c;很难理解这两个东西&#xff0c;只知道公式&#xff0c;但是不知道它代表的意义。当年上现代课的时候&#xff0c;老师根本不会去讲这些东…

特征值和特征向量的几何意义

1. 特征值和特征向量 我们首先回顾下特征值和特征向量的定义如下&#xff1a; A x λ x Ax\lambda x Axλx 其中A是一个 n n n\times n nn的实对称矩阵&#xff0c; x x x是一个n维向量&#xff0c;则我们说 λ \lambda λ是矩阵A的一个特征值&#xff0c;而 x x x是矩阵A的…

特征值和特征向量的通俗解释

我们知道&#xff0c;特征向量的公式是 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 其中A代表矩阵&#xff0c;x代表特征向量&#xff0c;代表特征值。 众所周知&#xff0c;特…

对特征值和特征向量的理解

Agenda 1. 特征值和特征向量1.1 特征值和特征向量的通俗解释1.2 如何计算矩阵的特征值和特征向量1.3 特征多项式1.4 特征值和特征向量的性质 1. 特征值和特征向量 在讨论特征值和特征向量之前&#xff0c;必须声明的是现在我们关注的是有限维 线性空间上的线性变换。这里两个关…

线性代数(五)特征值和特征向量

文章目录 一&#xff1a;特征值与特征向量二&#xff1a;特征方程2.1行列式求解的另一种方法--初等变换2.2可逆矩阵定理以及行列式性质的补充2.3特征方程/特征多项式2.4相似性 三&#xff1a;对角化3.1从例子出发3.2定理3.3例子 一&#xff1a;特征值与特征向量 1.定义&#x…

特征值和特征向量(三)

特征值和特征向量&#xff08;三&#xff09; 一、先看一下教科书上的定义&#xff1a;设A是n阶方阵&#xff0c;如果存在常数及非零n向量x&#xff0c;使得&#xff0c;则称是矩阵A的特征值&#xff0c;x是A属于特征值的特征向量。给定n阶矩阵A&#xff0c;行列式 的结果是关…

网页游戏脱机脚本制作视频教程

网页游戏脱机脚本制作视频教程 百度网盘 布脖练馅辰杖怖铱试疤促钩咏合躺酱澈纸罢旨谖谘帘婪尾拾碧鸥居丶骨碳捍饰炔幌干衫乖商衣临衣氛捍运阂妊痰煤籽媒移惶心谑源谑丫松橙湛叭坪佳蛊八婪毒鄙刮碧悠凳炔捍灰钩贺篮媒梅敝粱寡油倨制柿囊谐举婪贫婪奖堂虏啄腊谘剿镜感诺衣挥堂猎…

python可以制作游戏脚本吗_用Python写一个游戏脚本,你会吗?

学习python有一段时间了,由于python语言的强大和简洁,是一个不错的脚本语言,就准备做个游戏脚本练练手。如果你也想多练项目实战。可以去小编的Python交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目 听说pywin32写脚本还不错 pyw…

逆水寒商业脚本制作视频

​一章 易语言基础 共6课时 1、关于易语言必须了解的基本知识 2、易语言基本组件(不包括超级列表框)讲解 3、易语言超级列表框详解 3、易语言核心支持库讲解之一 4、易语言核心支持库讲解之二 5、易语言模块制作和DLL制作 6、用制作的模块和DLL开发三个小软件 第二章…

Java开发游戏脚本(第三卷)

游戏脚本开发第三卷 XML文件存储数据使用exe4j打包成exe文件回首BUG最后结语 XML文件存储数据 我举个例子&#xff0c;我的窗口数据需要存储到文件&#xff0c;它的结构为: public class Game {// Game类的成员变量private String Title;private int X;private int Y;private…

乐玩模块脚本实战教程辅助脚本制作开发视频

乐玩插件模块的制作&#xff0c;封装了后台绑定判断&#xff0c;键鼠图色窗口文本输入等游戏辅助常用的方法&#xff0c;每种方法都做了游戏调用测试示范&#xff0c;最后录制了四种多线程方法调用乐玩插件&#xff0c;并通过游戏进行了演示。 学习地址&#xff1a;链接&#x…

游戏多开器制作教程

这里讲解怎么制作多开器&#xff0c;简单易懂的讲解&#xff0c;希望能够记录学习过程。 用易语言来制作自己的小工具&#xff0c;还是挺有成就感的。每个人都可以。 1.常见的几种游戏多开限制-简单说明 2.什么是互斥体 3.互斥体的类型与查找 4.编写多开代码实现游戏多开

C++游戏编程教程(一)

参考书籍&#xff1a;《C游戏编程&#xff1a;创建3D游戏》 注&#xff1a;本教程所有代码的开发环境均为Visual Studio Preview 2022&#xff0c;C标准是C20。 一、初识SDL SDL是一个跨平台的开源多媒体库&#xff0c;被广泛应用于游戏开发&#xff0c;具体可以看这里。另外…

html5分镜头脚本范例,分镜头脚本教程图解

这是一份pdf免费高清彩版的分镜头脚本设计教程&#xff0c;全书彩页&#xff0c;排版非常不错&#xff0c;阅读起来充满趣味性&#xff0c;另外&#xff0c;书中有不少分镜头脚本范例以及分镜头脚本教程图解&#xff0c;是一本值得一看的好书。全书详细讲解了分镜头是如何制作的…

Java开发游戏脚本(第五卷)

游戏脚本开发第五卷 前言介绍相关技术相关功能项目结构最后结语 前言介绍 本卷具体介绍脚本1.0&#xff0c;相关代码不再展示&#xff0c;该项目全部源码以及相关配置文件可在下方评论区留下QQ邮箱即可领取。 相关技术 JavaFX&#xff0c;主要用于展示页面效果&#xff0c;该技…

群控系统linux脚本,群控系统的自定脚本制作

做为沒有一切技术性累积的***游戏玩家&#xff0c;买这套醉适合&#xff0c;回家了依照使用说明一顿插线&#xff0c;插 好即玩&#xff0c;一小时内拿下&#xff0c;立刻就可以进行实际业务流程。这套系统软件现阶段关键对于手机0信&#xff0c;沒有各种各样目不暇接的作用&am…

Unity 脚本入门教程

原文&#xff1a;Introduction to Unity Scripting 作者&#xff1a;Georgi Ivanov 译者&#xff1a;kmyhy Unity 的许多功能都要通过它的富脚本语言 C# 来体现。你可以用它来处理用户输入&#xff0c;操作场景中的对象&#xff0c;碰撞检测&#xff0c;自动生成新的 GameOb…

2020年易语言调用大漠插件来制作游戏脚本教程

第一章 易语言基础 共6课时 1、关于易语言必须了解的基本知识 2、易语言基本组件&#xff08;不包括超级列表框&#xff09;讲解 3、易语言超级列表框详解 3、易语言核心支持库讲解之一 4、易语言核心支持库讲解之二 5、易语言模块制作和DLL制作 6、用制作的模块和DLL开发三个小…

Lua脚本教程

Lua脚本教程 一、数据类型1、常量、变量2、变量名&#xff1a;字母、数字、下划线&#xff08;不能以数字开头&#xff09;3、几种数据类型 二、运算符三、初识函数四、判断语句五、循环语句六、表七、高级函数与控制结构八、函数库1.基本库2.数学库&#xff0c;表库3.字符串库…