你真的了解Canvas吗--解密二【ZRender篇】

news2024/11/25 20:54:36

书接上文你真的了解Canvas吗--解密一【ZRender篇】

目录
        入口
        挖掘
                继承
                _init
                        step-1:取所有key值
                ​​​​​​​        step-2:定义构造函数BezierCurveShape
                ​​​​​​​        step-3:赋值基础css属性的默认值
                ​​​​​​​        step-4:遍历传入的key属性值
                总结


入口

我们走第二个方法(这里我都是用使用量较高的函数带大家进行了解,日后涉及别的细节点我再慢慢讲)

var curve = new zrender.BezierCurve({
            position: [0, 0],
            scale: [1, 1],
            shape: {
                x1: 10,
                y1: 400,
                cpx1: 0,
                cpy1: 0,
                cpx2: 0,
                cpy2: 0,
                x2: 300,
                y2: 30
            },
            draggable: true
        });

这里就开始绘制图形,我用贝塞尔曲线举例~

挖掘

  • 继承

进入zrender的世界,我们就看到一个继承的体系

BezierCurve.js
Path.js
Displayable.js
Element.js

嗯,最终的“父类”是Element,在原型链上表现就如下

curve.__proto__ = Path;
Path实例.__proto__ =  Displayable;
Displayable实例.__proto__ = Element;
Element实例.__proto__ = Object;
Object实例.__proto__ = null;

(不知不觉列了一下原型链)

  • _init

Element的constructor中有_init方法。一般私有方法前面加_表示,TypeScript中有private关键词表示更加方便易读且安全,后续可以考虑转TS

然后这个_init方法也不是找当前js的_init,它会先从"子类"BezierCurve中查找,如果找不到才会向其一层层的"父类"中进行查找,最后我找到了这里Path.js中

按4步讲
step-1:取所有key值

就是一个keys方法,它来源于util工具类的一个函数,具体可以看我的番外篇之util。(就是我们传入的position、scale、shape、draggable)

step-2:定义构造函数BezierCurveShape
BezierCurve.js
BezierCurve.js
step-3:赋值基础css属性的默认值
BezierCurve.js
Displayable.js
Path.js

createObject方法,它来源于util工具类的一个函数,具体可以看我的番外篇之util。目的就是创建一个对象并合并obj

Path.js

defaults方法,它来源于util工具类的一个函数,具体可以看我的番外篇之util,目的就是合并对象DEFAULT_COMMON_STYLE

Displayable.js
step-4:遍历传入的key属性值

针对style和shape属性值,都是创建合并之类的操作,就是支持我们传入的样式。紧接着我们再来看super.attrKV();这里就是明确往“父类”找attrKV方法了

Displayable.js
Element.js

看到最后,就知道给class设置属性值,比如我们传入的draggable=true

这里还有一个点,让我们来看下

Element.js

这里在创建Element的时候有一个自动执行的函数,它会将position、scale、origin先进行预处理,如果是我们传入了对应相同的属性,那么就不会直接赋值key=value,而是要通过Object.defineProperty的set方法赋值。

总结

好了,让我们看最后的打印结果吧!!

这个步骤主要是绘制方面的初始化,里面一套继承体系,可以配置我们传入的样式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2128974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PMP--一模--解题--1-10

文章目录 14.敏捷--方法--替代敏捷方法--看板1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用以下哪种方法? …

金属铬厂商分析:前十强厂商占有大约64.0%的市场份额

金属铬是一种灰色、有光泽、硬而脆的过渡金属。铬是不锈钢的主要添加剂,可增加耐腐蚀性。 据QYResearch调研团队最新报告“全球金属铬市场报告2024-2030”显示,预计2030年全球金属铬市场规模将达到11.8亿美元,未来几年年复合增长率CAGR为6.5%…

【数据结构与算法】受限线性表 --- 栈

【数据结构与算法】受限线性表 — 栈 文章目录 【数据结构与算法】受限线性表 --- 栈前言一、栈的基本概念二、栈的顺序存储三、栈的分文件编写四、栈的链式存储五、栈的应用案例-就近分配六、 中缀表达式转后缀表达式以及基于后缀表达式运算总结 前言 本篇文章就栈的基本概念…

医院HISPACS存储备份 要求全周期保存

内蒙古赤峰医院 HIS PACS数据备份 ,质量好可以满足15-30年存储的空间需求,用着放心

NIDS——suricata(三)

一、监控ICMP流量 1、ICMP流量特征 四大特征分别为:消息类型(Type)、代码(Code)、校验和(Checksum)、数据字段(Data Field)。这里我们使用 type消息类型。 ICMP 消息的类…

Cookie、Web Storage介绍

概述 Cookie、LocalStorage、SessionStorage、IndexDB这些作为浏览器的存储入口,也是经典的八股文了,本文再次冷饭热吃来介绍这些API,主要是因为在其他文章中看到了一些个人感觉有用的小知识点,所以在这记录一下,以便…

招加盟商视频怎么拍效果好?

一定没有人比我更适合分享这篇文章了,我自己曾经就是做宣传片的,而且还有一家酸奶品牌做全国招商。 我来分享下加盟招商视频怎么拍效果好? 一、定脚步 说个题外话,以前我做传媒公司的时候,很多客户找我做宣传片&…

