vue+canvasでタイムラインを描く方法

vue+canvasでタイムラインを描く方法

この記事では、参考までにvueキャンバスのタイムライン描画の具体的なコードを紹介します。具体的な内容は次のとおりです。

最近、キャンバス描画タイムラインを勉強しています。ここに直接コードがあります。共有することでお役に立てれば幸いです。効果は次のとおりです。

コードは以下のとおりです。これをvueプロジェクトにコピーして直接プレビューすることができます。

<テンプレート>
  <div>
    <canvas id="time_line" width="1200" height="27"></canvas>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: 'pathwaytrack',
  データ() {
    戻る {
      画面幅: document.body.clientWidth
    }
  },
  マウント() {
    それを = これとする
    that.carveTimeScale(1200, 1, 10, 0, 10)
    キャンバスカラーを '#999999' にします
    initTime = 12000 とします
    間隔を設定する(() => {
      初期化時間 += 1000
      that.carveTimeScale(1200, 1, 10, initTime, 10)
    }, 1000);
  },
  メソッド: {
    /**
     * 分割ピクセルスケール* width: 幅 (ミリ秒): 小さいスケールの場合はミリ秒数 pxMs: 小さいスケールの場合は 10 ピクセル pageShowStartTime: 初期時間 (ミリ秒) 大きい間隔の継続時間 (秒)
     */
    carveTimeScale(幅、ミリ秒、ピクセル数、ページ表示開始時間、間隔時間) {
      canvasId = document.getElementById('time_line') とします。
      ctx = canvasId.getContext('2d') とします。
      ctx.clearRect(0, 0, 1200, 60)
      ctx.fillStyle = '#999999'
      // Apple 2X 画面で異常な表示を防ぐため // Apple 2X 画面で異常な表示を防ぐため var getPixelRatio = function (context) {
        var backingStore = context.backingStorePixelRatio ||
          context.webkitBackingStorePixelRatio ||
          context.mozBackingStorePixelRatio ||
          コンテキスト.msBackingStorePixelRatio ||
          コンテキスト.oBackingStorePixelRatio ||
          コンテキスト.backingStoreピクセル比 || 1
        戻り値 (window.devicePixelRatio || 1) / backingStore
      }
      比率 = getPixelRatio(ctx) とします。
      let msOffset = this.startOffsetTime(pageShowStartTime, ms) // 開始オフセット時間 ms
      let pxOffset = msOffset / 1000 * pxMs // 開始オフセット距離 px
      let leftDistance = 0 // 左への距離 let leftDistanceTime = 0 // 左への時間 let beginX = 0
      beginY = 0 とする
      (i = 0 とします; i < 幅 / (ms * pxMs); i++) {
        leftDistance = pxOffset + i * (ms * pxMs) // 距離 = 開始オフセット距離 + グリッド数 * px/グリッド leftDistanceTime = pageShowStartTime + msOffset + i * ms // 時間 = 左開始時間 + オフセット時間 + グリッド数 * ms
        beginX = pxOffset + i * (ms * pxMs)
        キャンバスカラー
        showTime = pageShowStartTime + beginX / pxMs * 1000 とします。
        表示時間% (間隔時間 * 1000) === 0の場合
          開始Y = 0
          ctx.font = '12px Arial'
          ctx.fillText(this.changeTime(showTime, 1), beginX + 10, 22)
          キャンバスカラー = '#999999'
          ctx.fillStyle = '#B1B1B1'
          this.drawLine(左距離、開始Y、左距離、20、キャンバスカラー、1)
        } そうでない場合 (showTime % intervalTime == 0) {
          開始Y = 0
          キャンバスカラー = '#999999'
          this.drawLine(左距離、開始Y、左距離、10、キャンバスカラー、1)
        }
      }
    },
    /**
     * 渡されたパラメータに従って線を描画します */
    描画線(開始X、開始Y、終了X、終了Y、色、幅) {
      canvasId を document.getElementById('time_line') に設定します。
      ctx = canvasId.getContext('2d') とします。
      ctx.beginPath();
      ctx.moveTo(開始X、開始Y);
      ctx.lineTo(終了X、終了Y);
      ctx.strokeStyle = 色;
      ctx.lineWidth = 幅;
      ctx.stroke();
    },
    /**
     * 左開始時間のオフセット(ミリ秒単位で返されます)
     */
    startOffsetTime(タイムスタンプ, ステップ) {
      残り = タイムスタンプ % ステップ
      残りを返す?ステップ - 残り: 0
    },
    /**
     * 帰りの時間 */
    changeTime(時間, 数値) {
      時間 = 0 とする
      分を 0 にする
      秒を 0 にする
      秒 = 時間 / 1000
      (秒 >= 3600)の場合{
        分 = (秒 - (秒 % 60)) / 60
        時間 = parseInt((分 / 60).toString())
        分 = 分 % 60
        /* eslint を無効にする */
        時間 >= 10 ? 時間 : 時間 = '0' + 時間
        分 >= 10 ? 分 : 分 = '0' + 分
        秒 = 秒 % 60
        秒 >= 10 ? 秒 : 秒 = '0' + 秒
        /* eslint を有効にする */
        時間 + ':' + 分 + ':' + 秒を返す
      }
      (秒<3600 &&秒>=60)の場合{
        時間 = '00'
        分 = parseInt((秒 / 60).toString())
        /* eslint を無効にする */
        分 >= 10 ? 分 : 分 = '0' + 分
        秒 = 秒 % 60
        秒 >= 10 ? 秒 : 秒 = '0' + 秒
        /* eslint を有効にする */
        時間 + ':' + 分 + ':' + 秒を返す
      }
      (秒数<60)の場合{
        時間 = '00'
        分 = '00'
        秒 = parseInt(秒)
        /* eslint を無効にする */
        秒 >= 10 ? 秒 : 秒 = '0' + 秒
        /* eslint を有効にする */
        時間 + ':' + 分 + ':' + 秒を返す
      }
    }
  }
}
</スクリプト>

