Canvas-绘制图形

摘要:
Canvas教程-MDNHTML5Canvas参考手册绘制形状canvas元素默认被网格所覆盖。通常来说网格中的一个单元相当于canvas元素中的一像素。直线lineTo语法:context.lineTo(x,y);参数描述x路径的目标位置x坐标y路径的目标位置y坐标varcanvas=document.getElementById;if{varctx=canvas.getContext;//填充三角形ctx.beginPath();ctx.moveTo;ctx.lineTo;ctx.lineTo;ctx.fill();//描边三角形ctx.beginPath();ctx.moveTo;ctx.lineTo;ctx.lineTo;ctx.closePath();ctx.stroke();}SeethePencanva-lineTobyflqbestboyonCodePen.矩形rect语法:context.rect;context.fillRect;context.clearRect;context.strokeRect;参数值:参数描述x矩形左上角的x坐标y矩形左上角的y坐标width矩形的宽度,以像素计height矩形的高度,以像素计varcanvas=document.getElementById;if{varctx=canvas.getContext;ctx.fillRect;ctx.clearRect;ctx.strokeRect;//红色矩形ctx.beginPath();ctx.lineWidth="6";ctx.strokeStyle="red";ctx.rect;ctx.stroke();}SeethePencanvas-rectbyflqbestboyonCodePen.fillRect()函数绘制了一个边长为100px的黑色正方形。

绘制形状

canvas元素默认被网格所覆盖。通常来说网格中的一个单元相当于canvas元素中的一像素。栅格的起点为左上角(坐标为(0,0))。所有元素的位置都相对于原点定位。所以图中蓝色方形左上角的坐标为距离左边(X轴)x像素,距离上边(Y轴)y像素(坐标为(x,y))。

Canvas-绘制图形第1张

路径path

路径绘制图形步骤:

  1. 创建路径起始点, beginPath()新建一条路径,生成之后,图形绘制命令被指向到路径上生成路径。
  2. 使用画图命令去画出路径,如:ctx.strokeRect(50, 50, 50, 50)
  3. 封闭路径,closePath()闭合路径之后图形绘制命令又重新指向到上下文中,不是必需的。这个方法会通过绘制一条从当前点到开始点的直线来闭合图形。如果图形是已经闭合了的,即当前点为开始点,该函数什么也不做。
  4. 一旦路径生成,就能通过描边或填充路径区域来渲染图形。stroke()通过线条来绘制图形轮廓;fill()通过填充路径的内容区域生成实心的图形。

直线lineTo

语法:

context.lineTo(x, y);
参数描述
x路径的目标位置x坐标
y路径的目标位置y坐标
var canvas = document.getElementById('canvas');
if (canvas.getContext){
	var ctx = canvas.getContext('2d');

	// 填充三角形
	ctx.beginPath();
	ctx.moveTo(25,25);
	ctx.lineTo(105,25);
	ctx.lineTo(25,105);
	ctx.fill();

	// 描边三角形
	ctx.beginPath();
	ctx.moveTo(125,125);
	ctx.lineTo(125,45);
	ctx.lineTo(45,125);
	ctx.closePath();
	ctx.stroke();
}

矩形rect

语法:

context.rect(x, y, width, height);

context.fillRect(x, y, width, height);
context.clearRect(x, y, width, height);
context.strokeRect(x, y, width, height);

参数值:

参数描述
x矩形左上角的 x 坐标
y矩形左上角的 y 坐标
width矩形的宽度,以像素计
height矩形的高度,以像素计
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
	var ctx = canvas.getContext('2d');
	
	ctx.fillRect(25, 25, 100, 100);
	ctx.clearRect(45, 45, 60, 60);
	ctx.strokeRect(50, 50, 50, 50);
	
	// 红色矩形
	ctx.beginPath();
	ctx.lineWidth="6";
	ctx.strokeStyle="red";
	ctx.rect(0,0,150,150);
	ctx.stroke();
}

fillRect()函数绘制了一个边长为100px的黑色正方形。clearRect()函数从正方形的中心开始擦除了一个6060px的正方形,接着strokeRect()在清除区域内生成一个5050的正方形边框。

绘制三角形

var canvas = document.getElementById('canvas');
    if (canvas.getContext) {
        var ctx = canvas.getContext('2d');
       
        ctx.beginPath();
        ctx.moveTo(75, 50); //moveTo(x, y) 将笔触移动到指定的坐标x以及y上。
        ctx.lineTo(100, 75);
        ctx.lineTo(100, 25);
        ctx.fill();
    }

