JavaScript甚のSVGりィゞェットを曞いたように

免責事項

正盎に蚀っお、最初は仕事をしおいたした-ハブで補品に぀いお曞くこずです。 最初は、通垞のPR゚ッセむに限定しお、コンポヌネントの䞻芁な機胜を詳现に焊点を圓おずに説明するこずにしたした。 もちろん、このようなストヌリヌは、補品のすべおのチップを完党に明らかにするこずを可胜にしたす。 䞀方、3番目の段萜に぀いおあくびをしたこずは確かです。



したがっお、この蚘事を著者だけでなく読者にも圹立぀ようにしようず思いたす。 私たちが䜕をしたかではなく、どのようにしたかを説明したす。 圓然、私たちが盎面した仕事から始めたす。





挑戊する



あなたが耇雑なSCADAシステム、ダッシュボヌド申し蚳ありたせんが、この単語のロシア語ぞの明確な翻蚳は芋おいたせん、むンタラクティブなメトリック管理システムを実装するWebプログラマヌ、たたはあなたのWebサむトに時蚈を挿入する必芁があるず想像しおくださいデザむン。 この堎合、あらゆる皮類のスケヌル、ツむスト、矢印英語ではこれをゲヌゞず呌びたす、時蚈、その他の「デバむス」、堎合によっおはむンタラクティブなものを远加する必芁がありたす。



䞀芋、この問題は非垞に簡単に解決されたす。 たずえば、 Google Gaugeには無料のコンポヌネントがあり、同じGoogleにはリク゚ストに応じおさたざたなものがありたす。 䞀方、これらのラむブラリのほずんどでは、オプションのセットは通垞制限されおいたす。 自分で䜕かをする必芁があるずすぐに、「自分で曞きやすい」ずいう原則が機胜し始めたす。



したがっお、私たちのタスクは、既存の「ツむスト」をカスタマむズできるだけでなく、れロから自分で䜜成できるシステムを䜜成するこずでした。 このシステムは、グラフィックプリミティブ幟䜕孊的圢状、矢印、「詊隓管」、「ばね」などの特別な芁玠などからりィゞェットを組み立おるこずができるようになっおいたす。 さらに、プログラマヌが個々のりィゞェット芁玠の倀たずえば、テキストボックス内の数字やスケヌル内の矢印の䜍眮をバむンドできるスクリプト蚀語を開発したかったのです。



そのため、2人のプログラマヌ、QA 少し埌に接続ずプロダクトマネヌゞャヌ「ナヌザヌが䞍快たたは困難なため」を匷制的に党員が䜜業を䞭断し、すべおをやり盎す のチヌムは、幎末幎始の盎埌に開発を開始したした。



この問題は、プロゞェクトの䜜業を開始した時点で、Windows Forms甚の類䌌の補品が既にあったずいう事実によっお促進されたした。 そこからWindows甚のりィゞェットオブゞェクトモデルずりィゞェット゚ディタを正垞にドラッグしたした。



解決すべきいく぀かの技術的なタスクに盎面したした。



   JavaScript



枠組み

始める前に、ツヌルを遞択する必芁がありたした。 私たちは「JSを調理する方法がわからない」ず叫ぶホリバヌずinを呌ぶこずに挑戊したすが、それでも私は蚀いたす。 「玔粋な」JavaScriptで曞くこずは、プログラマヌが過床に熱心で、泚意を払い、「RAM」が倚すぎるこずを芁求するタスクです。 カスタム開発の経隓から、玔粋なJavaScriptでのRIAアプリケヌションの高品質な開発は、FlashたたはSilverlightを䜿甚しお同等の品質のシステムを䜜成するよりも1.5〜2倍時間がかかるず蚀えたす安心しおください 。



私たちの堎合、プロのSilverlightチヌムが再蚓緎されるこずになっお問題が悪化したしたたた、Microsoftの戊略家は自分の開発者を困らせるこずがありたす。 したがっお、「玔粋な」JSを䜿甚しお同じレベルに達するには、数幎ず2、3の「マヌゞされた」補品が必芁になりたす。



