Sa Yui 3 Gallery: Matt Taylor RaphaelJS Module

Setyembre 27, 2010 sa 01:05 sa pamamagitan ng Mateo Taylor | Sa Development , Yui 3 Gallery | 9 Puna

Matt Taylor ( @ rhyolight , blog ) ay gumagana para sa Yahoo! sa isang panloob na browser-side JavaScript framework. Siya enjoys nagtatrabaho sa mga graphics, at siya ay nagtrabaho sa mga guhit at animation bago gamitin ang Java2d aklatan. Bago lumipat sa Silicon Valley upang gumana para sa Yahoo!, Matt nagtrabaho sa lugar ng St. Louis bilang isang kontratista software. Siya ay nagtrabaho nang husto sa Groovy at Grails teknolohiya para sa SpringSource. Siya ay ang orihinal na programmer nangunguna para sa YUI2-based GrailsUI plugin para sa Grails web framework.

RaphaelJS ay isang malakas na JavaScript library na namamahala ng mga mga SVG guhit at animation. Ito ay nagbibigay-daan sa iyo upang madaling lumikha ng SVG canvases at makahatak ng mga pangunahing hugis at path masyadong madali, kahit na pagsasama ito sa mga hanay at paglalapat ng mga transformations sa isa o maraming mga vectors. Maaari mong gumuhit ng hugis, manipulahin ng mga imahe, at bigyang-buhay ang lahat. RaphaelJS nagbibigay gandang API upang lumikha at baguhin ang mga SVG elemento na may kadalian.

Ang habang aklatan ay kahanga-hanga, ngunit natagpuan ko na ang maaari kong magdagdag ng ilang mahahalagang mga tampok sa mga elemento ng library RaphaelJS sa YUI3. Ko na nagsimula off ang mga pagsisikap na ito sa bagong RaphaelJS Gallery Module .

Tamad Naglo-load RaphaelJS at plugin

Ang unang na tampok ay ang tamad-loading ng hindi lamang ang RaphaelJS na library, ngunit anumang RaphaelJS plugin na maaari mong kailanganin. Ang Module ng RaphaelJS Gallery ay lamang load ang mga file na ito kapag idedeklara mo na gumagamit ka ng mga ito sa loob ng isang Yui sandbox. Halimbawa:

 
 Yui ({gallery: 'gallery-2010.09.22-20-15'}). Paggamit ('gallery-Raphael', ang function (Y) {
 
	 Y.Raphael (). Gamitin (ng function (Raphael) {
		
		 / / Gamitin Raphael dito tulad ng gagawin mo sa labas Yui
		 var papel = Raphael ('myPaper', 500, 500);
 
	 });
 
 });

Kung ikaw ay gumagamit ng RaphaelJS plugin, tukuyin ang kanilang mga landas sa isang array at ipadala na bilang unang parameter sa ang Y.Raphael () gamitin () function.:

 
 Yui ({gallery: 'gallery-2010.09.22-20-15'}). Paggamit ('gallery-Raphael', ang function (Y) {
 
	 ang var myPlugins = ['plugin / raphael.awesomePlugin.js na', 'plugin / raphael.wickedPlugin.js'];
 
	 Y.Raphael (). Gamitin (myPlugins, ang function na (Raphael) {
 
		 / / Gamitin Raphael dito tulad ng gagawin mo sa labas Yui
		 var papel = Raphael ('myPaper', 500, 500);
		 / / Ang 'papel' ay magkakaroon ng anumang mga bagong pag-andar idinagdag sa pamamagitan ng iyong mga plugin ay ngayon
	 });
 
 });

Ang RaphaelJS library ay unang-load, pagkatapos anumang tinukoy na plugin ay load bago ang iyong callback function na ay pinaandar sa ang Raphael bagay bilang lamang ang parameter.

Pasadyang Kaganapan

Kapag ginawa mo ang isang puwang ng guhit sa bagay Raphael, pagkatapos ay maaari mong agad na makakuha ng pababa sa drawing. Kapag tumawag ka ng mga paraan tulad ng rect , circle , at path sa drawing space, makakatanggap ka ng bumalik ang mga bagay na kumakatawan sa SVG vectors. Karaniwan, magkakaroon ka ng access sa kanilang kaukulang mga elemento na DOM sa pamamagitan ng node ari-arian. Halimbawa:

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

