echartsカスタムtooltip描画軌跡

11687 ワード

この前、echartsを使ってAPPのトレンド図を作りました.ソースを修正して、いくつかのカスタム効果を実現しました.そして、いくつかのecharts-m.jsの隠しセットを設置して、ここでMarkは忘れないようにします.
1.カスタムtooltipで軌跡を描く.
    echartsが提供するtooltipは、直線を描く時、実線、破線、シャドウ線のみを提供します.直線に基づいて、いくつかの機能を追加するには、例えば線が図の境界を超えて(formaterイベントで注入すれば、遅延効果があります)、ソースを変更する必要があります.内部の描画経路を指導します.echarts自体はcanvasでtootipを描いています.余計なことを言わない
    A.Config属性を追加します.
'echard/component/tooltip'モジュールの下で、ecConfig.tooltipの定義の中で、axis Pointを拡張して、self Defineの属性を追加して、デフォルトはSteringで、有効にしません.着信functionは上書きして使用できます.
	axisPointer: {
            type: 'line',
            lineStyle: {
                color: '#48b',
                width: 2,
                type: 'solid',
                selfDefine : 'self defined function to help draw tip panel'   //modify, new add
            },
            crossStyle: {
                color: '#1e90ff',
                width: 1,
                type: 'dashed',
                selfDefine : 'self defined function to help draw tip panel'   //modify, new add
            },
            shadowStyle: {
                color: 'rgba(150,150,150,0.3)',
                width: 'auto',
                type: 'default',
                selfDefine : 'self defined function to help draw tip panel'   //modify, new add
            }
        },
  B.Tooltip.prototype={}の定義で、_を修正します.style Axis Pointer方法は、self Defineメソッドの注入に注意します.
_styleAxisPointer: function (seriesArray, xStart, yStart, xEnd, yEnd, gap, x, y) {
            if (seriesArray.length > 0) {
                var queryTarget;
                var curType;
                var axisPointer = this.option.tooltip.axisPointer;
                var pointType = axisPointer.type;
                var appendStyle = this.option.tooltip.appendStyle; 
                var style = {
                    line: {},
                    cross: {},
                    shadow: {}
                };
                for (var pType in style) {
                    style[pType].color = axisPointer[pType + 'Style'].color;
                    style[pType].width = axisPointer[pType + 'Style'].width;
                    style[pType].type = axisPointer[pType + 'Style'].type;
                    style[pType].selfDefine = axisPointer[pType + 'Style'].selfDefine;   // new add
                }
                for (var i = 0, l = seriesArray.length; i < l; i++) {
                    queryTarget = seriesArray[i];
                    curType = this.query(queryTarget, 'tooltip.axisPointer.type');
                    pointType = curType || pointType;
                    if (curType) {
                        style[curType].color = this.query(queryTarget, 'tooltip.axisPointer.' + curType + 'Style.color') || style[curType].color;
                        style[curType].width = this.query(queryTarget, 'tooltip.axisPointer.' + curType + 'Style.width') || style[curType].width;
                        style[curType].type = this.query(queryTarget, 'tooltip.axisPointer.' + curType + 'Style.type') || style[curType].type;
                        style[curType].selfDefine = style[curType].selfDefine;  //new add
                    }
                }
                if (pointType === 'line') {
                    var lineWidth = style.line.width;
                    var isVertical = xStart == xEnd;
                    this._axisLineShape.style = {
                        xStart: isVertical ? this.subPixelOptimize(xStart, lineWidth) : xStart,
                        yStart: isVertical ? yStart : this.subPixelOptimize(yStart, lineWidth),
                        xEnd: isVertical ? this.subPixelOptimize(xEnd, lineWidth) : xEnd,
                        yEnd: isVertical ? yEnd : this.subPixelOptimize(yEnd, lineWidth),
                        strokeColor: style.line.color,
                        lineWidth: lineWidth,
                        lineType: style.line.type,
                        selfDefine : style.line.selfDefine   //new add 
                    };
                    this._axisLineShape.invisible = false;
                    this.zr.modShape(this._axisLineShape.id);
                } else if (pointType === 'cross') {
                    var crossWidth = style.cross.width;
                    this._axisCrossShape.style = {
                        brushType: 'stroke',
                        rect: this.component.grid.getArea(),
                        x: this.subPixelOptimize(x, crossWidth),
                        y: this.subPixelOptimize(y, crossWidth),
                        text: ('( ' + this.component.xAxis.getAxis(0).getValueFromCoord(x) + ' , ' + this.component.yAxis.getAxis(0).getValueFromCoord(y) + ' )').replace('  , ', ' ').replace(' ,  ', ' '),
                        textPosition: 'specific',
                        strokeColor: style.cross.color,
                        lineWidth: crossWidth,
                        lineType: style.cross.type
                    };
                    if (this.component.grid.getXend() - x > 100) {
                        this._axisCrossShape.style.textAlign = 'left';
                        this._axisCrossShape.style.textX = x + 10;
                    } else {
                        this._axisCrossShape.style.textAlign = 'right';
                        this._axisCrossShape.style.textX = x - 10;
                    }
                    if (y - this.component.grid.getY() > 50) {
                        this._axisCrossShape.style.textBaseline = 'bottom';
                        this._axisCrossShape.style.textY = y - 10;
                    } else {
                        this._axisCrossShape.style.textBaseline = 'top';
                        this._axisCrossShape.style.textY = y + 10;
                    }
                    this._axisCrossShape.invisible = false;
                    this.zr.modShape(this._axisCrossShape.id);
                } else if (pointType === 'shadow') {
                    if (style.shadow.width == null || style.shadow.width === 'auto' || isNaN(style.shadow.width)) {
                        style.shadow.width = gap;
                    }
                    if (xStart === xEnd) {
                        if (Math.abs(this.component.grid.getX() - xStart) < 2) {
                            style.shadow.width /= 2;
                            xStart = xEnd = xEnd + style.shadow.width / 2;
                        } else if (Math.abs(this.component.grid.getXend() - xStart) < 2) {
                            style.shadow.width /= 2;
                            xStart = xEnd = xEnd - style.shadow.width / 2;
                        }
                    } else if (yStart === yEnd) {
                        if (Math.abs(this.component.grid.getY() - yStart) < 2) {
                            style.shadow.width /= 2;
                            yStart = yEnd = yEnd + style.shadow.width / 2;
                        } else if (Math.abs(this.component.grid.getYend() - yStart) < 2) {
                            style.shadow.width /= 2;
                            yStart = yEnd = yEnd - style.shadow.width / 2;
                        }
                    }
                    this._axisShadowShape.style = {
                        xStart: xStart,
                        yStart: yStart,
                        xEnd: xEnd,
                        yEnd: yEnd,
                        strokeColor: style.shadow.color,
                        lineWidth: style.shadow.width
                    };
                    this._axisShadowShape.invisible = false;
                    this.zr.modShape(this._axisShadowShape.id);
                }
               
                this.zr.refreshNextFrame();
                if(appendStyle && (typeof appendStyle === 'function')){  //new add
                	appendStyle.call(this, x, y);
                }
            }
        },
   C. モジュール'zrender/shpe/Line'を修正し、 Line.prototype={}の定義において、buildPathの描画を指導します.selfDefine関数が入ってきたら、self Defineの画図経路を使って、このような方式によって、各種の様式を描くことができます.必ずしもechartsによって提供されるいくつかのtooltipに従ってはいけません.
