yj.微信小程序 长短不一的饼状图

今天项目有个需求,发过来瞅了一眼,尼玛哦,这尼玛是画的吧,画的吧!!!(图1)

图1

赶紧百度一波 ,没有。。。没有。。。没有。。。擦嘞  要哭惹   ,百度h5的  有个看起来很舒的  

https://blog.csdn.net/Welkin_qing/article/details/84592210

还好看的懂h5 但是差距还是很大    emmmmm   最终我放弃写成一摸一样了     结果 如: (图二)

图2


图2代码:

.js:

var context = wx.createCanvasContext('Canvas');

    var array = [3,10,10,7,5,5,8,6];

    var arraystr = ['职业发展', '财务状况', '个人健康', '娱乐休闲', '家庭', '朋友和重要他人', '个人成长', '自我实现'];

    var colors = ["red", "blue", "yellow", "green", "purple", "black", "gold","forestgreen"];

    /*伸出去的线的长度*/

    var outLine = 30;

    /*说明的矩形大小*/

    var rectW = 30;

    var rectH = 16;

    var space = 20;

    var total = 0;

    for (var val = 0; val < array.length; val++) {

      total += array[val];

    }

    var point = { x: 250, y: 120 };

    var radius = [7 * 3, 7 * 10, 7 * 10, 7 * 7, 7 * 5, 7 * 5, 7 * 8, 7 *6];

    for (var i = 0; i < array.length; i++) {

      context.beginPath();

      var start = 0;

      if (i > 0) {

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

          start += array[j] / total * 2 * Math.PI;

        }

      }

      context.arc(point.x, point.y, radius[i], start, start + array[i] / total * 2 * Math.PI, false);

      context.setLineWidth(0)

      context.lineTo(point.x, point.y);

      context.setStrokeStyle('#F5F5F5');

      context.setFillStyle(colors[i]);

      context.fill();

      context.closePath();

      context.stroke();


      var edge = radius[i] + outLine;

      /*x轴方向的直角边*/

      var edgeX = Math.cos(start + (array[i] / total * 2 * Math.PI)/2) * edge;

      /*y轴方向的直角边*/

      var edgeY = Math.sin(start + (array[i] / total * 2 * Math.PI) / 2) * edge;

      var outX = point.x + edgeX;

      var outY = point.y + edgeY;

      context.beginPath();

      context.moveTo(point.x, point.y);

      context.lineTo(outX, outY);

      context.strokeStyle = colors[i];

      /*画文字和下划线*/

      /*线的方向怎么判断 伸出去的点在X0的左边 线的方向就是左边*/

      /*线的方向怎么判断 伸出去的点在X0的右边 线的方向就是右边*/

      /*结束的点坐标  和文字大小*/

      context.font = "14rpx Microsoft YaHei";


      const metrics = context.measureText(array[i]);

      var textWidth = metrics.width;

      if (outX > point.x) {

        /*右*/

        context.lineTo(outX + textWidth, outY);

        context.textAlign = 'left';

      } else {

        /*左*/

        context.lineTo(outX - textWidth, outY);

        context.textAlign = 'right';

      }

      context.stroke();

      context.textBaseline = 'bottom';

      context.fillText(array[i], outX, outY);

      /*绘制说明*/

      /*矩形的大小*/

      /*距离上和左边的间距*/

      /*矩形之间的间距*/

      context.fillRect(space, space + i * (rectH + 10), rectW, rectH);

      /*绘制文字*/

      context.beginPath();

      context.textAlign = 'left';

      context.textBaseline = 'top';

      context.font = '12px Microsoft YaHei';

      context.fillText(arraystr[i], space + rectW + 10, space + i * (rectH + 10));

    }

    context.draw();


.wxml

<canvas canvas-id="Canvas" style="width: 400px; height: 400px;">

        </canvas>


最后花了两个小时出来的样子(图3)

图3

还有一个问题  无法百分百还原,这个边上的框内文字怎么加,加应该是可以加的 但是目前时间不允许啊哈  

图3代码

.js