ただし、状況から抜け出すための非垞に良い方法を芋぀けたした。ずころで、JavaScriptでRIAを䜜成するすべおの.NET開発者に積極的に掚奚したす。 この出力は、Microsoftによっお開発されおいるScriptず呌ばれるフレヌムワヌクでした。 Cでコヌドを蚘述し、JavaScriptに倉換できたす。 さらに、正盎に蚀いたす。出力のJSコヌドの品質は非垞にたずもです。 もちろん、そこにある関数のセットはかなり制限されおいたすが、個々のメ゜ッドをJSで完党に実装する機䌚を節玄し、その埌、結果のファむルに倉曎を加えずに倉換されたす。 䞀般に、Cで蚘述する堎合は、詊しおみるこずをお勧めしたす。



建築



SVG察 キャンバス
   HTML5を䜿甚しお開発を行う必芁があるこずがすぐに明らかになりたした。 確かに最初に尋ねた質問は、SVGずCanvasの遞択でした。



䞀方では、SVGは、゚ディタヌで個々のオブゞェクトずプリミティブから組み立おられたりィゞェットを操䜜するのに最適でした。 䞀方、SVGのパフォヌマンスずさたざたなブラりザでのサポヌトを恐れたした。 コンポヌネントが通垞は最新バヌゞョンのGoogle Chromeでのみ機胜するような状況にはなりたくありたせんでした。 さらに、重芁なポむントはモバむルデバむスのサポヌトでしたiOS、Android、その他の動物園。



Canvasを芋るず、倚くのブラりザヌでのハヌドりェアサポヌトは明らかなプラスであり、明らかなマむナスはアニメヌション䞭のオブゞェクトの耇雑な再描画の必芁性でしたたずえば、矢印を移動するず、その䞋のオブゞェクトの䞀郚を再描画する必芁がありたす。



少し考えた埌、レンダリングシステム党䜓を、SVGたたはCanvashello、Capの仕様に䟝存しない抜象化で蚘述する必芁があるこずに気付きたした。 その埌、特定のテクノロゞを䜿甚しおオブゞェクトをレンダリングおよび再描画するために、クラスの別個のセットが実装されたす。 最初のバヌゞョンでは、回転ごずに画像を再描画するのではなく、角床属性を䜿甚しお矢印をひねる機胜に非垞に惹かれたため、SVGに限定するこずにしたした。 さらに、暙準のSVGアニメヌションたた、これには倧きな問題がありたしたずCSSを䜿甚しお、りィゞェットスタむルを制埡したいず考えたした。



したがっお、すべおのりィゞェットは玔粋なSVGで描画されたす。



オブゞェクトモデル
    少なくずも゚ディタヌを積極的に䜿甚するWindows Forms甚の既補のシステムが既にあるずいう事実を考慮しお、同じオブゞェクトモデルを基本ずしお採甚し、Webに少し適応させるこずにしたした。



開発がスクリプトで実行されたこずを考慮するず、モデルの移怍は平凡なコピヌアンドペヌストに削枛されたした。 残念ながら、1぀のコヌドベヌスを離れる詊みはすべお倱敗したした。 動䜜、レンダリング、その他のささいなこずにはあたりにも倚くの違いがありたした。 このため、倚数の条件付きディレクティブずブランチが登堎したしたが、コヌドを理解するこずは難しくなり、良いこずよりも害が倧きくなりたした。 その結果、DRY原則は害にならないこずが決定されたした。 時間が瀺したように、私たちはすべおを正しく行いたした。Webパヌツのコヌドには、Windowsパヌツず実質的に同䞀の郚分はありたせんでした。



ただし、客芳的にするために、C補品ずScript補品の間のコヌド分​​離の成功䟋がありたす。



連茉
     䜜業の開始点ずしお機胜するWinFormsりィゞェットを保存するために、独自のバむナリ圢匏を䜿甚したした。 この圢匏のファむルは、りィゞェット゚ディタヌによっお読み取られお保存されたした。 䞀方、私はりィゞェットをWebバヌゞョンのJavaScriptに「ネむティブ」に蚭定するこずを本圓に望んでいたした。 明らかに、このためにJSONを遞択したした。



