yj.微信小程序 長短不一的餅狀圖

今天項(xiàng)目有個(gè)需求涎拉,發(fā)過來瞅了一眼,尼瑪哦,這尼瑪是畫的吧曼库,畫的吧G凇!;倏荨(圖1)

圖1

趕緊百度一波 慈缔,沒有。种玛。藐鹤。沒有。赂韵。娱节。沒有。祭示。苞冯。擦嘞? 要哭惹? ?涧团,百度h5的? 有個(gè)看起來很舒的??

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

還好看的懂h5 但是差距還是很大? ? emmmmm? ?最終我放棄寫成一摸一樣了? ? ?結(jié)果 如: (圖二)

圖2


圖2代碼:

.js:

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

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

? ? var arraystr = ['職業(yè)發(fā)展', '財(cái)務(wù)狀況', '個(gè)人健康', '娛樂休閑', '家庭', '朋友和重要他人', '個(gè)人成長', '自我實(shí)現(xiàn)'];

? ? 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];

? ? ? /*畫文字和下劃線*/

? ? ? /*線的方向怎么判斷 伸出去的點(diǎn)在X0的左邊 線的方向就是左邊*/

? ? ? /*線的方向怎么判斷 伸出去的點(diǎn)在X0的右邊 線的方向就是右邊*/

? ? ? /*結(jié)束的點(diǎn)坐標(biāo)? 和文字大小*/

? ? ? 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>


最后花了兩個(gè)小時(shí)出來的樣子(圖3)

圖3

還有一個(gè)問題? 無法百分百還原掏缎,這個(gè)邊上的框內(nèi)文字怎么加箱蝠,加應(yīng)該是可以加的 但是目前時(shí)間不允許啊哈??

圖3代碼

.js

// var arraystr = ['職業(yè)發(fā)展', '財(cái)務(wù)狀況', '個(gè)人健康', '娛樂休閑', '家庭', '朋友和重要他人', '個(gè)人成長', '自我實(shí)現(xiàn)'];

? //? 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];

? //? ? /*畫文字和下劃線*/

? //? ? /*線的方向怎么判斷 伸出去的點(diǎn)在X0的左邊 線的方向就是左邊*/

? //? ? /*線的方向怎么判斷 伸出去的點(diǎn)在X0的右邊 線的方向就是右邊*/

? //? ? /*結(jié)束的點(diǎn)坐標(biāo)? 和文字大小*/

? //? ? 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> -->




在此作為記錄? 下次好用,有大佬有更好的方法? 希望能夠提出汇陆,萬謝Eā!毡代!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阅羹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子教寂,更是在濱河造成了極大的恐慌捏鱼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酪耕,死亡現(xiàn)場離奇詭異穷躁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)因妇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猿诸,“玉大人婚被,你說我怎么就攤上這事∈崴洌” “怎么了址芯?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我谷炸,道長北专,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任旬陡,我火速辦了婚禮拓颓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘描孟。我一直安慰自己驶睦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布匿醒。 她就那樣靜靜地躺著场航,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廉羔。 梳的紋絲不亂的頭發(fā)上溉痢,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音憋他,去河邊找鬼孩饼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛举瑰,可吹牛的內(nèi)容都是我干的捣辆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼此迅,長吁一口氣:“原來是場噩夢啊……” “哼汽畴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起耸序,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忍些,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后坎怪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罢坝,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年搅窿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘁酿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡男应,死狀恐怖闹司,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沐飘,我是刑警寧澤游桩,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布牲迫,位于F島的核電站,受9級特大地震影響借卧,放射性物質(zhì)發(fā)生泄漏盹憎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一铐刘、第九天 我趴在偏房一處隱蔽的房頂上張望陪每。 院中可真熱鬧,春花似錦滨达、人聲如沸奶稠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锌订。三九已至,卻和暖如春画株,著一層夾襖步出監(jiān)牢的瞬間辆飘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工谓传, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜈项,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓续挟,卻偏偏與公主長得像紧卒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子诗祸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容