zoukankan      html  css  js  c++  java
  • HTML5 canvas

      canvas主要用于绘制简单的2D图形,具备基本绘图能力的2D上下文。webGL用于绘制3D图形,但支持不够好。下面我们主要来说明绘图的步骤,以及有哪些绘图API。

    绘图步骤

    1. 创建画布,指定绘图区域,必须指定宽高,否则画布不显示。
    1 <!-- 创建一个长200,宽200的画布 -->
    2 <canvas id="drawing" width="200" height="200"></canvas>

      2. 获取上下文,调用getContext方法进行获取。

    1 var drawing= document.getElementById('drawing');
    2 if (drawing.getContext) { // 检测浏览器是否支持canvas
    3     var context = drawing.getContext('2d');
    4 }

      3. 在上下文中进行图形绘制,绘制相关api将在后面详细进行描述。

      4. 最后,可以将绘制的图片导出。使用toDataURL()方法。

    绘图API

      1. 基本绘图操作

    1. 填充:使用fillStyle属性设置样式。其值可以是颜色,渐变对象,模式对象。
    2. 描边:使用strokeStyle属性设置样式。

      2. 绘制矩形

      fillRect(x, y, w, h);   使用fillStyle设置的样式。

      strokeRect(x, y, w, h);   使用strokeStyle设置的样式。

      其中,x,y为矩形的起点,w为矩形的宽,h为矩形的高。

      并且描边的边线样式,可以通过设置lineWidth,lineCap,lineJoin进行设置。

     1 if (canvas1.getContext) {
     2     // 获取2d上下文
     3     context = canvas1.getContext('2d');
     4 
     5     // 以(10, 10)点为起点,绘制长宽为50的红色矩形框
     6     context.fillStyle = '#ff0000';
     7     context.fillRect(10, 10, 50, 50);
     8     // 以(30, 30)点为起点,绘制长宽为50的半透明蓝色矩形框
     9     context.fillStyle = 'rgba(0, 0, 255, 0.5)';
    10     context.fillRect(30, 30, 50, 50);
    11 }

      3. 绘制路径

      在绘图之前需要调用beginPath()方法,开始绘制路径。在绘图之后调用closePath()方法,结束路径绘制。

      绘制路径API

      1. arc(x, y, radius, startAngle, endAngle, counterclockwise);  以(x, y)为圆心绘制圆弧

      2. arcTo(x1, y1, x2, y2, radius);  绘制连接(x1, y1),(x2, y2)且半径为radius的圆弧

      3. lineTo(x, y);   从当前点开始绘制到(x, y)

      4. moveTo(x, y);   移动到(x, y)点,不绘制图像

      5. rect(x, y, w, h);  绘制矩形路径 

       

      最后使用fill()或 stroke()进行填充或描边,或者使用clip()对路径进行裁剪。

      4. 绘制文本

      strokeText(text, x, y);

      fillText(text, x, y);

      我们可以通过设置font,textAlign,textBaseline属性,设置文本大小和对齐方式。

      

      钟表代码

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 
     4 <head>
     5     <meta charset="UTF-8">
     6     <title>canvas clock</title>
     7 </head>
     8 
     9 <body>
    10     <canvas id="clock" width="200px" height="200px" style="border: 1px solid gray"></canvas>
    11 </body>
    12 <script>
    13 var canvas = document.getElementById('clock');
    14 
    15 if (canvas.getContext) {
    16     var context = canvas.getContext('2d');
    17 
    18     context.beginPath();
    19     // 外圈
    20     context.arc(100, 100, 98, 0, Math.PI * 2, false);
    21 
    22     // 内圈
    23     context.moveTo(194, 100);
    24     context.arc(100, 100, 94, 0, Math.PI * 2, false);
    25 
    26     // 绘制分针
    27     context.moveTo(100, 100);
    28     context.lineTo(100, 10);
    29 
    30     // 绘制时针
    31     context.moveTo(100, 100);
    32     context.lineTo(30, 100);
    33     // context.endPath();
    34 
    35     context.strokeStyle = '#ff0000';
    36     context.stroke();
    37 
    38     // 绘制文本
    39     context.font = 'bold 16px Arial';
    40     context.textAlign = 'center';
    41     context.textBaseline = 'top';
    42 
    43     context.fillText('12', 100, 8);
    44 
    45 }
    46 </script>
    47 
    48 </html>
    View Code

      

      最后,我们还可以通过canvasAPI实现阴影效果,渐变效果,模式等。

    svg vs canvas

      svg(Scalable Vector Graphics) 是一种使用XML描述2D图形的语言。它是基于XML的,意味着其中的dom元素可以添加javascript事件。 并且SVG属性发生变化时,浏览器自动重现图片,不失真。

      canvas时通过js绘制2D图形,逐像素进行渲染。使用canvas绘制的图片一旦绘制完成后,便不再被关注。如果发生变化,需要重新绘制。

  • 相关阅读:
    如何利用 JConsole观察分析Java程序的运行,进行排错调优
    【解决】网站运行一段时间后就无法访问,重启Tomcat才能恢复
    不允许一个用户使用一个以上用户名与一个服务器或共享
    SVN升级到1.8后 Upgrade working copy
    Windows Server 2012 R2 创建AD域
    JTA 深度历险
    svn merge error must be ancestrally related to,trunk merge branch报错
    OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream-四种复制方式-单层文件夹复制
    SVN提交时响应很慢,我是这样解决的。
    docker学习6-docker-compose容器集群编排
  • 原文地址:https://www.cnblogs.com/diligentYe/p/6400013.html
Copyright © 2011-2022 走看看