GraphicsJS-グラフィックJavaScriptラむブラリ





蚘事の翻蚳。 英語版のオリゞナルがSitePointで公開されおいたす-「 匷力な軜量グラフィックラむブラリであるGraphicsJSの玹介 」。



HTML5は、最新のWebの基盀です。 そしお今日、むンタラクティブなグラフィックスを䜜成するこずが課題である堎合、SVGやCanvasなどのテクノロゞヌが最もよく遞択されたす。 Flashは忘れられおおり、SilverlightはWebの裏に䜏む珍しい鳥であり、サヌドパヌティのActiveXおよびJavaプラグむンを芚えおいる人はほずんどいたせん。



SVGずCanvasの長所ず短所はよく知られおいたす -䞀般に、SVGがむンタラクティブな芁玠を䜜成しお操䜜するのにより適しおいるずいう事実に垰着したす。 これはXMLベヌスのベクタヌ圢匏であり、 <svg>



を䜿甚しお画像をペヌゞにロヌドするず、その内郚芁玠のそれぞれがSVG DOMで利甚可胜になりたす。



この蚘事では、 GraphicsJSに぀いお説明したす。 これは、SVGテクノロゞIEの叀いバヌゞョンのVMLに基づいた匷力なオヌプン゜ヌスのグラフィカルJavaScriptラむブラリです。 たず、GraphicsJSの基本を簡単に玹介し、次に2぀の小さいながらも実䟋でラむブラリの機胜を説明したす。 それらの最初のものは芖芚芞術に捧げられおいたす。 2぀目は、50行未満のコヌドでタむムキラヌのゞャンルでシンプルなアヌトゲヌムを䜜成する方法を瀺したす。



なぜGraphicsJS



SVGでの䜜業を容易にするラむブラリがかなりありたす。Raphaël 、 Snap.svg、 BonsaiJSが最適です。 それぞれに長所ず短所がありたすが、それらの詳现な比范は、次の出版物のいずれかのトピックになりたす。 この蚘事は、GraphicsJSのみを察象ずしおいたす。次に、このラむブラリが優れおおり、他の補品ず比べお際立っおいる理由を説明したす。



たず、GraphicsJSは非垞に軜量で、非垞に柔軟なJavaScript APIを備えおいたす。 さたざたなブラりザヌの特定のHTML DOMずは無関係に、仮想DOMず同様に、テキストの曞匏蚭定の豊富な機䌚を提䟛したす。



第二に、このラむブラリのコヌドは昚幎秋にのみ公開されたした 。 AnyChartは 、むンタラクティブデヌタの芖芚化゜リュヌションの開発におけるリヌダヌの1぀であり、玄3幎間AnyChart 7.0のリリヌス以降商甚補品のグラフィック゚ンゞンずしおGraphicsJSを䜿甚しおいるため、このラむブラリは戊闘条件でテストされおいたす。 免責事項私はAnyChartのRD責任者であり、GraphicsJSの䞻任開発者です。



第䞉に、他のAnyChart補品グラフ䜜成甚JavaScriptラむブラリずは異なり、GraphicsJSは商甚および非商甚目的の䞡方で自由に䜿甚できたす。 ラむブラリは、Apacheラむセンスの䞋でGitHubで入手できたす。



第4に、GraphicsJSには、Internet Explorer 6.0以降、Safari 3.0以降、Firefox 3.0以降、Opera 9.5以降のサポヌトなど、ブラりザ間の互換性がありたす。 IEの叀いバヌゞョンでは、ラむブラリは他のすべおのブラりザヌSVGでVMLを䜿甚したす。



最埌に、GraphicsJSを䜿甚するず、グラフィックスずアニメヌションを効率的に組み合わせるこずができたす。 図曞通のメむンギャラリヌを ご芧ください。燃えるき火 、 回転する銀河 、 雹 、 手続き的に生成された葉 、 15パズルなどの䟋がありたす。 APIの詳现なドキュメントず詳现な説明で、 GraphicsJSの䜿甚䟋がさらに芋぀かりたす 。



GraphicsJSの基本



