1.深入konva实现原理 - 事件系统
2.konva.js 原理与源码解析
深入konva实现原理 - 事件系统
在深入了解konva的事件系统之前,我们先来探讨一下如何在开发中运用事件处理。
以下是一段示例代码,展示了如何为红色矩形元素绑定mousedown事件,并打印出事件对象的属性。
点击矩形后,网站项目源码如图所示,event对象中包含了currentTarget、evt、pointerId、target、type这五个属性,它们都是konva封装后的属性,提供给事件处理器,分别代表:
在实际开发过程中,我们可能会对canvas内部的图形元素如何监听DOM事件,以及鼠标交互事件如何触发图形元素等问题产生疑问。带着这些问题,我们将查看konva源码的实现方式。
在konva源码的最顶部,定义了EVENTS和EVENTS_MAP对象,怎么分析一个C程序源码其中包含了所有konva支持的DOM事件。事件的本质是发布(触发)/订阅(监听)模式的实现。首先来看订阅(监听):在业务开发代码中,我们通过rect.on('xxx', ...)进行监听,那么konva内部是如何实现订阅(监听)的呢?on方法定义在Rect类继承的根类:Node.ts中。
rect.on('mousedown', () => { })会执行到上面的on方法,执行后会将事件的handler回调存储到Rect实例上,如下截图:
也就是说,将事件的handler回调放到Rect.eventListeners.mousedown中。看过Node::on方法后,三万个易语言源码案例打包我们只了解了事件句柄的存储过程,但Rect只是一个虚拟元素,并不是真实的DOM元素。真实DOM元素的事件绑定/触发需要打开Stage.ts文件继续阅读。
实际绑定DOM事件是在Stage::_bindContentEvents中进行的,遍历konva支持的所有事件常量EVENTS数组,为canvas元素的外层div监听DOM事件。当mousedown事件触发时,执行_pointerdown,然后通过Node::getIntersection方法找到当前点击的多语言足球反波胆源码图形实例,并通过_fireAndBubble方法执行当前图形实例绑定的事件回调。接下来,我们来看Node::_fire和Node::_fireAndBubble的具体实现。
整体流程如下:
总结:konva在自身内部实现了完整的发布订阅系统,并模拟了事件委托、事件冒泡场景的处理方式。通过给canvas元素外层的div绑定所有支持的DOM事件,与内部的发布订阅进行交互。整体思路比较清晰,适合学习和借鉴。交互式电影播放器源码
konva.js 原理与源码解析
Konva是一个基于2D canvas的类库,适用于桌面和移动设备,提供图形组件、事件系统、变换、高性能动画、节点嵌套与分层等功能。Konva与FabricJS都是高性能2D渲染库,适合编辑器场景,各有优势。
Konva架构基于图形树,类似DOM结构,通过add和remove操作增删节点。核心包括SceneContext和HitContext,实现绘制填充和描边。Konva通过Canvas缓存绘制图形信息,用户点击时判断击中图形。
拾取方案中,Konva在SceneCanvas上绘制图形同时在HitCanvas上绘制,使用随机索引颜色,用户点击时根据缓存判断图形。流程包括获取交集、计算击中图形,触发交互事件。
Konva的Node类是图形的底层封装,包含各种方法,所有Konva节点最终继承自Node。渲染流程包括添加图形、绘制、缓存和重绘。Node类的draw方法调用drawScene和drawHit,最终执行具体图形类的绘制方法。
属性更新流程使用Factory模块绑定属性,通过getter和setter实现,统一调用Node._setAttr方法更新属性并批量重绘。Konva历史源码基于ES3定义类,Factory模块在代码中添加属性绑定逻辑。
总体而言,Konva的结构设计、图形绘制、交互处理和属性更新机制共同构建了一个高效、灵活的2D图形渲染框架。