Lumilikha ito ng isang hugis-parihaba object vector sa coordinate [0,0] na may isang lapad at taas ng mga 100 pixels. Mayroon kang access sa kalakip na sangkap ng DOM (na kung saan ay isang sangkap ng SVG rect ) tulad ng sa gayon:

 
 var rectNode = square.node;
 rectNode.onclick = ang function () {
	 alert ('Binabati kita, ikaw nag-click sa isang parisukat na!');
 };

Kung ikaw ay isang sabik Yui gumagamit, gusto mo marahil gusto ang isang bagay na mas sa ito. Paano ang tungkol sa isang built in Y.Node pati na rin? Tulad ng ang node ari-arian ay tumutukoy sa ang HTMLElement sa likod ng SVG bagay, ang $node ari-arian ay tumutukoy sa Y.Node wrapper para sa na elemento. Kaya maaari mong gawin ang mga bagay na tulad nito:

 
 parisukat. $ node.on ('mouseover', ang function () {
	 alert ('Binabati kita, maaari mong ilipat ang isang mouse!');
 });

Hayaan ng subukan ang isang bagay na mas kumplikado ngayon. Isang pakikipag-ugnayan sa isang vector ay dapat na magagawang maging sanhi ng iba pang mga iguguhit vectors upang i-update ang kanilang mga estilo, i-right? Paano ang tungkol sa aming lumikha ng ilang mga bar na ang lahat ng render ang kanilang mga kulay nakasalalay sa kung saan ang isang mouse ay matatagpuan sa isang bilog sa pahina:

 
 var papel = Raphael (sa 'rcanvas', 600, 800);
 
 . var sa circ = paper.circle (350, 200, 100) sa attr ({fill: 'rosas', stroke: 'itim'});
 
 / / Ng panunulak isang grupo ng parihaba sa isang array
 var i = 0; mga parihaba = [];
 para sa (; i <10; i + +) {
	 rectangles.push (paper.rect (0, 40 * i, 200, 20) ang attr ({fill: 'red', stroke: 'dilaw'}.));
 }
 
 / / Looping sa pamamagitan ng mga parihaba, pagdaragdag ng mga tiyak na bilog handlers mousemove para sa bawat
 Y.Array.each (parihaba, ang function (rect, index) {
	 var i = index + 1;
	 circ. $ node.on (ang 'mousemove', ang function (evt) {
		 / / Ang fill kulay ay dynamic, nakasalalay sa lokasyon ng parihaba na ito
		 / / Sa array pati na rin ang lokasyon ng mouse
		 var lf = circ.attrs.cx - circ.attrs.r,
			 rt = 2 * circ.attrs.r ang + lf,
			 x = evt.clientX-lf,
			 Ang tuktok = circ.attrs.cy - circ.attrs.r,
			 btm = 2 * circ.attrs.r + tuktok,
			 y = evt.clientY-itaas;
			 red = (((128 * x) / (2 * circ.attrs.r)) -1) * i / 6,
			 berde = 256 - ((((128 * x) / (2 * circ.attrs.r)) -1) * i / 6),
			 asul = (((128 * y) / (2 * circ.attrs.r)) -1) * i / 6;
		 rect.attr ('punan', 'rgb (' + red + ',' + green + ',' + asul + ')');
	 });
 });

Halimbawa na ito ay tumatakbo dito , ngunit tulad ng makikita mo sa snapshot sa ibaba, ang kulay ng bawat bar ay nakasalalay sa ang lokasyon ng mouse sa ibabaw ng bilog pati na rin ang order ng ​​bar.



Depende sa kung saan ang iyong mouse cursor ay matatagpuan sa ibabaw ng bilog, ang mga kulay na bar baguhin paisa-isa.