// var arraystr = ['职业发展', '财务状况', '个人健康', '娱乐休闲', '家庭', '朋友和重要他人', '个人成长', '自我实现'];

  //  var colors = ["red", "blue", "yellow", "green", "purple", "black", "gold", "forestgreen"];

  //  var array1 = [.1, .1, .1, .1, .2, .2, .1, .1];

  //  /*伸出去的线的长度*/

  //  var outLine = 30;

  //  /*说明的矩形大小*/

  //  var rectW = 30;

  //  var rectH = 16;

  //  var space = 20;

  //  var array = [10, 10, 10, 10, 10, 10, 10, 10];

  //  var point = { x: 200, y: 150 };

  //  var radius = [100, 100, 100, 100, 100, 100, 100, 100];

  //  var context = wx.createCanvasContext('Canvas1');


  //  var total = 0;

  //  for (var val = 0; val < array.length; val++) {

  //    total += array[val];

  //  }

  //  for (var i = 0; i < array.length; i++) {

  //    context.beginPath();

  //    var start = 0;

  //    if (i > 0) {

  //      for (var j = 0; j < i; j++) {

  //        start += array[j] / total * 2 * Math.PI;

  //      }

  //    }

  //    context.arc(point.x, point.y, radius[i], start, start + array[i] / total * 2 * Math.PI, false);

  //    context.setLineWidth(1)

  //    context.lineTo(point.x, point.y);

  //    context.setStrokeStyle('#333333');

  //    context.setFillStyle('#fff');

  //    context.fill();

  //    context.closePath();

  //    context.stroke();

  //  }

  //  context.draw();

  //  var radius2 = [80, 80, 80, 80, 80, 80, 80, 80];

  //  var context2 = wx.createCanvasContext('Canvas2');

  //  var total = 0;

  //  for (var val = 0; val < array.length; val++) {

  //    total += array[val];

  //  }

  //  for (var i = 0; i < array.length; i++) {

  //    context2.beginPath();

  //    var start = 0;

  //    if (i > 0) {

  //      for (var j = 0; j < i; j++) {

  //        start += array[j] / total * 2 * Math.PI;

  //      }

  //    }

  //    context2.arc(point.x, point.y, radius2[i], start, start + array[i] / total * 2 * Math.PI, false);

  //    context2.setLineWidth(1)

  //    context2.lineTo(point.x, point.y);

  //    context2.setStrokeStyle('#333333');

  //    context2.setFillStyle('#fff');

  //    context2.fill();

  //    context2.closePath();

  //    context2.stroke();

  //  }

  //  context2.draw();

  //  var radius3 = [70, 50, 70, 80, 40, 60, 50, 30];

  //  var context3 = wx.createCanvasContext('Canvas3');

  //  var total = 0;

  //  for (var val = 0; val < array.length; val++) {

  //    total += array[val];

  //  }

  //  for (var i = 0; i < array.length; i++) {

  //    context3.beginPath();

  //    var start = 0;

  //    if (i > 0) {

  //      for (var j = 0; j < i; j++) {

  //        start += array[j] / total * 2 * Math.PI;

  //      }

  //    }

  //    context3.arc(point.x, point.y, radius3[i], start, start + array[i] / total * 2 * Math.PI, false);

  //    context3.setLineWidth(1)

  //    context3.lineTo(point.x, point.y);

  //    context3.setStrokeStyle('#333333');

  //    context3.setFillStyle(colors[i]);

  //    context3.fill();

  //    context3.closePath();

  //    context3.stroke();




  //  var edge = radius[i]+20 ;

  //    /*x轴方向的直角边*/

  //    var edgeX = Math.cos(start + (array[i] / total * 2 * Math.PI)/2) * edge;

  //    /*y轴方向的直角边*/

  //    var edgeY = Math.sin(start + (array[i] / total * 2 * Math.PI) / 2) * edge;

  //    var outX = point.x + edgeX;

  //    var outY = point.y + edgeY+10;

  //    context3.beginPath();

  //    // context3.moveTo(point.x, point.y);

  //    // context3.lineTo(outX, outY);

  //    // context3.strokeStyle = colors[i];

  //    /*画文字和下划线*/

  //    /*线的方向怎么判断 伸出去的点在X0的左边 线的方向就是左边*/

  //    /*线的方向怎么判断 伸出去的点在X0的右边 线的方向就是右边*/

  //    /*结束的点坐标  和文字大小*/

  //    context3.font = "14rpx Microsoft YaHei";

  //    const metrics = context3.measureText(radius3[i]);

  //    var textWidth = metrics.width;

  //    if (outX > point.x) {

  //      /*右*/

  //      context3.lineTo(outX + textWidth, outY);

  //      context3.textAlign = 'left';

  //    } else {

  //      /*左*/

  //      context3.lineTo(outX - textWidth, outY);

  //      context3.textAlign = 'right';

  //    }

  //    context3.stroke();

  //    context3.textBaseline = 'bottom';

  //    context3.fillText(radius3[i], outX, outY);

  //    // context3.fillRect(space, space + i * (rectH + 10), rectW, rectH);

  //    // /*绘制文字*/

  //    // context3.beginPath();

  //    // context3.textAlign = 'left';

  //    // context3.textBaseline = 'top';

  //    // context3.font = '12px Microsoft YaHei';

  //    // context3.fillText(arraystr[i], space + rectW + 10, space + i * (rectH + 10));

  //  }

  //  context3.draw();

.wxml

<!-- <canvas canvas-id="Canvas1" style="width: 400px; height: 400px;">

          <canvas canvas-id="Canvas2" style="width: 400px; height: 400px;">

            <canvas canvas-id="Canvas3" style="width: 400px; height: 400px;">

            </canvas>

          </canvas>

        </canvas> -->




在此作为记录  下次好用,有大佬有更好的方法  希望能够提出,万谢!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容