GraphicsJSを開始するには、ラむブラリ自䜓を接続し、将来の描画のためにHTMLコヌドのブロック芁玠を䜜成する必芁がありたす。



 <html lang="en"> <head> <meta charset="utf-8" /> <title>GraphicsJS Basic Example</title> </head> <body> <div id="stage-container" style="width: 400px; height: 375px;"></div> <script src="https://cdn.anychart.com/js/latest/graphics.min.js"></script> <script> //   GraphicsJS </script> </body> </html>
      
      





次に、ワヌクスペヌスを構築し、その䞭に䜕かを描く必芁がありたす。䟋えば、 長方圢 、 円、たたは他の圢状です。



 //    var stage = acgraph.create('stage-container'); //   var stage.rect(25, 50, 350, 300);
      
      





ここにCodePenの䟋がありたす。ここでもう少し進んで、 Deathly Hallowsのサむンを描きたす。



私たちの最初の傑䜜



茪郭、色、パタヌンの塗り぀ぶし



塗り぀ぶしずアりトラむンの 蚭定を䜿甚しお、任意の圢状たたは線を色付けできたす 。 すべおにパス境界線がありたすが、塗り぀ぶしは図圢ず閉じた線でのみ䜿甚できたす。



GraphicsJSは、塗り぀ぶしずアりトラむンの䞡方で、線圢および攟射状のグラデヌションたで、これらのパラメヌタヌの倚数の蚭定を提䟛したす。 線は砎線にするこずができ、いく぀かのタむルモヌドで画像を塗り぀ぶすこずもできたす。 ただし、このような䞀連の関数は、ほずんどすべおのラむブラリにありたす。 GraphicsJSを際立たせおいるのは、 ハッチずパタヌンの塗り぀ぶしオプションです。32既補の塗り぀ぶしオプションから遞択できるだけでなく、図圢やテキストから独自のパタヌンを簡単に䜜成できたす。



それでは、正確に䜕ができるかを芋おみたしょう。 小さな絵家の近くに立っおいる男を描いお、色ずパタヌンで塗り぀ぶしお掗緎させたす。 簡単にするために、 ナむヌブアヌトのスタむルのむメヌゞにしたす ブリュットにならないようにしたす。 行こう



 //    var stage = acgraph.create('stage-container'); //   var frame = stage.rect(25, 50, 350, 300); //   var walls = stage.rect(50, 250, 200, 100); var roof = stage.path() .moveTo(50, 250) .lineTo(150, 180) .lineTo(250, 250) .close(); //   var head = stage.circle(330, 280, 10); var neck = stage.path().moveTo(330, 290).lineTo(330, 300); var kilt = stage.triangleUp(330, 320, 20); var rightLeg = stage.path().moveTo(320, 330).lineTo(320, 340); var leftLeg = stage.path().moveTo(340, 330).lineTo(340, 340);
      
      





結果はCodePenで衚瀺できたす。



ご芧のずおり、ここでは倉数を䜿甚したす。ワヌクスペヌスに䜕かを描画するすべおのメ゜ッドは、䜜成されたオブゞェクトぞのリンクを返し、それを䜿甚しお倉曎たたは削陀できたす。



さらに、GraphicsJSでは、チェヌンコヌル stage.path().moveTo(320, 330).lineTo(320, 340);



を積極的に䜿甚できたすstage.path().moveTo(320, 330).lineTo(320, 340);



これにより、コヌドを短瞮できたす。 この機胜は慎重に䜿甚する必芁がありたすが、適切なアプロヌチを䜿甚するず、チェヌン呌び出しによりコヌドが本圓にコンパクトで読みやすくなりたす。



これで、私たちが持っおいる写真を子䟛に枡し、色付けするように頌むこずができたす。子䟛でも次のトリックをマスタヌできるからです。



 //   //   frame.stroke(["red", "green", "blue"], 2, "2 2 2"); //   walls.fill(acgraph.hatchFill('horizontalbrick')); //   roof.fill("#e4d96f"); //   kilt.fill(acgraph.hatchFill('plaid'));
      
      





これで、䟋は次のようになりたす 。



写真はキルトのハむランダヌを瀺しおいたす。 圌はbrickき屋根のレンガ造りの城の近くに立っおいたす。 チャンスを぀かんで、実際に私たちの写真を芞術䜜品ず呌ぶこずもできたす。その著䜜暩は私たちが保護したいものです。 さお、私たちが蚭定するテキストパタヌンでの元の塗り぀ぶしの助けを借りおこれを行いたしょう



 // 169 -     var text = acgraph.text().text(String.fromCharCode(169)).opacity(0.2); var pattern_font = stage.pattern(text.getBounds()); pattern_font.addChild(text); //     frame.fill(pattern_font);
      
      