Sa gayon maaari mong makita na ang $node ay isang kapaki-pakinabang na shortcut, ngunit walang kagilas-gilas. Ito talagang hindi kapani-paniwala kung ang ang bawat SVG bagay sa iyo na lumikha sa RaphaelJS maaaring sunog ng pasadyang mga kaganapan . Na ay magpapahintulot sa iyong mga indibidwal na mga elemento sa guhit na apoy ng mga pasadyang mga kaganapan, at anumang bagay sa pahina ay maaaring makinig at tumugon. Ito ay maaaring maging kapaki-pakinabang sa maraming paraan. Para sa mga starters, ito ay nagbibigay ng mga mayaman na pakikipag-ugnayan sa pagitan ng iyong mga guhit. Pakikipag-ugnayan ng gumagamit sa isang vector ngayon ipaalam sa anumang iba pang mga vectors ng pakikipag-ugnayan sa pangangailangan. Nangangahulugan ito na maaari mong programatically sunog ang mga kaganapan mula sa iyong mga guhit kapag ay matugunan ang ilang mga kundisyon. Hindi lamang ang mga ito payagan ang iyong mga guhit na abisuhan ang iba pang mga vectors, ngunit ang anumang sa pahina ay maaaring makinig in

 
 var papel = Raphael (sa 'rcanvas', 600, 800);
 
 . var sa circ = paper.circle (350, 200, 100) sa attr ({fill: 'rosas', stroke: 'itim'});
 
 / / Paggawa ng mga arrays ng mga parihaba at bilog
 var i = 0, parihaba = [], bilog = [];
 para sa (; i <10; i + +) {
	 rectangles.push (paper.rect (0, 40 * i, 40 * i, 20) ang attr ({fill: 'red', stroke: 'dilaw'}.));
	 circles.push (paper.circle (0,0,20) itago ang ().);
 }
 Y.Array.each (parihaba, ang function (rect, index) {
	 var i = index + 1;
	 circ. $ node.on (ang 'mousemove', ang function (evt) {
		 var lf = circ.attrs.cx - circ.attrs.r,
			 rt = 2 * circ.attrs.r ang + lf,
			 x = evt.clientX-lf,
			 Ang tuktok = circ.attrs.cy - circ.attrs.r,
			 btm = 2 * circ.attrs.r + tuktok,
			 y = evt.clientY-itaas;
			 newWidth = (((256 * x) / (2 * circ.attrs.r)) -1) * i / 6,
			 red = (((128 * x) / (2 * circ.attrs.r)) -1) * i / 6,
			 berde = 256 - ((((128 * x) / (2 * circ.attrs.r)) -1) * i / 6),
			 asul = (((128 * y) / (2 * circ.attrs.r)) -1) * i / 6;
		 / / Oras na ito, hindi lamang ang pagbabago ng kulay, ngunit din ang parihaba lapad
		 rect.attr ({
			 lapad: newWidth,
			 punan: rgb ('+ red +', '+ green +', '+ asul +') '
		 });
		 / / Pagpapaputok pasadyang kaganapan na ipaalam na ang sa parihaba lapad na ito ay nagbago
		 rect.fire ('lapad-nagbago', {lapad: newWidth, pinagmulan: rect, order: index});
	 });
	
	 / / Ang parihaba bawat nakakakuha ng tagapakinig na apoy sa lapad-binago
	 rect.on ('lapad-nagbago', ang function (evt) {
		 var attrs mga = evt.source.attrs;
		 / / Makakuha ng nararapat na bilog at ilipat ito sa kanang dulo ng parihaba
		 bilog [evt.order]. attr ({
			 cx: attrs.x + attrs.width,
			 cy: attrs.y,
			 punan ang: 'cornflowerblue'
		 .}) Ipakita ();
		
	 });
	
 });

Tingnan sa ito tumatakbo halimbawa dito . Maaari mo ring makita mula sa ang snapshot ibaba na bilog ay iguguhit sa kanang dulo ng parihaba. Ito ay occuring sa tugon sa pasadyang bawat indibidwal na parihaba pagpapaputok ng kaganapan, na nakuha ng isang handler na gumagalaw ang bilog sa isang posisyon na kamag-anak sa ang kasalukuyang mga katangian ng parihaba.

