/** * echarts组件:图表标题 * * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) * */ define(function (require) { var Base = require('./base'); // 图形依赖 var TextShape = require('zrender/shape/Text'); var RectangleShape = require('zrender/shape/Rectangle'); var ecConfig = require('../config'); // 图表标题 ecConfig.title = { zlevel: 0, // 一级层叠 z: 6, // 二级层叠 show: true, text: '', // link: null, // 超链接跳转 // target: null, // 仅支持self | blank subtext: '', // sublink: null, // 超链接跳转 // subtarget: null, // 仅支持self | blank x: 'left', // 水平安放位置,默认为左对齐,可选为: // 'center' ¦ 'left' ¦ 'right' // ¦ {number}(x坐标,单位px) y: 'top', // 垂直安放位置,默认为全图顶端,可选为: // 'top' ¦ 'bottom' ¦ 'center' // ¦ {number}(y坐标,单位px) //textAlign: null // 水平对齐方式,默认根据x设置自动调整 backgroundColor: 'rgba(0,0,0,0)', borderColor: '#ccc', // 标题边框颜色 borderWidth: 0, // 标题边框线宽,单位px,默认为0(无边框) padding: 5, // 标题内边距,单位px,默认各方向内边距为5, // 接受数组分别设定上右下左边距,同css itemGap: 5, // 主副标题纵向间隔,单位px,默认为10, textStyle: { fontSize: 18, fontWeight: 'bolder', color: '#333' // 主标题文字颜色 }, subtextStyle: { color: '#aaa' // 副标题文字颜色 } }; var zrUtil = require('zrender/tool/util'); var zrArea = require('zrender/tool/area'); var zrColor = require('zrender/tool/color'); /** * 构造函数 * @param {Object} messageCenter echart消息中心 * @param {ZRender} zr zrender实例 * @param {Object} option 图表参数 */ function Title(ecTheme, messageCenter, zr, option, myChart) { Base.call(this, ecTheme, messageCenter, zr, option, myChart); this.refresh(option); } Title.prototype = { type: ecConfig.COMPONENT_TYPE_TITLE, _buildShape: function () { if (!this.titleOption.show) { return; } // 标题元素组的位置参数,通过计算所得x, y, width, height this._itemGroupLocation = this._getItemGroupLocation(); this._buildBackground(); this._buildItem(); for (var i = 0, l = this.shapeList.length; i < l; i++) { this.zr.addShape(this.shapeList[i]); } }, /** * 构建所有标题元素 */ _buildItem: function () { var text = this.titleOption.text; var link = this.titleOption.link; var target = this.titleOption.target; var subtext = this.titleOption.subtext; var sublink = this.titleOption.sublink; var subtarget = this.titleOption.subtarget; var font = this.getFont(this.titleOption.textStyle); var subfont = this.getFont(this.titleOption.subtextStyle); var x = this._itemGroupLocation.x; var y = this._itemGroupLocation.y; var width = this._itemGroupLocation.width; var height = this._itemGroupLocation.height; var textShape = { zlevel: this.getZlevelBase(), z: this.getZBase(), style: { y: y, color: this.titleOption.textStyle.color, text: text, textFont: font, textBaseline: 'top' }, highlightStyle: { color: zrColor.lift(this.titleOption.textStyle.color, 1), brushType: 'fill' }, hoverable: false }; if (link) { textShape.hoverable = true; textShape.clickable = true; textShape.onclick = function (){ if (!target || target != 'self') { window.open(link); } else { window.location = link; } }; } var subtextShape = { zlevel: this.getZlevelBase(), z: this.getZBase(), style: { y: y + height, color: this.titleOption.subtextStyle.color, text: subtext, textFont: subfont, textBaseline: 'bottom' }, highlightStyle: { color: zrColor.lift(this.titleOption.subtextStyle.color, 1), brushType: 'fill' }, hoverable: false }; if (sublink) { subtextShape.hoverable = true; subtextShape.clickable = true; subtextShape.onclick = function (){ if (!subtarget || subtarget != 'self') { window.open(sublink); } else { window.location = sublink; } }; } switch (this.titleOption.x) { case 'center' : textShape.style.x = subtextShape.style.x = x + width / 2; textShape.style.textAlign = subtextShape.style.textAlign = 'center'; break; case 'left' : textShape.style.x = subtextShape.style.x = x; textShape.style.textAlign = subtextShape.style.textAlign = 'left'; break; case 'right' : textShape.style.x = subtextShape.style.x = x + width; textShape.style.textAlign = subtextShape.style.textAlign = 'right'; break; default : x = this.titleOption.x - 0; x = isNaN(x) ? 0 : x; textShape.style.x = subtextShape.style.x = x; break; } if (this.titleOption.textAlign) { textShape.style.textAlign = subtextShape.style.textAlign = this.titleOption.textAlign; } this.shapeList.push(new TextShape(textShape)); subtext !== '' && this.shapeList.push(new TextShape(subtextShape)); }, _buildBackground: function () { var padding = this.reformCssArray(this.titleOption.padding); this.shapeList.push(new RectangleShape({ zlevel: this.getZlevelBase(), z: this.getZBase(), hoverable :false, style: { x: this._itemGroupLocation.x - padding[3], y: this._itemGroupLocation.y - padding[0], width: this._itemGroupLocation.width + padding[3] + padding[1], height: this._itemGroupLocation.height + padding[0] + padding[2], brushType: this.titleOption.borderWidth === 0 ? 'fill' : 'both', color: this.titleOption.backgroundColor, strokeColor: this.titleOption.borderColor, lineWidth: this.titleOption.borderWidth } })); }, /** * 根据选项计算标题实体的位置坐标 */ _getItemGroupLocation: function () { var padding = this.reformCssArray(this.titleOption.padding); var text = this.titleOption.text; var subtext = this.titleOption.subtext; var font = this.getFont(this.titleOption.textStyle); var subfont = this.getFont(this.titleOption.subtextStyle); var totalWidth = Math.max( zrArea.getTextWidth(text, font), zrArea.getTextWidth(subtext, subfont) ); var totalHeight = zrArea.getTextHeight(text, font) + (subtext === '' ? 0 : (this.titleOption.itemGap + zrArea.getTextHeight(subtext, subfont)) ); var x; var zrWidth = this.zr.getWidth(); switch (this.titleOption.x) { case 'center' : x = Math.floor((zrWidth - totalWidth) / 2); break; case 'left' : x = padding[3] + this.titleOption.borderWidth; break; case 'right' : x = zrWidth - totalWidth - padding[1] - this.titleOption.borderWidth; break; default : x = this.titleOption.x - 0; x = isNaN(x) ? 0 : x; break; } var y; var zrHeight = this.zr.getHeight(); switch (this.titleOption.y) { case 'top' : y = padding[0] + this.titleOption.borderWidth; break; case 'bottom' : y = zrHeight - totalHeight - padding[2] - this.titleOption.borderWidth; break; case 'center' : y = Math.floor((zrHeight - totalHeight) / 2); break; default : y = this.titleOption.y - 0; y = isNaN(y) ? 0 : y; break; } return { x: x, y: y, width: totalWidth, height: totalHeight }; }, /** * 刷新 */ refresh: function (newOption) { if (newOption) { this.option = newOption; this.option.title = this.reformOption(this.option.title); this.titleOption = this.option.title; this.titleOption.textStyle = this.getTextStyle( this.titleOption.textStyle ); this.titleOption.subtextStyle = this.getTextStyle( this.titleOption.subtextStyle ); } this.clear(); this._buildShape(); } }; zrUtil.inherits(Title, Base); require('../component').define('title', Title); return Title; });