# canvas **Repository Path**: RichQin/canvas ## Basic Information - **Project Name**: canvas - **Description**: canvas的一些基础学习,以及一些小demo - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2020-11-29 - **Last Updated**: 2021-01-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # canvas ### 介绍 canvas的一些基础学习,以及一些小demo 预览:http://richqin.gitee.io/canvas/ ### canvas画布笔记 #### 按点画线 ```html Canvas ``` #### 画圆 ```javascript function draw(){ let canvas = document.getElementById("canvas"); if(canvas.getContext){ //创建contect对象 let cvsCtx = canvas.getContext("2d"); //画圆(圆心x,y,半径,开始角度,结束角度,顺时针false/逆时针true) cvsCtx.strokeStyle = '#000'; //线宽 //cvsCtx.lineWidth = 10; //画笑脸 cvsCtx.beginPath(); cvsCtx.arc(400, 200, 150, 0, 2*Math.PI, false); cvsCtx.moveTo(500, 200); cvsCtx.arc(400, 200, 100, 0, Math.PI, false); cvsCtx.closePath(); cvsCtx.moveTo(370, 120); cvsCtx.arc(350, 120, 20, 0, 2*Math.PI, false); cvsCtx.moveTo(470, 120); cvsCtx.arc(450, 120, 20, 0, 2*Math.PI, false); cvsCtx.stroke(); } } ``` #### 渐变 ```javascript //参数1:0-1,表示颜色所在位置 //参数2: 颜色 white #fff #ffffff rgb(255,255,255) //创建一个线性渐变对象(x,y,w,h) let grd = cvsCtx.createLinearGradient(0,0,0,200); //创建径向渐变对象 (x1,y1,r1,x2,y2,r2) //var rad = cvsCtx.createRadialGradient(120,120,20,120,120,50); //添加颜色 grd.addColorStop(0,"#000"); grd.addColorStop(0.5,"#ccc"); grd.addColorStop(1,"#fff"); cvsCtx.fillStyle = grd; cvsCtx.fillRect(0,0,200,200); ``` #### 绘制图像 ```javascript //绘制图像 let img=new Image() img.src="info.png" //等待图片加载完 img.onload = function(){ //drawImage(img,x,y,width,height,从x开始截取,y,w,h) cvsCtx.drawImage(this,0,0); } ``` #### 绘制文字 ```javascript //绘制文字 //cvsCtx.font = 'style, weight, size, family'; cvsCtx.font = '160px italic'; //阴影 cvsCtx.shadowColor = '#ccc'; //阴影模糊度,偏移 cvsCtx.shadowBlur = 10; cvsCtx.shadowOffsetX = 20; cvsCtx.shadowOffsetY = 20; //cvsCtx.fillText/strokeText('text', x, y); cvsCtx.fillText('RichQin', 20, 150); ``` #### clip()切图 #### 图像组合 `cvsCtx.globalCompositeOperation = "destination-out";` >目标图像:画布已存在图像 destination >源图像:即将画上去的图像 source - source-over 默认。在目标图像上显示源图像。 - destination-over 在源图像上显示目标图像。 - source-atop / destination-atop 在目标图像上显示源图像以及目标图像。源图像非重合部分是不可见。 - source-in / destination-in 显示重合部分源图像 - source-out / destination-out 显示不重合的源图像,目标图像是透明的。 - lighter 显示源图像 + 目标图像。 - copy 显示源图像。忽略目标图像。 - xor 使用异或操作对源图像与目标图像进行组合。(重合为0,不重合为1) #### save()和restore() >保存数据和使用数据`cvsCtx.save();cvsCtx.restore();` >使用栈的存取方式,先进后出,先使用最后保存的数据 #### 关键帧运动 ```javascript let x = 0,y = 0,width = 50,height = 50; cvsCtx.beginPath(); cvsCtx.fillStyle = "pink"; cvsCtx.fillRect(x, y, width, height); let speedX = 2,speedY = 2; // 1 请求关键帧动画(自动规划最优动画,不会失帧) function move(){ //清除画布 cvsCtx.clearRect(x, y, canvas.width, canvas.height); //更新位置 x += speedX; if(x > canvas.width-width || x < 0){ speedX *= -1; } y += speedY; if(y > canvas.height-height || y < 0){ speedY *= -1; } //绘制图像 cvsCtx.fillRect(x, y, width, height); //请求关键帧动画 window.requestAnimationFrame(move); } move(); ```