使用KineticJS HTML5画布修改曲线锚点

产品说明:使用鼠标或手指和拖放锚点来修改二次曲线的曲率和曲线。


<!DOCTYPE HTML>
<html>
  <head>
    <style>
      body {
        margin: 0px;
        padding: 0px;
      }
    </style>
    <script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v4.7.4.min.js"></script>
    <script defer="defer">
      // globals
      var curveLayer, lineLayer, anchorLayer, quad, bezier
      
      function updateDottedLines() {
        var q = quad;
        var b = bezier;

        var quadLine = lineLayer.get('#quadLine')[0];
        var bezierLine = lineLayer.get('#bezierLine')[0];

        quadLine.setPoints([q.start.attrs.x, q.start.attrs.y, q.control.attrs.x, q.control.attrs.y, q.end.attrs.x, q.end.attrs.y]);

        bezierLine.setPoints([b.start.attrs.x, b.start.attrs.y, b.control1.attrs.x, b.control1.attrs.y, b.control2.attrs.x, b.control2.attrs.y, b.end.attrs.x, b.end.attrs.y]);
        lineLayer.draw();
      }
      function buildAnchor(x, y) {
        var anchor = new Kinetic.Circle({
          x: x,
          y: y,
          radius: 20,
          stroke: '#666',
          fill: '#ddd',
          strokeWidth: 2,
          draggable: true
        });

        // add hover styling
        anchor.on('mouseover', function() {
          document.body.style.cursor = 'pointer';
          this.setStrokeWidth(4);
          anchorLayer.draw();
        });
        anchor.on('mouseout', function() {
          document.body.style.cursor = 'default';
          this.setStrokeWidth(2);
          anchorLayer.draw();
          
        });

        anchor.on('dragend', function() {
          drawCurves();
          updateDottedLines();
        });

        anchorLayer.add(anchor);
        return anchor;
      }
      function drawCurves() {
        var context = curveLayer.getContext();

        context.clear();

        // draw quad
        context.beginPath();
        context.moveTo(quad.start.attrs.x, quad.start.attrs.y);
        context.quadraticCurveTo(quad.control.attrs.x, quad.control.attrs.y, quad.end.attrs.x, quad.end.attrs.y);
        context.setAttr('strokeStyle', 'red');
        context.setAttr('lineWidth', 4);
        context.stroke();

        // draw bezier
        context.beginPath();
        context.moveTo(bezier.start.attrs.x, bezier.start.attrs.y);
        context.bezierCurveTo(bezier.control1.attrs.x, bezier.control1.attrs.y, bezier.control2.attrs.x, bezier.control2.attrs.y, bezier.end.attrs.x, bezier.end.attrs.y);
        context.setAttr('strokeStyle', 'blue');
        context.setAttr('lineWidth', 4);
        context.stroke();
      }

      window.onload = function() {
        var stage = new Kinetic.Stage({
          container: 'container',
          width: 578,
          height: 200
        });

        anchorLayer = new Kinetic.Layer();
        lineLayer = new Kinetic.Layer;

        // curveLayer just contains a canvas which is drawn
        // onto with the existing canvas API
        curveLayer = new Kinetic.Layer();

        var quadLine = new Kinetic.Line({
          dashArray: [10, 10, 0, 10],
          strokeWidth: 3,
          stroke: 'black',
          lineCap: 'round',
          id: 'quadLine',
          opacity: 0.3,
          points: [0, 0]
        });

        var bezierLine = new Kinetic.Line({
          dashArray: [10, 10, 0, 10],
          strokeWidth: 3,
          stroke: 'black',
          lineCap: 'round',
          id: 'bezierLine',
          opacity: 0.3,
          points: [0, 0]
        });

        // add dotted line connectors
        lineLayer.add(quadLine);
        lineLayer.add(bezierLine);

        quad = {
          start: buildAnchor(60, 30),
          control: buildAnchor(240, 110),
          end: buildAnchor(80, 160)
        };

        bezier = {
          start: buildAnchor(280, 20),
          control1: buildAnchor(530, 40),
          control2: buildAnchor(480, 150),
          end: buildAnchor(300, 150)
        };

        // keep curves insync with the lines
        anchorLayer.on('beforeDraw', function() {
          drawCurves();
          updateDottedLines();
        });

    

        stage.add(curveLayer);
        stage.add(lineLayer);
        stage.add(anchorLayer);

        drawCurves();
        updateDottedLines();

      };

    </script>
  </head>
  <body οnmοusedοwn="return false;">
    <div id="container"></div>
  </body>
</html>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值