Ito ay bubukas up ng ilang mga kagiliw-giliw na mga possiblities para sa RaphaelJS loob YUI3. Halimbawa, ano kung maaari naming lumikha ng isang pangkat ng mga hugis ng vector sa group mismo ang entity na apoy sa mga kaganapan sa labas ng mundo? Sa loob, ang bawat vector pagguhit ay maaaring makipag-usap sa kanyang lalagyan sa pamamagitan ng mga pasadyang mga kaganapan, at lalagyan ay gumawa ng mga desisyon tungkol sa kung anong data ang apoy sa labas ng mundo. Bubuksan nito ang ideya ng ganap na encapsulated, interactive na mga kontrol SVG.

Buod

Sa ascendance ng ang HTML5 at mga satellite teknolohiya nito, may mga kaya mas maraming mga opsyon na iba sa Flash para sa mga mayaman na pakikipag-ugnayan. Kainaman, ang anumang vectored mga elemento sa pahina ay dapat na ganap na ma-access at standardized. Ito ay bubukas up ng mga kahanga-hangang mga possiblities para sa amin upang lumikha ng mapuntahan, karaniwang mga kontrol sa web nang walang resorting sa Flash. SVG ay isang sumasamo pagpipilian dahil ang bawat vector na iguguhit sa pahina ay nai-back up sa pamamagitan ng isang DOM node na maaari naming baguhin sa Yui tulad ng anumang iba pang mga DOM node. Na kung ano ang ay nagpapahintulot ang RaphaelJS Module Gallery upang dagdagan ang lahat ng mga SVG bagay na nilikha sa pamamagitan ng RaphaelJS, at na ay isang susi sa mayaman na pakikipag-ugnayan sa mga elments mula sa ibang lugar sa pahina.

Ibahagi at pahabain: bookmark sa del.icio.us | Digg ito! | reddit!

