En la galería de YUI 3: Matt Taylor RaphaelJS Módulo

27 de septiembre 2010 a las 1:05 pm por Matthew Taylor | En Desarrollo y YUI 3 Galería | 9 comentarios

Matt Taylor ( @ rhyolight , Blog ) trabaja para Yahoo! en un explorador del lado interno de marco de JavaScript. Le gusta trabajar con gráficos, y ha trabajado con dibujos y animaciones antes de usar Java2D bibliotecas. Antes de trasladarse a Silicon Valley a trabajar para Yahoo!, Matt trabajó en el área de St. Louis como contratista de software. También ha trabajado extensamente con Groovy y Grails tecnologías de SpringSource. Él era el jefe de programación original para el YUI2 basado GrailsUI plugin para el framework web Grails.

RaphaelJS es una poderosa biblioteca JavaScript que maneja SVG dibujos y animaciones. Le permite crear fácilmente cuadros SVG y dibujar formas básicas y caminos con mucha facilidad, incluso agrupándolos en conjuntos y aplicar transformaciones a uno o muchos vectores. Puede dibujar formas, manipular imágenes y la animación de todo. RaphaelJS proporciona una buena API para crear y modificar los elementos SVG con facilidad.

Mientras que la biblioteca es impresionante, pero he encontrado que puedo agregar algunas características importantes a los elementos de la biblioteca RaphaelJS con YUI3. He empezado estos esfuerzos con el nuevo módulo de Galería RaphaelJS .

RaphaelJS Lazy Loading y plugins

