You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
311 lines
12 KiB
311 lines
12 KiB
/**
|
|
* 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;
|
|
});
|
|
|
|
|
|
|