Line.prototype = {
        type: 'line',
        buildPath: function (ctx, style) {
        	if(style.selfDefine && (typeof style.selfDefine === 'function')){
//      		console.log(style.xStart+" "+style.yStart+" "+style.xEnd+" "+style.yEnd);
        		var selfDefine = style.selfDefine;
        		selfDefine.call(this,ctx,style.xStart,style.yStart,style.xEnd,style.yEnd);
                return;
        	}else if (!style.lineType || style.lineType == 'solid') {
//          	console.log('solid line');
                ctx.moveTo(style.xStart, style.yStart);
                ctx.lineTo(style.xEnd, style.yEnd);
            } else if (style.lineType == 'dashed' || style.lineType == 'dotted') {
//          	console.log('dash line');
                var dashLength = (style.lineWidth || 1) * (style.lineType == 'dashed' ? 5 : 1);
                dashedLineTo(ctx, style.xStart, style.yStart, style.xEnd, style.yEnd, dashLength);
            }
        },
        getRect: function (style) {
            if (style.__rect) {
                return style.__rect;
            }
            var lineWidth = style.lineWidth || 1;
            style.__rect = {
                x: Math.min(style.xStart, style.xEnd) - lineWidth,
                y: Math.min(style.yStart, style.yEnd) - lineWidth,
                width: Math.abs(style.xStart - style.xEnd) + lineWidth,
                height: Math.abs(style.yStart - style.yEnd) + lineWidth
            };
            return style.__rect;
        }
    };
  D.使用する
   修正が完了したら、以下のように構成されます.YStart-26を設定することで、tooltip線がechartsのグリッドエリアを超えます.
tooltip: {
	showDelay:0,
	transitionDuration:0,
	backgroundColor: "#a6afb6",
	borderColor: "yellow",
	borderWidth: 2,
	padding: 0,
	showContent: false,
	trigger: 'axis', //item,axis
	position: function() {
		return [0, 0];
	},
	formatter: function(params) {	
	}, 
	axisPointer: {
		type: 'line',
		lineStyle: {
			width: 2,
			color :"#a6afb6",
			selfDefine: function(ctx,xStart,yStart,xEnd,yEnd){
				ctx.moveTo(xStart, yStart-26);
				ctx.lineTo(xEnd, yEnd);
			}
		}			
	}
},
2.echarts-m.
    echartsはmバージョンを提供しています.多くのPCイベントを削除して、APPに適用しますが、APIとPC版はいくつかの違いがあります.特にY軸の座標値は右側にデフォルトであり、卵が痛いです.ソースコードを確認することにより、これらのデフォルトの設定が見つかりました.記録は以下の通りです
    1.Y軸座標値水平位置
     yAxis> axisLabel>marginは、35に設定されています.調整できます.
yAxis: [{
	type: 'value',
	lineStyle: {
		color: '#a6afb6',
		width: 1,
		type: 'solid'
	},
	axisLine: {
		lineStyle: {
		  color: '#a6afb6',
		  width: 1,
		  type: 'solid'
		}   
   },
   axisLabel: {
		textStyle: {
		   color: '#a6afb6'
		},
		margin: 35,  //modify for ehcarts-m
		align: 'right',
		formatter: function(value){
			if(value >= 10000000){
				value = value/1000000;
				
				value = value+"M";
			}else if(value >= 10000){
				value = value/1000;
				value = value+"K";
			}else{
				value = value+"";
			}
			for(var i = value.length ; i < 5;i++){
				value = " "+value;
			}
			return value;
		}
	}
}],
  B.max 3は重複トレンド線分を表示します.
アニメーションの設定:false
最後に、問題があったら、交流を歓迎します.