¿Como logran esta interacción?, si vemos en el código de estas aplicaciones, todas siguen mas o menos el mismo patrón:
- Agregar evento mousemove al elemento canvas
- comparar coordenadas del cursor con las de Objetos dibujados
- Seleccionar objeto sobre el cual se encuentra el cursor
- Al ocurrir un evento, ejecutarlo sobre el Objeto seleccionado
- Redibujar el canvas
No es algo difícil, pero podría ser mucho mas fácil.
Con esto en mente y luego de robar algunas ideas y algo de código de otros proyectos como procesingjs, jQuery, jquery-hotkeys y canto-js, nació canvas-event, una librería que se encarga del manejo de los eventos, facilitando el desarrollo de aplicaciones interactivas en el elemento canvas; ademas cuenta con objetos predefinidos como círculos, rectángulos, rutas e imágenes entre otros.
Algunos ejemplos de lo que se puede hacer con canvas-event:
Con esto en mente y luego de robar algunas ideas y algo de código de otros proyectos como procesingjs, jQuery, jquery-hotkeys y canto-js, nació canvas-event, una librería que se encarga del manejo de los eventos, facilitando el desarrollo de aplicaciones interactivas en el elemento canvas; ademas cuenta con objetos predefinidos como círculos, rectángulos, rutas e imágenes entre otros.
Algunos ejemplos de lo que se puede hacer con canvas-event:
Cv = Cevent("id-canvas");
// encadenamiento de métodos
Cv.circle( 40, 40, 40 )
.attr({fill: 'red'})
.rotate( 30 );
// manejo de eventos al estilo jquery
Cv.click( function(e) {
this.fill = this.fill == 'green' ? 'red' : 'green';
});
// eventos del teclado asociados a combinación de teclas
Cv.keydown( 'ctrl+s', function(e){
alert( "el Objeto ha sido guardados");
return false;
});
// Drag and drop
Cv.ellipse( 30, 40, 50, 10 )
.drag({
start: function() { console.log( "drag start" ); },
move: function() { console.log( "move to ", this.x, this.y ); },
end: function() { console.log( "drag end" ); }
})
// identificadores de Objetos
Cv.image(50, 100, "ball.gif").addId("pelota").rect(100, 50, 20).draw();
// Recuperar elementos por su Id o tipo;
Cv.find('#pelota').attr("alpha", .5).redraw();
Cv.find('rect').click(function(){
alert( "Hola, soy un rectangulo" );
});
// Eventos live
Cv.mouseover( "#pelota", function(e){
alert( "Soy una pelota" );
});
// Este Objeto también tendrá el evento anterior
Cv.circle(175, 75, 20).addId('pelota');
Ademas, podemos definir nuestras propias figuras extendiendo el objeto Shape:var Triangle = Cevent.Shape.extend({
// inicializador
init: function( x, y, size ){
this.size = size || 5;
this._super( x, y );
},
// ctx es el context en el que se debe dibujar
draw: function( ctx ) {
ctx.save();
// aplicamos estilo y trasformaciones
this.applyStyle( ctx );
this.setTransform( ctx );
// definimos el contexto en el cual dibujaremos
// para poder usar todos los métodos svg definidos en Cevent
// como M (move) c (cubicBlazier) etc
Cevent.beginPath( ctx )
.M( this.x, this.y )
.h( 1 * this.size )
.v( 1 * this.size )
.z();
if ( this.fill ) { ctx.fill(); }
if ( this.stroke ) { ctx.stroke(); }
ctx.restore();
}
});
// registramos el nuevo objeto
Cevent.registre( "triangle", Triangle );
// ahora podemos hacer uso del nuevo objeto
var Cv = Cevent( "canvas-id" );
Cv.triangle( 40, 30, 10 )
.attr({
fill: "#050",
alpha: .5
})
.focus(function() {
this.fill = "#999";
})
.blur(function() {
this.fill = "#050";
})
.draw();
Por el momento falta documentación pero se incluyen varios ejemplos de su uso, si tienen alguna duda y/o sugerencia por favor déjenla en los comentarios o en la pagina del proyecto en google code.



