ä½¿ç¨ canvas æ¥ç»å¶å¾å½¢
æ¢ç¶æä»¬å·²ç»è®¾ç½®äº canvas ç¯å¢ï¼æä»¬å¯ä»¥æ·±å ¥äºè§£å¦ä½å¨ canvas ä¸ç»å¶ãå°æ¬æçæåï¼ä½ å°å¦ä¼å¦ä½ç»å¶ç©å½¢ï¼ä¸è§å½¢ï¼ç´çº¿ï¼åå¼§åæ²çº¿ï¼åå¾çæè¿äºåºæ¬çå½¢ç¶ãç»å¶ç©ä½å° Canvas åï¼éææ¡è·¯å¾ï¼æä»¬ççå°åºæä¹åã
æ æ ¼

卿们å¼å§ç»å¾ä¹åï¼æä»¬éè¦äºè§£ä¸ä¸ç»å¸æ æ ¼ï¼canvas gridï¼ä»¥ååæ ç©ºé´ãä¸ä¸é¡µä¸ç HTML 模æ¿ä¸æä¸ªå®½ 150px, é« 150px ç canvas å ç´ ãå¦å³å¾æç¤ºï¼canvas å ç´ é»è®¤è¢«ç½æ ¼æè¦çãé常æ¥è¯´ç½æ ¼ä¸çä¸ä¸ªåå ç¸å½äº canvas å ç´ ä¸çä¸åç´ ãæ æ ¼çèµ·ç¹ä¸ºå·¦ä¸è§ï¼åæ 为ï¼0,0ï¼ï¼ãææå ç´ çä½ç½®é½ç¸å¯¹äºåç¹å®ä½ãæä»¥å¾ä¸èè²æ¹å½¢å·¦ä¸è§çåæ ä¸ºè·ç¦»å·¦è¾¹ï¼X è½´ï¼x åç´ ï¼è·ç¦»ä¸è¾¹ï¼Y è½´ï¼y åç´ ï¼åæ 为ï¼x,yï¼ï¼ãå¨è¯¾ç¨çæåæä»¬ä¼å¹³ç§»åç¹å°ä¸åçåæ ä¸ï¼æè½¬ç½æ ¼ä»¥å缩æ¾ãç°å¨æä»¬è¿æ¯ä½¿ç¨åæ¥ç设置ã
ç»å¶ç©å½¢
ä¸åäº SVGï¼<canvas> åªæ¯æä¸¤ç§å½¢å¼çå¾å½¢ç»å¶ï¼ç©å½¢åè·¯å¾ï¼ç±ä¸ç³»åç¹è¿æç线段ï¼ãææå
¶ä»ç±»åçå¾å½¢é½æ¯éè¿ä¸æ¡æè
夿¡è·¯å¾ç»åèæçãä¸è¿ï¼æä»¬æ¥æä¼å¤è·¯å¾çæçæ¹æ³è®©å¤æå¾å½¢çç»å¶æä¸ºäºå¯è½ã
é¦å ï¼æä»¬åå°ç©å½¢çç»å¶ä¸ãcanvas æä¾äºä¸ç§æ¹æ³ç»å¶ç©å½¢ï¼
fillRect(x, y, width, height)-
ç»å¶ä¸ä¸ªå¡«å çç©å½¢
strokeRect(x, y, width, height)-
ç»å¶ä¸ä¸ªç©å½¢çè¾¹æ¡
clearRect(x, y, width, height)-
æ¸ é¤æå®ç©å½¢åºåï¼è®©æ¸ é¤é¨åå®å ¨éæã
ä¸é¢æä¾çæ¹æ³ä¹ä¸æ¯ä¸ä¸ªé½å å«äºç¸åçåæ°ãx ä¸ y æå®äºå¨ canvas ç»å¸ä¸æç»å¶çç©å½¢çå·¦ä¸è§ï¼ç¸å¯¹äºåç¹ï¼çåæ ãwidth å height 设置ç©å½¢ç尺寸ã
ä¸é¢ç draw() 彿°æ¯åä¸é¡µä¸åå¾çï¼ç°å¨å°±æ¥ä½¿ç¨ä¸é¢çä¸ä¸ªå½æ°ã
ç©å½¢ç¤ºä¾
function draw() {
const canvas = document.getElementById("canvas");
if (canvas.getContext) {
const ctx = canvas.getContext("2d");
ctx.fillRect(25, 25, 100, 100);
ctx.clearRect(45, 45, 60, 60);
ctx.strokeRect(50, 50, 50, 50);
}
}
该ä¾åçè¾åºå¦ä¸å¾æç¤ºã
fillRect()彿°ç»å¶äºä¸ä¸ªè¾¹é¿ä¸º 100px çé»è²æ£æ¹å½¢ãclearRect()彿°ä»æ£æ¹å½¢çä¸å¿å¼å§æ¦é¤äºä¸ä¸ª 60*60px çæ£æ¹å½¢ï¼æ¥çstrokeRect()卿¸
é¤åºåå
çæä¸ä¸ª 50*50 çæ£æ¹å½¢è¾¹æ¡ã
æ¥ä¸æ¥æä»¬è½å¤çå° clearRect() ç两个å¯éæ¹æ³ï¼ç¶åæä»¬ä¼ç¥éå¦ä½æ¹å渲æå¾å½¢çå¡«å é¢è²åæè¾¹é¢è²ã
ä¸åäºä¸ä¸èæè¦ä»ç»çè·¯å¾å½æ°ï¼path functionï¼ï¼ä»¥ä¸çä¸ä¸ªå½æ°ç»å¶ä¹åä¼é©¬ä¸æ¾ç°å¨ canvas ä¸ï¼å³æ¶çæã
ç»å¶è·¯å¾
å¾å½¢çåºæ¬å ç´ æ¯è·¯å¾ãè·¯å¾æ¯éè¿ä¸åé¢è²å宽度ççº¿æ®µææ²çº¿ç¸è¿å½¢æçä¸åå½¢ç¶çç¹çéåãä¸ä¸ªè·¯å¾ï¼çè³ä¸ä¸ªåè·¯å¾ï¼é½æ¯éåçã使ç¨è·¯å¾ç»å¶å¾å½¢éè¦ä¸äºé¢å¤çæ¥éª¤ã
- é¦å ï¼ä½ éè¦å建路å¾èµ·å§ç¹ã
- ç¶åä½ ä½¿ç¨ç»å¾å½ä»¤å»ç»åºè·¯å¾ã
- ä¹åä½ æè·¯å¾å°éã
- 䏿¦è·¯å¾çæï¼ä½ å°±è½éè¿æè¾¹æå¡«å è·¯å¾åºåæ¥æ¸²æå¾å½¢ã
以䏿¯æè¦ç¨å°ç彿°ï¼
beginPath()-
æ°å»ºä¸æ¡è·¯å¾ï¼çæä¹åï¼å¾å½¢ç»å¶å½ä»¤è¢«æåå°è·¯å¾ä¸çæè·¯å¾ã
closePath()-
éåè·¯å¾ä¹åå¾å½¢ç»å¶å½ä»¤åéæ°æåå°ä¸ä¸æä¸ã
stroke()-
éè¿çº¿æ¡æ¥ç»å¶å¾å½¢è½®å»ã
fill()-
éè¿å¡«å è·¯å¾çå 容åºåçæå®å¿çå¾å½¢ã
çæè·¯å¾çç¬¬ä¸æ¥å«å beginPath()ãæ¬è´¨ä¸ï¼è·¯å¾æ¯ç±å¾å¤åè·¯å¾ææï¼è¿äºåè·¯å¾é½æ¯å¨ä¸ä¸ªå表ä¸ï¼ææçåè·¯å¾ï¼çº¿ãå¼§å½¢ãççï¼ææå¾å½¢ãèæ¯æ¬¡è¿ä¸ªæ¹æ³è°ç¨ä¹åï¼åè¡¨æ¸ ç©ºéç½®ï¼ç¶åæä»¬å°±å¯ä»¥éæ°ç»å¶æ°çå¾å½¢ã
夿³¨ï¼å½åè·¯å¾ä¸ºç©ºï¼å³è°ç¨ beginPath() ä¹åï¼æè canvas åå»ºçæ¶åï¼ç¬¬ä¸æ¡è·¯å¾æé å½ä»¤é常被è§ä¸ºæ¯ moveToï¼ï¼ï¼æ 论å®é 䏿¯ä»ä¹ãåºäºè¿ä¸ªåå ï¼ä½ å 乿»æ¯è¦å¨è®¾ç½®è·¯å¾ä¹åä¸é¨æå®ä½ çèµ·å§ä½ç½®ã
ç¬¬äºæ¥å°±æ¯è°ç¨å½æ°æå®ç»å¶è·¯å¾ï¼æ¬æç¨åæä»¬å°±è½çå°äºã
第ä¸ï¼å°±æ¯éåè·¯å¾ closePath(),䏿¯å¿ éçãè¿ä¸ªæ¹æ³ä¼éè¿ç»å¶ä¸æ¡ä»å½åç¹å°å¼å§ç¹çç´çº¿æ¥éåå¾å½¢ã妿å¾å½¢æ¯å·²ç»éåäºçï¼å³å½åç¹ä¸ºå¼å§ç¹ï¼è¯¥å½æ°ä»ä¹ä¹ä¸åã
夿³¨ï¼å½ä½ è°ç¨ fill() 彿°æ¶ï¼æææ²¡æéåçå½¢ç¶é½ä¼èªå¨éåï¼æä»¥ä½ ä¸éè¦è°ç¨ closePath() 彿°ã使¯è°ç¨ stroke() æ¶ä¸ä¼èªå¨éåã
ç»å¶ä¸ä¸ªä¸è§å½¢
ä¾å¦ï¼ç»å¶ä¸è§å½¢ç代ç å¦ä¸ï¼
function draw() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
ctx.beginPath();
ctx.moveTo(75, 50);
ctx.lineTo(100, 75);
ctx.lineTo(100, 25);
ctx.fill();
}
}
è¾åºçä¸å»å¦ä¸ï¼
ç§»å¨ç¬è§¦
ä¸ä¸ªé常æç¨ç彿°ï¼èè¿ä¸ªå½æ°å®é
ä¸å¹¶ä¸è½ç»åºä»»ä½ä¸è¥¿ï¼ä¹æ¯ä¸é¢ææè¿°çè·¯å¾å表çä¸é¨åï¼è¿ä¸ªå½æ°å°±æ¯moveTo()ãæè
ä½ å¯ä»¥æ³è±¡ä¸ä¸å¨çº¸ä¸ä½ä¸ï¼ä¸æ¯é¢ç¬æè
é
ç¬çç¬å°ä»ä¸ä¸ªç¹å°å¦ä¸ä¸ªç¹çç§»å¨è¿ç¨ã
moveTo(x, y)-
å°ç¬è§¦ç§»å¨å°æå®çåæ x 以å y ä¸ã
å½ canvas åå§åæè
beginPath()è°ç¨åï¼ä½ é常ä¼ä½¿ç¨moveTo()彿°è®¾ç½®èµ·ç¹ãæä»¬ä¹è½å¤ä½¿ç¨moveTo()ç»å¶ä¸äºä¸è¿ç»çè·¯å¾ãçä¸ä¸ä¸é¢çç¬è¸ä¾åãæå°ç¨å°moveTo()æ¹æ³ï¼çº¢çº¿å¤ï¼çå°æ¹æ è®°äºã
ä½ å¯ä»¥å°è¯ä¸ä¸ï¼ä½¿ç¨ä¸è¾¹ç代ç çãåªéè¦å°å
¶å¤å¶å°ä¹åçdraw()彿°å³å¯ã
function draw() {
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()ã
夿³¨ï¼éè¦å¦ä¹ æ´å¤å ³äº arc() 彿°çå 容ï¼è¯·çä¸é¢çåå¼§
线
ç»å¶ç´çº¿ï¼éè¦ç¨å°çæ¹æ³lineTo()ã
lineTo(x, y)-
ç»å¶ä¸æ¡ä»å½åä½ç½®å°æå® x 以å y ä½ç½®çç´çº¿ã
è¯¥æ¹æ³æä¸¤ä¸ªåæ°ï¼x 以å yï¼ä»£è¡¨åæ ç³»ä¸ç´çº¿ç»æçç¹ãå¼å§ç¹åä¹åçç»å¶è·¯å¾æå
³ï¼ä¹åè·¯å¾çç»æç¹å°±æ¯æ¥ä¸æ¥çå¼å§ç¹ï¼ä»¥æ¤ç±»æ¨ãå¼å§ç¹ä¹å¯ä»¥éè¿moveTo()彿°æ¹åã
ä¸é¢çä¾åç»å¶ä¸¤ä¸ªä¸è§å½¢ï¼ä¸ä¸ªæ¯å¡«å çï¼å¦ä¸ä¸ªæ¯æè¾¹çã
function draw() {
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();
}
}
è¿éä»è°ç¨beginPath()彿°åå¤ç»å¶ä¸ä¸ªæ°çå½¢ç¶è·¯å¾å¼å§ãç¶å使ç¨moveTo()彿°ç§»å¨å°ç®æ ä½ç½®ä¸ãç¶åä¸é¢ï¼ä¸¤æ¡çº¿æ®µç»å¶åææä¸è§å½¢ç两æ¡è¾¹ã
ä½ ä¼æ³¨æå°å¡«å
ä¸æè¾¹ä¸è§å½¢æ¥éª¤ææä¸åãæ£å¦ä¸é¢ææå°çï¼å 为路å¾ä½¿ç¨å¡«å
ï¼fillï¼æ¶ï¼è·¯å¾èªå¨éåï¼ä½¿ç¨æè¾¹ï¼strokeï¼åä¸ä¼éåè·¯å¾ãå¦ææ²¡ææ·»å éåè·¯å¾closePath()å°æè¾¹ä¸è§å½¢å½æ°ä¸ï¼ååªç»å¶äºä¸¤æ¡çº¿æ®µï¼å¹¶ä¸æ¯ä¸ä¸ªå®æ´çä¸è§å½¢ã
åå¼§
ç»å¶åå¼§æè
åï¼æä»¬ä½¿ç¨arc()æ¹æ³ãå½ç¶å¯ä»¥ä½¿ç¨arcTo()ï¼ä¸è¿è¿ä¸ªçå®ç°å¹¶ä¸æ¯é£ä¹çå¯é ï¼æä»¥æä»¬è¿éä¸ä½ä»ç»ã
arc(x, y, radius, startAngle, endAngle, anticlockwise)-
ç»ä¸ä¸ªä»¥ï¼x,yï¼ä¸ºåå¿ç以 radius 为åå¾çåå¼§ï¼åï¼ï¼ä» startAngle å¼å§å° endAngle ç»æï¼æç § anticlockwise ç»å®çæ¹åï¼é»è®¤ä¸ºé¡ºæ¶éï¼æ¥çæã
arcTo(x1, y1, x2, y2, radius)-
æ ¹æ®ç»å®çæ§å¶ç¹ååå¾ç»ä¸æ®µåå¼§ï¼å以ç´çº¿è¿æ¥ä¸¤ä¸ªæ§å¶ç¹ã
è¿é详ç»ä»ç»ä¸ä¸ arc æ¹æ³ï¼è¯¥æ¹æ³æå
ä¸ªåæ°ï¼x,y为ç»å¶åå¼§æå¨åä¸çåå¿åæ ãradius为åå¾ãstartAngle以åendAngleåæ°ç¨å¼§åº¦å®ä¹äºå¼å§ä»¥åç»æç弧度ãè¿äºé½æ¯ä»¥ x 轴为åºåãåæ°anticlockwise为ä¸ä¸ªå¸å°å¼ã为 true æ¶ï¼æ¯éæ¶éæ¹åï¼å¦å顺æ¶éæ¹åã
夿³¨ï¼arc() 彿°ä¸è¡¨ç¤ºè§çå使¯å¼§åº¦ï¼ä¸æ¯è§åº¦ãè§åº¦ä¸å¼§åº¦ç js 表达å¼ï¼
弧度=(Math.PI/180)*è§åº¦ã
ä¸é¢çä¾åæ¯ä¸é¢çè¦å¤æä¸ä¸ï¼ä¸é¢ç»å¶äº 12 个ä¸åçè§åº¦ä»¥åå¡«å çåå¼§ã
ä¸é¢ä¸¤ä¸ªfor循ç¯ï¼çæåå¼§çè¡åï¼x,yï¼åæ ãæ¯ä¸æ®µåå¼§çå¼å§é½è°ç¨beginPath()ã代ç ä¸ï¼æ¯ä¸ªåå¼§ç忰齿¯å¯åçï¼å®é
ç¼ç¨ä¸ï¼æä»¬å¹¶ä¸éè¦è¿æ ·åã
x,y åæ æ¯å¯åçãåå¾ï¼radiusï¼åå¼å§è§åº¦ï¼startAngleï¼é½æ¯åºå®çãç»æè§åº¦ï¼endAngleï¼å¨ç¬¬ä¸åå¼å§æ¶æ¯ 180 度ï¼ååï¼ç¶åæ¯åå¢å 90 度ãæåä¸åå½¢æä¸ä¸ªå®æ´çåã
clockwiseè¯å¥ä½ç¨äºç¬¬ä¸ãä¸è¡æ¯é¡ºæ¶éçåå¼§ï¼anticlockwiseä½ç¨äºäºãåè¡ä¸ºéæ¶éåå¼§ãifè¯å¥è®©ä¸ãäºè¡æè¾¹åå¼§ï¼ä¸é¢ä¸¤è¡å¡«å
è·¯å¾ã
夿³¨ï¼è¿ä¸ªç¤ºä¾æéçç»å¸å¤§å°ç¥å¤§äºæ¬é¡µé¢çå ¶ä»ä¾åï¼150 x 200 åç´ ã
function draw() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 3; j++) {
ctx.beginPath();
var x = 25 + j * 50; // x åæ å¼
var y = 25 + i * 50; // y åæ å¼
var radius = 20; // åå¼§åå¾
var startAngle = 0; // å¼å§ç¹
var endAngle = Math.PI + (Math.PI * j) / 2; // ç»æç¹
var anticlockwise = i % 2 == 0 ? false : true; // 顺æ¶éæéæ¶é
ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);
if (i > 1) {
ctx.fill();
} else {
ctx.stroke();
}
}
}
}
}
äºæ¬¡è´å¡å°æ²çº¿å䏿¬¡è´å¡å°æ²çº¿
ä¸ä¸ä¸ªååæç¨çè·¯å¾ç±»åå°±æ¯è´å¡å°æ²çº¿ãäºæ¬¡å䏿¬¡è´å¡å°æ²çº¿é½ååæç¨ï¼ä¸è¬ç¨æ¥ç»å¶å¤ææè§å¾çå¾å½¢ã
quadraticCurveTo(cp1x, cp1y, x, y)-
ç»å¶äºæ¬¡è´å¡å°æ²çº¿ï¼
cp1x,cp1y为ä¸ä¸ªæ§å¶ç¹ï¼x,yä¸ºç»æç¹ã bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)-
ç»å¶ä¸æ¬¡è´å¡å°æ²çº¿ï¼
cp1x,cp1y为æ§å¶ç¹ä¸ï¼cp2x,cp2y为æ§å¶ç¹äºï¼x,yä¸ºç»æç¹ã
å³è¾¹çå¾è½å¤å¾å¥½çæè¿°ä¸¤è çå ³ç³»ï¼äºæ¬¡è´å¡å°æ²çº¿æä¸ä¸ªå¼å§ç¹ï¼èè²ï¼ãä¸ä¸ªç»æç¹ï¼èè²ï¼ä»¥åä¸ä¸ªæ§å¶ç¹ï¼çº¢è²ï¼ï¼è䏿¬¡è´å¡å°æ²çº¿æä¸¤ä¸ªæ§å¶ç¹ã