9 Mga Puna

  1. Kung titingnan mo ang mga internals ng Raphael, isang bit higit sa isang third ng mga deal ng code sa VML sa humigit-kumulang sa parehong halaga para sa SVG. Mayroon bang anumang pagkakataon upang makakuha ng mga kondisyon Yui loading na magtrabaho dito o doon sa paglilisensya / halaga ng mga hadlang sa pagsisikap sa pagkuha Raphael mismo split at host? (Bahagi benepisyo ng Combo-load aktwal na nagtatrabaho)

    Puna sa pamamagitan ng Karl G - Setyembre 27, 2010 #

  2. Dalawang bagay:

    1) Raphael ay isang pambalot para sa SVG * at * VML at lamang kasama ang mga bagay na gumagana sa parehong. Kapag hinihikayat ka extension, hindi mo balaan ang mga kamag-anak na maraming beses na ito ay mabibigo sa IE. Kung hindi sila pakialam, multa, ngunit dapat mong balaan ang mga ito.

    2) Ikaw ay nag-aanyaya sa mga tao sa isang mundo ng sakit sa recommending access sa. Node. Ang bilang ng mga operasyon (na nagbabago sa bawat release at sa pagitan ng SVG / VML) sanhi ng node ng recreated, kaya ang iyong mga kaganapan handlers at iyong Y.Node ay nawala o sumangguni sa isang tinanggal na bagay. . Wakas ang mga nilalaman ng node naiiba sa platform at ay hindi lamang isang solong node - lalo na kapag ang itinuturing mong teksto, na kung saan makakakuha ka ng hindi bababa sa isang bagay sa bawat karakter - at maraming beses, ang mga kaganapan ng mouse ang mga handlers trigger lamang sa tinta, kapag ang mga gumagamit ay inaasahan ang cell na maging aktibo.

    Puna sa pamamagitan ng Clifford Heath - Setyembre 27, 2010 #

  3. Mahusay writeup at mga demo,

    Dahil ikaw ay isang Y! 'ER pagha-hack ang layo sa Raphael siguro alam mo ang ilang mga detalye tungkol sa mga pinakabagong sa graphing / charting ng mga pagsisikap para sa Yui?

    Marahil isang bagay na binuo sa itaas ng Raphael?

    Ako ay isang tagahanga ng Raphael, ngunit ang kanilang mga tsart library umalis ng kaunti sa nais na, pati na rin ang ilan sa mga raw mga halimbawa ng tsart na nilikha sa out-o-box Raphael ay paraan mas functional / interactive

    Gusto ibigin sa makita ang ilang mga Y! js magic sprinkled sa lugar na ito

    Puna sa pamamagitan ng Nate - Setyembre 27, 2010 #

  4. Salamat sa feedback.

    @ Karl: Kung Naiintindihan ko nang tama, para sa iyong mga ideya sa trabaho, nais kong basagin ang raphael.js na file sa mga bahagi para sa SVG at VML. Hindi ako pagpaplano sa hawakan ang RaphaelJS na library sa lahat ng, sa gayon ito ay malamang na manatili ang loading ang bilang-ay.

    @ Clifford: (1) Iyan ay isang magandang point na dinala ang isang tao sa ang Raphaeljs mailing list pati na rin. Hindi ako lalo na nababahala tungkol sa gallery na ito module na nagtatrabaho sa IE, ngunit na ay isang luxury. Kailangan pa rin ito ang pagsubok sa IE (bagaman tingin ko ito gumagana multa). Ako pagpunta sa patakbuhin ang pagsusulit sa IE para sa ang module na ito sa susunod na linggo, kaya kailangan kong malaman para sigurado. Samantala, kakailanganin ko bang ilagay ang isang babala hanggang sa pahina ng module. (2) Salamat para sa mga ulo-up. Ginagawang na magtaka akin kung maaari ko bang matukoy ang mga operasyon na maging sanhi ng nodes ay recreated at matiyak ang bagong $ node ari-arian ay balot sa Y.Node. Kukunin ko diving mas mas malalim sa RaphaelJS sa lalong madaling panahon, kaya kukunin ko na subaybayan ng mga ito at sana ay magagawang upang muling likhain ang ari-arian ng Yui node sa bawat node-clobbering operasyon.

    @ Nate: ko alam ilang mga detalye, ngunit Kukunin ko hayaan ang Yui koponan pangasiwaan ang kanilang mga negosyo doon. ;). Ako, gayunpaman, napaka-kagiliw-giliw na sa patubigan ng ilang Yui js magic sa bagong palaruan HTML5 graphics.

    Puna sa pamamagitan ng Mateo Taylor - Setyembre 27, 2010 #

  5. Alam mo ba kung ito pamamaraan o isang katulad na pamamaraan ay gagana sa ang HTML 5 elemento ng canvas. Kung ko bang ilagay ang isang html 5 canvas sa isang webpage sa isang parihaba sa ito, ito ay posible na makinig sa mga kaganapan sa mouse sa parihaba sa canvas.

    Kung ang aking pahina sa HTML5 naglalaman ng mga sumusunod.

    Ang tekstong ito ay ipinapakita kung ang iyong browser ay hindi sumusuporta sa HTML5 Canvas.

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

    kung saan ko kinuha mula sa website na ito:
    http://en.wikipedia.org/wiki/Canvas_element

    Posible upang kunin ang mga kaganapan sa mouse sa ibang mga hugis sa isang canvas gamit Yui. Posible upang ilagay ang isang bagay tulad ng isang Y.Node wrapper sa parihaba sa ang canvas katulad sa kung ano ang iyong ginagawa sa mga elemento sa mga RaphaelJS.

    Salamat

    Puna ni John - Setyembre 28, 2010 #

  6. Gumawa ka ng puna:
    "
    kung ang ang bawat SVG bagay sa iyo na lumikha sa RaphaelJS maaaring sunog ng pasadyang mga kaganapan.
    "
    Mabilis na suriin ang kumpletong hanay ng mga madaling handa mga kaganapan sa Raphael ...
    http://www.irunmywebsite.com/raphael/additionalhelp.php?q=usingelementevents
    Maaari kang magtalaga ng mga Raphael bagay ...

    Puna sa pamamagitan ng Charles - Setyembre 28, 2010 #

  7. @ John: Guhit sa Canvas ang tag ay isang magkano ang iba't-ibang ehersisyo kaysa sa Raphael at SVG (VML). Mga Vectors mayroon estado, at maaaring ilipat, animated, at interacted na may. Guhit sa canvas ay higit pa tulad ng bitmap drawing. Kapag pintura ng isang bagay, ito ay stuck doon bilang isang bahagi ng canvas sa background, at hindi ako sigurado kung paano mismo ang pakikipag-ugnayan ng gumagamit sa trabaho.

    Puna sa pamamagitan ng Mateo Taylor - Setyembre 28, 2010 #

  8. @ Charles: Oo! Pagiging ma-access ang SVG node ay magandang para sa mga uri ng mga pakikipag-ugnayan ng gumagamit, at ang aking mga demo ay gumagamit ng mga lubos ng kaunti. Ang uri ng mga pasadyang mga kaganapan na ako ng pakikipag-usap tungkol sa mga kaganapan sa labas ng saklaw ng normal na mga kaganapan ng DOM.

    Sa aking huling na halimbawa sa itaas, maaari mong makita na ang bawat parihaba apoy ng isang width-changed kaganapan kapag sila ay sukat. Mga kaganapan na ito ay maaaring nakuha sa pamamagitan ng anumang bagay sa ang pahina na registers para sa kaganapan. Iyon ay kung paano bilog ang bawat isa ay inilipat sa tamang posisyon ang parihaba na sukat.

    Siyempre, ang katalista ng lahat ng ito ay ng ang mousemove kaganapan na nangyayari sa malaking bilog, na kung saan ay sila ang uri ng kaganapan na sa tingin ko ikaw ay nagre-refer. Mangyaring iwasto ako kung nasagot ko na ang isang bagay.

    Puna sa pamamagitan ng Mateo Taylor - Setyembre 28, 2010 #

  9. @ John,

    Posible, ngunit magulo. Kailangan mong mapanatili ang isang talaan (ie hash) ng mga punto ng interes, at pagkatapos ay magkaroon ng mga tagapakinig na nakalakip sa elemento canvas. Kapag nakakuha ka ng isang kaganapan, kailangan mong kumuha ng mga ito coords xy at ihambing sa iyong hash ng mga punto ng interes, at pagkatapos ay marahil sunog ng isang pasadyang kaganapan.

    Nagawa ko ito sa YUI2, paglikha ng isang radar tsart na nagbibigay-daan sa nag-click ka sa mga punto ng data sa ang tsart upang makakuha ng impormasyon, at magdagdag ng mga data sa pamamagitan ng pag-click sa ang mga tickmarks sa ang axes. Sa excanvas ito gumagana sa IE, masyadong, at may bentahe para sa akin ng pagiging isang imahe (kahit na ang IE ay mas mabagal).

    Gayunpaman, ito ay ang lahat na may mga punto, at medyo limitadong bilang ng mga puntos sa na, kaya check kung ang mouse ay kagiliw-giliw na lugar ay hindi masyadong maraming trabaho. Ngunit sa rehiyon pinaghihinalaan ko ito ay masyadong mahal, at gusto mo marahil nais mag-isip tungkol sa isang paraan ng mga lamang pakikinig para sa sa "mousein" (yan ay tumatawid ng isang line) sa halip kaysa sa mouseover. Kahit na sa punto, kailangan mong gawin ang ilang mga pag-scan, pati na ang mga puntos sa mga pixels at umaasa sa mga gumagamit na i-click ang tumpak na pixel ay hindi gumawa para sa madaling pakikipag-ugnayan ng gumagamit!

    Maaari mong gawin ang 'animation', uri ng, masyadong, ngunit na nagsasangkot redrawing canvas sa bawat oras, kaya sila ay mas maraming mga transition sa mga animation. Lumikha ako ng simpleng RenderStack para sa mga bagay na alam ko ay hindi magbabago ang mga magkano (eg axes) na punan up ako sa mga tawag sa drawing canvas, at pagkatapos ay sunog ang stack, kaya hindi ko na gawin ang matematika sa bawat oras. Ngunit hindi ako sigurado kung magkano ang pagkakaiba na ito ay talagang gumagawa, ito ay mabagal pa rin sa IE at mabilis sa lahat ng iba pa!

    Matt

    Puna sa pamamagitan ng Matt Parker - Setyembre 29, 2010 #

Paumanhin, ang form ng komento ay sarado sa oras na ito.

Host sa pamamagitan ng Yahoo!

Copyright © 2006-2012 Yahoo! Inc. Lahat ng karapatan ay reserbado. Patakaran sa Privacy - Mga Tuntunin ng Serbisyo

Pinapatakbo ng WordPress sa Yahoo! Web Hosting .