最初は、りィゞェットの説明を含むJSONがナヌザヌ぀たり、補品を䜿甚するプログラマヌによっお䜜成されるこずが蚈画されおいたしたが、その埌、このアむデアから少し離れたした。 りィゞェットが゚ディタヌで゚クスポヌトされるず、オブゞェクトの説明を含むJSONが䜜成されたす。 最初のバヌゞョンでは、最小の抵抗のパスを取り、.NET Framework 3.5に付属する暙準のJSON-Serializerをねじ蟌みたした。 実装の詳现には觊れたせんが、りィゞェットのオブゞェクトモデルは暙準的な方法でJSONにシリアル化され、結果はプログラマに返されたす。 りィゞェットをペヌゞに远加するずき、プログラマヌはこのJSONをコンストラクタヌパラメヌタヌずしおJavaScriptで枡したす。 りィゞェットを䜜成するずき、JSONぱンゞンによっお解析され、SVGプリミティブのセットがその䞊に構築されたす。



最も基本的な欠点の1぀は、近い将来に既に蚈画されおいる戊いであり、結果のJSON蚘述に䞍必芁な情報が豊富にあるこずです。 これは、暙準のシリアル化メカニズムを䜿甚し、䞍芁なプロパティの束を含む「珟状のたた」のオブゞェクトのコピヌを取埗するためですたた、すべおのパブリックフィヌルドをシリアル化する必芁がありたす。 このため、JSONの蚘述は巚倧に芋え、倚くのスペヌスを占有したす。 JSONむンスペクタヌを特別に䜜成しお、 JSONに特別な圢匏の説明をロヌドするこずで、プログラマヌがりィゞェットの配眮を確認できるようにしたした。



ちなみに、りィゞェットの䜜成時にJSONパラメヌタヌを倉曎する機胜を远加したした。そのため、䞀般的な説明があり、詳现を倉曎するこずは非垞に簡単です。たずえば、スケヌルのスケヌルを倉曎したり、矢印を非衚瀺にしたす。



実装



アニメヌション
       jQuery スケヌルの矢印がほずんどの堎合「量子ゞャンプ」である倀から別の倀に移動するのではなく、すべおの䞭間倀をスムヌズに枡し、目的の倀を少し超えお、そこに゚レガントに戻るこずは明らかです。 さらに、りィゞェットがプロセッサの146を消費しないようにしお、このスムヌズな移動を実行するこずが重芁です。



䞀般的に、最初は正盎にCSSアニメヌションを䜿甚しようずしたした...残念ながら、私たちは2週間で負けおしたいたした。 これはおそらく最も明るい瞬間であり、1぀の暙準で動䜜したくないブラりザから動物園によっお生成されたWeb開発の機胜が完党に明らかになりたす。

その結果、 クォッドラむセンスがChrome非ラむセンスInternet Explorerであるこずが完党に明らかになった埌、私たちはJavaScriptで奜みず遊女を䜿っお独自のアニメヌションを䜜成したした。 これは私たちの手を倧きく解きたした。 たずえば、加枛速やその他の矎しさに関するほずんどすべおのオプションを実装できたした。



すべおが遅くなるずいう䞻な懞念は無駄であり、りィゞェット党䜓を矢印の䜍眮の小さな倉化に再描画するのをやめるずすぐに、すべおが飛び始めたした。 結論-通垞、SetIntervalによる最適化された「手動」再描画は、CSSアニメヌションのパフォヌマンスにほずんど劣りたせんが、すべおのブラりザヌで同じように機胜したす。



CSS
      CSS

私たちのタスクは、CSSで個々のりィゞェット芁玠の色を構成する機胜をプログラマに提䟛するこずでした。 䞀般に、ここでは問題はありたせん。 SVG芁玠があり、クラスがあり、このクラスの蚭定を持぀CSSがありたす。 倱望した唯䞀のこずは、CSSでSVGの募配を適切に蚭定できないこずでした。 仕様により、SVGオブゞェクトのグラデヌション塗り぀ぶしを䜿甚するには、最初に同じSVGで宣蚀的に蚘述する必芁がありたす。



そのため、JavaScriptでオブゞェクトのグラデヌション塗り぀ぶしを蚭定できる別のメ゜ッドを䜜成する必芁がありたした。 もちろん、これによりプログラマヌはこの塗り぀ぶしを蚭定するこずができたしたが、残念ながら、圓初の目的どおり、CSSのすべおの「蚭蚈」蚭定を行うこずができたせんでした。



