Переведите пример использования html5 canvas в svg - PullRequest
0 голосов
/ 02 мая 2011

Я познакомился с canvas с помощью множества ресурсов, доступных онлайн, и пытался сравнить то же самое с svg. Мое приложение должно рисовать ограниченное количество фигур, но должно быть интерактивным. Я думаю, что svg будет более подходящим, если фигуры являются элементами dom. было бы очень полезно, если бы кто-то смог перевести пример canvas (см. demo ) в svg с зависимостью только от jQuery и html5 (не беспокойтесь о IE)

В этом примере мне нужно нарисовать прямоугольник с помощью мыши (щелкните левой кнопкой мыши и перетащите). Вы можете добавить каждый элемент в dom (на холсте мне может потребоваться сохранить массив для объекта rect, поскольку экран очищается при каждом событии).


<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
        <script type="text/javascript" src="draw.js"></script>
</head>
<body>
    <canvas id="cvs" height="600" width="800"></canvas>
</body>
<    /html>

$(document).ready(function() {
    var cvs = $("#cvs"),
        ctx = cvs.get(0).getContext("2d");
    var v_bufX, v_bufY, v_bufW, v_bufH;

    var box = function ( ctx, style, x, y, w, h ) {        
            ctx.beginPath();
            ctx.rect( x, y, w, h );
            ctx.closePath();
            if ( style.fill ) {
                ctx.fillStyle = style.fill;
                ctx.fill();
            }
            if ( style.stroke ) {
                ctx.strokeStyle = style.stroke;
                ctx.lineWidth = style.width || 1;
                ctx.stroke();
            }
        },
        draw = function (res) {
            var style = {fill:'rgba(96,185,206, 0.3)',stroke:'rgb(96,185,206)',width:.5};
            ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height); 
            box(ctx, style, res.x, res.y, res.w, res.h);
        };

    var rect = {
        reset : function () {
            this.x0 = this.y0 = this.x = this.y = this.w = this.h = -1;
            this.started = this.dragging = false;
        },    
        mousedown : function (e) {
            this.reset();
            this.started = true;
            this.x0 = e._x;
            this.y0 = e._y; 
        },
        mousemove : function (e) {
          if (!this.started) {
            return;     
          }

          var x = Math.min(e._x,  this.x0),
              y = Math.min(e._y,  this.y0),
              w = Math.abs(e._x - this.x0),
              h = Math.abs(e._y - this.y0);
         console.log(x, y, w, h);

          if (!w || !h) {
          return;       
          };
          this.x = x;
          this.y = y;
          this.w = w;
          this.h = h;
          draw(this);
        },
        mouseup : function (ev) {
          if (this.started) {
            this.mousemove(ev);
            this.started = false;
            draw(this);
          }
        }
    };


    $(window).mousedown(function(e) {       
        var canvasOffset = cvs.offset();
        e._x = Math.floor(e.pageX-canvasOffset.left); 
        e._y = Math.floor(e.pageY-canvasOffset.top);
        rect.mousedown(e);          
    }); 
    $(window).mousemove(function(e) {
        var canvasOffset = cvs.offset();
        e._x = Math.floor(e.pageX-canvasOffset.left); 
        e._y = Math.floor(e.pageY-canvasOffset.top);
        rect.mousemove(e);
    });
    $(window).mouseup(function(e) {
        var canvasOffset = cvs.offset();
        e._x = Math.floor(e.pageX-canvasOffset.left); 
        e._y = Math.floor(e.pageY-canvasOffset.top);
        rect.mouseup(e);
    });
});

1 Ответ

4 голосов
/ 03 мая 2011

Я не хочу переписывать целый пример, но вот некоторые ресурсы, которые могут помочь:

  • Встраивание SVG в XHTML5 - включает простой JavaScriptэто создает некоторые элементы программно.

  • Перетаскивание преобразованных элементов - использует мой собственный код перетаскивания и учитывает переводы в преобразованных иерархиях.

  • SVGPan - хорошая библиотека для панорамирования и масштабирования

  • Raphael - библиотека, предназначенная для создания SVG / VML (длястарый IE) из JavaScript, включая собственную перетаскиваемую реализацию.

  • KevLinDev - почтенный, но невероятно богатый источник учебных пособий и кода, связанных с SVG.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...