La primera característica es la pereza de carga, no sólo de la biblioteca RaphaelJS, pero cualquier RaphaelJS complementos que puede necesitar. El módulo de Galería RaphaelJS sólo cargará estos archivos cuando se declara que las va a utilizar dentro de un recinto YUI. Por ejemplo:

 
 YUI ({gallery: la galería-09.22.2010-20-15 '}). Uso (la galería-Raphaël', function (Y) {
 
	 Y.Raphael (). Utilizar (la función de (Rafael) {
		
		 / / Usar Raphael aquí al igual que lo harían fuera de YUI
		 var papel = Raphael ('myPaper', 500, 500);
 
	 });
 
 });

Si el uso de plugins RaphaelJS, especificar sus rutas de acceso en un array y enviarlo como el primer parámetro en el Y.Raphael () utiliza () función.:

 
 YUI ({gallery: la galería-09.22.2010-20-15 '}). Uso (la galería-Raphaël', function (Y) {var MyPlugins = ['plugins / raphael.awesomePlugin.js', 'plugins / Rafael . wickedPlugin.js '.]; Y.Raphael () uso (MyPlugins, la función de (Rafael) {/ / usar Raphael aquí igual que lo haría fuera de YUI papel var = Raphael (' myPaper ', 500, 500); / / la "papel" que tiene nuevas funciones agregadas por los plugins ahora});}); 

La biblioteca RaphaelJS se carga primero, luego los complementos específicos se cargan antes de la función de devolución de llamada se ejecuta con el objeto de Rafael como único parámetro.

Eventos personalizados

Una vez que hayas creado un espacio de dibujo con el objeto de Rafael, a continuación, inmediatamente puede llegar hasta el dibujo. Cuando se llama a métodos como el rect , circle , y la path en el área de dibujo, recibirá de nuevo los objetos que representan vectores SVG. Normalmente, usted tendrá acceso a sus correspondientes elementos DOM a través del node la propiedad. Por ejemplo:

 
 var papel = Raphael ('myPaper', 500, 500);
 var cuadrado = paper.rect (0, 0, 100, 100);

Esto crea un objeto vectorial rectangular, en las coordenadas [0,0], con una anchura y una altura de 100 píxeles. Usted tiene acceso al elemento DOM subyacente (que es un SVG rect elemento), así:

 
 var = rectNode square.node;
 rectNode.onclick = function () {
	 alert ('Felicitaciones, usted hace clic en un cuadrado');
 };

Si usted es un ávido usuario de YUI, es probable que quiera algo más que esto. ¿Qué tal una construida en Y.Node así? Al igual que el node la propiedad se refiere a la HTMLElement detrás del objeto SVG, el $node propiedad se refiere a la Y.Node contenedor para ese elemento. Así que usted puede hacer cosas como esta:

 
 cuadrado. $ node.on ('mouseover', function () {
	 alert ('Felicitaciones, usted puede mover un ratón!');
 });

Vamos a intentar algo más complejo ahora. Una interacción con un vector debe ser capaz de causar otros vectores dibujados para actualizar sus estilos, ¿verdad? ¿Qué podemos crear algunos de los bares que todos prestan sus colores depende de dónde uno el ratón se encuentra en un círculo en la página:

 
 var papel = Raphael ('rcanvas', 600, 800);
 
 var. circ = paper.circle (350, 200, 100) attr ({fill: 'rosa', un derrame cerebral: 'negro'});
 
 / / Empujar un montón de rectángulos en una matriz
 var i = 0; rectángulos = [];
 for (; i <10; i + +) {
	 rectangles.push (paper.rect (0, 40 * i, 200, 20) attr ({fill: 'rojo', un derrame cerebral: 'amarillo'}.));
 }
 
 / / Bucle a través de los rectángulos, la adición de controladores específicos para cada círculo mousemove
 Y.Array.each (rectángulos, la función (Rect, index) {
	 var i = índice + 1;
	 Circ. $ node.on ("MouseMove ', function (evt) {
		 / / El color de relleno es dinámico, dependiente de la localización de este rectángulo
		 / / En la matriz, así como la ubicación del ratón
		 var = Si circ.attrs.cx - circ.attrs.r,
			 rt = 2 * circ.attrs.r + LF,
			 x = evt.clientX - Si,
			 top = circ.attrs.cy - circ.attrs.r,
			 BTM = 2 * + circ.attrs.r superior,
			 y = evt.clientY - la parte superior;
			 rojo = (((128 * x) / (2 * circ.attrs.r)) -1) * I / 6,
			 verde = 256 - ((((128 * x) / (2 * circ.attrs.r)) -1) * i / 6),
			 azul = (((128 * y) / (2 * circ.attrs.r)) -1) * I / 6;
		 rect.attr ('relleno', 'rgb (' + rojo + ',' + verde + ',' + azul + ')');
	 });
 });

En este ejemplo se ejecuta aquí , pero como se puede ver en las fotos de abajo, el color de cada barra depende de la ubicación del ratón sobre el círculo, así como el orden de la barra.



Dependiendo del lugar donde el cursor del ratón se encuentra sobre el círculo, los colores de la barra cambia de forma individual.

Así que usted puede ver que $node es un atajo útil, pero nada espectacular. Realmente sería fantástico si cada objeto SVG que usted crea con RaphaelJS podía disparar eventos personalizados . Esto permitiría a los elementos de dibujo individuales para desencadenar eventos personalizados, y nada en la página podía escuchar y responder. Esto puede ser útil en muchas formas. Para empezar, proporciona interacciones ricas entre sus dibujos. La interacción del usuario con un vector de ahora puede notificar a los otros vectores de la interacción de la demanda. Esto significa que puede disparar eventos mediante programación de sus dibujos cuando se cumplan ciertas condiciones. Esto no sólo permite que sus dibujos para notificar a otros vectores, pero nada en la página se puede escuchar pulg

 
 var papel = Raphael ('rcanvas', 600, 800);
 
 var. circ = paper.circle (350, 200, 100) attr ({fill: 'rosa', un derrame cerebral: 'negro'});
 
 / / Hacer arreglos de rectángulos y círculos
 var i = 0, rectángulos = [], círculos = [];
 for (; i <10; i + +) {
	 rectangles.push (paper.rect (0, 40 * i, 40 * i, 20) attr ({fill: 'rojo', un derrame cerebral: 'amarillo'}.));
	 circles.push (paper.circle (0,0,20) hide ().);
 }
 Y.Array.each (rectángulos, la función (Rect, index) {
	 var i = índice + 1;
	 Circ. $ node.on ("MouseMove ', function (evt) {
		 var = Si circ.attrs.cx - circ.attrs.r,
			 rt = 2 * circ.attrs.r + LF,
			 x = evt.clientX - Si,
			 top = circ.attrs.cy - circ.attrs.r,
			 BTM = 2 * + circ.attrs.r superior,
			 y = evt.clientY - la parte superior;
			 newwidth = (((256 * x) / (2 * circ.attrs.r)) -1) * I / 6,
			 rojo = (((128 * x) / (2 * circ.attrs.r)) -1) * I / 6,
			 verde = 256 - ((((128 * x) / (2 * circ.attrs.r)) -1) * i / 6),
			 azul = (((128 * y) / (2 * circ.attrs.r)) -1) * I / 6;
		 / / Esta vez no, sólo cambiando el color, sino también el ancho de un rectángulo
		 rect.attr ({
			 Ancho: newwidth,
			 fill: 'rgb (' + rojo + ',' + verde + ',' + azul + ')'
		 });
		 / / Cocción de eventos personalizado para notificar que el ancho de un rectángulo ha cambiado
		 rect.fire ("ancho de cambiar", {width: newwidth, fuente: rect, el orden: índice});
	 });
	
	 / / Cada rectángulo un detector que se dispara el ancho cambiado
	 rect.on ("ancho cambiado ', function (evt) {
		 var = attrs evt.source.attrs;
		 / / Obtener el círculo correspondiente y moverlo a la parte derecha del rectángulo
		 círculos [evt.order]. attr ({
			 cx: attrs.x + attrs.width,
			 CY: attrs.y,
			 llenar: "cornflowerblue '
		 .}) Show ();
		
	 });
	
 });

