可视化-02

173 阅读3分钟

canvas基础知识

使用场景

canvas对象是像素级的,适用于高密集的游戏开发,动态渲染和量大级处理

缺点

  1. 需要使用js来操作。
  2. canvas使用多了,会造成内存过多,导致游览器崩溃。
  3. canvas是由像素点构成的,放大会失真模糊。

使用方法和注意事项

只有宽高两个属性,若是不设计,会给默认宽300px高150px 然后通过获取元素获取这个元素,例

let ctx =getElementById('aa')
//通过ctx.getContext()来判断游览器是否可以使用canvas
if (!ctx.getContext()) return

属性

canvas有多种画图方法:

路径画图

    ctx.getContext('2d')
    //首先 ctx.beginPath()开始
    ctx.beginPath()
    //这就相当于一个画笔拿起来移动到另一个位置,画布上不会留下痕迹。
    ctx.moveTo(x,y)
    
    //这是画直线的,可以多次图像会自动连接
    ctx.lineTo(x,y)
    
    //画圆,radius是 ,后面两个是弧度,最后一个是默认false顺时针。
    //弧度整个圆为2Math.PI,一共360个。
    ctx.arc(x,y,radius,startAngle,endAngle,false)
    
    //这是填充默认会闭合图像
    ctx.fill()
    //这是边框里面没有填充,不会默认闭合
    ctx.stroke()
    //非必须,但是没有会影响下一次画图的起始位置
    ctx.ClosePath()

好像是基础的

fillRect(x,y,width,height)从坐标(x,y)处画一个矩形。 stokeRect() 属性如上,画一个矩形边框。 cleanRect() 清除范围内的的canvas图表。

canvas的样式属性

  1. 有fillWidth和stokeWidth,代表宽度
  2. fillStyle和stokeStyle,是颜色,可以用rgb或者rgba,这个类似于css,下面覆盖上的属性。
  3. gobalAlpha:0-1 是透明度,影响全局。

线条也有属性

  1. lineCap=butt(默认,截断),round(圆形),square(正方形)
  2. lineJoin=(bevel,斜角),(round,圆形),(miter,斜槽角)

image.png

宽度为1px不精准的原因是因为,设计是中间开始,左右各0.5px,然后再在两侧外面又补上0.5px的浅色

解决办法:设计个基数,让他平移到格子中间。

绘制文本

  1. fillText(text,x,y,maxweight)
  2. stokeText(text,x,y,maxweight)

样式

  1. 字体:font= value,默认 10px sans-sirif
  2. 文本对齐:textAlign =value 默认start 还有end,center,left,right
  3. 基线对齐:textBaseline =value 很多,自己去找吧,不想打了

绘制图片

drawImage()

有属性image,x,y,width,height,前3个必选,后面可选。

或者drawImage(image,sx,sy,swidth,sheight,dx,dy,dwidth,dheight),前4个是对图片的,后四个是对显示位置的。

好像要在

image.preload=function(){
//这里面写
}

最后了

他也有css的transform(矩阵),scale(),rotate(弧度),translate()的方法 然后可以用ctx.save进行保存ctx.restore进行取出,就是栈的进出。

他也有动画效果,就是settimeout和setinterval和requestAnimationFrame等方法来通过重绘修改,因为所有的动画都是一个个片段变换,然后在人的眼睛看到是会动的。 写法大概是:

  1. 清除之前的画布内容
  2. 保存当前状态
  3. 修改canvas
  4. 回到之前的状态

这样有利于帮助你找到当前的x,y轴,其实可以先设计根节点旋转,这样当别的依附于这个节点时也会根着旋转。

PS.一点昨天的css基础漏了一个属性backface-visibility:vibility和hidden两个属性,就是背面是否可见,用过设计软件的同学都懂吧。