home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 January / PCWorld_2005-01_cd.bin / novinky / Interval / clanek06.htm < prev    next >
Encoding:
Extensible Markup Language  |  2004-12-09  |  34.8 KB  |  437 lines

  1. <?xml version='1.0' encoding='windows-1250'?>
  2. <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
  3. <html xmlns='http://www.w3.org/1999/xhtml' xml:lang='cs' lang='cs'>
  4. <head>
  5. <meta http-equiv='Content-Type' content='text/html; charset=windows-1250' />
  6. <meta http-equiv='Content-language' content='cs' />
  7. <meta http-equiv='Cache-control' content='no-cache' />
  8. <meta http-equiv='Pragma' content='no-cache' />
  9. <meta http-equiv='Expires' content='-1' />
  10. <meta name='robots' content='index,follow' />
  11. <meta name='googlebot' content='index,follow,snippet,noarchive' />
  12. <meta name='description' content='Interval.cz - Internetov² magazφn o webdesignu, v²voji webov²ch aplikacφ a e-komerci. VÜe podstatnΘ o technologiφch XHTML, HTML, CSS, DHTML, JavaScript, XML, .NET, ASP, PHP, Java, J2ME, SQL, WAP...' />
  13. <meta name='keywords' content='Interval' />
  14. <meta name='ICBM' content='49.1915, 16.626' />
  15. <meta name='DC.Title' content='Interval.cz' />
  16. <meta name='DC.Identifier' content='http://interval.cz' />
  17. <meta name='DC.Language' content='cs' />
  18. <meta http-equiv='pics-label' content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline EN v2.0" l gen true for "http://interval.cz" r (nz 1 vz 1 lz 1 oz 1 cz 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://interval.cz" r (n 0 s 0 v 0 l 0))' />
  19. <meta http-equiv='imagetoolbar' content='no' />
  20. <meta http-equiv='MSThemeCompatible' content='no' />
  21. <meta name='MSSmartTagsPreventParsing' content='true' />
  22. <link rel='shortcut icon' type='image/x-icon' href='favicon.ico' />
  23. <link rel='alternate' type='application/rss+xml' title='RSS Interval.cz' href='http://interval.cz/__rss/rss.asp' />
  24. <link rel='home' href='http://interval.cz' />
  25. <link rel='search' href='http://interval.cz/search_ex.asp' />
  26. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/html4.css' />
  27. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/basic_all.css' />
  28. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/homepage_all.css' />
  29. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/articles_all.css' />
  30. <link rel='stylesheet' type='text/css' media='print' href='__services/styles/articles_print.css' />
  31. <title>Interval.cz - webdesign a e-komerce denn∞</title>
  32. </head>
  33. <body class='interval interval-articles'>
  34. <div id='page-header'><div id='interval-logo'><h1 title='Interval.cz - denn∞ o tvorb∞ webu a e-komerci (logo & index link)'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz'>Interval.cz<span></span></a></h1></div><div id='advertising-page-header'></div><div class='page-maker'> </div></div>
  35. <div id='page-topmenu'><h2 class='textversion'>Navigace</h2><div id='page-mainmenu'><h3 class='textversion'>Hlavnφ menu</h3><ul><li class='first selected'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz'>Titulnφ strana</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=14'>Webdesign</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=15'>V²voj aplikacφ</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=18'>E-komerce</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=17'>Nßstroje</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=16'>Magazφn</a></li><li class='right selected'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.inshop.cz'>Knihkupectvφ</a></li><li class='right'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interforum.interval.cz'>Interforum</a></li></ul></div><div id='page-mainmenu-maker'> </div></div>
  36. <div id='page-body'><div id='page-left'><div id='article'>
  37.  
  38.  
  39. <h2>Kurz SVG - DOM a JavaScript p°i programovßnφ animacφ</h2>
  40. <p id='prepend'>V tomto Φlßnku vßs Φekß prvnφ pomoc p°i programovßnφ (alias skriptovßnφ) v prost°edφ SVG. ZφskanΘ znalosti si hned vyzkouÜφme v n∞kolika zajφmav²ch praktick²ch p°φkladech. Myslφte si nap°φklad, ₧e znßte vÜechny v²hody, kterΘ majφ vektorovΘ mapy v SVG formßtu? Mo₧nß ano, ale i tak se vßs pokusφm p°esv∞dΦit, ₧e SVG mapy toho dovedou jeÜt∞ vφce, ne₧ jste Φekali.</p>
  41.  
  42. <p>Jeliko₧ ne vÜechny ·lohy lze zvlßdnout jen s animaΦnφmi prvky SVG specifikace, podφvßme se na mo₧nosti, kterΘ nßm nabφzφ skriptovßnφ. U₧ d°φve jsem v tomto kurzu n∞kolikrßte zmi≥oval, ₧e zvlßdßte-li techniku DHTML, jako byste ji₧ um∞li programovat i SVG. V nßsledujφcφm textu tΘto podobnosti tak trochu zneu₧iji a upozornφm vßs spφÜe na odliÜnosti a specifika SVG, ne₧ abych vysv∞tloval vÜe od zßkladu.</p>
  43. <p>Pozor, nßsledujφcφ text p°edpoklßdß, ₧e s JavaScriptem ji₧ n∞jakΘ zkuÜenosti mßte a ₧e rovn∞₧ mßte p°edstavu o objektovΘ datovΘ struktu°e HTML (XML) strßnek. V p°φpad∞ pot°eby odkazuji na n∞kterΘ z nesΦetn²ch text∙ o <a href='http://www.w3.org/DOM/'>DOM</a> (Document Object Model) a <a href='http://interval.cz/clanek.asp?article=1511' title='Kus²n, Michal: RozluÜt∞nΘ k°i₧ovatky DHTML'>DHTML</a>, z nich₧ °ada je dostupnß i zde na Intervalu. V tomto textu nynφ zmφnφm jen n∞kterΘ zßkladnφ a nejΦast∞ji pou₧φvanΘ konstrukce. Detaily SVG-DOM bez problΘmu dohledßte <a href='podklady/hejral/1033/CurrentSupport.pdf'>v dokumentaci k ASV3</a>.</p>
  44.  
  45. <h3>Test aktivnφho SVG prohlφ₧eΦe</h3>
  46. <p>Hned <a href='http://interval.cz/clanek.asp?article=2253' title='Hejral, Martin: Pr∙vodce SVG - hlßÜenφ o stavu v²voje'>ze zaΦßtku sΘrie text∙ o SVG</a> jste se o Adobe SVG3 prohlφ₧eΦi mohli dozv∞d∞t, ₧e jednφm z hlavnφch rozdφl∙ oproti p°edchozφ verzi je implementace plnohodnotnΘho interpreteru JavaScriptu. Tato informace je pro nßs nynφ klφΦovß. Programßto°i firmy Adobe tφm v²razn∞ zv²Üili kompatibilitu prohlφ₧eΦe nap°φΦ vÜemi platformami a r∙zn²mi webov²mi prohlφ₧eΦi. Osobn∞ siln∞ doporuΦuji jako prvnφ krok p°i spouÜt∞nφ jak²chkoli skript∙ v SVG prost°edφ provΘst test verze prohlφ₧eΦe. Dovoluji si vßm nabφdnout svΘ odlad∞nΘ °eÜenφ:</p>
  47.  
  48. <div class='sample'>
  49. <script type="text/ecmascript">
  50. <br /><![CDATA[
  51. <br />function testAdobe() {
  52. <br />  //created by Martin Hejral, 2003
  53. <br />  //test if Adobe SVG Viewer 3 (ASV3) or greater is present
  54. <br />  if(window.navigator)
  55. <br />    if( (navigator.appName=="Adobe SVG Viewer")
  56. <br />     && (navigator.appVersion>="3.0") )
  57. <br />      return true;
  58. <br />  alert("PROSIM, nainstalujte novou verzi Adobe SVG prohlizece!!!");
  59. <br />  return false;
  60. <br />}
  61. <br />]]>
  62. <br /></script>
  63. </div>
  64.  
  65. <p>A hned mohu dodat, ₧e zßpis k≤du uvnit° SVG souboru se °φdφ obecn²mi XML pravidly, proto je nutnΘ programovΘ k≤dy v₧dy uzav°φt do sekce CDATA, jak jste si vÜichni urΦit∞ povÜimli v p°edchßzejφcφm v²pisu.</p>
  66.  
  67. <h3>Nejd∙le₧it∞jÜφ p°φkazy a postupy</h3>
  68. <p>Toto je notoricky znßmß konstrukce, kterou zaΦφnß tΘm∞° ka₧d² DHTML (a SVG) skript, kter² pracuje s DOM. Zjistφme takto ukazatel na objekt, se kter²m pot°ebujeme pracovat - a¥ u₧ Φφst jeho atributy, nebo n∞co modifikovat.</p>
  69.  
  70. <div class='sample'>
  71. //zjisti ukazatel na SVG objekt
  72. <br />var obj = document.getElementById("nejake_id");
  73. </div>
  74.  
  75. <p>Adobe doporuΦuje ke stejnΘmu ·Φelu o n∞co slo₧it∞jÜφ postup. Ten vznikl p°edevÜφm k zamezenφ mo₧n²ch problΘm∙ v p°φpadech, kdy skript provßd∞l webov² prohlφ₧eΦ (v ASV2) a v HTML strßnce bylo souΦasn∞ vlo₧eno n∞kolik SVG prvk∙.</p>
  76.  
  77. <div class='sample'>
  78. <svg onload="svgInitialize(evt)" width="320" height="200">
  79. <br />
  80. <br />...
  81. <br />
  82. <br />var svgDocument = null; //globalni promenna
  83. <br />
  84. <br />function svgInitialize(evt)
  85. <br />{
  86. <br />svgDocument = evt.getTarget().getOwnerDocument();
  87. <br />var obj = svgDocument.getElementById("nejake_id");
  88. <br />...
  89. <br />}
  90. <br />
  91. <br />...
  92. </div>
  93.  
  94. <p>Vidφte, ₧e namφsto toho, aby se vyu₧il standardnφ objekt <code>document</code>, je zjiÜ¥ovßn objekt "vlastnφcφ" ty konkrΘtnφ SVG prvky, se kter²mi zrovna pot°ebujeme pracovat. (Abych byl zcela p°esn², hledßme vlastnφka objektu, kter² byl zdrojem udßlosti <code>onload</code>, tedy prvku <code>svg</code>.) Pro ka₧d² vlo₧en² SVG soubor se toti₧ vytvo°φ jeden dalÜφ objekt <code>document</code>.</p>
  95. <p>Pom∞rn∞ hojn∞ vyu₧φvanΘ jsou i nßsledujφcφ p°φkazy, rovn∞₧ znßmΘ z DHTML: </p>
  96.  
  97. <div class='list'>
  98. <ul>
  99. <li>window.status="text" - prom∞nnß</li>
  100. <li>window.alert("text") - funkce</li>
  101. </ul>
  102. </div>
  103.  
  104. <p>V²znamnΘ usnadn∞nφ prßce p°i programovßnφ vßm poskytnou funkce zjednoduÜujφcφ prßci s atributy SVG element∙ - jejich slu₧eb vyu₧ijete p°i prßci s SVG velmi Φasto:</p>
  105.  
  106. <div class='list'>
  107. <ul>
  108. <li>obj.getAttribute( "transform" )</li>
  109. <li>obj.setAttribute( "transform", "translate(11,22)" )</li>
  110. </ul>
  111. </div>
  112.  
  113. <p>Nßsledujφcφ v²pis ukazuje, jak modifikovat a Φφst obsah atributu <code>style</code>. Prozatφm p°φliÜ nedoporuΦuji pou₧φvßnφ <code>style</code> z d∙vod∙ kompatibility, jeliko₧ prohlφ₧eΦe mΘn∞ vysp∞lΘ ne₧ ASV2 v∞tÜinou CSS zatφm uspokojiv∞ nepodporujφ.</p>
  114.  
  115. <div class='sample'>
  116. var svgobj = svgdoc.getElementById("nejake_id");
  117. <br />if (svgobj != null)
  118. <br />{
  119. <br />var svgstyle = svgobj.getStyle();
  120. <br />var fill = svgstyle.getPropertyValue("fill");
  121. <br />svgstyle.setProperty("stroke","#69F");
  122. <br />svgstyle.removeProperty("stroke-width");
  123. <br />}
  124. </div>
  125.  
  126. <p>K hodnotßm atribut∙ uvnit° struktury SVG-DOM se m∙₧eme dostat alternativn∞ takΘ nßsledujφcφm zßpisem:</p> 
  127.  
  128. <div class='list'>
  129. <ul>
  130. <li>svgobj.attributes.getNamedItem("nazev_atr").value</li>
  131. </ul>
  132. </div>
  133.  
  134. <p>ZvlßÜt∞ v p°φpad∞ animacφ jsou Φasto pou₧itelnΘ obecnΘ funkce JavaScriptu pro prßci s p°eruÜenφm a Φasovßnφm:</p>
  135.  
  136. <div class='list'>
  137. <ul>
  138. <li>var casovac = window.setTimeout("nejaka_funkce()", 50)</li>
  139. <li>window.clearTimeout(casovac)</li>
  140. </ul>
  141. </div>
  142.  
  143. <h3>Obsluha udßlostφ</h3>
  144. <p>DalÜφ oblφbenou Φinnostφ, kterou jist∞ budete chtφt provozovat takΘ, je obsluha udßlostφ u₧ivatelskΘho rozhranφ - tu velmi Φasto vyu₧ijete p°i vytvß°enφ interaktivnφch grafick²ch prezentacφ. Dovolφm si shrnout nejd∙le₧it∞jÜφ praktickΘ informace, kterΘ k tomu budete pot°ebovat.</p>
  145. <p>SVG p°i obsluze udßlostφ pou₧φvß model shodn² s dob°e znßmou normou DOM2-Events, pou₧φvan² v prohlφ₧eΦφch Netscape a Mozilla (MSIE se trochu odchyluje). Ka₧dß obslu₧nß rutina toti₧ dostane jako parametr specißlnφ objekt <em>event</em>, kter² nese informace pot°ebnΘ k reakci na konkrΘtnφ udßlost. Pozor, zßvazn² nßzev tohoto specißlnφho objektu v ASV je <code>evt</code> (na rozdφl od klasick²ch WWW browser∙)!</p>
  146. <p>JednotlivΘ polo₧ky ve struktu°e objektu <code>evt</code> pak jsou ji₧ shodnΘ. Ty nejzajφmav∞jÜφ si nynφ vyjmenujeme:</p>
  147.  
  148. <div class='list'>
  149. <ul>
  150. <li><em>target</em> - zdrojov² objekt udßlosti</li>
  151. <li><em>currentTarget</em> - aktußlnφ objekt, ke kterΘmu je p°ipojen obslu₧n² skript (event listener)</li>
  152. <li><em>screenX</em> - X v sou°adnicovΘm systΘmu obrazovky</li>
  153. <li><em>screenY</em> - Y v sou°adnicovΘm systΘmu obrazovky</li>
  154. <li><em>clientX</em> - X relativn∞ vzhledem k oknu (rßmu) SVG grafiky</li>
  155. <li><em>clientY</em> - Y relativn∞ vzhledem k oknu (rßmu) SVG grafiky</li>
  156. <li><em>ctrlKey</em></li>
  157. <li><em>shiftKey</em></li>
  158. <li><em>altKey</em></li>
  159. <li><em>metaKey</em></li>
  160. <li><em>button</em></li>
  161. <li><em>keyCode</em></li>
  162. <li><em>charCode</em></li>
  163. </ul>
  164. </div>
  165.  
  166. <h3>Animace s vyu₧itφm DOM a JavaScriptu</h3>
  167. <p>A vzh∙ru do praxe...</p>
  168.  
  169. <h4>Fyzikßlnφ pokus - koule a pru₧iny</h4>
  170. <p>Nynφ si vyzkouÜφme realizaci znßmΘho fyzikßlnφho pokusu, kdy koule, zav∞Üenß na pru₧in∞, po jejφm napnutφ a uvoln∞nφ kmitß s klesajφcφ amplitudou okolo rovnovß₧nΘ polohy.</p>
  171.  
  172. <div class='image'>
  173. <img src='podklady/hejral/1033/a16.gif' alt='Fyzikßlnφ pokus - koule a pru₧iny' title='Fyzikßlnφ pokus - koule a pru₧iny' />
  174. <br /><span class='comment'>Fyzikßlnφ pokus - koule a pru₧iny (<a href='podklady/hejral/1033/a16-3-physics.svg'>originßlnφ SVG, cca 5 kB</a>)</span>
  175. </div>
  176.  
  177. <p>V <a href='podklady/hejral/1033/a16-1-physics.svg'>prvnφ fßzi</a> jsem si v Illustratoru nakreslil jednoduchΘ ztvßrn∞nφ pru₧iny (skupina s <samp>id="spring"</samp>) a koule (skupina s <samp>id="sphere"</samp>). Dovnit° ka₧dΘ skupiny jsem pak dodal animaΦnφ prvky. Musφ b²t dva, proto₧e v p°φpad∞ pru₧iny pot°ebujeme animovat smrÜ¥ovßnφ, naproti tomu koule jen m∞nφ polohu...</p>
  178.  
  179. <div class='sample'>
  180. <g id="spring">
  181. <br />  ...
  182. <br />  <!-- anim. pruziny -->
  183. <br />  <animateTransform attributeName="transform"
  184. <br />    type="scale" values="1 1;1 0.32;1 1" dur="10s"
  185. <br />    additive="sum" repeatCount="indefinite" />
  186. <br /></g>
  187. <br /><g id="sphere">
  188. <br />  ...
  189. <br />  <!-- anim. koule -->
  190. <br />  <animateTransform attributeName="transform"
  191. <br />    type="translate" values="0 0;0 -100;0 0" dur="10s"
  192. <br />    additive="sum" repeatCount="indefinite" />
  193. <br /></g>
  194. </div>
  195.  
  196. <p>Definice pohybu pomocφ <code>values</code> ovÜem ve v²chozφm (lineßrnφm) interpolaΦnφm re₧imu vede k fyzikßln∞ nesprßvnΘmu ΦasovΘmu °φzenφ animovan²ch hodnot. Abych dosßhl realistickΘ zm∞ny zrychlenφ, kterß p°i tomto fyzikßlnφm procesu probφhß, nastavil jsem v²poΦetnφ re₧im na <samp>calcMode="spline"</samp> a p°idal dv∞ °φdicφ k°ivky do atributu <samp>keySplines=".5 0 .5 1;.5 0 .5 1"</samp>. Navφc byly <a href='podklady/hejral/1033/a16-2-physics.svg'>v druhΘ fßzi</a> koule a pru₧ina definovßny jako symboly, abychom je mohli "rozmno₧it":</p>
  197.  
  198. <div class='sample'>
  199. <use x="50" xlink:href="#spring">
  200. <br />  <!-- anim. -->
  201. <br />  <animateTransform
  202. <br />    attributeName="transform" type="scale"
  203. <br />    values="1 1;1 0.32;1 1" dur="10s"
  204. <br />    keySplines=".5 0 .5 1;.5 0 .5 1" calcMode="spline"
  205. <br />    additive="sum" repeatCount="indefinite" />
  206. <br /></use>
  207. <br /><use x="50" xlink:href="#sphere">
  208. <br />  <!-- anim. -->
  209. <br />  <animateTransform
  210. <br />    attributeName="transform" type="translate"
  211. <br />    values="0 0;0 -100;0 0" dur="10s"
  212. <br />    keySplines=".5 0 .5 1;.5 0 .5 1" calcMode="spline"
  213. <br />    additive="sum" repeatCount="indefinite" />
  214. <br /></use>
  215. </div>
  216.  
  217. <p>Stßle ale z∙stßvß opominut jeden fyzikßlnφ aspekt - v reßlnΘm sv∞t∞ bude v₧dy dochßzet ke ztrßt∞ energie kmitajφcφ soustavy a kmity se budou utlumovat. Mohli bychom to ud∞lat zp∙sobem, kter² pou₧il v podobnΘm p°φkladu s kostkami Antoine Quint, ale ten je nep°esn² a nßroΦn² na vypisovßnφ mno₧stvφ polohov²ch ·daj∙.</p>
  218. <p>Proto si nynφ ukß₧eme p°φm² v²poΦet animaΦnφch fßzφ pomocφ JavaScriptu. Prosφm ct∞nΘ Φtenß°e, nekamenujte mne za nep°esnosti a zjednoduÜovßnφ ve fyzikßlnφ strßnce v∞ci, st°edem zßjmu stßle z∙stßvß vektorovß grafika:</p>
  219.  
  220. <div class='sample'>
  221. //global variables
  222. <br />var amp=50, scale=0.34, time=0, to=-1;
  223. <br />//perform fading animation
  224. <br />function fade() {
  225. <br />  //get pointer to animated objects
  226. <br />  var obj1 = document.getElementById('sphere1');
  227. <br />  var obj2 = document.getElementById('spring1');
  228. <br />  var s = y = Math.cos(time/1000);
  229. <br />  //window.status="time = "+time/1000+" s";
  230. <br />  //multiply COS t with amplitude
  231. <br />  y *= amp;
  232. <br />  //shift sphere to base position
  233. <br />  y -= 50;
  234. <br />  //scale spring
  235. <br />  s *= scale;
  236. <br />  //set base position
  237. <br />  s += 0.34 + 0.32;
  238. <br />  time += 50;
  239. <br />  //amplitude and scale decay
  240. <br />  amp = amp*999/1000;
  241. <br />  scale = scale*999/1000;
  242. <br />  //modify SVG graphics
  243. <br />  obj1.setAttribute( "transform", "translate(0,"+y+")" );
  244. <br />  obj2.setAttribute( "transform", "scale(1,"+s+")" );
  245. <br />  //start timer
  246. <br />  to = window.setTimeout("fade()", 50);
  247. <br />}
  248. </div>
  249.  
  250. <p>Uveden² k≤d vykonßvß zhruba nßsledujφcφ. Ihned potΘ, co zjistφ ukazatele na animovanΘ objekty, pou₧ije funkci <code>cos()</code> k v²poΦtu animovan²ch hodnot: <samp>y</samp> - aktußlnφ poloha koule, <samp>s</samp> - aktußlnφ nata₧enφ pru₧iny. Jeliko₧ byla pru₧ina nakreslena v pln∞ nata₧enΘ poloze, byl jsem nßsledn∞ donucen do v²poΦtu p°idat mo₧nß pon∞kud zßhadnΘ konstanty (<samp>50, 0.34, 0.32</samp>). Pak se posuneme po ΦasovΘ ose zv²Üenφm prom∞nnΘ <samp>time</samp>, utlumφme amplitudu a aplikujeme vypoΦtenΘ hodnoty na SVG objekty (<code>setAttribute</code>).</p>
  251. <p>Nakonec nastavφme ΦasovaΦ, kter² rutinu <code>fade()</code> spustφ znovu po 50 ms.</p>
  252.  
  253. <h4>Äivot brouka</h4>
  254. <p>Tato animace op∞t vychßzφ <a href='podklady/hejral/1033/a17-beetle.swf'>z p°φkladu firmy Macromedia</a>, ve kterΘm je beruÜka ovlßdßna virtußlnφm joystickem.</p>
  255. <p>Op∞t jsem si trochu ulehΦil prßci, o°ezal jsem p°φklad a₧ na holΘ jßdro a vypustil n∞kterΘ vlastnosti originßlu. Pokud jste poctiv∞ doΦetli a₧ sem, mßte vÜechny pot°ebnΘ znalosti, kterΘ vßm umo₧nφ napsat JavaScriptovou rutinu kterß by nap°φklad stejn∞ jako v SWF p°edloze pohybovala °φdicφ pßkou (n∞co velmi podobnΘho obsahuje i <a href='http://interval.cz/clanek.asp?article=3662' title='Hejral, Martin: Kurz SVG - animace (praktickΘ ukßzky pro pokroΦilΘ)'>p°φklad s animacφ masky obrßzku</a>).</p>
  256.  
  257. <div class='image'>
  258. <img src='podklady/hejral/1033/a17.gif' alt='Äivot brouka' title='Äivot brouka' />
  259. <br /><span class='comment'>Äivot brouka (<a href='podklady/hejral/1033/a17-2-beetle.svg'>originßlnφ SVG, cca 18 kB</a>)</span>
  260. </div>
  261.  
  262. <p>Hned <a href='podklady/hejral/1033/a17-1-beetle.svg'>prvnφ varianta SVG p°φkladu</a> naznaΦuje mo₧nosti °eÜenφ tΘto interaktivnφ animace bez pou₧itφ programovßnφ. Bohu₧el, ovlßdßnφ beruÜky pomocφ sm∞rovΘho k°φ₧e takto nelze stoprocentn∞ realizovat - neexistuje toti₧ mo₧nost, aby animaΦnφ prvek po ukonΦenφ a p°i novΘm startu p°iΦφtal rostoucφ hodnoty sou°adnic k poloze, ve kterΘ byla p°edtφm animace ukonΦena (beruÜka zastavena), proΦe₧ pohyb zaΦφnß v₧dy znovu od poΦßteΦnφch sou°adnic danΘho animaΦnφho prvku.</p>
  263. <p><span class='note-author'>Pozn. aut.: Tak₧e asi podßme nßvrh na rozÜφ°enφ normy SVG o pam∞¥ov² efekt animaΦnφch element∙ - navrhuji atribut "memory" s mo₧n²mi hodnotami "replace" a "sum" kv∙li konzistentnosti s atributy "additive" a "accumulate".</span></p>
  264. <p>Prozatφm vßm nabφzφm °eÜenφ pomocφ JavaScriptu <a href='podklady/hejral/1033/a17-2-beetle.svg'>v druhΘ verzi</a> p°φkladu. SVG k≤d je pro vaÜe pohodlφ pom∞rn∞ podrobn∞ okomentovßn.</p>
  265. <p>Tento kousek SVG je zobrazenφm ovlßdacφho k°φ₧e s p°ipojenou rutinou <samp>onmouseover="beetleMania(evt)"</samp>, kterß je potom aktivovßna kdykoli se ukazatel dostane nad zobrazenφ Üipek. P°i pozornΘm Φtenφ k≤du zjistφte, ₧e ve skuteΦnosti je kresba neviditelnß. D∙vod? P∙vodnφ sm∞rov² k°φ₧ byl toti₧ nakreslen jako jedna spojitß vektorovß cesta - to by ale neumo₧nilo jednoduchΘ rozpoznßnφ sm∞ru... Aby prvky v∙bec reagovaly na udßlosti, musφ b²t vykresleny, a jeliko₧ souΦasn∞ chceme vid∞t p∙vodnφ kresbu, nastavil jsem jim prost∞ stoprocentnφ pr∙hlednost pomocφ <samp>opacity="0"</samp>.</p>
  266.  
  267. <div class='sample'>
  268. <g id="control" opacity="0" onmouseover="beetleMania(evt)">
  269. <br />  <path id="n" d="M61,31.4V20.1h5.6L55,0L43.3,20.1h6v11.2"/>
  270. <br />  <path id="nw" d="M41.5,34.8L33,26.2l2.8-2.8L19,18.9l4.4,16.9l2.8-2.8l8.7,8.7"/>
  271. <br />  <path id="ne" d="M75,41.6l8.6-8.6l2.8,2.8L91,18.9l-16.9,4.5l2.8,2.8l-8.5,8.5"/>
  272. <br />  <path id="e" d="M77.9,60.8h11.9v5.8l20.1-11.7L89.8,43.2V49H78.1"/>
  273. <br />  <path id="w" d="M31.8,49H20.2v-5.8L0,54.9l20.2,11.7v-5.8h11.9"/>
  274. <br />  <path id="se" d="M67.7,74.5l9.2,9.2l-2.8,2.8L91,90.9L86.5,74l-2.9,2.9l-9.1-9.1"/>
  275. <br />  <path id="s" d="M49.2,77.5v12.3h-6L55,109.8l11.7-20.1H61V77.4"/>
  276. <br />  <path id="sw" d="M35.3,67.8l-9.1,9.1l-2.8-2.8L19,91l16.9-4.5L33,83.7l9.2-9.3"/>
  277. <br /></g>
  278. </div>
  279.  
  280. <p>Podprogram <samp>beetleMania(evt)</samp> si snadno zjistφ <code>id</code> prvku (<samp>evt.target.id</samp>), kter² spustil udßlost, a podle n∞j nastavφ sm∞r pohybu:</p>
  281.  
  282. <div class='sample'>
  283. //'evt' is standard name of event object
  284. <br />function beetleMania(evt) {
  285. <br />  //get 'id' of control element to determine direction
  286. <br />  var ctrl = evt.target.id;
  287. <br />  switch(ctrl) {
  288. <br />  case 'n': dx=0; dy=-1; mrot=0;
  289. <br />  break;
  290. <br />  case 'ne': dx=1; dy=-1; mrot=45;
  291. <br />  break;
  292. <br />  case 'e': dx=1; dy=0; mrot=90;
  293. <br />  break;
  294. <br />  case 'se': dx=1; dy=1; mrot=135;
  295. <br />  break;
  296. <br />  case 's': dx=0; dy=1; mrot=180;
  297. <br />  break;
  298. <br />  case 'sw': dx=-1; dy=1; mrot=-135;
  299. <br />  break;
  300. <br />  case 'w': dx=-1; dy=0; mrot=-90;
  301. <br />  break;
  302. <br />  case 'nw': dx=-1; dy=-1; mrot=-45;
  303. <br />  break;
  304. <br />  }
  305. <br />  //stop event bubbling
  306. <br />  evt.stopPropagation();
  307. <br />  return false;
  308. <br />}
  309. </div>
  310.  
  311. <p>Pokud alespo≥ trochu vlßdnete JavaScriptem, jist∞ pro vßs nebude problΘmem cviΦn∞ naprogramovat druhou variantu pohybu, kdy se beruÜka otßΦφ plynule, nikoli skokov∞.</p>
  312. <p>Vlastnφ pohyb (a modifikace SVG-DOM) zajiÜ¥uje rutina <code>beetleMove()</code>, opakovan∞ spouÜt∞nß ΦasovaΦem:</p>
  313.  
  314. <div class='sample'>
  315. function beetleMove(evt) {
  316. <br />  //get pointer to animated object
  317. <br />  var obj = document.getElementById('beetle');
  318. <br />  mx += dx; my += dy;
  319. <br />  if(mx < -128) mx = 128;
  320. <br />  else if(mx > 128) mx = -128;
  321. <br />  if(my < -128) my = 128;
  322. <br />  else if(my > 128) my = -128;
  323. <br />  obj.setAttribute("transform",
  324. <br />    "translate("+mx+","+my+") rotate("+mrot+")");
  325. <br />  to = window.setTimeout("beetleMove()", 22);
  326. <br />}
  327. </div>
  328.  
  329. <h4>Interaktivnφ ₧elezniΦnφ mapa ╚R</h4>
  330. <p>V tomto p°φkladu si dovolφm troÜiΦku vylepÜit interaktivnφ <a href='podklady/hejral/1033/a18-cd_mapa-origin.svgz'>SVG mapu ze serveru ╚esk²ch drah</a>. Na okraj jeÜt∞ jednu poznßmku k ovlßdßnφ Adobe SVG prohlφ₧eΦe - zmenÜovßnφ Φi zv∞tÜovßnφ m∞°φtka lze provΘst i myÜφ, pokud podr₧φte klßvesu <code>CTRL</code>, respektive <code>CTRL+SHIFT</code>, a posuv mapy lze realizovat kombinacφ <code>ALT+myÜ</code>, jak je sprßvn∞ uvedeno v map∞.</p>
  331.  
  332. <div class='image'>
  333. <img src='podklady/hejral/1033/a18s.gif' alt='Interaktivnφ ₧elezniΦnφ mapa ╚R' title='Interaktivnφ ₧elezniΦnφ mapa ╚R' />
  334. <br /><span class='comment'>Interaktivnφ ₧elezniΦnφ mapa ╚R (<a href='podklady/hejral/1033/a18.gif'>velk² nßhled, cca 55 kB</a>, <a href='podklady/hejral/1033/a18-cd_mapa.svgz'>originßlnφ SVG, cca 30 kB</a>)</span>
  335. </div>
  336.  
  337. <p>V rßmci naÜeho SVG kurzu jsem p°idal "roll-over" efekty (pomocφ animaΦnφch prvk∙ <code>set</code>) a souΦasn∞ "kontextovou" nßpov∞du, kterß ukazuje velkΘ Φφslo trati (JavaScript).</p>
  338. <p>K mod°e zbarven²m tratφm byl cviΦn∞ pomocφ animaΦnφho prvku <code>set</code> dodßn zv²raz≥ovacφ efekt:</p>
  339.  
  340. <div class='sample'>
  341. <path class="fil0 str4" d="M2833 3681l-23 106">
  342. <br />  <set attributeName="stroke" to="magenta"
  343. <br />    begin="mouseover" end="mouseout"/>
  344. <br /></path>
  345. </div>
  346.  
  347. <p>To byla hraΦka, zbytek u₧ bude troÜiΦku komplikovan∞jÜφ. Vyu₧il jsem toho, ₧e SVG ╚esk²ch drah obsahuje hyperlinky na jφzdnφ °ßdy, p°iΦem₧ Φφslo trati je v₧dy obsa₧eno v nßzvu odkazovanΘho dokumentu - prost∞ jsem je z atributu <code>xlink:href</code> v objektovΘ struktu°e vyextrahoval:</p>
  348.  
  349. <div class='sample'>
  350. var trat = obj.attributes.getNamedItem("xlink:href").value;
  351. </div>
  352.  
  353. <p>V SVG jsem si p°edem vytvo°il textov² prvek s <samp>id="info"</samp>, do kterΘho nφ₧e uvedenß rutina zapφÜe Φφslo trati a souΦasn∞ jej p°emφstφ na sprßvnΘ sou°adnice.</p>
  354. <p>Program, kter² jsem vytvo°il, Üikovn∞ vyu₧φvß efektu zvanΘho <a href='http://interval.cz/clanek.asp?article=2064' title='Kus²n, Michal: PokroΦilΘ zpracovßnφ udßlostφ nap°φΦ platformami podruhΘ'>event-bubbling</a> - rutinu odchytßvajφcφ pohyb myÜi mi pak staΦilo umφstit do ko°ene objektovΘho stromu a poΦkat si, a₧ dotyΦnß udßlost probublß a₧ k nφ. Pak testuji, zda se jednß o prvek typu <code>a</code> (hyperlink). M∙₧e se vßm zdßt divnΘ, proΦ netestuji zdrojov² objekt udßlosti (<samp>evt.target</samp>), nybr₧ jeho rodiΦe (<samp>evt.target.parentNode</samp>). Je to proto, ₧e udßlost <code>onmouseover</code> m∙₧e spustit pouze viditeln² objekt - co₧ jsou Φßry znßzor≥ujφcφ jednotlivΘ trat∞, hyperlinky jsou jim v naÜem SVG souboru p°φmo nad°azeny:</p>
  355.  
  356. <div class='sample'>
  357. <a xlink:href="../k130.pdf" target="_blank">
  358. <br />  <path class="fil0 str4" d="M-2472 1338l-294 -23">
  359. <br />  <set attributeName="stroke" to="magenta"
  360. <br />    begin="mouseover" end="mouseout"/>
  361. <br />  </path>
  362. <br /></a>
  363. </div>
  364.  
  365. <p>DalÜφ velmi zajφmavou vlastnostφ, je₧ by rozhodn∞ nem∞la z∙stat nepovÜimnuta, je zjiÜt∞nφ aktußlnφho zv∞tÜenφ a posunutφ grafiky v SVG Vieweru (nezapome≥me - vektorovou grafiku lze neomezen∞ zv∞tÜovat bez ztrßty kvality) a nßsledn² p°epoΦet sou°adnic umis¥ovanΘho objektu.</p>
  366.  
  367. <div class='sample'>
  368. //kontextova napoveda, Martin Hejral, 2004
  369. <br />function napoveda(evt) {
  370. <br />  //evt = objekt 'event' s informacemi o udalosti
  371. <br />  //zjisti ukazatel na textovy informacni objekt
  372. <br />  var obj = document.getElementById('info');
  373. <br />  //zjisti jmeno tagu zdrojoveho objektu
  374. <br />  var tag = evt.target.parentNode.tagName.toLowerCase();
  375. <br />  if(tag == "a") {
  376. <br />    //extrahuje cislo trati z odkazu
  377. <br />    //na PDF soubor s jizdnim radem
  378. <br />    //a vlozi jej do text. prvku
  379. <br />    //kontextove napovedy
  380. <br />    obj.firstChild.nodeValue =
  381. <br />      evt.target.parentNode.attributes.
  382. <br />      getNamedItem("xlink:href").value.substring(4,7);
  383. <br />  }
  384. <br />  //nasledujici data potrebujeme abychom
  385. <br />  //se prizpusobili aktualnimu zvetseni
  386. <br />  //v prohlizeci SVG
  387. <br />  meritko = document.rootElement.currentScale;
  388. <br />  posun = document.rootElement.currentTranslate;
  389. <br />  //nastavi polohu textu podle polohy mysi
  390. <br />  obj.setAttribute("transform", "translate("
  391. <br />      + (evt.clientX-posun.x)/meritko + ","
  392. <br />      + (evt.clientY-posun.y)/meritko + ")");
  393. <br />  //pripadne 'bublani' muze pokracovat
  394. <br />  return evt;
  395. <br />}
  396. </div>
  397.  
  398. <p>To¥ vÜe. Jen za sebe dodßm, ₧e p°esn∞ zde je skrytß velkß sφla grafiky ve znaΦkovacφm jazyce SVG, zde se otevφrß spousta mo₧nostφ pro aplikace. Äiv∞ si p°edstavuji t°eba detailnφ mapu m∞sta, kde jsou vÜechny objekty podrobn∞ popsßny ve standardnφch prvcφch <code>title</code> a <code>desc</code> - skript velmi podobn² tomu zde p°edstavenΘmu pak dßvß u₧ivateli tΘto mapy mo₧nost velmi pohodln∞ tyto informace zφskat...</p><div class='refer'><h3><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/serial.asp?serial=76' title='p°ehled Φlßnk∙ vΦetn∞ anotacφ'>Kurz SVG - tvorba vektorovΘ grafiky v XML</a></h3><p>Pokud u₧ mßte dost suchΘ teorie Scalable Vector Graphics, nenφ nic sna₧Üφho, ne₧ se vrhnout na praktickΘ testovßnφ jeho mo₧nostφ. Kurz SVG vßm usnadnφ osvojenφ zßkladnφch struktur a vlastnostφ tohoto jazyka pro prßci s vektorovou grafikou. Tato sΘrie Φlßnk∙ dosud nebyla ukonΦena!</p><ul><li><strong>Kurz SVG - DOM a JavaScript p°i programovßnφ animacφ</strong> (prßv∞ Φtete)</li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3662'>Kurz SVG - animace (praktickΘ ukßzky pro pokroΦilΘ)</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3608'>Kurz SVG - animace (dynamika zm∞ny hodnot)</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3578'>Kurz SVG - animace (praktickΘ ukßzky)</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3566'>Kurz SVG - animace (Φasovßnφ)</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3530'>Kurz SVG - nenφ to Flash a p°ece se toΦφ!</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3514'>Kurz SVG - transformace sou°adnic</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3506'>Kurz SVG - o°ezßvßnφ a maskovßnφ</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3483'>Kurz SVG - vypl≥ovßnφ II</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3476'>Kurz SVG - vypl≥ovßnφ I</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3469'>Kurz SVG - text</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3464'>Kurz SVG - grafickß primitiva</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3460'>Kurz SVG - struktura dokumentu, zobrazovacφ a vykreslovacφ model</a></li></ul></div>
  399.  
  400. <div id='article-author'>
  401. <a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/autor.asp?author=187'>Hejral, Martin</a> (24. 11. 2004)
  402.  
  403. </div>
  404.  
  405.  
  406. </div></div>
  407. <div id='page-right'><h2 class='textversion'>Prav² sloupek</h2>
  408. <div id='search'><h3 class='textversion'>Vyhledßvßnφ</h3><form method='get' action='http://interval.cz/search.asp'><div><input type='text' name='hledej' class='text' /><input type='submit' class='submit' value='Najdi!' /></div></form><div><a href='http://interval.cz/search_ex.asp'>RozÜφ°enΘ vyhledßvßnφ</a></div></div>
  409.  
  410.  
  411.  
  412. <div class='page-right-box book'>
  413.     <h3>Kni₧nφ novinka</h3>
  414.     <div class='page-right-box-in'>
  415.         <div class='book-top'>
  416.             <h4><a href='http://interval.cz/__redirect/redirect.asp?what=interval_booknews&url=http://interval.inshop.cz/inshop/scripts/detail.asp?ItemID=280'>xCSS - referenΦnφ p°φruΦka</a></h4>
  417.         </div>
  418.         <div class='image'>
  419.             <img src='podklady/knihy/image.jpg' alt='obßlka' title='obßlka' /></a>
  420.         </div>
  421.         <div class='book-bottom'>Cena: <span class='book-price-old'>350 KΦ</span> <span class='book-price-new'>315 KΦ</span></div>
  422.     </div>
  423. </div>
  424.  
  425.  
  426.  
  427. <div class='page-right-box reading'><h3 title='NejΦten∞jÜφ Φlßnky za poslednφch 14 dn∙'>NejΦten∞jÜφ</h3><div class='page-right-box-in'><ul><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3658'>VyhlßÜenφ sout∞₧e Interzen 2004</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3682'>Zend's PHP 5 Coding Contest - wtcSQLite</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3693'>PSPad - zaΦφnßme tvo°it webov² projekt</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3694'>SEO - struktura a p°esm∞rovßnφ</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3689'>NauΦte se vid∞t kreativn∞</a></li></ul></div></div><div class='page-right-box cauldron'><h3 title='Nejdiskutovan∞jÜφ Φlßnky za poslednφch 21 dn∙'>Diskuznφ kotel</h3><div class='page-right-box-in'><ul><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3680' title='(34 komentß°∙)'>H°φchy pro ÜφlenΘho korektora - autentizace, autentikace nebo autentifikace?</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3694' title='(31 komentß°∙)'>SEO - struktura a p°esm∞rovßnφ</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3683' title='(13 komentß°∙)'>Individualizace stylopis∙ k eliminaci chyb prohlφ₧eΦ∙ - teoretick² p°ehled</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3682' title='(13 komentß°∙)'>Zend's PHP 5 Coding Contest - wtcSQLite</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3676' title='(11 komentß°∙)'>Webdesign s webov²mi standardy</a></li></ul></div></div>
  428.  
  429.  
  430.  
  431. <div class='page-right-box emailserv'><h3>Email servis</h3><div class='page-right-box-in'><form action='prihlaseni.asp' method='post'><div class='shell'><input class='text' type='text' name='adresa' /></div><div class='shell'><input class='radio' type='radio' value='1' name='co' checked='checked' />T²dennφ p°ehled Φlßnk∙</div><div class='shell'><input class='radio' type='radio' value='2' name='co' />HELP konference</div><div class='shell'><input class='submit' type='submit' value='P°ihlßsit' /></div></form></div></div>
  432. </div>
  433. <div class='page-maker'> </div><div class='page-maker-white'> </div></div>
  434. <div id='page-foot'><div id='page-foot-menu'><a href='http://interval.cz/reklama.asp'>Inzerce na Interval.cz</a> | <a href='http://interval.cz/redakce.asp'>Redakce Interval.cz</a> | <a href='http://interval.cz/autori.asp'>Hledßme novΘ autory</a></div><div id='issn'>ISSN 1212-8651</div><div id='page-foot-zoner'>© Zoner software, s.r.o., vÜechna prßva vyhrazena, tento server dodr₧uje <a href='http://interval.cz/privacy.asp'>prßvnφ p°edpisy</a>o ochran∞ osobnφch ·daj∙.</div></div>
  435. </body>
  436. </html>
  437.