使用ZRender實(shí)現(xiàn)護(hù)理單折線圖功能

公司醫(yī)院項(xiàng)目履澳,需要定制化顯示病人的體溫、脈搏怀跛、呼吸距贷。由于界面是定義好的,無(wú)法使用開(kāi)源項(xiàng)目來(lái)改吻谋,干脆自己畫(huà)一個(gè)了忠蝗。

為什么是ZRender

ZRender 是百度前端團(tuán)隊(duì)用于繪制 EChar t的開(kāi)源庫(kù),里面封裝了各種對(duì) Canvas 的使用漓拾。而且 ZRender 的文檔是全中文的阁最,對(duì)開(kāi)發(fā)者也非常友好

需求

相對(duì)于其他知識(shí)點(diǎn)戒祠,繪圖沒(méi)什么特別要講的。無(wú)非是不停的畫(huà)而已速种。步驟復(fù)雜但是實(shí)現(xiàn)起來(lái)沒(méi)有什么技術(shù)難點(diǎn)姜盈。所以直接寫(xiě)下需求,然后貼上代碼供大家參考啦~

  • 繪制表格 —— 計(jì)算好格子的寬配阵、高馏颂、數(shù)量,for 循環(huán)繪制多條橫線棋傍、豎線即可實(shí)現(xiàn)救拉。
  • 根據(jù)體溫、脈搏等數(shù)據(jù)標(biāo)注相應(yīng)位置的點(diǎn)瘫拣,點(diǎn)有各種形狀亿絮。 —— 形狀ZRender 已經(jīng)提供,直接調(diào)用配置即可麸拄。
    • 實(shí)心圓
    • 空心圓
    • 實(shí)心三角形
    • 虛線
    • 特殊符號(hào) —— 其實(shí)都不難派昧,慢慢畫(huà)都能畫(huà)出來(lái)。
  • 縱向繪制文本 —— 沒(méi)有發(fā)現(xiàn)縱向繪制的方式拢切,于是將文本拆分一個(gè)一個(gè)字畫(huà)上去蒂萎。
  • 鼠標(biāo) hover 在各個(gè)點(diǎn)上需要有文本框顯示具體內(nèi)容。 —— 繪制一個(gè)文本失球,隱藏起來(lái)岖是。當(dāng)觸發(fā) hover 事件的時(shí)候顯示文本,并將文本移動(dòng)到相應(yīng)位置实苞。
  • 線段連接 —— 計(jì)算一下兩個(gè)點(diǎn)的x豺撑,y連接即可。虛線只需要配置 style: { lineDash: [ 5, 5 ] } 即可實(shí)現(xiàn)虛線效果黔牵。
  • 將 ZRender 繪制的表格打印出來(lái) —— 轉(zhuǎn)為圖片打印聪轿,最后會(huì)講。

貼個(gè)效果圖:


效果圖

實(shí)現(xiàn)

由于是公司項(xiàng)目猾浦,不發(fā)布源碼啦~以下是demo代碼陆错。

table.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Table</title>
    <script src="zrender.js"></script>
    <style>
        #main {
            height: 600px;
            width: 800px;
        }
    </style>
</head>
<body>
<div id="main"></div>
<img src="" id="main_img">
<script src="DrawUtil.js"></script>
<script>
    var zr = zrender.init(document.getElementById('main'))
    const [height, width] = [15, 15]
    var tableGroup = new zrender.Group()
    for (let i = 0; i <= 30; i++) {
        var line1 = new zrender.Line({
            shape: {
                x1: 0,
                y1: height * i,
                x2: width * 30,
                y2: height * i,
            }
        })
        var line2 = new zrender.Line({
            shape: {
                x1: width * i,
                y1: 0,
                x2: width * i,
                y2: height * 30,
            }
        })
        tableGroup.add(line1)
        tableGroup.add(line2)
    }
    tableGroup.attr('position', [10, 10])
    zr.add(tableGroup)

    DrawUtil.initHoverText(zr)
    zr.add(DrawUtil.drawText('你好,在干嘛吶金赦?', 30, 30))
    zr.add(DrawUtil.drawCircle({x: 50, y: 50, txt: '哈哈'}, '#FAD'))
    zr.add(DrawUtil.drawHollowCircle({x: 100, y: 100, txt: '空心圓'}, '#DAF'))
    zr.add(DrawUtil.drawIsogon({x: 200, y: 200, txt: 'jack'}, '#ADF'))

    setTimeout(toImg, 1000)

    function toImg() {
        console.log('to img')
        var canvas = document.querySelector('#main canvas')
        if (canvas) {
            var img = canvas.toDataURL("image/png")
            document.querySelector('#main_img').src = img
        }
    }
</script>
</body>
</html>

DrawUtil.js

// hover 框文本樣式
var Text

var DrawUtil = {
    // 初始化懸浮文本
    initHoverText(zr){
        Text = new zrender.Text({
            style: {
                fontSize: 14,
                textBackgroundColor: '#FFF',
                textBorderColor: '#000',
                textBorderWidth: 1,
                textBorderRadius: 2,
                textPadding: 5,
            },
            zlevel: 100
        })
        zr.add(Text)
        Text.hide()
    },
    // 繪制縱向文本
    drawText (str, dx, dy) {
        let group = new zrender.Group()

        for (var i = 0; i < str.length; i++) {
            var text = new zrender.Text({
                style: {
                    text: str.charAt(i),
                    fontSize: 14,
                    textFill: '#FF4949',
                    textBackgroundColor: '#FFF',
                }
            })
            let y = 14 * i
            text.attr('position', [0, y])
            group.add(text)
        }

        group.attr('position', [dx, dy])
        return group
    },
    // 繪制實(shí)心圓
    drawCircle (Obj, Color) {
        return new zrender.Circle({
            shape: {
                cx: Obj.x,
                cy: Obj.y,
                r: 4
            },
            style: {
                fill: Color
            }
        }).on('mouseover', function () {
            Text.show()

            Text.attr('position', [Obj.x, Obj.y])
            Text.attr({
                style: {
                    text: Obj.txt
                }
            })
        }).on('mouseout', function () {
            Text.hide()
        })
    },
    // 繪制三角形
    drawIsogon (Obj, Color) {
        return new zrender.Isogon({
            shape: {
                x: Obj.x,
                y: Obj.y,
                r: 6,
                n: 3
            },
            style: {
                fill: Color
            }
        }).on('mouseover', function () {
            Text.show()

            Text.attr('position', [Obj.x, Obj.y])
            Text.attr({
                style: {
                    text: Obj.txt
                }
            })
        }).on('mouseout', function () {
            Text.hide()
        })
    },
    // 繪制空心圓
    drawHollowCircle (Obj, Color) {
        return new zrender.Circle({
            shape: {
                cx: Obj.x,
                cy: Obj.y,
                r: 4
            },
            style: {
                fill: '#FFFFFF',
                stroke: Color
            }
        }).on('mouseover', function () {
            Text.show()

            Text.attr('position', [Obj.x, Obj.y])
            Text.attr({
                style: {
                    text: Obj.txt
                }
            })
        }).on('mouseout', function () {
            Text.hide()
        })
    },
    // 繪制×
    drawX (Obj, Color) {
        return new zrender.Text({
            style: {
                text: '×',
                fontSize: 20,
                textFill: Color,
            },
            position: [Obj.x - 7, Obj.y - 11]
        }).on('mouseover', function () {
            Text.show()

            Text.attr('position', [Obj.x, Obj.y])
            Text.attr({
                style: {
                    text: Obj.txt
                }
            })
        }).on('mouseout', function () {
            Text.hide()
        })
    },
    // 繪制圓圈中有點(diǎn)的圓
    drawPointCircle (Obj, Color) {
        var group = new zrender.Group()
        var Point = new zrender.Circle({
            shape: {
                cx: 4,
                cy: 4,
                r: 1
            },
            style: {
                fill: Color
            }
        })
        var OutCircle = new zrender.Circle({
            shape: {
                cx: 4,
                cy: 4,
                r: 4
            },
            style: {
                fill: '#FFFFFF',
                stroke: Color
            }
        })
        group.on('mouseover', function () {
            Text.show()

            Text.attr('position', [Obj.x, Obj.y])
            Text.attr({
                style: {
                    text: Obj.txt
                }
            })
        }).on('mouseout', function () {
            Text.hide()
        })

        group.add(OutCircle)
        group.add(Point)
        group.attr('position', [Obj.x - 3, Obj.y - 3])

        return group
    },
    // 繪制圓圈中有H的圓
    drawHCircle (Obj, Color) {
        var group = new zrender.Group()
        var h = new zrender.Text({
            style: {
                text: 'H',
                fontSize: 8,
                textFill: Color
            },
            position: [2, -1]
        })
        var OutCircle = new zrender.Circle({
            shape: {
                cx: 5,
                cy: 5,
                r: 5
            },
            style: {
                fill: '#FFFFFF',
                stroke: Color
            }
        })
        group.on('mouseover', function () {
            Text.show()
            Text.attr('position', [Obj.x, Obj.y])
            Text.attr({
                style: {
                    text: Obj.txt
                }
            })
        }).on('mouseout', function () {
            Text.hide()
        })

        group.add(OutCircle)
        group.add(h)
        group.attr('position', [Obj.x - 4, Obj.y - 4])

        return group
    },
    // 繪制圓圈中有加號(hào)的圓
    drawAddCircle (Obj, Color) {
        var group = new zrender.Group()
        var h = new zrender.Text({
            style: {
                text: '+',
                fontSize: 8,
                textFill: Color
            },
            position: [2, -1]
        })
        var OutCircle = new zrender.Circle({
            shape: {
                cx: 5,
                cy: 5,
                r: 5
            },
            style: {
                fill: '#FFFFFF',
                stroke: Color
            }
        })
        group.on('mouseover', function () {
            Text.show()
            Text.attr('position', [Obj.x, Obj.y])
            Text.attr({
                style: {
                    text: Obj.txt
                }
            })
        }).on('mouseout', function () {
            Text.hide()
        })

        group.add(OutCircle)
        group.add(h)
        group.attr('position', [Obj.x - 4, Obj.y - 4])

        return group
    },
}