<style lang="less" スコープ>
  キャンバス {
    背景:黒;
  }
</スタイル>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vueは水平タイムラインを実装する
  • Vueはタイムライン機能を実装する
  • 2列の水平タイムラインを実装するためのVueサンプルコード
  • VUEはタイムライン再生コンポーネントを実装します
  • Vue.jsはタイムライン機能を実装します
  • Vue+swiperでタイムライン効果を実現
  • Vueは物流タイムライン効果を実現します
  • Vue タイムライン vue-light-timeline 使用方法
  • Vueは移動可能な水平タイムラインを実装します
  • Vueはタイムライン効果を実装する

<<:  SQL 面接の質問: 時間差の合計を求める (重複は無視)

>>:  CentOS8でルートパスワードを素早く変更する方法

推薦する

MySQL 検査スクリプト (必読)

以下のように表示されます。 #!/usr/bin/env python3.5 psutilをインポー...

mysql+mybatisはストアドプロシージャ+トランザクション+複数同時シリアル番号取得を実装します

データベースストアドプロシージャ`generate_serial_number_by_date` が...

tomcat デプロイメント プロジェクトの実装と IDEA との統合

目次Tomcat でプロジェクトを展開する 3 つの方法プロジェクトをwebappsディレクトリに直...

Windows 環境での MySQL 8.0 のインストール、設定、アンインストール

ソフトウェアバージョンウィンドウズ: ウィンドウズ10 MySQL: mysql-8.0.17-wi...

Vue モバイル開発で better-scroll を使用するときにクリック イベントが失敗する問題の解決策

最近、モバイル プロジェクトの開発方法を学ぶために vue を使用し、スクロールには better-...

mysql8.0.11クライアントがログインできない問題の解決方法

この記事では、mysql8.0.11クライアントがログインできない問題の解決策を紹介します。参考まで...

Dockerコンテナのk8sデプロイメントの実装

環境: (docker、k8s クラスター)、前回 docker で起動した Java プログラムの...

nginxで複数のサーバーを簡単に構成する方法

1: nginx のインストール方法については詳しく説明しません。Baidu で検索してください。 ...

ユーザーエクスペリエンスの概要

最近では、ソフトウェアやウェブサイトのいずれの作業であっても、設計時に「ユーザー エクスペリエンス」...

Centos7サーバーの基本的なセキュリティ設定手順

pingスキャンをオフにする(役に立たないが)まずルートに切り替えるエコー 1 > /proc...

CSSを使用してAndroidシステムの読み込みアニメーションを実装する

Web には一般的な読み込みアイコンが 2 つあります。1 つは iOS の「菊」、もう 1 つは ...

データベースSQL SELECTクエリの仕組み

私たちは Web 開発者として、プロの DBA ではありませんが、データベースなしではやっていけませ...

リアルタイムコンピューティングフレームワークFlinkクラスタの構築と動作メカニズムについての簡単な説明

目次1. Flinkの概要1.1 基本的な紹介1.2 アプリケーションシナリオ2. 環境の展開2.1...

選択/フォーカス時にすべてのオプションをリストする現在のより良い方法

開発中にこのような要件に遭遇したので、将来使用するために記録しました。需要背景キーボード ショートカ...