canvas图形绘制:矩形,路径

1,canvas绘制矩形:实心矩形,边框矩形 ,擦除矩形

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>canvas绘制形状</title>
  <style type="text/css">
    #cv{
     border: 1px solid black;
    }
  </style>
</head>
<body>
  <canvas id="cv" width="300" height="200"></canvas>
</body>
<script type="text/javascript">
  function draw(){
    var canvas = document.getElementById("cv");
    if(canvas.getContext){
      var ctx = canvas.getContext("2d");
      // 图形绘制:矩形,路径
        //矩形: 绘制矩形的三种方法;
        ctx.fillRect(20,20,50,60); // fillRect(x,y,width,height) 绘制一个填充的矩形,x、y:矩形左上角顶点x、y轴坐标;width、height: 矩形宽度、高度;

        ctx.strokeRect(80,80,40,60);// fillRect(x,y,width,height) 绘制一个矩形的边框,x、y:矩形左上角顶点x、y轴坐标;width、height: 矩形宽度、高度;

        ctx.clearRect(30,30,20,20); // fillRect(x,y,width,height) 清楚一个矩形区域,x、y:矩形左上角顶点x、y轴坐标;width、height: 矩形宽度、高度;
      }
  }
  draw();
</script>
</html>   

2,绘制三角形:draw方法变成下面这样:

function draw(){
    var canvas = document.getElementById("cv");
    if(canvas.getContext){
      var ctx = canvas.getContext("2d");
      // 通过路径绘制
        // beginPath() 新建一条路径;closePath() 闭合路径; 
        // stroke() 通过线条来绘制图形轮廓;fill() 通过填充内容区域来生成实心图形
        ctx.beginPath();
        ctx.moveTo(60,80);
        ctx.lineTo(50,60);
        ctx.lineTo(40,100);
        ctx.closePath();  
        ctx.stroke();
    }
  }

 效果:

3,绘制圆弧:draw方法变成这样:

function draw(){
    var canvas = document.getElementById("cv");
    if(canvas.getContext){
      var ctx = canvas.getContext("2d");
      // 路径 
        ctx.beginPath(); 
 // arc(x, y, radius, startAngle, endAngle, anticlockwise) 绘制圆弧 
 // x, y, 圆心坐标; radius 半径, startAngle, endAngle, 圆弧开始结束弧度,单位是弧度, 弧度=(Math.PI/180)*角度
        // anticlockwise 绘制方向,默认为顺时针 boolean类型
        var start = (Math.PI/180)*0;
        var end = (Math.PI/180)*210;
        ctx.arc(50,50,30,start,end,false);
        ctx.stroke();
    }
  }

效果:

4,二次贝塞尔曲线:

function draw(){
    var canvas = document.getElementById("cv");
    if(canvas.getContext){
      var ctx = canvas.getContext("2d");
      // 路径 
        ctx.beginPath(); 
        // 二次贝塞尔曲线 quadraticCurveTo(cp1x,cp1y,x,y) : cp1x,cp1y, 一个控制点;x,y 结束点
        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();
    }
  }

 

 绘制路径

 // 绘制路径
      ctx.beginPath();
      ctx.fillStyle = "rgba(200,0,300,0.5)"; // 设置填充色
      ctx.moveTo(300, 80); // lineTo(x, y)
      ctx.lineTo(200, 150); // lineTo(x, y)
      ctx.lineTo(150, 100);
      ctx.lineTo(300, 80);
      ctx.closePath();
      ctx.fill(); // 填充图形
      // ctx.stroke(); // 边框图形

 使用全局透明度的例子:globalAlpha

// 画背景图
      ctx.fillStyle = "#F9F205";
      ctx.fillRect(50,600,100,100);
      ctx.fillStyle = "#18F306";
      ctx.fillRect(150,600,100,100);
      ctx.fillStyle = "#05D6F9";
      ctx.fillRect(50,700,100,100);
      ctx.fillStyle = "#F90526";
      ctx.fillRect(150,700,100,100);
      // 设置全局透明度 globalAlpha
      ctx.globalAlpha = 0.2;
      ctx.fillStyle = "rgba(255,255,255)";
      for(var i = 0; i < 10; i ++) {
        ctx.beginPath();
        ctx.arc(150, 700, i * 10, 0, Math.PI * 2, false);
        ctx.fill();
      }

 

 设置线条宽度

