• HTML5简易在线画图工具


    继上次学习了HTML5的路径画圆做了动态时钟、异次元空间的反转做了运动的太阳系,这两天将画线、画圆、填充等知识点结合起来做了一个简易的在线画图工具:

    简易在线画图工具

    查看DEMO:HTML5简易在线画图工具

    功能包括自由画笔、橡皮擦、文字填充、画三角形、画圆等,相对我这个新手来说,感觉挺难的,不过还是参考了资料慢慢“拼”出来了。

    自由画笔的思路:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    /******* 自由画笔 *******/
    function dBrush(n){
      setStatus(actions,n,1);
      //鼠标按下的时候
      var status = 0;
      canvas.onmousedown=function(e){
        e=window.event||e;
        var sX=e.pageX-this.offsetLeft;
        var sY=e.pageY-this.offsetTop;
        can.beginPath();
        can.moveTo(sX,sY);
        status=1;
      }
      //鼠标移动的时候
      canvas.onmousemove=function(e){
        e=window.event||e;
        var eX=e.pageX-this.offsetLeft;
        var eY=e.pageY-this.offsetTop;
        if(status==1){
          can.lineTo(eX,eY);
          can.stroke();
        }else {return false}
     
      }
      //鼠标抬起的时候
      canvas.onmouseup=function(){
        can.closePath();
        status=0;     
      }
      //鼠标移出canvas画布结束画图
      canvas.onmouseout=function(){
        can.closePath();
        status=0;
      }
    }

    填充文字,主要用到fillText(val,x,y):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /******* 文字 *******/
    function dText(n){
      setStatus(actions,n,1);
      canvas.onmousedown=function(e){
        e=window.event||e;
        var x=e.pageX-this.offsetLeft;
        var y=e.pageY-this.offsetTop;
        var val = window.prompt('输入填充的文字','');
        if(val==null) return false; //输入为空则返回
        can.fillText(val,x,y);
        dBrush(0); //填入文字后返回自由画笔工具
      }
      canvas.onmouseup=null;
      canvas.onmousemove=null;
      canvas.onmouseout=null;
    }

    直线工具,主要确定起点和终点,然后lineTo(x,y)就可以了:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /******* 直线 *******/
    function dLine(n){
      setStatus(actions,n,1);
      //画直线,鼠标按下时,当前鼠标位置为起点
      canvas.onmousedown=function(e){
        e=window.event||e;
        var sX=e.pageX-this.offsetLeft;
        var sY=e.pageY-this.offsetTop;
        can.beginPath();
        can.moveTo(sX,sY);
      }
      //画直线,鼠标抬起时,当前鼠标位置为终点
      canvas.onmouseup=function(e){
        e=window.event||e;
        var eX=e.pageX-this.offsetLeft;
        var eY=e.pageY-this.offsetTop;
        can.lineTo(eX,eY);
        can.closePath();
        can.stroke();
      }
      canvas.onmousemove=null;
      canvas.onmouseout=null;
    }

    最后贴一个空心圆,起点坐标为圆心,鼠标移动距离为半径:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    /******* 空心圆圈 *******/
    function dArc(n){
      setStatus(actions,n,1);
      var sX=0;  //内部的“全局标量”
      var sY=0;
      //画空心圆,鼠标按下时,当前鼠标位置为圆心
      canvas.onmousedown=function(e){
        e=window.event||e;
        sX=e.pageX-this.offsetLeft;
        sY=e.pageY-this.offsetTop;
      }   
      //画空心圆,鼠标抬起时,当前鼠标位置为外圆结束点
      canvas.onmouseup=function(e){
        e=window.event||e;
        var eX=e.pageX-this.offsetLeft;
        var eY=e.pageY-this.offsetTop;
        var dX=eX-sX
        var dY=eY-sY;
        //计算出半径
        var r = Math.sqrt(Math.pow(dX,2)+Math.pow(dY,2));
        can.beginPath();
        can.arc(sX,sY,r,0,360,false);
        can.closePath();
        can.stroke();
      }
      canvas.onmousemove=null;
      canvas.onmouseout=null;
    }

    好了,剩下的其他工具代码就不贴了,可以查看DEMO里的源代码。

  • 相关阅读:
    B Graph(异或MST)
    G. Xor-MST(边权为俩点值的异或值,求MST)
    H Harmony Pairs(找(大小)和(位数和大小)逆序的点对,数位dp)
    hdu6787(根据喜欢程度分配得最大总价值,最大费用最大流)
    Codeforces Global Round 2
    2019西北工业大学程序设计创新实践基地春季选拔赛(重现赛)
    Java EE学习笔记(九)
    Java EE学习笔记(八)
    Codeforces Round #549 (Div. 2)
    Codeforces Round #550 (Div. 3)
  • 原文地址:https://www.cnblogs.com/zhwl/p/3530714.html
Copyright © 2020-2023  润新知