📄 canvas.js
字号:
PlotKit.CanvasRenderer.prototype._renderLineAxis = function() { this._renderAxis();};PlotKit.CanvasRenderer.prototype._renderAxis = function() { if (!this.options.drawXAxis && !this.options.drawYAxis) return; var context = this.element.getContext("2d"); var labelStyle = {"style": {"position": "absolute", "fontSize": this.options.axisLabelFontSize + "px", "zIndex": 10, "color": this.options.axisLabelColor.toRGBString(), "width": this.options.axisLabelWidth + "px", "overflow": "hidden" } }; // axis lines context.save(); context.strokeStyle = this.options.axisLineColor.toRGBString(); context.lineWidth = this.options.axisLineWidth; if (this.options.drawYAxis) { if (this.layout.yticks) { var drawTick = function(tick) { if (typeof(tick) == "function") return; var x = this.area.x; var y = this.area.y + tick[0] * this.area.h; context.beginPath(); context.moveTo(x, y); context.lineTo(x - this.options.axisTickSize, y); context.closePath(); context.stroke(); var label = DIV(labelStyle, tick[1]); label.style.top = (y - this.options.axisLabelFontSize) + "px"; label.style.left = (x - this.options.padding.left - this.options.axisTickSize) + "px"; label.style.textAlign = "right"; label.style.width = (this.options.padding.left - this.options.axisTickSize * 2) + "px"; MochiKit.DOM.appendChildNodes(this.container, label); this.ylabels.push(label); }; MochiKit.Iter.forEach(this.layout.yticks, bind(drawTick, this)); } context.beginPath(); context.moveTo(this.area.x, this.area.y); context.lineTo(this.area.x, this.area.y + this.area.h); context.closePath(); context.stroke(); } if (this.options.drawXAxis) { if (this.layout.xticks) { var drawTick = function(tick) { if (typeof(dataset) == "function") return; var x = this.area.x + tick[0] * this.area.w; var y = this.area.y + this.area.h; context.beginPath(); context.moveTo(x, y); context.lineTo(x, y + this.options.axisTickSize); context.closePath(); context.stroke(); var label = DIV(labelStyle, tick[1]); label.style.top = (y + this.options.axisTickSize) + "px"; label.style.left = (x - this.options.axisLabelWidth/2) + "px"; label.style.textAlign = "center"; label.style.width = this.options.axisLabelWidth + "px"; MochiKit.DOM.appendChildNodes(this.container, label); this.xlabels.push(label); }; MochiKit.Iter.forEach(this.layout.xticks, bind(drawTick, this)); } context.beginPath(); context.moveTo(this.area.x, this.area.y + this.area.h); context.lineTo(this.area.x + this.area.w, this.area.y + this.area.h); context.closePath(); context.stroke(); } context.restore();};PlotKit.CanvasRenderer.prototype._renderPieAxis = function() { if (!this.options.drawXAxis) return; if (this.layout.xticks) { // make a lookup dict for x->slice values var lookup = new Array(); for (var i = 0; i < this.layout.slices.length; i++) { lookup[this.layout.slices[i].xval] = this.layout.slices[i]; } var centerx = this.area.x + this.area.w * 0.5; var centery = this.area.y + this.area.h * 0.5; var radius = Math.min(this.area.w * this.options.pieRadius, this.area.h * this.options.pieRadius); var labelWidth = this.options.axisLabelWidth; for (var i = 0; i < this.layout.xticks.length; i++) { var slice = lookup[this.layout.xticks[i][0]]; if (MochiKit.Base.isUndefinedOrNull(slice)) continue; var angle = (slice.startAngle + slice.endAngle)/2; // normalize the angle var normalisedAngle = angle; if (normalisedAngle > Math.PI * 2) normalisedAngle = normalisedAngle - Math.PI * 2; else if (normalisedAngle < 0) normalisedAngle = normalisedAngle + Math.PI * 2; var labelx = centerx + Math.sin(normalisedAngle) * (radius + 10); var labely = centery - Math.cos(normalisedAngle) * (radius + 10); var attrib = {"position": "absolute", "zIndex": 11, "width": labelWidth + "px", "fontSize": this.options.axisLabelFontSize + "px", "overflow": "hidden", "color": this.options.axisLabelColor.toHexString() }; if (normalisedAngle <= Math.PI * 0.5) { // text on top and align left attrib["textAlign"] = "left"; attrib["verticalAlign"] = "top"; attrib["left"] = labelx + "px"; attrib["top"] = (labely - this.options.axisLabelFontSize) + "px"; } else if ((normalisedAngle > Math.PI * 0.5) && (normalisedAngle <= Math.PI)) { // text on bottom and align left attrib["textAlign"] = "left"; attrib["verticalAlign"] = "bottom"; attrib["left"] = labelx + "px"; attrib["top"] = labely + "px"; } else if ((normalisedAngle > Math.PI) && (normalisedAngle <= Math.PI*1.5)) { // text on bottom and align right attrib["textAlign"] = "right"; attrib["verticalAlign"] = "bottom"; attrib["left"] = (labelx - labelWidth) + "px"; attrib["top"] = labely + "px"; } else { // text on top and align right attrib["textAlign"] = "right"; attrib["verticalAlign"] = "bottom"; attrib["left"] = (labelx - labelWidth) + "px"; attrib["top"] = (labely - this.options.axisLabelFontSize) + "px"; } var label = DIV({'style': attrib}, this.layout.xticks[i][1]); this.xlabels.push(label); MochiKit.DOM.appendChildNodes(this.container, label); } }};PlotKit.CanvasRenderer.prototype._renderBackground = function() { var context = this.element.getContext("2d"); context.save(); context.fillStyle = this.options.backgroundColor.toRGBString(); context.fillRect(0, 0, this.width, this.height); context.restore();};PlotKit.CanvasRenderer.prototype.clear = function() { if (this.isIE) { // VML takes a while to start up, so we just poll every this.IEDelay try { if (this.clearDelay) { this.clearDelay.cancel(); this.clearDelay = null; } var context = this.element.getContext("2d"); } catch (e) { this.isFirstRender = false; this.clearDelay = MochiKit.Async.wait(this.IEDelay); this.clearDelay.addCallback(bind(this.clear, this)); return; } } var context = this.element.getContext("2d"); context.clearRect(0, 0, this.width, this.height); MochiKit.Iter.forEach(this.xlabels, MochiKit.DOM.removeElement); MochiKit.Iter.forEach(this.ylabels, MochiKit.DOM.removeElement); this.xlabels = new Array(); this.ylabels = new Array();};// ----------------------------------------------------------------// Everything below here is experimental and undocumented.// ----------------------------------------------------------------PlotKit.CanvasRenderer.prototype._initialiseEvents = function() { var connect = MochiKit.Signal.connect; var bind = MochiKit.Base.bind; //MochiKit.Signal.registerSignals(this, ['onmouseover', 'onclick', 'onmouseout', 'onmousemove']); //connect(this.element, 'onmouseover', bind(this.onmouseover, this)); //connect(this.element, 'onmouseout', bind(this.onmouseout, this)); //connect(this.element, 'onmousemove', bind(this.onmousemove, this)); connect(this.element, 'onclick', bind(this.onclick, this));};PlotKit.CanvasRenderer.prototype._resolveObject = function(e) { // does not work in firefox //var x = (e.event().offsetX - this.area.x) / this.area.w; //var y = (e.event().offsetY - this.area.y) / this.area.h; var x = (e.mouse().page.x - PlotKit.Base.findPosX(this.element) - this.area.x) / this.area.w; var y = (e.mouse().page.y - PlotKit.Base.findPosY(this.element) - this.area.y) / this.area.h; //log(x, y); var isHit = this.layout.hitTest(x, y); if (isHit) return isHit; return null;};PlotKit.CanvasRenderer.prototype._createEventObject = function(layoutObj, e) { if (layoutObj == null) { return null; } e.chart = layoutObj return e;};PlotKit.CanvasRenderer.prototype.onclick = function(e) { var layoutObject = this._resolveObject(e); var eventObject = this._createEventObject(layoutObject, e); if (eventObject != null) MochiKit.Signal.signal(this, "onclick", eventObject);};PlotKit.CanvasRenderer.prototype.onmouseover = function(e) { var layoutObject = this._resolveObject(e); var eventObject = this._createEventObject(layoutObject, e); if (eventObject != null) signal(this, "onmouseover", eventObject);};PlotKit.CanvasRenderer.prototype.onmouseout = function(e) { var layoutObject = this._resolveObject(e); var eventObject = this._createEventObject(layoutObject, e); if (eventObject == null) signal(this, "onmouseout", e); else signal(this, "onmouseout", eventObject);};PlotKit.CanvasRenderer.prototype.onmousemove = function(e) { var layoutObject = this._resolveObject(e); var eventObject = this._createEventObject(layoutObject, e); if ((layoutObject == null) && (this.event_isinside == null)) { // TODO: should we emit an event anyway? return; } if ((layoutObject != null) && (this.event_isinside == null)) signal(this, "onmouseover", eventObject); if ((layoutObject == null) && (this.event_isinside != null)) signal(this, "onmouseout", eventObject); if ((layoutObject != null) && (this.event_isinside != null)) signal(this, "onmousemove", eventObject); this.event_isinside = layoutObject; //log("move", x, y); };PlotKit.CanvasRenderer.isSupported = function(canvasName) { var canvas = null; try { if (MochiKit.Base.isUndefinedOrNull(canvasName)) canvas = MochiKit.DOM.CANVAS({}); else canvas = MochiKit.DOM.getElement(canvasName); var context = canvas.getContext("2d"); } catch (e) { var ie = navigator.appVersion.match(/MSIE (\d\.\d)/); var opera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); if ((!ie) || (ie[1] < 6) || (opera)) return false; return true; } return true;};// Namespace IniitialisationPlotKit.Canvas = {}PlotKit.Canvas.CanvasRenderer = PlotKit.CanvasRenderer;PlotKit.Canvas.EXPORT = [ "CanvasRenderer"];PlotKit.Canvas.EXPORT_OK = [ "CanvasRenderer"];PlotKit.Canvas.__new__ = function() { var m = MochiKit.Base; m.nameFunctions(this); this.EXPORT_TAGS = { ":common": this.EXPORT, ":all": m.concat(this.EXPORT, this.EXPORT_OK) };};PlotKit.Canvas.__new__();MochiKit.Base._exportSymbols(this, PlotKit.Canvas);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -