微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用zrender.js绘制体温单效果

今天我们来画折线图 效果

使用zrender.js绘制体温单效果


以下为模拟数据

[{"time":19,"text":"入\n院\n19\n时\n11\n分","position":42,"cellMin":29.0,"cellSplit":0.2,"type":"text","color":"red","shape":null},{"time":22,"text":"手\n术",{"time":129,{"cellMin":29.0,"y":30.0,"type":"baseline","color":"#000","y":31.0,"y":32.0,"y":33.0,"y":34.0,"y":35.0,"y":36.0,"y":37.0,"y":38.0,{"cellMin":28.0,"y":39.0,"y":40.0,"y":41.0,"y":42.0,"array":[{"time":19,"tips":"体温37.1","value":"37.1","shape":"x","Break":"false","type":"temperature","extraArr":[],"others":[]},{"time":21,"tips":"体温36.9","value":"36.9",{"time":30,"tips":"体温36.5","value":"36.5",{"time":38,"tips":"体温36.6","value":"36.6",{"time":54,"tips":"体温36.7","value":"36.7","others":[]}],"type":"line","color":"blue","shape":"x-circle"},{"cellMin":-10.0,"cellSplit":2.0,"shape":"empty-circle","tips":"呼吸20","value":"20","Break":"false"},"tips":"呼吸19","value":"19","tips":"呼吸18","value":"18","Break":"false"}],"color":"black","shape":"empty-circle"},{"cellMin":-2.0,"cellSplit":1.0,"tips":"疼痛7","value":"7","type":"pain","extraArr":[{"extra":"3","extraColor":"red","extraTips":"疼痛评价3"}],{"time":23,"tips":"疼痛3","value":"3",{"time":27,{"time":33,{"time":39,{"time":44,{"time":51,{"time":58,{"bgColor":"rgba(255,0.7)","cellMin":30.0,"v1":69,"v1Tips":"心率69","v2":69,"v2Tips":"脉搏69","v1":70,"v1Tips":"心率70","v2":70,"v2Tips":"脉搏70","v1":83,"v1Tips":"心率83","v2":83,"v2Tips":"脉搏83","v1":78,"v1Tips":"心率78","v2":78,"v2Tips":"脉搏78","v1":77,"v1Tips":"心率77","v2":77,"v2Tips":"脉搏77","type":"area",{"text":null,"y":"28","cellMin":-10.0,"array":[],"type":"tag","y":null,"shape":null}]

  首先创建filterData方法 用于过滤数据 text文本 line线段 area圆 tag暂时用不到 今天说的是折线所以创建zrLine 方法

filterData(){
   const data = chartData

   data.forEach(el => {
    switch (el.type) {
     case "text":
      // this.zrText(el)
      break;
     case "line":
      this.zrLine(el)
      break;
     case "area":
      this.zrpolyline(el)
      break;
     case "tag":
      this.zrTag(el)
      break;

     default:
      break;
    }
    });
  }

我们在新增一个文件夹创建utli.js这个文件夹的作用为我们把创建线创建圆的公共方法在这个js文件

使用zrender.js绘制体温单效果


utli.js 我们先说 createLine createCircle

createLine 需要传5个参数分别为开始点的横纵坐标 结束点的横纵坐标 还有线的样式

createCircle 需要传4个参数分别为 圆点的横纵坐标 圆的半径 和样式

addHover 也需要 这时我们需要在init 方法添加一段代码(上一章创建的初始化方法) 这段代码为创建一个div到时我们鼠标移到圆上会弹出文本信息的时候回用到

var div = document.createElement("div")
   div.classList.add("tips")
   document.getElementById("main").append(div)

utli.js

//线段
export const createLine = (x1,y1,x2,y2,style)=>{
  return new zrender.Line({
    shape:{
      x1:x1,y1:y1,x2:x2,y2:y2
    },style:style,});
};
// cx 横坐标 cy纵坐标 r半径 空心圆
export const createCircle = (cx,cy,r,style)=>{
  return new zrender.Circle({
    shape:{
      cx:cx,cy:cy,r:r
    },zlevel:4
  })
}
//添加horver事件 el 元素对象 config 一些配置项 x x轴坐标 y y轴坐标 shapeOn鼠标移入一些属性配置 shapeOn鼠标移出一些属性配置 shape配置项看官网
export const addHover = (el,config,x,y,shapeOn,shapeOut) => {
  const domTips = document.getElementsByClassName("tips")
  el.on('mouSEOver',function(){
    domTips[0].innerHTML = config.tips
    domTips[0].setAttribute("style",`position:absolute;top:${y-13}px;left:${x}px;display:block;font-size:10px;background-color:rgba(0,.7);padding:3px;border-radius:3px;color:#fff`)
    el.animateto({
      shape:shapeOn
    },100,0)
  }).on('mouSEOut',function () {
    domTips[0].setAttribute("style",`display:none`)
    el.animateto({
      shape:shapeOut
     },0)
  })
}
//多边形
export const createpolygon = (points,style) => {
  return new zrender.polyline({
    shape:{
      points:points,},style:style
  })
}

zrLine方法里的第一段代码 判断这个折线拐点是需要空心圆还是实心圆还是其他的形状 都通过shape决定 color为圆的边框颜色填充色为白色 先定义一个style变量到时好实现自定义

使用zrender.js绘制体温单效果


   

var style = {}
   switch (data.shape) {
    case "x-circle":
     style = {
      stroke:data.color,fill:"#fff",text:"x",}
     break;
    case "empty-circle":
     style = {
      stroke:data.color,text:"",}
     break;

    default:
     break;
   }

这里需要在添加2个方法

getX

//获取X坐标 data当前时间点
  getX(data){
   let XShareOne = this.XShareOne()
   return data * XShareOne
  },

transformY

//转换y轴坐标点为正确坐标点 因为y轴坐标是顶点为0递增的 所有用总高度减去原来坐标的高度剩下的高度就是正确坐标点
  //i代表一个格子代表几个高度
  transformY(data,i){
   let YHeight = this.YShareOne()

   //计算出剩余高度
   let surplusHeight = this.canavsHeight - (YHeight/i) * data
   return surplusHeight
  },

这段代码意思是先把数据遍历出来 在通过time属性计算出x坐标 value值计算出y坐标 x轴左边基本是以time为基本来计算的 y轴坐标可能会随数据变化而有所改变 Break属性为是否断线 如果需要断线就位true

data.array.forEach((el,i) =>{
    if (i > 0) {
     let XShareOne = this.XShareOne()
     let firstX = this.getX(data.array[i-1].time)
     let firstY = this.transformY(data.array[i-1].value,1)
     let x = this.getX(data.array[i].time)
     let y = this.transformY(data.array[i].value,1)
     if (data.array[i-1].Break == "false") {
      let line = createLine(firstX,firstY,{
        stroke:"#af2377",linewidth:2,})
      this.zr.add(line)
     }
    }
    if (el.extraArr && el.extraArr.length > 0) {
      el.extraArr.forEach((item,a) => {
       let x = this.getX(el.time)
       let y = this.transformY(el.value,1)
       let lastY = this.transformY(item.extra,1)
       let dottedLine = createLine(x,lastY,{
         stroke:"#af2377",lineDash:[2,2]
       })
       this.zr.add(dottedLine)
       el.extraArr.forEach((item,a) => {
        let getY = this.transformY(item.extra,1)
        let Circle = createCircle(x,getY,5,{
         stroke:item.extraColor,})
        this.zr.add(Circle)
        addHover(Circle,{
          tips:item.extraTips,{
          r:8,{
          r:5,})
       })
      })
     }
    let getX = this.getX(el.time)
    let getY = this.transformY(el.value,1)
    let Circle = createCircle(getX,style)
    this.zr.add(Circle)
    addHover(Circle,el,getX,{
      r:8,{
       r:5,})
   })

这步完成折线图应该就画好了

下次我们将阴影的画法

使用zrender.js绘制体温单效果


总结

以上所述是小编给大家介绍的使用zrender.js绘制体温单效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型:
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点 题目 重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下JavaScript中this指向的问题。
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高