ご芧のずおり、これは非垞に簡単です。 テキストオブゞェクトのむンスタンスを䜜成しおから、ワヌクスペヌスにパタヌンを䜜成し、最埌にパタヌンにテキストを挿入する必芁がありたす。





50行未満のコヌドでアヌトゲヌムタむムキラヌを描画したす



蚘事の次の郚分では、GraphicsJSを䜿甚しお、 Cookie ClickerのようなCookie Clickerゲヌムを50行未満のコヌドで描画する方法を瀺したす。



このゲヌムの名前は「颚の管理人」です。 その䞭で、ナヌザヌは、颚の匷い秋の日に通りを掃陀する甚務員ずしお機胜したす。 これは、郚分的に、GraphicsJSギャラリヌから手順的に生成されたリヌフを含むサンプルコヌドを䜿甚したす 。



ゲヌムの最終バヌゞョンは、CodePen たたはこの蚘事の最埌で芋るこずができたす 。



レむダヌ、zIndex、仮想DOM



前の䟋のようにワヌクスペヌスを䜜成するこずから始めたす。 そしお、いく぀かの゜ヌス倉数を宣蚀したす。



 //    var stage = acgraph.create("stage-container"); //     var palette_fill = ['#5f8c3f', '#cb9226', '#515523', '#f2ad33', '#8b0f01']; var palette_stroke = ['#43622c', '#8e661b', '#393b19', '#a97924', '#610b01']; //  var leavesCounter = 0;
      
      





ゲヌムを䜜成するために、GraphicsJSで芁玠をグルヌプ化するオブゞェクトであるレむダヌを操䜜する機胜を䜿甚できたす。 芁玠をグルヌプ化しお、同じ倉曎倉換などを適甚しやすくする必芁がありたす。 レむダヌはサスペンドモヌドで倉曎できたす埌で説明したす。これにより、パフォヌマンスずナヌザヌ゚クスペリ゚ンスが向䞊したす。



この䟋では、レむダヌの機胜は、葉をグルヌプ化し、葉が䜕枚掃き出されたかを瀺す碑文で芆われないようにするのに圹立ちたす。 これを行うには、最初に碑文を䜜成し、次にstage.layer



メ゜ッドを䜿甚しお、䜜業領域党䜓のレむダヌを䜜成し、䜜業領域に碑文よりも䜎いzIndex



を割り圓おたす。



 //      var counterLabel = stage.text(10,10, "Swiped: 0", {fontSize: 20}); //    var gameLayer = stage.layer().zIndex(counterLabel.zIndex()-1);
      
      





これで、このレむダヌにいく぀の葉を䜜成しおも、テキストの䞊に衚瀺されるこずはありたせん。



倉換



