折线图第一次触发时没问题,第二次触发时一卡一卡的

来源:7-1 雷达图开发(设计说明)

qq_失落的世界_2

2016-09-12

/* 柱图组件对象 */


var H5ComponentPolyline = function(name, cfg) {

var component = new H5ComponentBase(name, cfg);


//component.text(cfg.text);


//绘制网格线

var w = cfg.width;

var h = cfg.height;

//绘制画布

var canvas=function(w,h,cfg){

var cns=document.createElement('canvas');

var ctx = cns.getContext('2d');

cns.width = ctx.width = w;

cns.height = ctx.height = h;

//水平网格线 100份 -->10份

var stepY = 10;

ctx.beginPath(); //开始画

ctx.lineWidth = 1; //画笔宽度

ctx.strokeStyle = "#AAA" //画笔颜色


//水平网格线

for (var i = 0; i < stepY + 1; i++) {

var y = (h / stepY) * i;

//console.log(y);

ctx.moveTo(0, y);

ctx.lineTo(w, y);

}

//垂直网格线(根据项目的个数)

var stepX = cfg.data.length + 1; //6

var text_w = w / stepX >> 0; //画布垂直网格的宽度

//console.log(text_w); //88

for (var i = 0; i < stepX + 1; i++) {

var x = (w / stepX) * i;

//console.log(x); //画布垂直网格X的坐标

ctx.moveTo(x, 0);

ctx.lineTo(x, h);

if (cfg.data[i]) {

//console.log(cfg.data[i]);

var text = $('<div class="text">');

text.text(cfg.data[i][0]);

var textLeft=x/2- text_w/4 +text_w / 2;

text.css('width', text_w / 2).css('left',textLeft);

//console.log((x / 2 - text_w / 4) + text_w / 2);

component.append(text)

}

}

ctx.stroke();


return cns;

}


//加入一个画布,做网格背景的

/*var cns = document.createElement('canvas');

var ctx = cns.getContext('2d');

cns.width = ctx.width = w;

cns.height = ctx.height = h;*/


component.append(canvas(w,h,cfg));

/*

//水平网格线 100份 -->10份

var step = 10;


ctx.beginPath(); //开始画

ctx.lineWidth = 1; //画笔宽度

ctx.strokeStyle = "#AAA" //画笔颜色

window.ctx = ctx;

//水平网格线

for (var i = 0; i < step + 1; i++) {

var y = (h / step) * i;

ctx.moveTo(0, y);

ctx.lineTo(w, y);

}*/


/*//垂直网格线(根据项目的个数)

var step = cfg.data.length + 1;

var text_w = w / step >> 0;

for (var i = 0; i < step + 1; i++) {

var x = (w / step) * i;

ctx.moveTo(x, 0);

ctx.lineTo(x, h);

if (cfg.data[i]) {

var text = $('<div class="text">');

text.text(cfg.data[i][0]);

text.css('width', text_w / 2).css('left', (x / 2 - text_w / 4) + text_w / 2);

component.append(text)

}


}

   

ctx.stroke();

         */

//绘制折线数据,重新创建画布

var cns = document.createElement('canvas');

var ctx = cns.getContext('2d');

cns.width = ctx.width = w;

cns.height = ctx.height = h;

component.append(cns);

     

    /**

     * 绘制折现以及对应的数据和阴影

     * @param {floot} per 0到1之间的数据,会根据这个值绘制最终数据对应的中间状态

     * 

     */

    

var draw = function(per) {

//清空画布

        ctx.clearRect(0,0,w,h);

        

ctx.beginPath(); //开始画

ctx.lineWidth = 3; //画笔宽度

ctx.strokeStyle = "#ff8878" //画笔颜色


var x = 0;

var y = 0;

/* ctx.moveTo(10,10);

ctx.arc(10,10,5,0,2*Math.PI);*/

//step=cfg.data.length+1; //6

var row_w = (w / (cfg.data.length + 1));

//画点

for (i in cfg.data) { //for in 是枚举对象的方法

var item = cfg.data[i];

x = row_w * i + row_w;

//console.log(x);

y = h-(item[1]*h*per);

ctx.moveTo(x, y);

ctx.arc(x, y, 5, 0, 2 * Math.PI);

}

//连线

//移动画笔到第一个数据的点位置

ctx.moveTo(row_w, h - (cfg.data[0][1]*h*per));

for (i in cfg.data) { //for in 是枚举对象的方法

var item = cfg.data[i];

x = row_w * i + row_w;

y = h-(item[1]*h*per);

ctx.lineTo(x, y);

}

ctx.stroke();

ctx.lineWidth = 1; //画笔宽度

ctx.strokeStyle = 'rgba(255, 136, 120, 0)';


//绘制阴影

ctx.lineTo(x, h);

ctx.lineTo(row_w, h);

ctx.fillStyle = 'rgba(255, 136, 120, 0.2)';

ctx.fill();


//写文字数据

for (i in cfg.data) { //for in 是枚举对象的方法

var item = cfg.data[i];

x = row_w * i + row_w;

y = h-(item[1]*h*per);

ctx.fillStyle = item[2] ? item[2] : '#595959';

ctx.fillText((item[1] * 100 + '%'), x - 10, y - 10);

}


ctx.stroke();

}

//折线图生长动画

component.on('onLoad', function() {

        var s=0;

        for(var i=0;i<100;i++){

        setTimeout(function(){

           s+=0.01;

           draw(s);

        },i*10);

        }

});

component.on('onLeave', function() {

//折线图退长动画

var s=1;

         for(var i=0;i<100;i++){

        setTimeout(function(){

           s-=0.01;

           draw(s);

          },i*10+500);

}

});


return component;

}







写回答

1回答

Lyn

2016-09-19

给个线上代码我看看?

0
0

Web App用组件方式开发全站

用HTML5/CSS3/JS流行技术,实现移动端可视化数据报告

3164 学习 · 516 问题

查看课程