Ubuntu系统Docker部署数据库管理工具DbGate并实现远程查询数据

文章目录 前言1. 安装Docker2. 使用Docker拉取DbGate镜像3. 创建并启动DbGate容器4. 本地连接测试5. 公网远程访问本地DbGate容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 前言 本文主要介绍如何在Linux Ubuntu系统中使用Docker部署DbGate数…

Windows安装字体的几种方式

1.选中你要安装的字体,然后右键,点击“为所有用户安装”,这样字体就会安装在C:\Windows\Fonts;如果你点了“安装”,那么就会安装在C:\Users\你电脑用户的名字\AppData\Local\Microsoft\Windows\Fonts。 像电脑自带的字…

strncmp函数的使用

目录 1.头文件 2.strncmp函数的使用 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#xff01; 1.头文件 strncmp函数的使用需要头文件 #include<string.h> 2.strncmp函数的使用 …

第一篇:教你轻松部署本地大模型(Ollama)

一、前言 搞研发的&#xff0c;想学习大模型的&#xff0c;很多都想本地部署一波&#xff0c;体验一下&#xff0c;部署是学习的第一步&#xff0c;我们不仅仅是要理论的巨人&#xff0c;还要成为实战的专家。不要恐惧&#xff0c;不要恐惧&#xff0c;不要恐惧&#xff0c;重…

【数学建模】典型相关分析

典型相关分析&#xff08;Canonical Correlation Analysis, CCA&#xff09;是一种统计方法&#xff0c;用于寻找两个多变量数据集之间的线性关系。这种分析方法可以用来衡量两个数据集之间的相关性&#xff0c;并找出能够最好地解释这种相关性的变量组合。 典型相关分析的基本…

Android系列基础知识总结

四大组件 Activity Activity生命周期 不同场景下Activity生命周期的变化过程 启动Activity&#xff1a; onCreate()—>onStart()—>onResume()&#xff0c;Activity进入运行状态。Activity退居后台&#xff1a; 当前Activity转到新的Activity界面或按Home键回到主屏&a…

WebGL系列教程二(环境搭建及着色器初始化)

目录 1 前言2 新建html页面3 着色器介绍3.1 顶点着色器、片元着色器与光栅化的概念3.2 声明顶点着色器3.3 声明片元着色器 4 坐标系(右手系)介绍5 着色器初始化5.1 给一个画布canvas5.2 获取WebGL对象5.3 创建着色器对象5.4 获取着色器对象的源5.5 绑定着色器的源5.6 编译着色器…

好看好听的小猪包扩音器,轻巧便携更好用,得胜E10上手

我们以前在学校、景区等地方&#xff0c;都见过教师、讲解员所使用的扩音器&#xff0c;这类设备大多做得笨重粗糙&#xff0c;而且音质一般&#xff0c;声音特别粗糙刺耳&#xff0c;对使用者和旁观者影响都不好。最近我发现了一款得胜E10扩音器&#xff0c;大大提升了这种便携…

HTTPX 与 AIOHTTP 与 Requests:选择哪个?

Python 有三个众所周知的库用于发送 HTTP&#xff08;超文本传输协议&#xff09;请求&#xff1a; HTTPX、AIOHTTP 和 Requests。 所有这些都有其独特的优点和缺点。 通常&#xff0c;您需要对同步 HTTP 请求使用 Requests&#xff0c;在需要同步和异步混合时使用 HTTPX&#…

场景解决方案丨突破成本限制,中小企业如何快速搭建后台管理系统

信息化时代下业务数据量激增&#xff0c;云计算、物联网、人工智能等技术的成本大幅度降低及普及&#xff0c;这些变化推动着市场需求发生改变&#xff0c;使数字化转型成为各行业的共同趋势。在这一背景下&#xff0c;大型企业利用其经济和技术优势巩固市场领导地位&#xff0…

养宠浮毛严重怎么清理?希喂、范罗士、IAM宠物空气净化器真实测评

宠物毛发不等于宠物浮毛&#xff1f;这可真是问到我的知识盲区了。养猫来我已经接受了目光所及之处都是猫毛&#xff0c;可以心平气和的打扫被猫毛占据的屋子。自认为是很勤快的人&#xff0c;家里也一直保持着干净整洁&#xff0c;结果上星期鼻子不舒服去看医生&#xff0c;告…

发现一个有趣的滑动组件样式,并给它实现了

最近在浏览网站的时候看到一个有趣的滑动组件的样式&#xff0c;觉得很有趣。一时有兴趣就去用代码实现了一下&#xff1a; 这里我就不从零开始实现了&#xff0c;借用 Material UI Slider 快速实现&#xff0c;基本上就是重新写样式覆盖。 Material UI 上的 Slider 组件默认样…

面试产品经理,怎样描述过往经历,才能让面试官印象深刻?

金三银四求职季&#xff0c;你是不是也有面试的冲动&#xff01;但面试并不是头脑一热就能取得好结果&#xff0c;在此之前&#xff0c;必须得有周全的准备&#xff0c;才能应对好面试官的“连环问”&#xff01; 所以&#xff0c;给大家分享这篇产品经理面试干货文章&#xf…