canvas基本操作
大约 4 分钟
canvas基本操作
// 添加语法提示
/** @type {HTMLCanvasElement} */
// 第一行必须是
var canvas = document.getByIdElement("dom");
var d2d = canvas.getContext("2d");
canvas 操作
// 填充颜色
d2d.fillStyle = "rgb";
// 矩形
d2d.fillRect(y,x,width,height);
绘制三角形
// 绘制线条
// 填充三角形
ctx.beginPath();
ctx.moveTo(0, 20);
ctx.lineTo(100, 100);
ctx.lineTo(201, 101);
ctx.lineTo(302, 102);
// fill 填充 stroke描边
ctx.fill();
// 清屏
canvas.height = canvas.height;
绘制线条
var color = ['LightPink','Crimson','MediumBlue','MediumPink']
for(let i = 0;i <= 3;i++){
// 路径宽度
ctx.lineWidth = 1+i;
ctx.strokeStyle = color[i]
ctx.beginPath();
ctx.moveTo(5+i*14,5);
ctx.lineTo(5+i*14,140);
ctx.stroke();
}
绘制圆圈
// 清屏
canvas.height = canvas.height;
ctx.beginPath();
// x,y,size,star,end,是否反向
ctx.arc(10,10,10,0,2*Math.PI,false);
ctx.fill();
ctx.beginPath();
// x,y , radius 半径,startAngle endAngle ,bool 是否反向
ctx.arc(40,40,10,0,2*Math.PI,true);
ctx.stroke();
使用线条画正方形
// 设置描边颜色
ctx.strokeStyle = 'blue';
ctx.beginPath();
ctx.moveTo(20,10);
ctx.lineTo(20,100);
ctx.lineTo(100,100);
ctx.lineTo(100,10);
ctx.lineTo(20,10);
ctx.stroke();
LineCap 线条端点的样式
// cap 线条端点的样式
var lineCap = [
'butt', // 正常类型的
'round', // 圆边的
'square' // 平方
];
for(let i=0;i<3;i++){
ctx.lineCap = lineCap[i];
ctx.lineWidth = 10;
ctx.beginPath();
ctx.moveTo(25 + i * 20,10);
ctx.lineTo(25 + i * 20,100);
ctx.stroke();
}
line join
// lineJoin 线条连接点的样式
var lineJoin = [
'round', // 圆
'bevel', // 斜的
'miter' // 斜接
]
ctx.lineWidth = 10;
for(let i = 0; i < 3; i++){
ctx.lineJoin = lineJoin[i]
ctx.beginPath();
ctx.moveTo(0,5 + i * 100);
ctx.lineTo(100 ,40 + i * 100);
ctx.lineTo(200,5 + i * 100);
ctx.lineTo(300,40 + i * 100);
ctx.stroke();
}
蚂蚁线动画,SetLineDash([线条稀疏度,线条间隙]),LineDashOffset = 起始点偏移量
<script>
/** @type {HTMLCanvasElement}*/
var canvas = document.getElementById("dom");
var ctx = canvas.getContext("2d");
var offset = -4;
// 虚线 lineDash
function draw(){
// 清空画布(矩形)
ctx.clearRect(0,0,canvas.width,canvas.height);
// setLineDash(线段数值,间隙数值)
ctx.setLineDash([10,10]);
// lineDashOffset 起始偏移量
ctx.lineDashOffset = -offset;
ctx.strokeRect(10,10,100,100);
}
function march(){
offset++;
if(offset > 16){
offset = 0;
}
draw();
setInterval(march,500);
}
march();
</script>
渐变色 linearGradient(x1,y1,x2,y2)
// 渐变 createLinearGradient(x1,y1,x2,y2)
// 径向渐变 createRadialGradient(x1,y1,r1,x2,y2,r2);
var linear = ctx.createLinearGradient(0,0,300,300);
linear.addColorStop(0.9,'blue');
linear.addColorStop(0.1,'red');
ctx.fillStyle = linear;
ctx.rect(0,0,300,300);
ctx.fill();
redialGradient(x1,y1,r1,x2,y2,r2);
var linear = ctx.createRadialGradient(150,150,30,150,150,15);
linear.addColorStop(.1,'blue');
linear.addColorStop(1,'red');
ctx.fillStyle = linear;
// ctx.arc(150,150,150,0,2*Math.PI,true);
ctx.rect(0,0,300,300);
ctx.fill();
绘制图案,CreatePattern
// pattern 绘制图案
var img = new Image();
img.src = "./src/logo.jpg";
img.onload = function(){
// create pattern,创建图案
var Pattern = ctx.createPattern(img,'repeat');
ctx.fillStyle = Pattern;
ctx.fillRect(0,0,300,300);
}
阴影与字体 shadow fillText
// shadows
// offset x,y偏移
ctx.shadowOffsetX = 2;
ctx.shadowOffsetY = 2;
// blur 模糊度
ctx.shadowBlur = 2;
ctx.shadowColor = 'red';
ctx.font = '25px Times New Roman';
ctx.fillStyle = 'LightPink';
// 绘制文字
ctx.fillText('hello world',10,30);
字体
// fillText
ctx.font = '48px serif';
ctx.fillText('hello world',10,50,300);
// 文本对齐方式
ctx.textAlign = 'start,end,left,right or center';
// baseline 基线对齐
ctx.textBaseline = 'top,hanging,middle,alphaBetic,等等等';
// 文本朝向
ctx.direction = 'default=inherit';
// 文本边框
ctx.strokeText('你好,世界~',10,120,300);
测量文本宽度,measureText
var test = ctx.measureText('你好,世界~');
ctx.strokeText(test.width,10,50);
图片渲染
// image
var img = new Image();
img.src = '/src/logo.jpg';
img.onload = function(){
// 绘制图片,drawImage(image,x,y,width,height);
ctx.drawImage(img,0,0,300,300);
}
save 与 restore
// save 保存当前状态(style,alpha,width,cap,join,miterLimit,shadow,color,blur,cont,textAlign,baseLine,direction等等等)
// store 恢复保存的状态
ctx.strokeStyle = "red";
// 保存的状态
ctx.save();
ctx.strokeRect(10,10,50,50);
ctx.strokeStyle = 'pink';
ctx.strokeRect(10,70,50,50);
// 把保存的状态恢复
ctx.restore();
ctx.strokeRect(70,10,50,50);
translate 移动
ctx.fillStyle = 'red';
// translate 移动
ctx.translate(10,10);
// fillRect 的值可以不用设置
ctx.fillRect(0,0,50,50);
rotate 旋转
ctx.strokeStyle = 'red';
ctx.fillStyle = 'pink';
ctx.font="20px Georgia";
ctx.fillText(`弧度:${65 * Math.PI / 180}`,10,100);
// rotate 先移动,旋转
// ctx.translate(125,125);
ctx.rotate(15 * Math.PI / 180);
// translate 移动
ctx.translate(10,10);
// fillRect 的值可以不用设置
ctx.shadowBlur = 5;
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 0;
ctx.shadowColor = 'red';
ctx.rect(0,0,50,50);
ctx.fill();
缩放 scale
ctx.strokeStyle = 'red';
ctx.fillStyle = 'pink';
// scale 缩放(x,y)
ctx.scale(2.5,1.5);
// 原始大小50x50
ctx.rect(10,10,50,50);
ctx.fill();
签名工具
/** @type {HTMLCanvasElement}*/
var canvas = document.getElementById("dom");
var ctx = canvas.getContext("2d");
ctx.lineWidth = 10;
var IsClick = false;
var startLineY = 0,startLineX = 0;
canvas.addEventListener('mousedown',function(event){
// 启动
IsClick = true;
startLineY = event.offsetY;
startLineX = event.offsetX;
});
canvas.addEventListener('mouseup',function(event){
// 关闭
IsClick = false;
startLineY = 0;
startLineX = 0;
});
canvas.addEventListener('mouseleave',function(){
// 关闭
IsClick = false;
startLineY = 0;
startLineX = 0;
});
canvas.addEventListener('mousemove',function(event){
// 绘制
if(IsClick){
// 画线
// ctx.beginPath();
// ctx.moveTo(startLineX,startLineY);
// ctx.lineTo(event.offsetX,event.offsetY);
// ctx.stroke();
/** 画圆圈 */
// ctx.beginPath();
// ctx.arc(event.offsetX,event.offsetY,5,0,Math.PI * 2,false);
// ctx.fill();
/** 画线 */
ctx.beginPath();
ctx.moveTo(event.offsetX,event.offsetY);
ctx.lineTo(event.offsetX+1,event.offsetY+1);
ctx.stroke();
}
});
签名绘制2.0
/** @type {HTMLCanvasElement}*/
var canvas = document.getElementById("dom");
var ctx = canvas.getContext("2d");
ctx.lineWidth = 10;
var IsClick = false;
var startLineY = 0,startLineX = 0;
canvas.addEventListener('mousedown',function(event){
// 启动
IsClick = true;
startLineY = event.offsetY;
startLineX = event.offsetX;
// path
ctx.beginPath();
ctx.moveTo(event.offsetX,event.offsetY);
});
canvas.addEventListener('mouseup',function(event){
// 关闭
IsClick = false;
startLineY = 0;
startLineX = 0;
});
canvas.addEventListener('mouseleave',function(){
// 关闭
IsClick = false;
startLineY = 0;
startLineX = 0;
});
canvas.addEventListener('mousemove',function(event){
// 绘制
if(IsClick){
/** 画线 */
ctx.lineTo(event.offsetX+1,event.offsetY+1);
// stroke
ctx.stroke();
}
});