• 用html5的canvas和JavaScript创建一个绘图程序


    本文将引导你使用canvas和JavaScript创建一个简单的绘图程序。

    创建canvas元素

    首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面。

    1 <canvas id="canvasInAPerfectWorld" width="490" height="220"></canvas>

    获取绘图环境

    canvas元素本身没有任何外观,它就是一块空白画板,提供给JS的一套API,大部分的API都不在canvas元素自身定义,canvas元素自身属性与常规的HTML元素并没有多大区别, 它的绘图API都定义在一个CanvasRenderingContext2D对象上(这里简单翻译成上下文对象),该对象通过getContext()方法获得。

    1 context = document.getElementById('canvasInAPerfectWorld').getContext("2d");

    开始绘图过程

    维护坐标点数字函数

    首先我们需要存储绘图路径点坐标,addClick函数添加坐标点值到数组

    var clickX = new Array();
    var clickY = new Array();
    var clickDrag = new Array();//存储路径点
    var paint;//是否绘制,mousedown时置为true
    function addClick(x, y, dragging)
    {
      clickX.push(x);
      clickY.push(y);
      clickDrag.push(dragging);
    }

    绘图函数

    redraw函数每次调用整个canvas就会重新绘制一次。首先我们清空画布上内容,设置绘制线条颜色粗细线条连接方式。然后

    两点之间绘制一段路径,将数组中的坐标点依次绘制出来

     1 function redraw(){
     2   context.clearRect(0, 0, context.canvas.width,   context.canvas.height); // 清除画布内容
     3   
     4   context.strokeStyle = "#df4b26";//设置线条颜色
     5   context.lineJoin = "round";//当两条线条交汇时,创建圆形边角
     6   context.lineWidth = 5;//线条粗细
     7             
     8   for(var i=0; i < clickX.length; i++) {        
     9     context.beginPath();//开始一条路径,或重置当前的路径
    10     if(clickDrag[i] && i){
    11       context.moveTo(clickX[i-1], clickY[i-1]);
    12      }else{
    13        context.moveTo(clickX[i]-1, clickY[i]);
    14      }
    15      context.lineTo(clickX[i], clickY[i]);
    16      context.closePath();
    17      context.stroke();//绘制路径
    18   }
    19 }

    绘制过程需要的事件

    1 mousedown事件

    绘图这点击到画布上时,将触发该事件执行。调用了addClick函数,并将paint置为true。

    1 $('#canvas').mousedown(function(e){
    2   var mouseX = e.pageX - this.offsetLeft;
    3   var mouseY = e.pageY - this.offsetTop;
    5   paint = true;
    6   addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop);
    7   redraw();
    8 });

    2 mousemove事件

    mousedown中设置的paint为true后,鼠标移动时触发mousemove事件执行,将鼠标移动的所有点记录下来,并不断调用redraw重绘画布。

    1 $('#canvas').mousemove(function(e){
    2   if(paint){
    3     addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop, true);
    4     redraw();
    5   }
    6 });

    3 mouseup事件

    mouseup鼠标点击后松开或者拖拽后松开,表示绘制完成该路径,将paint置为false。

    1 $('#canvas').mouseup(function(e){
    2   paint = false;
    3 });

    4 mouseleave事件

    mouseleave鼠标离开canvas元素,将paint置为false。

    1 $('#canvas').mouseleave(function(e){
    2   paint = false;
    3 });
  • 相关阅读:
    vue系列教程:插值
    docker load 镜像时出现:open /var/lib/docker/tmp/docker-import-500852078/repositories: no such file or dir
    Day 18: 记filebeat内存泄漏问题分析及调优
    Filebeat 启动关闭流程
    docker加速
    Docker镜像保存save、加载load(外网转移至内网)
    filebeat.yml(中文配置详解)
    kafka介绍
    基于统一开发平台的微服务架构转型升级之路 | 某国有大型银行案例
    转 -Filebeat + Redis 管理 LOG日志实践
  • 原文地址:https://www.cnblogs.com/fangsmile/p/5644611.html
Copyright © 2020-2023  润新知