這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何利用Canvas做出3D動(dòng)態(tài)的Chart圖表,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了平遠(yuǎn)免費(fèi)建站歡迎大家使用!
發(fā)現(xiàn)現(xiàn)在工業(yè)SCADA上或者電信網(wǎng)管方面用圖表的特別多,雖然絕大部分人在圖表制作方面用的是echarts,他確實(shí)好用,但是有些時(shí)候我們不能調(diào)用別的插件,這個(gè)時(shí)候就得自己寫這些美麗的圖表了,然而圖表輕易做不成美麗的。。??吹接幸粋€(gè)網(wǎng)站上在賣的圖表,感覺挺好看的,就用 HT for Web 3D 做了一個(gè)小例子,挺簡單的,也挺好看的,哈哈~
動(dòng)態(tài)效果圖如下:
這個(gè)例子用 HT 實(shí)現(xiàn)真的很容易,首先創(chuàng)建一個(gè) HT 中最基礎(chǔ)的 dm 數(shù)據(jù)模型,然后將數(shù)據(jù)模型添加進(jìn) g3d 3d 組件中,再設(shè)置 3d 中的視角并把 3d 組件添加進(jìn) body 元素中:
dm = new ht.DataModel(); g3d = new ht.graph4d.Graph4dView(dm); g3d.setEye(0, 185, 300); g3d.addToDOM(); g3d.getView().style.background = '#000';
接著就是造這五個(gè)chart圖表?xiàng)l了,我的思路是這樣的,里層有一個(gè)節(jié)點(diǎn),外層一個(gè)透明的節(jié)點(diǎn),底部一個(gè) 3d 的文字顯示當(dāng)前的百分比。
里層的節(jié)點(diǎn)非常容易,我直接用的 HT 封裝的 ht.Node 創(chuàng)建了一個(gè)新的節(jié)點(diǎn)對(duì)象,然后通過 node.s 方法來設(shè)置 node 節(jié)點(diǎn)的樣式:
var node = new ht.Node(); node.s({ 'shape3d': cylinderModel, 'shape3d.color': color, '3d.movable': false }); node.a({ 'myHeight': s3[1], }); node.p3([p3[0], s3[1]/2, p3[2]]); node.s3(s3); dm.add(node);
其中要說明的是,'shape3d':cylinderModel 這個(gè)樣式的設(shè)置,首先,shape3d 屬性指定顯示為 3d 模型的圖標(biāo)效果,cylinderModel 是用 HT 自定義的一個(gè) 3d 模型,可參考 HT for Web 建模手冊(cè):
cylinderModel = ht.Default.createCylinderModel(1000, 0, 1000, false, false, true, true);
然后設(shè)置了一個(gè)動(dòng)態(tài)變化的屬性 myHeight,在 HT 中,node.a 方法是預(yù)留給用戶存儲(chǔ)業(yè)務(wù)數(shù)據(jù)的,我們可以在這邊添加任意多個(gè)屬性。
接下來我們要?jiǎng)?chuàng)建的是外部的透明節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)的構(gòu)造方式基本上與內(nèi)部節(jié)點(diǎn)相同,就是多了一點(diǎn)“透明”的樣式設(shè)置:
var cNode = new ht.Node(); cNode.s({ 'shape3d': cylinderModel, 'shape3d.transparent': true, 'shape3d.opacity': 0.2, 'label.color': '#fff', '3d.movable': false }); cNode.p3([p3[0], 50, p3[2]]); cNode.s3(20, 100, 20); dm.add(cNode);
要先設(shè)置 ‘shape3d.transparent’ 為true,再設(shè)置 ‘shape3d.opacity’ 透明度。
最后是 3d 文字,呈現(xiàn) 3d 文字需要一個(gè) json 格式的 typeface 字體,然后通過 ht.Default.loadFontFace 來加載 json 格式的字體到內(nèi)存中,詳情請(qǐng)參考 HT for Web 3D 手冊(cè):
ht.Default.loadFontFace('./wenquanyi.json', function(){ //...... var text = new ht.Node(); text.s3([5, 5, 5]); text.p3(cNode.p3()[0]-5, -10, 0); dm.add(text); text.s({ 'shape3d' : 'text', 'shape3d.text': node.a('myHeight')+'%', 'shape3d.text.curveSegments': 1, '3d.movable': false }); });
因?yàn)槲覀冇玫?typeface 字體的繪制方式是無數(shù)個(gè)三角形構(gòu)成的一個(gè)字,會(huì)占用很大的內(nèi)存,所以我把圖形的曲線的精細(xì)度調(diào)得較低,但是還是很清晰,如果你們能找到性能更好的字體,可以使用并且告知我一下,我們目前沒找到占用內(nèi)存小的字體。
最后,要?jiǎng)討B(tài)的變化 chart 圖表中的柱形圖,我們得設(shè)置動(dòng)畫,并且將 3d 字體也同步更新數(shù)值:
setInterval(function(){ if(node.a('myHeight') < 100){ node.a('myHeight', (node.getAttr('myHeight')+1)); node.s3(20, node.a('myHeight'), 20); node.p3(p3[0], node.a('myHeight')/2, p3[2]); }else{ node.a('myHeight', 0); node.s3([20, 0, 20]); node.p3([p3[0], 0, p3[2]]); } if (text) text.s('shape3d.text', node.a('myHeight')+'%'); }, 100);
這里,我自定義的屬性 “myHeight” 就起到了決定性的作用,我用這個(gè)屬性來存儲(chǔ)變量,而且可以任意更改變量的值,這樣就能實(shí)現(xiàn)動(dòng)態(tài)綁定的效果了。
還有不懂的可以留言,或者直接去我們官網(wǎng)上查看手冊(cè) HT for Web,有更多你想不到的效果能快速實(shí)現(xiàn)哦~
上述就是小編為大家分享的如何利用Canvas做出3D動(dòng)態(tài)的Chart圖表了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章名稱:如何利用Canvas做出3D動(dòng)態(tài)的Chart圖表
文章URL:http://jinyejixie.com/article4/igoeie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、響應(yīng)式網(wǎng)站、動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站制作、網(wǎng)站改版、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)