入口2: 渲染

// zrender_demo.html
zr.render();// zrender.js
/*** 渲染* * @param {Function} callback  渲染结束后回调函数* todo:增加缓动函数*/
ZRender.prototype.render = function (callback) {this.painter.render(callback);return this;
};

然后我们看看Painter是如何渲染的。(这边的回调是undefined)

1. 先关闭正在显示的数据加载提示

// Painter.js
/*** 首次绘图,创建各种dom和context* * @param {Function=} callback 绘画结束后的回调函数*/
Painter.prototype.render = function (callback) {if (this.isLoading()) {this.hideLoading();}//......return this;
};

2. 检查_maxZlevel是否变大,如是则同步创建需要的Canvas。这次并不需要更新。

this._syncMaxZlevelCanvase();
/*** 检查_maxZlevel是否变大,如是则同步创建需要的Canvas* * @private*/
Painter.prototype._syncMaxZlevelCanvase = function () {var curMaxZlevel = this.storage.getMaxZlevel();if (this._maxZlevel < curMaxZlevel) {//实体for (var i = this._maxZlevel + 1; i <= curMaxZlevel; i++) {var canvasElem = createDom(i, 'canvas', this);this._domList[i] = canvasElem;this._domRoot.insertBefore(canvasElem, this._domList.hover);if (vmlCanvasManager) {vmlCanvasManager.initElement(canvasElem);}var canvasCtx = canvasElem.getContext('2d');this._ctxList[i] = canvasCtx;if (devicePixelRatio != 1) { canvasCtx.scale(devicePixelRatio, devicePixelRatio);}}this._maxZlevel = curMaxZlevel;}
};

3. 依然是好习惯,先清空已有内容。这边的clearLayer() API比较复杂,晚点再细究吧。

//清空已有内容,render默认为首次渲染
this.clear();
/*** 清除hover层外所有内容*/
Painter.prototype.clear = function () {for (var k in this._ctxList) {if (k == 'hover') {continue;}this.clearLayer(k);}return this;
};

this._ctxList的值如下,这边只需要清空非高亮画布

4. 升序遍历,shape上的zlevel指定绘画图层的z轴层叠

//升序遍历,shape上的zlevel指定绘画图层的z轴层叠
this.storage.iterShape(this._brush({ all : true }),{ normal: 'up' }
);
/*** 遍历迭代器* * @param {Function} fun 迭代回调函数,return true终止迭代* @param {Object=} option 迭代参数,缺省为仅降序遍历常规形状*     hover : true 是否迭代高亮层数据*     normal : 'down' | 'up' | 'free' 是否迭代常规数据,迭代时是否指定及z轴顺序*/
Storage.prototype.iterShape = function (fun, option) {// ..... // 设置option默认值,默认降序遍历if (option.hover) {//高亮层数据遍历for (var i = 0, l = this._hoverElements.length; i < l; i++) {if (fun(this._hoverElements[i])) {return this;}}}var zlist;var len;if (typeof option.normal != 'undefined') {//z轴遍历: 'down' | 'up' | 'free'switch (option.normal) {case 'down':// 降序遍历,高层优先//......break;case 'up'://升序遍历,底层优先for (var i = 0, l = this._zElements.length; i < l; i++) {zlist = this._zElements[i];if (zlist) {len = zlist.length;for (var k = 0; k < len; k++) {if (fun(zlist[k])) {return this;}}}}break;// case 'free':default://无序遍历for (var i in this._elements) {if (fun(this._elements[i])) {return this;}}break;}}return this;
};  

还记得之前初始化Painter时提到的_zElements不,当时说的就是根据zlevel来组织画布,这边就用到了。状态如下:

遍历中,会对circle进行刷画图像

function(shape) {if ((changedZlevel.all || changedZlevel[shape.zlevel])&& !shape.invisible) {var ctx = ctxList[shape.zlevel];if (ctx) {if (!shape.onbrush //没有onbrush//有onbrush并且调用执行返回false或undefined则继续粉刷|| (shape.onbrush && !shape.onbrush(ctx, false))) {if (config.catchBrushException) {try {shape.brush(ctx, false, updatePainter);}catch(error) {log(error,'brush error of ' + shape.type,shape);}}else {shape.brush(ctx, false, updatePainter);}}}else {log('can not find the specific zlevel canvas!');}}
};   

其中shape.brush()暂时不细究。等下一轮吧。

5. update到最新则清空标志位。Storage中只是清空了_changedZlevel。

// update到最新则清空标志位
this.storage.clearChangedZlevel();
// Storage.js
Storage.prototype.clearChangedZlevel = function () {this._changedZlevel = {};return this;
};

6. callback为undefined,所以下面的不执行。

/*** 首次绘图,创建各种dom和context* * @param {Function=} callback 绘画结束后的回调函数*/
Painter.prototype.render = function (callback) {// .......// 这部分代码刚才都分析过if (typeof callback == 'function') {callback();}return this;
};

Painter的初步分析到此为止。接下来分析先Handler,再细究Painter中跳过的部分。

转载于:https://www.cnblogs.com/leftthen/p/3994971.html

zrender源码分析4--初始化Painter绘图模块2相关推荐

  1. ZRender源码分析2:Storage(Model层)

    回顾 上一篇请移步:zrender源码分析1:总体结构 本篇进行ZRender的MVC结构中的M进行分析 总体理解 上篇说到,Storage负责MVC层中的Model,也就是模型,对于zrender来 ...

  2. ceph-deploy源码分析(三)——mon模块 转

    ceph-deploy源码分析(三)--mon模块 原文: http://www.hl10502.com/2017/06/19/ceph-deploy-mon/#more ceph-deploy的mo ...

  3. webpack 源码分析(四)——complier模块

    webpack 源码分析(四)--complier模块 上一篇我们看到,webpack-cli 通过 yargs 对命令行传入的参数和配置文件里的配置项做了转换包装,然后传递给 webpack 的 c ...

  4. Solr初始化源码分析-Solr初始化与启动

    用solr做项目已经有一年有余,但都是使用层面,只是利用solr现有机制,修改参数,然后监控调优,从没有对solr进行源码级别的研究.但是,最近手头的一个项目,让我感觉必须把solrn内部原理和扩展机 ...

  5. celery源码分析-worker初始化分析(下)

    celery源码分析 本文环境python3.5.2,celery4.0.2,django1.10.x系列 celery的worker启动 在上文中分析到了Hub类的初始化,接下来继续分析Pool类的 ...

  6. celery源码分析-wroker初始化分析(上)

    celery源码分析 本文环境python3.5.2,celery4.0.2,django1.10.x系列 celery与Django的配合使用 首先,在安装有django的环境中创建一个django ...

  7. tomcat8源码分析-Connector初始化

    谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多人早期的J2EE项目,由程序员自 ...

  8. velocity源码分析:初始化之日志系统

    之前在"velocity源码分析:velocity初始化"文章中粗略地介绍了velocity整体的初始化过程,包括各个系统的初始化,本文主要介绍日志系统初始化. 日志系统类图: 概 ...

  9. zrender源码分析--初探

    先看下,本次例子做的效果 然后开始代码: 调用init接口初始化 // zrender_demo.html var zr = zrender.init(document.getElementById( ...

  10. ConcurrentHashMap的源码分析-CounterCells初始化图解

    初始化长度为2的数组,然后随机得到指定的一个数组下标,将需要新增的值加入到对应下标位置处 transfer扩容阶段 判断是否需要扩容,也就是当更新后的键值对总数baseCount >= 阈值si ...

最新文章

  1. oracle cdc 提交顺序,Oracle CDC部署流程
  2. 01-html介绍和head标签
  3. 最强悍的VS插件—reSharper
  4. 技术面试中,遇到不会回答的问题怎么破?来,教你几招!
  5. JQuery的ready函数与JS的onload的区别详解
  6. js改变select下拉框默认选择的option
  7. 计算机专业技能考核方案,计算机专业技能课教学目标考核方案教程.doc
  8. java数据类型的站位_Java 数据类型在实际开发中应用
  9. opencv库skimage 实现Canny边缘探测算法
  10. 京东面试题(Redis):为啥RedisCluster设计成16384个槽
  11. C++ 基类指针和派生类指针之间的转换
  12. 数据库系统概论速成?
  13. c语言使用CodeBlocks软件,使用CodeBlocks学习C语言
  14. SourceOffsite安装配置
  15. 广义线性模型和线性回归
  16. 墨尔本大学计算机科学要求,墨尔本大学计算机科学
  17. 使用git提交到仓库使用commit指令出现问题Your branch and 'origin/master' have diverged,
  18. 在 Oracle 云上用 Cluster API 升级 K8s 集群
  19. 用python画星空-python3的turtle画模仿3d星空,运动的恒星小宇宙
  20. python 数列筛选_numpy ndarray 按条件筛选数组,关联筛选的例子

热门文章

  1. PHP file_get_contents(‘php://input‘) 和POST的区别
  2. 上海财经大学计算机考研好不好,五所不错的财经类大学,不歧视,不压分,你会考虑吗?...
  3. error: could not lock config file .git/config: Permission denied/Command failed with exit 255
  4. dpkg-checkbuilddeps: error: Unmet build dependencies: build-essential:native
  5. CentOS更改主机名
  6. LINUX C#安装开发工具MonoDevelop
  7. android 系统宏定义,Android.mk宏定义demo【转】
  8. mysql 6.17,mysql小结篇2(17.6.27)
  9. java协程处理IO_并发编程 --进、线程池、协程、IO模型
  10. java list 泛型 转换_Java中List与数组互相转换