最后音瓷,需要將Canvas打印出來(lái)。我的解決方案是將Canvas轉(zhuǎn)為圖片夹抗。之后將圖片放到你想放的地方即可绳慎。

    setTimeout(toImg, 1000)

    function toImg() {
        var canvas = document.querySelector('#main canvas')
        if (canvas) {
            var img = canvas.toDataURL("image/png")
            document.querySelector('#main_img').src = img
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子杏愤,更是在濱河造成了極大的恐慌靡砌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珊楼,死亡現(xiàn)場(chǎng)離奇詭異通殃,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)厕宗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)画舌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人媳瞪,你說(shuō)我怎么就攤上這事骗炉≌毡Γ” “怎么了蛇受?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)厕鹃。 經(jīng)常有香客問(wèn)我兢仰,道長(zhǎng),這世上最難降的妖魔是什么剂碴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任把将,我火速辦了婚禮,結(jié)果婚禮上忆矛,老公的妹妹穿的比我還像新娘察蹲。我一直安慰自己,他們只是感情好催训,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布洽议。 她就那樣靜靜地躺著,像睡著了一般漫拭。 火紅的嫁衣襯著肌膚如雪亚兄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天采驻,我揣著相機(jī)與錄音审胚,去河邊找鬼。 笑死礼旅,一個(gè)胖子當(dāng)著我的面吹牛膳叨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痘系,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼菲嘴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起临谱,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤璃俗,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后悉默,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體城豁,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年抄课,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唱星。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跟磨,死狀恐怖间聊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抵拘,我是刑警寧澤哎榴,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站僵蛛,受9級(jí)特大地震影響尚蝌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜充尉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一飘言、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驼侠,春花似錦姿鸿、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至相速,卻和暖如春碟渺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背突诬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工苫拍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旺隙。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓绒极,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蔬捷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垄提,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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