Echa un vistazo a este ejemplo funcionando aquí . También se puede ver en la foto a continuación que los círculos se están elaborando en los extremos de la derecha de los rectángulos. Esto está ocurriendo en respuesta a cocción cada rectángulo individuo evento personalizado, ser capturado por un controlador que se mueve el círculo a una posición relativa a los atributos actuales del rectángulo.

Esto abre algunas Posibilidades interesantes para RaphaelJS dentro YUI3. Por ejemplo, qué pasaría si pudiéramos crear un grupo de formas vectoriales con el grupo en sí es la entidad que desencadena eventos con el mundo exterior? Internamente, cada uno de dibujo vectorial podía comunicarse con su contenedor a través de eventos personalizados, y el contenedor que tomar decisiones acerca de qué datos se dispara con el mundo exterior. Esto abre la idea de plena encapsulados, controles interactivos SVG.

Resumen

Con el ascenso de HTML5 y sus tecnologías de satélites, hay muchas más opciones que no sean de Flash para las interacciones ricas. Lo ideal sería que todos los elementos vectoriales de la página debe ser totalmente accesible y estandarizada. Esto abre Posibilidades maravillosos para nosotros para crear los controles de acceso, web estándar sin necesidad de recurrir a Flash. SVG es una opción atractiva debido a que cada vector dibujado en la página está respaldado por un nodo DOM que podemos modificar con Yui como cualquier otro nodo DOM. Eso es lo que permite que el módulo de Galería RaphaelJS para aumentar todos los objetos de SVG siendo creadas por RaphaelJS, y que es la clave para una rica interacción con estos elments de otras partes de la página.

Compartir y ampliar: Marcar página con del.icio.us | Digg It! | reddit!