åæ° xãy å¨è¿ä¸¤ä¸ªæ¹æ³ä¸é½æ¯ç»æç¹åæ ãcp1x,cp1yä¸ºåæ ä¸ç第ä¸ä¸ªæ§å¶ç¹ï¼cp2x,cp2yä¸ºåæ ä¸ç第äºä¸ªæ§å¶ç¹ã
使ç¨äºæ¬¡ä»¥å䏿¬¡è´å¡å°æ²çº¿æ¯æä¸å®çé¾åº¦çï¼å 为ä¸åäºå Adobe Illustrators è¿æ ·çç¢éè½¯ä»¶ï¼æä»¬æç»å¶çæ²çº¿æ²¡æç»æä»¬æä¾ç´æ¥çè§è§åé¦ãè¿è®©ç»å¶å¤æçå¾å½¢åå¾ååå°é¾ãå¨ä¸é¢çä¾åä¸ï¼æä»¬ä¼ç»å¶ä¸äºç®åæè§å¾çå¾å½¢ï¼å¦æä½ ææ¶é´ä»¥åæ´å¤çèå¿ï¼å¾å¤å¤æçå¾å½¢ä½ ä¹å¯ä»¥ç»å¶åºæ¥ã
ä¸é¢çè¿äºä¾å没æå¤å°å°é¾ãè¿ä¸¤ä¸ªä¾å䏿们ä¼è¿ç»ç»å¶è´å¡å°æ²çº¿ï¼æåå½¢æå¤æçå¾å½¢ã
äºæ¬¡è´å¡å°æ²çº¿
è¿ä¸ªä¾å使ç¨å¤ä¸ªè´å¡å°æ²çº¿æ¥æ¸²æå¯¹è¯æ°æ³¡ã
function draw() {
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();
}
}
䏿¬¡è´å¡å°æ²çº¿
è¿ä¸ªä¾å使ç¨è´å¡å°æ²çº¿ç»å¶å¿å½¢ã
function draw() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
//䏿¬¡è´å¡å°æ²çº¿
ctx.beginPath();
ctx.moveTo(75, 40);
ctx.bezierCurveTo(75, 37, 70, 25, 50, 25);
ctx.bezierCurveTo(20, 25, 20, 62.5, 20, 62.5);
ctx.bezierCurveTo(20, 80, 40, 102, 75, 120);
ctx.bezierCurveTo(110, 102, 130, 80, 130, 62.5);
ctx.bezierCurveTo(130, 62.5, 130, 25, 100, 25);
ctx.bezierCurveTo(85, 25, 75, 37, 75, 40);
ctx.fill();
}
}
ç©å½¢
ç´æ¥å¨ç»å¸ä¸ç»å¶ç©å½¢çä¸ä¸ªé¢å¤æ¹æ³ï¼æ£å¦æä»¬å¼å§æè§çç»å¶ç©å½¢ï¼åæ ·ï¼ä¹æ rect() æ¹æ³ï¼å°ä¸ä¸ªç©å½¢è·¯å¾å¢å å°å½åè·¯å¾ä¸ã
rect(x, y, width, height)-
ç»å¶ä¸ä¸ªå·¦ä¸è§åæ 为ï¼x,yï¼ï¼å®½é«ä¸º width 以å height çç©å½¢ã
å½è¯¥æ¹æ³æ§è¡çæ¶åï¼moveTo() æ¹æ³èªå¨è®¾ç½®åæ åæ°ï¼0,0ï¼ãä¹å°±æ¯è¯´ï¼å½åç¬è§¦èªå¨éç½®åé»è®¤åæ ã
ç»å使ç¨
ç®å为æ¢ï¼æ¯ä¸ä¸ªä¾åä¸çæ¯ä¸ªå¾å½¢é½åªç¨å°ä¸ç§ç±»åçè·¯å¾ãç¶èï¼ç»å¶ä¸ä¸ªå¾å½¢å¹¶æ²¡æéå¶ä½¿ç¨æ°é以åç±»åãæä»¥å¨æåçä¸ä¸ªä¾åéï¼è®©æä»¬ç»åä½¿ç¨ææçè·¯å¾å½æ°æ¥éç°ä¸æ¬¾èåçæ¸¸æã
function draw() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
roundedRect(ctx, 12, 12, 150, 150, 15);
roundedRect(ctx, 19, 19, 150, 150, 9);
roundedRect(ctx, 53, 53, 49, 33, 10);
roundedRect(ctx, 53, 119, 49, 16, 6);
roundedRect(ctx, 135, 53, 49, 33, 10);
roundedRect(ctx, 135, 119, 25, 49, 10);
ctx.beginPath();
ctx.arc(37, 37, 13, Math.PI / 7, -Math.PI / 7, false);
ctx.lineTo(31, 37);
ctx.fill();
for (var i = 0; i < 8; i++) {
ctx.fillRect(51 + i * 16, 35, 4, 4);
}
for (i = 0; i < 6; i++) {
ctx.fillRect(115, 51 + i * 16, 4, 4);
}
for (i = 0; i < 8; i++) {
ctx.fillRect(51 + i * 16, 99, 4, 4);
}
ctx.beginPath();
ctx.moveTo(83, 116);
ctx.lineTo(83, 102);
ctx.bezierCurveTo(83, 94, 89, 88, 97, 88);
ctx.bezierCurveTo(105, 88, 111, 94, 111, 102);
ctx.lineTo(111, 116);
ctx.lineTo(106.333, 111.333);
ctx.lineTo(101.666, 116);
ctx.lineTo(97, 111.333);
ctx.lineTo(92.333, 116);
ctx.lineTo(87.666, 111.333);
ctx.lineTo(83, 116);
ctx.fill();
ctx.fillStyle = "white";
ctx.beginPath();
ctx.moveTo(91, 96);
ctx.bezierCurveTo(88, 96, 87, 99, 87, 101);
ctx.bezierCurveTo(87, 103, 88, 106, 91, 106);
ctx.bezierCurveTo(94, 106, 95, 103, 95, 101);
ctx.bezierCurveTo(95, 99, 94, 96, 91, 96);
ctx.moveTo(103, 96);
ctx.bezierCurveTo(100, 96, 99, 99, 99, 101);
ctx.bezierCurveTo(99, 103, 100, 106, 103, 106);
ctx.bezierCurveTo(106, 106, 107, 103, 107, 101);
ctx.bezierCurveTo(107, 99, 106, 96, 103, 96);
ctx.fill();
ctx.fillStyle = "black";
ctx.beginPath();
ctx.arc(101, 102, 2, 0, Math.PI * 2, true);
ctx.fill();
ctx.beginPath();
ctx.arc(89, 102, 2, 0, Math.PI * 2, true);
ctx.fill();
}
}
// å°è£
çä¸ä¸ªç¨äºç»å¶åè§ç©å½¢ç彿°ã
function roundedRect(ctx, x, y, width, height, radius) {
ctx.beginPath();
ctx.moveTo(x, y + radius);
ctx.lineTo(x, y + height - radius);
ctx.quadraticCurveTo(x, y + height, x + radius, y + height);
ctx.lineTo(x + width - radius, y + height);
ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius);
ctx.lineTo(x + width, y + radius);
ctx.quadraticCurveTo(x + width, y, x + width - radius, y);
ctx.lineTo(x + radius, y);
ctx.quadraticCurveTo(x, y, x, y + radius);
ctx.stroke();
}
ç»æç»é¢å¦ä¸ï¼
æä»¬ä¸ä¼å¾è¯¦ç»å°è®²è§£ä¸é¢ç代ç ï¼å 为äºå®ä¸è¿å¾å®¹æçè§£ãéç¹æ¯ç»å¶ä¸ä¸æä¸ä½¿ç¨å°äº fillStyle 屿§ï¼ä»¥åå°è£
彿°ï¼ä¾åä¸çroundedRect()ï¼ã使ç¨å°è£
彿°å¯¹äºåå°ä»£ç é以åå¤æåº¦ååæç¨ã
å¨ç¨åç课ç¨éï¼æä»¬ä¼è®¨è®ºfillStyleæ ·å¼çæ´å¤ç»èãè¿ç« èä¸ï¼æä»¬å¯¹fillStyleæ ·å¼æåçä»
æ¯æ¹åå¡«å
é¢è²ï¼ç±é»è®¤çé»è²å°ç½è²ï¼ç¶å忝é»è²ã
Path2D 对象
æ£å¦æä»¬å¨åé¢ä¾åä¸çå°çï¼ä½ å¯ä»¥ä½¿ç¨ä¸ç³»åçè·¯å¾åç»ç»å½ä»¤æ¥æå¯¹è±¡âç»âå¨ç»å¸ä¸ã为äºç®å代ç åæé«æ§è½ï¼Path2D对象已å¯ä»¥å¨è¾æ°çæ¬çæµè§å¨ä¸ä½¿ç¨ï¼ç¨æ¥ç¼åæè®°å½ç»ç»å½ä»¤ï¼è¿æ ·ä½ å°è½å¿«éå°å顾路å¾ã
ææ ·äº§çä¸ä¸ª 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 示ä¾
å¨è¿ä¸ªä¾åä¸ï¼æä»¬åé äºä¸ä¸ªç©å½¢åä¸ä¸ªåãå®ä»¬é½è¢«å为 Path2D 对象ï¼åé¢åæ´¾ä¸ç¨åºãéçæ°ç Path2D API 产çï¼å ç§æ¹æ³ä¹ç¸åºå°è¢«æ´æ°æ¥ä½¿ç¨ Path2D 对象è䏿¯å½åè·¯å¾ãå¨è¿éï¼å¸¦è·¯å¾åæ°çstrokeåfillå¯ä»¥æå¯¹è±¡ç»å¨ç»å¸ä¸ã
function draw() {
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);
}
}
ä½¿ç¨ SVG paths
æ°ç Path2D API æå¦ä¸ä¸ªå¼ºå¤§çç¹ç¹ï¼å°±æ¯ä½¿ç¨ SVG path data æ¥åå§å canvas ä¸çè·¯å¾ãè¿å°ä½¿ä½ è·åè·¯å¾æ¶å¯ä»¥ä»¥ SVG æ canvas çæ¹å¼æ¥éç¨å®ä»¬ã
è¿æ¡è·¯å¾å°å
ç§»å¨å°ç¹ (M10 10) ç¶ååæ°´å¹³ç§»å¨ 80 个åä½(h 80)ï¼ç¶åä¸ç§» 80 个åä½ (v 80)ï¼æ¥ç左移 80 个åä½ (h -80)ï¼ååå°èµ·ç¹å¤ (z)ãä½ å¯ä»¥å¨Path2D constructor æ¥çè¿ä¸ªä¾åã
var p = new Path2D("M10 10 h 80 v 80 h -80 Z");