Gojs がアリのラインアニメーション効果を実装

Gojs がアリのラインアニメーション効果を実装

DAG グラフを描画する場合、ノード間の関係はノードと矢印間の接続線によって表されます。ノードには状態があることがよくあります。ノード間の処理関係をより適切に表現するために、ロード中の状態のノードは、後続のノード間のアニメーション化された点線で表現され、処理中であることを示す必要があります。処理後は実線になります。原理は、ページが読み込まれる前に読み込みプロンプトを追加するのと同じで、より優れたインタラクティブなエクスペリエンスを提供できます。

  • では、gojs でこの効果を実現するにはどうすればよいでしょうか?破線と破線アニメーション
  • 点線と点線アニメーションの原理は何ですか?
  • 点線はなぜ蟻線とも呼ばれるのでしょうか?
  • 純粋な CSS でこれは可能ですか?

1. Gojsの実装

gojs の基本的な使用方法については、前回の記事「データ視覚化のための gojs の使用に関する簡単な紹介」を参照してください。

たとえば、国慶節が近づいており、上海から北京へ旅行したいと考えています。現在、安徽省から安徽省を経由して山東省へ向かっているとします。次のように gojs で描画します。

1. 描画

<!-- コンテナ -->
<div id="myDiagramDiv" style="height:600px;width:100%;border:1px solid black"></div>
 <!-- gojs をインポート -->
<script src="https://unpkg.com/gojs/release/go.js"></script>
 // ジェネレーター const $ = go.GraphObject.make;

// コンテナを定義します。myDiagramDiv はコンテナ ID です
const ダイアグラム = $(go.Diagram, 'myDiagramDiv');

// ノード テンプレート。各ノードの構築方法を記述します。diagram.nodeTemplate = $(go.Node, "Auto", // ボックスはテキストに自動的に適応します。$(go.Shape, "RoundedRectangle", new go.Binding("fill", "color")),
  $(go.TextBlock、{margin: 5}、新しいgo.Binding("text", "name"))
);

// ノードとリンク情報を記述するモデルを定義します。diagram.model = new go.GraphLinksModel(
  [ // ノード { キー: 'shanghai'、 名前: "出発地 上海"、 色: "lightblue" },
    { キー: '江蘇省'、名前: "江蘇省"、色: "ピンク" },
    { キー: 'anhui'、名前: "Anhui"、色: "pink" },
    { キー: '山東'、名前: "山東"、色: "オレンジ"},
    { キー: '河北省'、名前: "河北省を通過"、色: "オレンジ" }、
    { キー: 'tianjin'、名前: "Tianjin via"、色: "orange" }、
    { キー: '北京'、名前: "目的地北京"、色: "ライトグリーン" }
  ]、
  [ // 接続 { from: "上海", to: "江蘇" },
    { 発信元: "江蘇省", 宛先: "安徽省" },
    { 発信元: "安徽省", 宛先: "山東省" },
    { 発信元: "山東省", 宛先: "河北省" },
    { 発信元: "河北省", 宛先: "天津市" },
    { 発信元: 「天津」、宛先: 「北京」 }
  ]
);

この時点では、簡単な移動経路関係図は描かれていますが、点線のアニメーションはありません。

2. 破線の実装

実装された図には実線と点線の両方があるため、ここではtemplateMap必要であることに注意してください。

実線と破線のテンプレートを定義する

// 実線と点線のテンプレートを格納するコレクションを定義します。const templmap = new go.Map()
定数カラー = '#000'

//デフォルトの接続テンプレート const defaultTemplate = $(
  go.Link、
  $(go.Shape, { ストローク: 色, ストローク幅: 1 }),
  $(go.Shape, { toArrow: 'Standard', 塗りつぶし: 色, ストローク: 色, ストローク幅: 1 })
)

// 破線テンプレート、キー属性:strokeDashArray: [6, 3]
定数破線テンプレート = $(
  go.Link、
  // name: 'dashedLink'、後でアニメーションで使用されます $(go.Shape, { name: 'dashedLink',stroke: color,strokeWidth: 1,strokeDashArray: [6, 3] }),
  $(go.Shape, { toArrow: 'Standard', 塗りつぶし: 色, ストローク: 色, ストローク幅: 1 })
)

templmap.add(''、デフォルトテンプレート)
// dashed は名前で、説明は属性カテゴリを使用して指定されます: 'dashed' templmap.add('dashed', dashedTemplate)

diagram.linkTemplateMap = テンプレートマップ

モデル データで、破線として記述する必要があるエッジを見つけて、属性category: 'dashed'を追加します。名前は、定義テンプレートで指定された名前と同じである必要があります。

 { from: "anhui", to: "shandong", カテゴリ: 'dashed' },