9 comentarios

  1. Si nos fijamos en la parte interna de Rafael, un poco más de un tercio de las ofertas con código VML con aproximadamente la misma cantidad para SVG. ¿Hay alguna posibilidad de conseguir carga condicional de YUI para trabajar aquí o está allí de concesión de licencias / cantidad de barreras esfuerzo en conseguir Raphael se dividió y organizó a cabo? (Beneficio secundario de la combinación de la carga de trabajo en realidad)

    Comentario por Carlos G - 27 de septiembre 2010 #

  2. Dos cosas:

    1) Rafael es un contenedor para SVG * y * VML y sólo incluye las cosas que funcionan en ambos. Cuando usted alienta a las extensiones, no advertir a gente que muchas veces se producirá un error en el IE. Si no les importa, está bien, pero hay que advertirles.

    2) Usted está invitando a la gente a un mundo de dolor en la recomendación de acceso al nodo.. Un número de operaciones (que cambia con cada nueva versión y entre SVG / VML) hacer que el nodo que se va a crear, por lo que sus controladores de eventos y su Y.Node se pierda o se refieren a un objeto eliminado. . Por último el contenido del nodo difieren en la plataforma y no es sólo un nodo individual - especialmente si se considera el texto, donde se obtiene al menos un objeto por carácter - y muchas veces, los manejadores de eventos de ratón disparar sólo en tinta, cuando los usuarios esperan de la célula para ser activa.

    Comentario por Clifford Heath - 27 de septiembre 2010 #

  3. Gran valoración crítica y demostraciones,

    Dado que usted es un Y! 'Er cortar lejos de Rafael, tal vez conocer algunos detalles sobre lo último en gráficas / trazar los esfuerzos de YUI?

    Tal vez algo que se construye en la parte superior de Rafael?

    Yo soy un fan de Rafael, pero su biblioteca de gráficos deja un poco que desear, así como algunos de los ejemplos gráficos creados con primas a cabo-o-caja de Rafael son la manera más funcional / interactivo

    Me encantaría volver a ver algunos de Y! js mágica salpicada en esta zona

    Comentario por Nate - 27 de septiembre 2010 #

  4. Gracias por los comentarios.

    @ Carlos: Si he entendido bien, para su idea de trabajar, tendría que romper el archivo raphael.js en partes para SVG y VML. No estoy pensando en tocar la biblioteca RaphaelJS en absoluto, por lo que la carga probablemente va a continuar como está.

    @ Clifford: (1) Que es un buen punto de que alguien criado en la lista de correo Raphaeljs así. No estoy particularmente preocupado acerca de este módulo de galería funciona en IE, pero eso es un lujo. Todavía necesita pruebas en IE (aunque creo que va a funcionar bien). Voy a estar en ejecución en las pruebas de IE para este módulo la próxima semana, así que voy a saberlo con certeza. Mientras tanto, voy a poner una advertencia en la página de módulo. (2) Gracias por el heads-up. Esto me hace preguntarme si puedo identificar las operaciones que hacen que los nodos que se van a crear y asegurar que el nuevo nodo de la propiedad $ está envuelto en Y.Node. Voy a ser el buceo mucho más profundo en RaphaelJS muy pronto, así que voy a hacer un seguimiento de esto y espero ser capaz de recrear la propiedad Nodo YUI en cada operación de nodos vapulear.

    @ Nate: hago saber algunos detalles, pero voy a dejar que el equipo YUI manejar su negocio allí. ;). Estoy, sin embargo, muy interesante para rociar un poco de magia YUI js en el nuevo patio de juegos HTML5 gráficos.

    Comentario de Matthew Taylor - 27 de septiembre 2010 #

  5. ¿Sabe usted si esta técnica o una técnica similar a trabajar con el elemento canvas de HTML 5. Si pongo un html 5 lienzo en una página web con un rectángulo en el mismo, es posible escuchar a los eventos del ratón sobre el rectángulo en el lienzo.

    Si mi página de HTML5 contiene lo siguiente.

    Este texto se muestra si su navegador no soporta HTML5 Canvas.

    var ejemplo = document.getElementById ('ejemplo');
    var context = example.getContext ('2 d ');
    context.fillStyle = "rgb (255,0,0)";
    context.fillRect (30, 30, 50, 50);

    que tomé de este sitio web:
    http://en.wikipedia.org/wiki/Canvas_element

    ¿Es posible para recoger los eventos del ratón sobre las diferentes formas en un lienzo usando YUI. ¿Es posible poner algo así como un envoltorio Y.Node en el rectángulo de la tela similar a lo que está haciendo con los elementos en RaphaelJS.

    Gracias

    Comentario por John - 28 de septiembre 2010 #

  6. Usted hace el siguiente comentario:
    "
    si cada objeto SVG que usted crea con RaphaelJS podría desencadenar eventos personalizados.
    "
    Revise rápidamente la serie completa de eventos fáciles de preparar con Rafael ...
    http://www.irunmywebsite.com/raphael/additionalhelp.php?q=usingelementevents
    Puede asignar estos a los objetos de Raphael ...

    Comentario por Carlos - 28 de septiembre 2010 #

  7. @ Juan: A partir de la etiqueta Canvas es un ejercicio muy diferente que con Rafael y SVG (VML). Vectores tiene el estado, y se pueden mover, animado, e interactuaron con. Sobre la base de la tela es más como el dibujo de mapa de bits. Una vez que pintar algo, se ha quedado atascado allí como parte del fondo del lienzo, y no estoy seguro exactamente de cómo el usuario trabajo interacciones.

    Comentario de Matthew Taylor - 28 de septiembre 2010 #

  8. @ Carlos: ¡Sí! Ser capaz de acceder al nodo SVG es bueno para ese tipo de interacciones de los usuarios, y utiliza los mis demos un poco. El tipo de eventos personalizados que estoy hablando son eventos fuera del alcance normal de eventos DOM.

    En mi último ejemplo anterior, se puede ver que cada rectángulo dispara un width-changed eventos cada vez que cambian de tamaño. Estos eventos pueden ser capturados por nada en la página que registra para ese evento. Así es como cada círculo se mueve en la posición correcta, como los rectángulos cambian de tamaño.

    Por supuesto, el catalizador de todo esto es el mousemove evento que ocurre en el círculo grande, que es el tipo de evento que creo que usted se refiere. Por favor, corríjanme si me he perdido algo.

    Comentario de Matthew Taylor - 28 de septiembre 2010 #

  9. @ Juan,

    Es posible, pero desordenado. Usted tiene que mantener un registro (hash es decir) de los puntos de interés, y luego tener los oyentes conectados al elemento canvas. Cuando se recibe un evento, usted necesita tomar su coordenadas xy y se compara con su valor hash de los puntos de interés, y luego probablemente desencadenar un evento personalizado.

    He hecho esto con YUI2, creando un gráfico de radar que le permite hacer clic sobre los puntos de datos en la tabla para obtener información, y agregar los datos haciendo clic en los tickmarks en los ejes. Con excanvas esto funciona en IE, también, y tiene la ventaja de ser para mí una imagen (aunque el IE es más lento).

    Sin embargo, todo esto es con puntos, y un número bastante limitado de los puntos en que, para comprobar si el ratón es un lugar interesante, no es demasiado trabajo. Sin embargo, con las regiones de sospecho que esto sería demasiado costoso, y usted probablemente querrá pensar en un modo de sólo escuchar para "mousein" (es decir, cruzando una línea) en lugar de mouseover. A pesar de los puntos, lo que tienes que hacer algo de exploración, ya que los puntos son los píxeles y los usuarios que esperan hacer clic en el píxel precisa no significa que la interacción del usuario fácil!

    Usted puede hacer las animaciones ", en cierto modo, también, pero eso implica volver a dibujar la lona cada vez que, por lo que son más que las transiciones de las animaciones. He creado un RenderStack simple para cosas que sé que no va a cambiar (ejes, por ejemplo) tanto que me llenan de llamadas de lienzo de dibujo, y luego despedir a la pila, así que no tiene que hacer las cuentas cada vez. Pero no estoy seguro de cuánta diferencia hace esto en realidad, sigue siendo lento en IE y rápida en todo lo demás!

    Mate

    Comentario por Matt Parker - 29 de septiembre 2010 #

Disculpa, los comentarios están cerrados en este momento.

Presentado por Yahoo!

Copyright © 2006-2012 Yahoo! Inc. Todos los derechos reservados. Política de privacidad - Condiciones del servicio

Desarrollado por WordPress en Yahoo! Web Hosting .