Canvas 使用指南

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Canvas 使用指南相关的知识,希望对你有一定的参考价值。

参考技术A canvas 的能力是通过 context 对象表现出来的,context一般称为绘图环境。

DOMString 为 "2d" 时,context 是 CanvasRenderingContext2D 对象;(本文重点)
DOMString 为 "webgl" 时,context 是 WebGLRenderingContext 对象;
DOMString 为 "webgl2" 时,context 是 WebGL2RenderingContext 对象;
DOMString 为 "bitmaprenderer" 时,context 是 ImageBitmap 对象;

CanvasRenderingContext2D 对象实例 instance 共有16个属性,只要设置了这些属性,就会影响 instance 调用绘制方法时的表现,常用的有:

注意:可使用 instance 的 save() 和 restore() 方法来临时修改 instance 的属性

1、一般用来保存数据,不展示在浏览器页面上,创建的两种方式:a、css 方式设置为 display:none;b、JS创建 document.createElement('canvas');
2、与html结合使用:可以采用 CSS 定位的方式,将 HTML 元素置于 canvas 元素之上,比如:在 canva 上叠加一个 div panel 作为某个开关控制界面;选景橡皮筋;时钟等
3、也可使用两个 canvas,一个用来显示,另一个用来做数据准备和处理,这种方式通常效率高,但比较耗费内存

1、准备一个绘制背景的函数,用于每次擦除上一次绘制的结果
2、绘制辅助线
3、监听事件,做坐标转换 windowToCanvas
4、绘制内容的保存于恢复

5、三事件
onmousedown:保存初始 canvas 绘制状态
onmousemove: 更新位置信息,并不断调用初始 canvas 绘制状态来擦除上一个绘制
onmouseup: 调用初始 canvas 绘制状态来擦除上一个绘制,并根据onmousemove保存的信息做最终绘制,将结果绘制在 canvas 上

fillStyle 和 strokeStyle 可以是任意有效的css颜色值或者渐变色以及图像Pattern

canvas 某一时刻只能有一条路径存在,这条路径可以包含多条子路径。用 beginPath 来开始一条新路径或清除上一次子路径

textAlign: left,center,right
textBaseline: top,middle,bottom
1、三属性 font,textAlign,textBaseline
2、三方法 strokeText, fillText, measureText
strokeText(text,x,y,maxWidth) 指定文本超过maxWidth会被缩放
measureText(text).width 返回指定文本宽度
3、水平垂直居中

注意每次变换前,用 save 和 restore 来保存原来绘制上下文

1、由路径定义的一片区域,如一个三角形,矩形,圆形,然后调用 clip 即可得到剪辑区域
2、默认和 canvas 大小一致
3、设置剪辑区域后,浏览器将只对该区域进行绘制
4、调用clip会把剪辑区域设为当前剪辑区域与当前路径定义的区域的交集,故clip 的调用经常在 save 和 restore 之间,这是为了防止剪辑区域越来越小

主要是 drawImage,getImageData,putImageData,createImageData 四个 API

使用 canvas画时钟

今天看了H5的canvas,练习使用下。待完善。。。

 

 

class Clock {
    constructor(canvas) {
        this.canvas = canvas;
    }

    draw() {
        let ctx = this.canvas.getContext("2d");
        
        ctx.setDefault = function() {
            const default_strokeStyle = "#000000";
            this.strokeStyle = default_strokeStyle; 
        }

        this.drawClockDialPlate(ctx);
        this.drawClockDial(ctx);

    }

    // 画表盘
    drawClockDialPlate(ctx) {
        ctx.beginPath();
        ctx.strokeStyle = "blue";
        ctx.lineWidth = 2;
        ctx.arc(400, 300, 200, 0, Math.PI*2, false);
        ctx.stroke();

        ctx.setDefault();
    }

    // 画刻度盘
    drawClockDial(ctx) {

        ctx.beginPath();
        ctx.translate(400, 300);
        ctx.lineWidth = 1;

        let scale = 30; // 每一小时对应30度

        let rg = ctx.createRadialGradient(0, 0, 180, 0, 0, 185);
        rg.addColorStop(0.9, this.canvas.style.backgroundColor);
        rg.addColorStop(1, "blue");
        ctx.strokeStyle = rg;

        for (let an = 0; an < 360; an += scale) {

            // 先画再转
            ctx.moveTo(0, 0);
            ctx.lineTo(200, 0);
            ctx.rotate(scale * Math.PI / 180);
        }

        ctx.stroke();

        // 重复画会导致小时刻度不明显
        ctx.beginPath();
        scale = 6; // 每一分钟对应6度
        rg = ctx.createRadialGradient(0, 0, 190, 0, 0, 195);
        rg.addColorStop(0.9, this.canvas.style.backgroundColor);
        rg.addColorStop(1, "blue");
        ctx.strokeStyle = rg;
        
        for (let an = 0; an < 360; an += scale) {
 
            // 重复画会导致小时刻度不明显
            if (an % 30 !== 0) { 
                ctx.moveTo(0, 0);
                ctx.lineTo(200, 0);
            }

            ctx.rotate(scale * Math.PI / 180);

        }
        
        ctx.stroke();

        ctx.setDefault();
        ctx.translate(-400, -300); // 还原
    }

}

let canvas = document.createElement("canvas");
let style = canvas.style;
[canvas.width, canvas.height] = [800, 600];
[style.backgroundColor, style.position, style.zIndex] = ["green", "absolute", 1]
document.body.prepend(canvas);

new Clock(canvas).draw();

 

 技术图片

 

 

 

 

以上是关于Canvas 使用指南的主要内容,如果未能解决你的问题,请参考以下文章

使用 canvas 绘图的几种方法

canvas的基础使用。

使用 canvas画时钟

怎样使用canvas绘制一个矩形

canvas 使用canvas压缩图片大小

使用svg和canvas实现图片的剪切