ctx.lineWidth = 10; // 设置线条宽度;
      ctx.strokeStyle = "#05D6F9";
      ctx.strokeRect(320,600,200,100); // 绘制线框

 设置线条末端样式

// 默认值 butt , 和导航线是完全平齐的。
      //  第二条线段使用了 round 选项,在线段末端增加了一个半径为线短宽度一半的半圆。
      // 右侧的线段使用了 square 选项,增加了一个宽度和线段相同,高度是线段厚度一半的矩形区域
      let lineCap = ["butt", "round", "square"];
      for(var i = 0; i < 3; i ++) {
        ctx.lineCap = lineCap[i]; // 设置线条末端样式
        ctx.beginPath();
        ctx.moveTo(600, 200 + i * 25);
        ctx.lineTo(900, 200 + i * 25);
        ctx.stroke();
      }

 定线条与线条间接合处的样式

// 设定线条与线条间接合处的样式。lineJoin: "bevel", "round", "miter" : 直角,圆角,菱角
      let lineJoin = ["bevel", "round", "miter"];
      for(var i = 0; i < 3; i ++) {
        ctx.lineJoin = lineJoin[i]; // 设置线条末端样式
        ctx.beginPath();
        ctx.moveTo(700, 300 + i * 45);
        ctx.lineTo(800, 370 + i * 45);
        ctx.lineTo(900, 300 + i * 45);
        ctx.stroke();
      }

 

 绘制虚线

var offset = 0;
      ctx.fillStyle = "skyblue";
      function drawLine() {
        ctx.clearRect(200, 300, 300, 200); // 清除区域
        ctx.setLineDash([8,10]); // setLineDash([a, b]) 来指定线段与间隙的交替  a:每一小段虚线的宽度 ; b: 间隙宽度;
        ctx.lineDashOffset = -offset; // 设置起始偏移量.
        ctx.strokeRect(230,330, 200, 100);
      }
      function timeOutDrawLine() {
        offset ++;
        if(offset > 20) {
          offset = 0;
        }
        drawLine();
        setTimeout(timeOutDrawLine, 15); // 注释掉这一行;虚线是静态的;打开时动态的;
      }
      timeOutDrawLine();

渐变色 :线性渐变

// 渐变 Gradients
      // createLinearGradient(x1, y1, x2, y2) 线性渐变; 接受 4 个参数,表示渐变的起点 (x1,y1) 与终点 (x2,y2)
      // createRadialGradient 径向渐变; 方法接受 6 个参数,前三个定义一个以 (x1,y1) 为原点,半径为 r1 的圆,
      //    后三个参数则定义另一个以 (x2,y2) 为原点,半径为 r2 的圆。
      // gradient.addColorStop(position, color) position 
          // 参数position必须是一个 0.0 与 1.0 之间的数值,表示渐变中颜色所在的相对位置。color 是一个有效的 CSS 颜色值
      // strokeStyle 和 fillStyle 属性都可以接受 canvasGradient 对象。
let lineGradient = ctx.createLinearGradient(0,0,0,150);
      lineGradient.addColorStop(0, '#00ABEB');
      lineGradient.addColorStop(0.5, '#fff');
      lineGradient.addColorStop(1, '#abccff');
      
      ctx.fillStyle = lineGradient;
      ctx.fillRect(500,0,100,150);

 createLinearGradient 中四个参数表示两个点是(0,0)和 (0,150)

// 径向渐变
      let radialGradient = ctx.createRadialGradient(0,150,150,0,350,150);
      radialGradient.addColorStop(0,"#00C9FF");
      radialGradient.addColorStop(0.5,"#C9FF");
      radialGradient.addColorStop(1,"#9FF");

      ctx.fillStyle = radialGradient;
      ctx.fillRect(0,150,200,200);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值