圆形arc

语法:

context.arc(x,y,r,sAngle,eAngle,counterclockwise);

参数值:

参数描述
x圆的中心的 x 坐标。
y圆的中心的 y 坐标。
r圆的半径。
sAngle起始角,以弧度计。(弧的圆形的三点钟位置是 0 度)。
eAngle结束角,以弧度计。
counterclockwise可选。规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针。
var canvas = document.getElementById('canvas');
if (canvas.getContext){
	var ctx = canvas.getContext('2d');

	ctx.beginPath();
	ctx.arc(75,75,50,0,Math.PI*2,true); // 绘制
	ctx.moveTo(110,75);
	ctx.arc(75,75,35,0,Math.PI,false);   // 口(顺时针)
	ctx.moveTo(65,65);
	ctx.arc(60,65,5,0,Math.PI*2,true);  // 左眼
	ctx.moveTo(95,65);
	ctx.arc(90,65,5,0,Math.PI*2,true);  // 右眼
	ctx.stroke();
	
	// 无moveTo则展现完整路径
	ctx.beginPath();
	ctx.strokeStyle="red";
	ctx.arc(175,75,50,0,Math.PI*2,true); // 绘制
	//ctx.moveTo(210,75);
	ctx.arc(175,75,35,0,Math.PI,false);   // 口(顺时针)
	//ctx.moveTo(165,65);
	ctx.arc(160,65,5,0,Math.PI*2,true);  // 左眼
	//ctx.moveTo(195,65);
	ctx.arc(190,65,5,0,Math.PI*2,true);  // 右眼
	ctx.stroke();
	
}

圆弧arcTo

语法:

arcTo(x1, y1, x2, y2, radius)
参数描述
x1切线起点的 x 坐标。
y1切线起点的 y 坐标。
x2切线终点的 x 坐标。
y2切线终点的 y 坐标。
r圆的半径。

(x1, y1)分别与点(x2, y2)及当前笔触点(x0, y0)构成两条切线,绘制的弧线是两个切点之间以r为半径的最短圆弧。

详解:Canvas学习:绘制圆和圆弧

/*
*
* ctx 画布
* x , y 左上角坐标
* width, height 矩形宽高
* r 弧形半径
* */
function drawRoundedRect(ctx, x, y, width, height, r) {
	ctx.save();
	ctx.beginPath();

	// draw top and top right corner
	ctx.moveTo(x + r, y);
	ctx.arcTo(x + width, y, x + width, y + r, r);

	// draw right side and bottom right corner
	ctx.arcTo(x + width, y + height, x + width - r, y + height, r);

	// draw bottom and bottom left corner
	ctx.arcTo(x, y + height, x, y + height - r, r);

	// draw left and top left corner
	ctx.arcTo(x, y, x + r, y, r);

	ctx.fill();
	ctx.stroke();

	ctx.restore();
}
var canvas = document.getElementById('canvas');
if (canvas.getContext){
	var ctx = canvas.getContext('2d');
	drawRoundedRect(ctx, 20, 20, 100, 100, 10);
}

贝塞尔曲线

贝塞尔曲线-百度百科

贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,

二阶贝塞尔

Canvas-绘制图形第2张
原理:AD/AB = BE/BC = DF/DE
Canvas-绘制图形第3张

语法:

context.quadraticCurveTo(cpx,cpy,x,y);

参数值:

参数描述
cpx贝塞尔控制点的 x 坐标
cpy贝塞尔控制点的 y 坐标
x结束点的 x 坐标
y结束点的 y 坐标
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
	var ctx = canvas.getContext('2d');

	// 二次贝塞尔曲线
	ctx.beginPath();
	ctx.moveTo(75,25);
	ctx.quadraticCurveTo(25,25,25,62.5);
	ctx.quadraticCurveTo(25,100,50,100);
	ctx.quadraticCurveTo(50,120,30,125);
	ctx.quadraticCurveTo(60,120,65,100);
	ctx.quadraticCurveTo(125,100,125,62.5);
	ctx.quadraticCurveTo(125,25,75,25);
	ctx.stroke();
}

三阶贝塞尔

Canvas-绘制图形第4张

语法:

context.bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y);

参数值:

参数描述
cp1x第一个贝塞尔控制点的 x 坐标
cp1y第一个贝塞尔控制点的 y 坐标
cp2x第二个贝塞尔控制点的 x 坐标
cp2y第二个贝塞尔控制点的 y 坐标
x结束点的 x 坐标
y结束点的 y 坐标

