今天是想看看使用zrender框架如何去,畫一個圓,再加“circle”的文字在圓心。
然后開始代碼:
如何部署代碼,讓zrender跑起來這邊就不說了,官方例子就有寫,地址是:https://github.com/ecomfe/zrender
准備工作如下:
dom中新建一個容器用於繪圖:
然后直接寫代碼就可以了。
調用zrender的init接口初始化
// zrender_demo.html var zr = zrender.init(document.getElementById('main'));
進入init方法,發現做2件事情:A、初始化ZRender;B、將其存入ZRender實例map索引
/** * zrender初始化 * 不讓外部直接new ZRender實例,為啥? * 不為啥,提供全局可控同時減少全局污染和降低命名沖突的風險! * * @param {HTMLElement} dom dom對象,不幫你做document.getElementById了 * @param {Object=} params 個性化參數,如自定義shape集合,帶進來就好 * * @return {ZRender} ZRender實例 */ zrender.init = function(dom, params) { var zi = new ZRender(guid(), dom, params || {}); _instances[zi.id] = zi; return zi; };
其中guid()是zrender統一的ID生成機制,通過esl加載,然后按需調用:
// zrender.js var guid = require('./tool/guid'); guid(); // tool/guid.js /** * zrender: 生成唯一id * * @author errorrik (errorrik@gmail.com) */ define( function() { var idStart = 0x0907; return function () { return 'zrender__' + (idStart++); }; } );
進入ZRender接口類,這邊體現官網提到的“MVC核心封裝實現圖形倉庫、視圖渲染和交互控制”
-
Stroage(M) : shape數據CURD管理
-
Painter(V) : canvas元素生命周期管理,視圖渲染,繪畫,更新控制
-
Handler(C) : 事件交互處理,實現完整dom事件模擬封裝
/** * ZRender接口類,對外可用的所有接口都在這里!! * storage(M)、painter(V)、handler(C)為內部私有類,外部接口不可見 * 非get接口統一返回支持鏈式調用~ * * @param {string} id 唯一標識 * @param {HTMLElement} dom dom對象,不幫你做document.getElementById * * @return {ZRender} ZRender實例 */ function ZRender(id, dom) { this.id = id; this.env = require('./tool/env'); this.storage = new Storage(); this.painter = new Painter(dom, this.storage); this.handler = new Handler(dom, this.storage, this.painter); // 動畫控制 this.animatingShapes = []; this.animation = new Animation({ stage : { update : getAnimationUpdater(this) } }); this.animation.start(); }
這邊Storage、Painter、Handler、animation的初始化暫時不細究跳過
好習慣是每次繪圖前,都清空畫布
// zrender_demo.html zr.clear();
zrender執行清空時,清空storage后,再執行painter的clear()方法
// zrender.js /** * 清除當前ZRender下所有類圖的數據和顯示,clear后MVC和已綁定事件均還存在在,ZRender可用 */ ZRender.prototype.clear = function () { this.storage.del(); this.painter.clear(); return this; };
同樣暫不細究storage、painter的清除機制
接下來開始繪圖,添加一個圓形
// zrender_demo.html var color = require('zrender/tool/color'); var colorIdx = 0; var width = Math.ceil(zr.getWidth()); // 視圖寬度 var height = Math.ceil(zr.getHeight()); // 視圖高度
F11查看getWidth(),調用painter的方法。getHeight類似實現
// zrender.js /** * 獲取視圖寬度 */ ZRender.prototype.getWidth = function() { return this.painter.getWidth(); };
// zrender_demo.html var circle = new CircleShape({ style : { x : 100, y : 100, r : 50, brushType : 'both', color : 'rgba(220, 20, 60, 0.8)', // rgba supported strokeColor : color.getColor(colorIdx++), // getColor from default palette lineWidth : 5, text :'circle', textPosition :'inside' }, hoverable : true, // default true draggable : true, // default false clickable : true, // default false // 可自帶任何有效自定義屬性 _name : 'Hello~', onclick: function(params){ alert(params.target._name); }, // 響應事件並動態修改圖形元素 onmousewheel: function(params){ var eventTool = require('zrender/tool/event'); var delta = eventTool.getDelta(params.event); var r = params.target.style.r; r += (delta > 0 ? 1 : -1) * 10; if (r < 10) { r = 10; }; zr.modShape(params.target.id, {style: {r: r}}) zr.refresh(); eventTool.stop(params.event); } });
初始化圓Circle,直接調用基類
// shape/circle.js function Circle(options) { Base.call(this, options); }
base中先對各屬性進行默認值初始化,而后使用傳入值覆蓋
// shape/base.js function Base( options ) { this.id = options.id || guid(); this.zlevel = 0; this.draggable = false; this.clickable = false; this.hoverable = true; this.position = [0, 0]; this.rotation = [0, 0, 0]; this.scale = [1, 1, 0, 0]; for ( var key in options ) { this[ key ] = options[ key ]; } this.style = this.style || {}; }
往storage中添加圖形形狀
// zrender_demo.html zr.addShape(circle);
// zrender.js /** * 添加圖形形狀 * * @param {Object} shape 形狀對象,可用屬性全集,詳見各shape */ ZRender.prototype.addShape = function (shape) { this.storage.add(shape); return this; };
執行繪圖
// zrender_demo.html zr.render();
zrender直接調用painter接口渲染
// zrender.js /** * 渲染 * * @param {Function} callback 渲染結束后回調函數 * todo:增加緩動函數 */ ZRender.prototype.render = function (callback) { this.painter.render(callback); return this; };
Storage、 Painter、handler等未完待續。