もう1぀の非垞に䞍快な瞬間は、SVGに円錐圢のグラデヌション塗り぀ぶしがないこずです。 これは、たずえば赀から緑に滑らかに倉化する色のスケヌルを䜿甚するツヌルにずっお、非垞に䟿利な塗り぀ぶし方法です。 したがっお、WinFormsの倚くのりィゞェットで䜿甚されおいたした。 円錐募配線圢を近䌌する必芁がありたしたが、これは垞に成功するずは限りたせん。



双方向性
   -  ,    基本的に、ナヌザヌが矢印たたはスラむダヌを匕いお新しい倀を蚭定できるようにりィゞェットを䜜成したした。 もちろん、りィゞェットはコヌルバックを呌び出しおJavaScriptに通知したす。



mousedownずmouseupの凊理は、りィゞェットが挿入されたdivに察しお行われたした。 マりスボタンのクリックで、ナヌザヌがクリックした芁玠を刀断し、それに応じおさらにロゞックを構築したした。



この堎合、ナヌザヌが比范的耇雑な境界を持぀領域をクリックするタむミングを刀断するのはかなり難しいタスクでした。 「通垞の」蚀語では、HitTestメ゜ッドが通垞これに䜿甚されたすが、SVGのJavaScriptでは、残念ながらそうではありたせん。



領域の境界は通垞、ポリゎンではなくベゞ゚曲線によっお蚭定されるため、角床の加算などの単玔なアルゎリズムを適甚するこずはできたせんでした。 ほずんどのオブゞェクトのクリックをテストするには、バりンディングボックスが非垞に適しおいたすが、䞉日月などの倧きくお薄い䞉日月圢の芁玠の圢匏には䟋倖がありたす。



最終的には、各コンポヌネントのHitTextを個別に蚘述し、分析ゞオメトリを蚘憶し、オブゞェクトをより単玔なプリミティブで近䌌するこずにしたした。



ナヌザヌのアクションに応じおりィゞェットを再描画し始めたずきに、別の小さなタスクが発生したした。 たずえば、ナヌザヌは矢印を「぀かんで」、非垞に高速でねじり始めたす。 圓然、再描画するこずがたくさんありたす。 ベクトルSVGを䜿甚する利点は、移動するオブゞェクトのみを再描画およびほずんどの堎合は回転し、他のオブゞェクトには觊れないこずです。Canvasを䜿甚するず、矢印の䞋にオブゞェクトも再描画する必芁がありたす。 䞀方で、時々かなりの量を曞き盎さなければならなかった。



もちろん、最初はすべおが非垞に遅かったのですが、数時間の最適化の埌、ちょうど動き始めたした。 そしお、ナヌザヌがりィゞェットに耇雑なスクリプトを远加できるようになり、盎接移動する矢印だけでなく、スクリプトによっおそれに関連する他のコンポヌネントの束も再描画するようになりたした。



ずころで、興味深いメモファむルシステムから読み蟌たれたペヌゞのJavaScriptのロヌカルバヌゞョンは、同じブラりザヌの同じペヌゞ䞊ではなく、サヌバヌから読み蟌たれたペヌゞよりもはるかに遅く動䜜したす。 誰が理由を知っおいるのか、コメントで共有しおください。



タッチデバむスの「ゞェスチャ」のサポヌトを実装するには、完党に異なるむベント、たずえば、タッチスタヌト、タッチ゚ンド、タッチムヌブなどを凊理する必芁がありたす。 したがっお、このサポヌトは個別に䜜成する必芁がありたした。



スクリプトず内郚ロゞック
 .        SharpShooter Gaugesは、内郚スクリプトをサポヌトするこずで有名でした。 これらのスクリプトは、グラフィック芁玠の䜍眮のスケヌルずガむドぞのバむンドを決定するため、りィゞェットの開発における重芁なポむントでした。



さらに、スクリプトを䜿甚しお、芁玠のサむズをバむンドしたり、衚瀺されたテキストをフォヌマットしたりできたす。 スクリプトの存圚により、個々のオブゞェクトずその内郚のプリミティブ間の盞互䜜甚を蚘述する、ほずんどあらゆる耇雑さのりィゞェットを䜜成できたした。このタスクを、補品にりィゞェットを埋め蟌むプログラマヌカプセル化、ええの肩に転送するこずはありたせん。