四阶贝塞尔

Canvas-绘制图形第5张

五阶贝塞尔

Canvas-绘制图形第6张

Path2D 对象

Path2D用来缓存或记录绘画命令,这样你将能快速地回顾路径。
Path2D()会返回一个新初始化的Path2D对象(可能将某一个路径作为变量——创建一个它的副本,或者将一个包含SVG path数据的字符串作为变量)。

new Path2D();     // 空的Path对象
new Path2D(path); // 克隆Path对象
new Path2D(d);    // 从SVG建立Path对象

所有的路径方法比如moveTo, rect, arc或quadraticCurveTo等,如我们前面见过的,都可以在Path2D中使用。
Path2D API 添加了 addPath作为将path结合起来的方法。当你想要从几个元素中来创建对象时,这将会很实用。比如:

Path2D.addPath(path [, transform])​

添加了一条路径到当前路径(可能添加了一个变换矩阵)。
Path2D可以使用SVG path data来初始化canvas上的路径。

var p = new Path2D("M10 10 h 80 v 80 h -80 Z");
var canvas = document.getElementById('canvas');
if (canvas.getContext){
	var ctx = canvas.getContext('2d');

	var rectangle = new Path2D();
	rectangle.rect(10, 10, 50, 50);

	var circle = new Path2D();
	circle.moveTo(125, 35);
	circle.arc(100, 35, 25, 0, 2 * Math.PI);

	ctx.stroke(rectangle);
	ctx.fill(circle);
}

免责声明:文章转载自《Canvas-绘制图形》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇redheat7 sd 0:0:0:0: [sda] Assuming drive cache: write through(未解决)JQuery 之 获取 radio选中值,select选中值下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

你知道几种前端动画的实现方式?

随着互联网的持续发展,H5 页面作为与用户直接交互的表现层越来越复杂,呈现的形式也越来越丰富,从而也要求 H5 页面具有更多的花样性及动画效果。那前端实现动画效果的方式有哪些呢,大致有如下几种: 一、GIF图片 GIF图就直接贴上图片就好了,使用非常简单,但GIF图有时出现问题是没办法控制的,比如常见的GIF图的闪烁现象。 二、序列帧 序列帧其实本质是GI...

H5_0009:关于HTML5中Canvas的宽、高设置问题

关于HTML5中Canvas的宽、高设置问题 Canvas元素默认宽 300px, 高 150px, 设置其宽高可以使用如下方法(不会被拉伸): 方法一:        <canvas  height="500"></canvas> 方法二:使用HTML5 Canvas API操作 OK        var canvas...

HTML5 Canvas 获取网页的像素值。

我之前在网上看过一个插件叫做出JScolor   颜色拾取器  说白了就是通过1*1PX的DOM设置颜色值通过JS来获取当前鼠标点击位置DOM的颜色值。 自从HTML5 画布出来之后。就有更好的方法来获取了,比方郭阿里巴巴ICON矢量库 用的SVG和渐变来进行绘制: 我昨天用Canvas来绘制了一下。由于Canvas有现成的方法getImageDat...

Android Graphics专题(1)--- Canvas基础

作为Android Graphics专题的开篇。毫无疑问,我们将讨论Android UI技术的核心概念——Canvas。 Canvas是Android UI框架的基础,在Android的控件体系中。全部容器类、控件类在实现上都依赖于Canvas。界面的绘制实质上都是Canvas绘制的。本文将讨论Canvs的由来。并通过实例展示Canvas的基础使用方法。...

移动前端—H5实现图片先压缩再上传

  在做移动端图片上传的时候,用户传的都是手机本地图片,而本地图片一般都相对比较大,拿iphone6来说,平时拍很多图片都是一两M的,如果直接这样上传,那图片就太大了,如果用户用的是移动流量,完全把图片上传显然不是一个好办法。   目前来说,HTML5的各种新API都在移动端的webkit上得到了较好的实现。根据查看caniuse,本demo里使用到的Fi...

Android视图控件架构分析之View、ViewGroup

在Android中,视图控件大致被分为两类,即ViewGroup和View,ViewGroup控件作为父控件,包含并管理着子View,通过ViewGroup和View便形成了控件树,各个ViewGoup对象和View对象就是控件树中的节点。在控件树中,以树的深度来遍历查找对应的控件元素,同时,上层控件负责子控件的测量与绘制,并传递交互事件。 Android...