UNPKG

@mapgis/webclient-es6-mapboxgl

Version:

545 lines (495 loc) 17.8 kB
import { Common } from '@mapgis/webclient-es6-service'; const { Zondy, indexOf, newGuid } = Common; import {Storage} from './Storage'; import {Painter} from './Painter'; import {Handler} from './Handler'; import {Animation} from './Animation'; /** * @private * @class Zondy.LevelRenderer.Render * @classdesc Render 接口类,对外可用的所有接口都在这里。内部使用非 get 接口统一返回 this 对象,支持链式调用。 */ class Render { /** * @function Zondy.LevelRenderer.Render.constructor * @description 构造函数。 * * @param {string} id - 唯一标识。 * @param {HTMLElement} dom - Dom 对象。 */ constructor(id, dom) { /** * @member {string} Zondy.LevelRenderer.Render.prototype.id * @description 唯一标识。 */ this.id = id; /** * @member {Zondy.LevelRenderer.Storage} Zondy.LevelRenderer.Render.prototype.storage * @description 图形仓库对象。 */ this.storage = new Storage(); /** * @member {Zondy.LevelRenderer.Painter} Zondy.LevelRenderer.Render.prototype.painter * @description 绘制器对象。 * */ this.painter = new Painter(dom, this.storage); /** * @member {Zondy.LevelRenderer.Handler} Zondy.LevelRenderer.Render.prototype.handler * @description 事件处理对象。 * */ this.handler = new Handler(dom, this.storage, this.painter); /** * @member {Array} Zondy.LevelRenderer.Render.prototype.animatingElements * @description 动画控制数组。 * */ this.animatingElements = []; /** * @member {Zondy.LevelRenderer.animation.Animation} Zondy.LevelRenderer.Render.prototype.animation * @description 动画对象。 * */ this.animation = new Animation({ stage: { update: Render.getFrameCallback(this) } }); /** * @member {boolean} Zondy.LevelRenderer.Render.prototype._needsRefreshNextFrame * @description 是否需要刷新下一帧。 * */ this._needsRefreshNextFrame = false; this.animation.start(); this.CLASS_NAME = "Zondy.LevelRenderer.Render"; } /** * @function Zondy.LevelRenderer.Render.prototype.destory * @description 销毁对象,释放资源。调用此函数后所有属性将被置为 null。 */ destroy() { this.id = null; this.storage = null; this.painter = null; this.handler = null; this.animatingElements = null; this.animation = null; this._needsRefreshNextFrame = null; } /** * @function Zondy.LevelRenderer.Render.prototype.getId * @description 获取实例唯一标识。 * @return {string} 实例唯一标识。 */ getId() { return this.id; } /** * @function Zondy.LevelRenderer.Render.prototype.addShape * @description 添加图形形状到根节点。 * * @param {Zondy.LevelRenderer.Shape} shape - 图形对象,可用属性全集,详见各 shape。 * @return {Zondy.LevelRenderer.Render} this。 */ addShape(shape) { this.storage.addRoot(shape); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.addGroup * @description 添加组到根节点。 * * (code) * //添加组到根节点例子 * var render = new Zondy.LevelRenderer.Render("Render",document.getElementById('lRendertest')); * render.clear(); * var g = new Zondy.LevelRenderer.Group(); * g.addChild(new Zondy.LevelRenderer.Shape.Circle({ * style: { * x: 100, * y: 100, * r: 20, * brushType: 'fill' * } * })); * render.addGroup(g); * render.render(); * (end) * * @param {Zondy.LevelRenderer.Group} group - 组对象。 * @return {Zondy.LevelRenderer.Render} this。 */ addGroup(group) { this.storage.addRoot(group); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.delShape * @description 从根节点删除图形形状。 * * @param {string} shapeId - 图形对象唯一标识。 * @return {Zondy.LevelRenderer.Render} this。 */ delShape(shapeId) { this.storage.delRoot(shapeId); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.delGroup * @description 从根节点删除组。 * * @param {string} groupId - 组对象唯一标识。 * @return {Zondy.LevelRenderer.Render} this。 */ delGroup(groupId) { this.storage.delRoot(groupId); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.modShape * @description 修改图形形状。 * * @param {string} shapeId - 图形对象唯一标识。 * @param {Zondy.LevelRenderer.Shape} shape - 图形对象。 * @return {Zondy.LevelRenderer.Render} this。 */ modShape(shapeId, shape) { this.storage.mod(shapeId, shape); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.modGroup * @description 修改组。 * * @param {string} groupId - 组对象唯一标识。 * @param {Zondy.LevelRenderer.Group} group - 组对象。 * @return {Zondy.LevelRenderer.Render} this。 */ modGroup(groupId, group) { this.storage.mod(groupId, group); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.modLayer * @description 修改指定 zlevel 的绘制配置项。 * * @param {string} zLevel - 组对象唯一标识。 * @param {Object} config - 配置对象。 * @param {string} clearColor - 每次清空画布的颜色。默认值:0。 * @param {boolean} motionBlur - 是否开启动态模糊。默认值:false。 * @param {number} lastFrameAlpha - 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显。默认值:0.7。 * @param {Array.<number>} position - 层的平移。 * @param {Array.<number>} rotation - 层的旋转。 * @param {Array.<number>} scale - 层的缩放。 * @param {boolean} zoomable - 层是否支持鼠标缩放操作。默认值:false。 * @param {boolean} panable - 层是否支持鼠标平移操作。默认值:false。 * @return {Zondy.LevelRenderer.Render} this。 */ modLayer(zLevel, config) { this.painter.modLayer(zLevel, config); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.addHoverShape * @description 添加额外高亮层显示,仅提供添加方法,每次刷新后高亮层图形均被清空。 * * @param {Zondy.LevelRenderer.Shape} shape - 图形对象。 * @return {Zondy.LevelRenderer.Render} this。 */ addHoverShape(shape) { this.storage.addHover(shape); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.render * @description 渲染。 * * @callback {Function} callback - 渲染结束后回调函数。 * @return {Zondy.LevelRenderer.Render} this。 */ render(callback) { this.painter.render(callback); this._needsRefreshNextFrame = false; return this; } /** * @function Zondy.LevelRenderer.Render.prototype.refresh * @description 视图更新。 * * @callback {Function} callback - 视图更新后回调函数。 * @return {Zondy.LevelRenderer.Render} this。 */ refresh(callback) { this.painter.refresh(callback); this._needsRefreshNextFrame = false; return this; } /** * @function Zondy.LevelRenderer.Render.prototype.refreshNextFrame * @description 标记视图在浏览器下一帧需要绘制。 * @return {Zondy.LevelRenderer.Render} this。 */ refreshNextFrame() { this._needsRefreshNextFrame = true; return this; } /** * @function Zondy.LevelRenderer.Render.prototype.refreshHover * @description 绘制(视图更新)高亮层。 * @callback {Function} callback - 视图更新后回调函数。 * @return {Zondy.LevelRenderer.Render} this。 */ refreshHover(callback) { this.painter.refreshHover(callback); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.refreshShapes * @description 视图更新。 * * @param {Array.<Zondy.LevelRenderer.Shape>} shapeList - 需要更新的图形列表。 * @callback {Function} callback - 视图更新后回调函数。 * @return {Zondy.LevelRenderer.Render} this。 */ refreshShapes(shapeList, callback) { this.painter.refreshShapes(shapeList, callback); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.resize * @description 调整视图大小。 * @return {Zondy.LevelRenderer.Render} this。 */ resize() { this.painter.resize(); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.animate * @description 动画。 * * @example * zr.animate(circle.id, 'style', false) * .when(1000, {x: 10} ) * .done(function(){ // Animation done }) * .start() * * * @param {Array.<(Zondy.LevelRenderer.Shape/Zondy.LevelRenderer.Group)>} el - 动画对象。 * @param {string} path - 需要添加动画的属性获取路径,可以通过 a.b.c 来获取深层的属性。若传入对象为<Zondy.LevelRenderer.Group>,path需为空字符串。 * @param {Function} loop - 动画是否循环。 * @return {Zondy.LevelRenderer.animation.Animator} Animator。 */ animate(el, path, loop) { if (typeof (el) === 'string') { el = this.storage.get(el); } if (el) { var target; if (path) { var pathSplitted = path.split('.'); var prop = el; for (var i = 0, l = pathSplitted.length; i < l; i++) { if (!prop) { continue; } prop = prop[pathSplitted[i]]; } if (prop) { target = prop; } } else { target = el; } if (!target) { return; } var animatingElements = this.animatingElements; if (typeof el.__aniCount === 'undefined') { // 正在进行的动画记数 el.__aniCount = 0; } if (el.__aniCount === 0) { animatingElements.push(el); } el.__aniCount++; return this.animation.animate(target, {loop: loop}) .done(function () { el.__aniCount--; if (el.__aniCount === 0) { // 从animatingElements里移除 var idx = indexOf(animatingElements, el); animatingElements.splice(idx, 1); } }); } } /** * @function Zondy.LevelRenderer.Render.prototype.clearAnimation * @description 停止所有动画。 * */ clearAnimation() { this.animation.clear(); } /** * @function Zondy.LevelRenderer.Render.prototype.getWidth * @description 获取视图宽度。 * @return {number} 视图宽度。 */ getWidth() { return this.painter.getWidth(); } /** * @function Zondy.LevelRenderer.Render.prototype.getHeight * @description 获取视图高度。 * @return {number} 视图高度。 */ getHeight() { return this.painter.getHeight(); } /** * @function Zondy.LevelRenderer.Render.prototype.toDataURL * @description 图像导出。 * * @param {string} type - 类型。 * @param {string} backgroundColor - 背景色,默认值:"#FFFFFF"。 * @param {string} args - 参数。 * @return {string} 图片的 Base64 url。 */ toDataURL(type, backgroundColor, args) { return this.painter.toDataURL(type, backgroundColor, args); } /** * @function Zondy.LevelRenderer.Render.prototype.shapeToImage * @description 将常规 shape 转成 image shape。 * * @param {Zondy.LevelRenderer.Shape} e - 图形。 * @param {number} width - 宽度。 * @param {number} height - 高度。 * @return {Object} image shape。 */ shapeToImage(e, width, height) { var id = newGuid(); return this.painter.shapeToImage(id, e, width, height); } /** * @function Zondy.LevelRenderer.Render.prototype.on * @description 事件绑定。 * * @param {string} eventName - 事件名称。 * @param {Function} eventHandler - 响应函数。 * @return {Zondy.LevelRenderer.Render} this。 */ on(eventName, eventHandler) { this.handler.on(eventName, eventHandler); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.un * @description 事件解绑定,参数为空则解绑所有自定义事件。 * * @param {string} eventName - 事件名称。 * @param {Function} eventHandler - 响应函数。 * @return {Zondy.LevelRenderer.Render} this。 */ un(eventName, eventHandler) { this.handler.un(eventName, eventHandler); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.trigger * @description 事件触发。 * * @param {string} eventName - 事件名称,resize,hover,drag,etc。 * @param {event} event - event dom事件对象。 * @return {Zondy.LevelRenderer.Render} this。 */ trigger(eventName, event) { this.handler.trigger(eventName, event); this.handler.dispatch(eventName, event); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.clear * @description 清除当前 Render 下所有类图的数据和显示,clear 后 MVC 和已绑定事件均还存在在,Render 可用。 * @return {Zondy.LevelRenderer.Render} this。 */ clear() { this.storage.delRoot(); this.painter.clear(); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.dispose * @description 释放当前 Render 实例(删除包括 dom,数据、显示和事件绑定),dispose后 Render 不可用。 */ dispose() { this.animation.stop(); this.clear(); this.storage.dispose(); this.painter.dispose(); this.handler.dispose(); this.animation = null; this.animatingElements = null; this.storage = null; this.painter = null; this.handler = null; } // SMIC-方法扩展 - start /** * @function Zondy.LevelRenderer.Render.prototype.updateHoverShapes * @description 更新设置显示高亮图层。 * * @param {Array.<Zondy.LevelRenderer.Shape>} shapes - 图形数组。 * @return {Zondy.LevelRenderer.Render} this。 */ updateHoverShapes(shapes) { this.painter.updateHoverLayer(shapes); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.getAllShapes * @description 获取所有图形。 * @return {Array.<Zondy.LevelRenderer.Shape>} 图形数组。 */ getAllShapes() { return this.storage._shapeList; } /** * @function Zondy.LevelRenderer.Render.prototype.clearAll * @description 清除高亮和图形图层。 * @return {Zondy.LevelRenderer.Render} this。 */ clearAll() { this.clear(); this.painter.clearHover(); return this; } /** * @function Zondy.LevelRenderer.Render.prototype.getHoverOne * @description 获取单个高亮图形,当前鼠标对应。 * @return {Zondy.LevelRenderer.Shape} 高亮图形。 */ getHoverOne() { return this.handler.getLastHoverOne(); } static getFrameCallback(renderInstance) { return function () { var animatingElements = renderInstance.animatingElements; //animatingElements instanceof Array 临时解决 destory 报错 if (animatingElements instanceof Array) { for (var i = 0, l = animatingElements.length; i < l; i++) { renderInstance.storage.mod(animatingElements[i].id); } if (animatingElements.length || renderInstance._needsRefreshNextFrame) { renderInstance.refresh(); } } }; } } export {Render}; Zondy.LevelRenderer.Render = Render;