この時点では、実線と点線の両方が描かれています。次は最終アニメーションです。

3. 点線を動かす

破線を見つけてプロパティを変更します:strokeDashOffset

2つの方法があります

  • 方法1: go.Animationは、ノードポートが相互作用するときに接続操作にスティッキー効果をもたらします。
関数アニメーション(){
  定数アニメーション = 新しい go.Animation();
  // 点線アニメーション diagram.links.each((link) => {
    const dashedLink = link.findObject("dashedLink");
    if (破線リンク) {
      アニメーション.add(dashedLink, "strokeDashOffset", 10, 0)
    }
  });

  アニメーションのイージングを Go のアニメーションに反映します。
  // 無期限に実行
  アニメーションの実行回数を無限大にする
  アニメーションを開始します。
}
アニメーション()
  • 方法2: タイムアウト
関数アニメーション(){
  定数ループ = () => {
    アニメーションタイマー = setTimeout(() => {
      const oldskips = diagram.skipsUndoManager;
      diagram.skipsUndoManager = true;
      // 点線アニメーション diagram.links.each((link) => {
        const dashedLinkShape = link.findObject("dashedLink");
        if (破線リンクシェイプ) {
          定数 off = dashedLinkShape.strokeDashOffset - 3;
          // ストロークアニメーションを設定(移動) dashedLinkShape.strokeDashOffset = (off <= 0) ? 60 : off;
        }
      });

      diagram.skipsUndoManager = oldskips;
      ループ();
    }, 180);
  }
  ループ()
}
アニメーション()

アニメーションには 2 つの方法があります。ノード ポート接続の相互作用がない場合は、最初の方法を使用してライブラリ アニメーションを実装することをお勧めします (内部的に最適化される場合があります)。アニメーションをより柔軟に制御したい場合、または最初の方法が不可能な場合は、2 番目の方法を使用してください。

この時点で、全体の効果は完成します。

2. 点線と点線アニメーションの原理

上記のコードでは、主に 2 つの主要なプロパティ、strokeDashArray とstrokeDashOffset を使用しています。

文書には 2 行あります。

詳細については、Stroke Line Dash Array (w3.org)、Stroke Line Dash Offset (w3.org) を参照してください。

その背後にはキャンバスがあり、その2つのプロパティsetLineDashlineDashOffsetあります。

参照:

mdn - setLineDah: Array 配列。交互の線分の長さとそれらの間の間隔 (座標空間単位) を表す数値の配列。 配列要素の数が奇数の場合、配列の要素がコピーされ、繰り返されます。

コード例:

関数drawDashedLine(パターン) {
  ctx.beginPath();
  ctx.setLineDash(パターン);
  ctx.moveTo(0, y);
  ctx.lineTo(300, y);
  ctx.stroke();
  y + = 20;
}

定数キャンバス = document.getElementById('キャンバス');
const ctx = canvas.getContext('2d');
y = 15とします。

破線を描画します([]);
破線を描画します([1, 1]);
破線を描画します([10, 10]);
破線を描画します([20, 5]);
破線を描画します([15, 3, 3, 3]);
破線を描画します([20, 3, 3, 3, 3, 3, 3, 3]);
drawDashedLine([12, 3, 3]); // [12, 3, 3, 12, 3, 3] に等しい

mdn - lineDashOffset: 破線のオフセットプロパティを設定します

コード例:

 var キャンバス = document.getElementById("キャンバス");
var ctx = canvas.getContext("2d");
var オフセット = 0;

関数draw() {
  ctx.clearRect(0,0, キャンバスの幅、キャンバスの高さ);
  ctx.setLineDash([4, 2]);
  ctx.lineDashOffset = -オフセット;
  ctx.strokeRect(10,10, 100, 100);
}

関数行進() {
  オフセット++;
  (オフセット>16)の場合{
    オフセット = 0;
  }
  描く();
  setTimeout(3月20日);
}

行進();

3. 点線の概念

破線: (数学的概念) 点または短い線で描かれた不連続な線。主に幾何学的図形や記号に使用されます。

点線はなぜ蟻線と呼ばれるのでしょうか?
画像ソフトウェアで選択領域を表す動的な点線は、点滅する点線が蟻の群れが走っているように見えるため、一般に蟻線と呼ばれています。
PhotoshopやAfter Effectなどのソフトウェアでは一般的です。

蟻の列: 先頭の蟻が餌や洞窟に向かってランダムな経路で歩き、2 番目の蟻がそのすぐ後ろを追って同じ経路に沿って歩き、後続の蟻が先頭の蟻の後を追って一列に歩くという動物の本能的な現象。

点線の特徴:流動性