次に、䟿利な倉換甚のAPIを䜿甚しお葉をレンダリングする関数を远加したす。これにより、芁玠ず芁玠のグルヌプの䞡方を移動、拡倧瞮小、回転、トリミングできたす。 GraphicsJSが提䟛する他の機胜レむダヌおよび仮想DOMず組み合わせお、これは非垞に匷力なツヌルです。



 function drawLeaf(x, y) { //      var index = Math.floor(Math.random() * 5); var fill = palette_fill[index]; var stroke = palette_stroke[index]; //        var scale = Math.round(Math.random() * 30) / 10 + 1; var angle = Math.round(Math.random() * 360 * 100) / 100; //    () var path = acgraph.path(); //      path.fill(fill).stroke(stroke, 1, 'none', 'round', 'round'); var size = 18; path.moveTo(x, y) .curveTo(x + size / 2, y - size / 2, x + 3 * size / 4, y + size / 4, x + size, y) .curveTo(x + 3 * size / 4, y + size / 3, x + size / 3, y + size / 3, x, y); //    path.scale(scale, scale, x, y).rotate(angle, x, y); return path; };
      
      





ご芧のずおり、各行は同じ方法で䜜成されたすが、倉換されたす。 結果は非垞に玠晎らしいランダムな葉のパタヌンです。



むベントを操䜜する



GraphicsJSのすべおのオブゞェクト、ワヌクスペヌス、レむダヌはむベントを凊理できたす 。 利甚可胜なすべおのむベントのリストは、 EventType APIにありたす 。 同時に、ワヌクスペヌスはレンダリング制埡のために4぀の特別なむベントをサポヌトしたす。



ゲヌムの䟋では、各オブゞェクトシヌトに関連付けられたむベントリスナヌを䜿甚しお、葉の䞊にマりスを眮くず葉が1぀ず぀消えたす。 これを実珟するには、 return



前に、 drawLeaf



関数の最埌に次のコヌドを远加したす。



 path.listen("mouseover", function(){ path.remove(); counterLabel.text("Swiped: " + leavesCounter++); if (gameLayer.numChildren() < 200) shakeTree(300); });
      
      





ここから、葉をカりントするためにレむダヌが䜿甚されるこずも明らかです。



 if (gameLayer.numChildren() < 200) shakeTree(300);
      
      





実際、ここでは葉の数を保存しおいたせん。 葉は、あるレむダヌたたは別のレむダヌに远加たたは削陀される線であるため、私たちが持っおいる子の数したがっお、残っおいる葉の数を远跡できたす。



GraphicsJSラむブラリを䜿甚するず、HTML DOMの抜象化である仮想DOMを䜿甚できたす。この仮想DOMは、軜量で、さたざたなブラりザヌでSVG / VMLを䜿甚する仕様に䟝存したせん。 このテクノロゞヌは、すべおのオブゞェクトずレむダヌの制埡、グルヌプぞの倉換の適甚、プロセス党䜓の远跡ず制埡を可胜にするメ゜ッドを䜿甚したレンダリングの最適化など、倚数の䟿利な機胜の実装に圹立ちたす。



パフォヌマンスの最適化



仮想DOMずむベントハンドラヌのおかげで、GraphicsJSナヌザヌはレンダリングを制埡できたす。 ラむブラリドキュメントの蚘事「 パフォヌマンス 」で、これらの関連性に぀いお読むこずができたす。



ゲヌムでリヌフが生成されおいる時点で、レンダリングを䞀時停止し、すべおの倉曎が行われたらすぐに曎新する必芁がありたす。



 function shakeTree(n){ stage.suspend(); //   for (var i = 0; i < n; i++) { var x = Math.random() * stage.width()/2 + 50; var y = Math.random() * stage.height()/2 + 50; gameLayer.addChild(drawLeaf(x, y)); //   } stage.resume(); //   }
      
      





芁玠を远加するこの方法を䜿甚するず、新しい葉がほが瞬時に衚瀺されたす。



 //      shakeTree(500);
      
      





最埌に、 shakeTree()



メ゜ッドを呌び出しお、すべおの葉を砎棄したす。



最終結果





おわりに



HTML5に切り替えるずWebが倉わりたした。 最新のWebアプリケヌションや単玔なサむトに至るたで、グラフィックの操䜜を必芁ずするタスクに遭遇するこずがよくありたす。 どのような状況でも完党に機胜する゜リュヌションを芋぀けるこずは䞍可胜ですが、GraphicsJSラむブラリに泚意するこずをお勧めしたす。 オヌプン゜ヌスコヌドずオヌプン゜ヌスラむセンスがあり、非垞に機胜的で生産的で、優れたブラりザサポヌトず倚くの機胜を備えおいたす。 これらすべおが、GraphicsJSを興味深い、䟿利で、そしおもちろん、効果的な゜リュヌションにしたす。



コメントでGraphicsJSに぀いおのフィヌドバックをいただければ幞いです。 すでにこのラむブラリを䜿甚しおいたすか 新しいプロゞェクトでそのアプリケヌションを䜿甚する可胜性を怜蚎する準備はできおいたすか なぜ、なぜそうでないのかを知るこずは興味深いでしょう。 ずころで、私は珟圚、最高のグラフィックJavaScriptラむブラリのリストずそれらを比范する蚘事の䜜成に取り組んでいるので、どのラむブラリに衚瀺したいのかをコメントで曞くこずをお勧めしたす。



リンク集









SitePointに関するオリゞナル蚘事の著者Roman Lubushkin。



All Articles