最初は、内郚スクリプトをJavaScript構文に完党に倉換するずいうアむデアがありたした。 しかし、WinFormsりィゞェットがシステムの新しいバヌゞョンで突然機胜しなくなるず理解できない叀いナヌザヌに぀いお考えお、内郚スクリプトをそのたたにしお、゚クスポヌト時にスクリプトをJSに倉換するこずにしたした。 しかし、この英雄的なむニシアチブの量は、考えられない想像を超えるすべおの条件を䞊回り、リリヌスをかなり遅らせたした。



内郚スクリプトの無条件の胜力にもかかわらず、率盎な短所がありたす。



たず、問題は、オブゞェクトたずえば、日付を文字列に暗黙的にキャストするこずにありたす。 実際には、JavaScriptず.NETでは日付が異なる方法で文字列にキャストされるため、WindowsずHTML5のバヌゞョンにかなりの非互換性が远加されたす。



第二に、最初は耇雑なスクリプトリンクが存圚する堎合、りィゞェットのパフォヌマンスが急激に䜎䞋したした。 しかし、私たちは心を倱いたせんでした。 箄1週間埌、耇雑なスクリプトはアニメヌションに事実䞊圱響を䞎えなくなり、IEでオブゞェクトの非垞に高速なドラッグアンドドロップでのみスロヌダりンが顕著になりたした。 すべおがクロムで完璧に機胜したした。 これでやめるこずにしたした。



別の小さな問題
   -\"\" この蚘事を読んだ埌、他の人が蚀及すべき他の問題に぀いおコメントをしたので、このセクションではそれらの最も兞型的なものに぀いお説明したす。



テキストのサむズを蚈算できない。 SVGでは、他の倚くのグラフィックシステムず同様に、レンダリング埌にテキストがどのサむズになるかを事前に決定する方法はありたせん。 WinFormsのバヌゞョンはこのGDI関数に完党に䟝存しおいるため、その実装のためにトリッキヌなスキヌムを考案する必芁がありたした。 これで、すべおのテキストが2回描画されたす。 䞀床-寞法を芋぀けるために、そしお通垞の䜍眮決めで二床目。



iOSデバむスでのRGBAの問題。 開発の途䞭で、異なるモデルのデバむスでりィゞェットをテストするず、iPhone 4ずiPadでは塗り぀ぶしが完党に黒であるこずがわかりたした。 もちろん、このためのりィゞェットは非垞にゎシックで面癜いように芋えたしたが、それでも完党に間違っおいたす。 少し調べた結果、色を決定するために䜿甚されたRGBA圢匏はiOS4 +のSafariではサポヌトされおいないこずに気付きたした驚くべきこずに、すべおがiPhone 3Gで機胜したした。 その結果、RGBA倀を䜿甚堎所に関係なく2぀の個別の倀色ず透明床に分割したした。 助けた。



結論

「マヌケティングのでたらめ」の蚘事の偏りを避け、技術的な芳点から倚かれ少なかれ有甚にしたいず私はすでに蚀った。 したがっお、JavaScriptでSVGを操䜜する際に圹立぀いく぀かの結論を瀺したす。



結論1.最新のブラりザのほずんどは、SVGで通垞の操䜜をサポヌトし、芖芚的に同じ結果をもたらしたす。

結論2. スクリプトフレヌムワヌクは、Cを䜿甚しおJavaScriptずHTML5のRIAを開発できるように、その仕事をうたく行いたす。

結論3.暙準のCSSアニメヌションはただ生でブラりザヌに䟝存しおいるため、䜜業に䜿甚できたせん。 SVGの䞀郚の再描画に基づく「手動」アニメヌションは、どこでも同じように機胜し、最適化を最小限に抑えお、たったく遅くなりたせんIEでも。

結論4. CSSから通垞、SVG芁玠のスタむルを蚭定できたす。 グラデヌション塗り぀ぶしを構成するには、最初に同じSVGで宣蚀する必芁があるため、CSSだけを行うこずはできたせん。 残念ながら、円錐鋳造はサポヌトされおいたせん。

結論5. iOSデバむス最も叀いものを陀くは、RGBAカラヌをサポヌトしおいたせん。 したがっお、スタむルを蚭定するずきは、RGBずアルファを個別に指定する必芁がありたす。

最埌の結論。 私たち自身が奜きなクヌルな補品を䜜りたした:)。

もちろん、 ここで私たちに䜕が起こったのかを芋るこずができたす 。



All Articles