4. CSS 描画境界線破線

CSS の border-style を使用して描画する場合、プロパティ値は 2 つあります。

  • 点線: 一連の点として表示されます。 2 つのポイント間の間隔のサイズは標準では定義されておらず、さまざまな実装によって異なります。ドットの半径は計算された境界幅の半分になります。
  • 破線: 一連の短い四角い破線として表示されます。線分の長さとサイズは標準では定義されておらず、さまざまな実装に依存します。

詳細については、mdn-border-styleを参照してください。

ネイティブ CSS プロパティでは点線効果を実現できますが、これに基づいてアニメーションを実装するのは簡単ではありません。ただし、他の CSS プロパティを使用して実現することもできます。

例:

 <div class="container">アリの列</div>
 。容器 {
  幅: 100ピクセル;
  高さ: 100px;
  パディング: 5px;
  境界線: 1px 透明の実線;
  背景: 線形グラデーション(白、白) パディングボックス、
    繰り返し線形グラデーション(-45度、黒0、黒、25%、透明0、透明50%) 0% 0% / 0.6em 0.6em;
  アニメーション: アリ 10 秒 線形 無限;
}

@keyframes アリ {
  に {
    背景位置: 100% 100%;
  }
} 

Gojs を使用して蟻の線のアニメーション効果を実装する方法に関するこの記事はこれで終わりです。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援して頂ければ幸いです。

以下もご興味があるかもしれません:
  • インタラクティブな視覚化 JS ライブラリ gojs の使い方の紹介とヒント
  • GOJS+VUEはフローチャート効果を実現します
  • Vue で gojs を参照して ER 図を描く方法の例
  • vue で gojs/jointjs を使用するサンプル コード
  • JS コンポーネント シリーズ: Gojs コンポーネント フロントエンド グラフィカル プラグイン ツール
  • gojs の実践的な高度な使用法

<<:  Founder フォント ライブラリの中国語と英語のファイル名比較表

>>:  MySQLデータベースインデックスの詳細な紹介

推薦する

海外の無料写真素材サイトベスト9

良い画像素材のウェブサイトを見つけるのは難しいです。特に無料です。良い写真には非常に目を引く視覚効果...

ローカルで起動したときに Vue プロジェクトがクッキーを保持できない問題を解決する

vueプロジェクトをパッケージ化してサーバーにデプロイし、正常にログインできるが、ローカルで起動する...

CentOS 7 での Nginx ログタイミング分割の実装手順の詳細説明

1. 分割スクリプト (splitNginxLog.sh) を作成します。 * この例では、ログ分割...

MySQL 5.7.21 解凍版インストール Navicat データベース操作ツールインストール

MySQL解凍版とNavicatデータベース操作ツールのインストールは、以下のとおりです。 1. M...

HTMLページ埋め込み動画とJSコントロール切り替え動画例の詳しい説明

まず、ページにビデオを埋め込むための HTML コードは次のとおりです。コードをコピーコードは次のと...

HTML 終了タグの問題と W3C 標準

W3C の原則によれば、XML の各開始タグには対応する終了タグが必要です。つまり、<html...

パーティショニングを使用して数十億のデータに対する MySQL データ処理を最適化する方法

MySQL が数千万のデータをクエリする場合、ほとんどのクエリ最適化の問題はインデックスを通じて解決...

MySQLの高可用性と高パフォーマンスのクラスタを構築する方法

目次MySQL NDB Clusterとはクラスター構築のための準備作業クラスターのデプロイを開始す...

vue-element-admin グローバル読み込み待機中

最近の要件:グローバルロード、すべてのインターフェースはロード待機機能を表示するかどうかを手動で制御...

Pengyou.com モバイル クライアントのダウンロード ページのデザイン共有 (画像とテキスト)

まずは簡単なデータを見てみましょう。 Googleが発表したレポートによると、 ①中国の都市の97%...

JavaScript でシンプルな Web 時計を実装する

JavaScript を使用して Web ページ クロックを実装します。効果は次の図に示されています...

Linux での MySQL 5.7.17 の最新安定バージョンのインストール チュートリアル

ソースコードを通じて Linux に最新の安定バージョンの MySQL をインストールします: my...

Vue の動的コンポーネントと非同期コンポーネントの詳細な理解

1. 動的コンポーネント <!DOCTYPE html> <html> &l...

Vueグローバルカスタム命令の実践 モーダルドラッグ

目次背景実装のアイデア成果を達成する背景最近取り組んでいるプロジェクトは、Vue2 で構築されたプロ...

MySQL 5.6 のインストール手順(画像とテキスト付き)

MySQL はオープンソースの小規模リレーショナル データベース管理システムです。現在、MySQL...