GIFアニメーション効果を模倣した自動ビデオ再生を実現するWeChatアプレットの例

GIFアニメーション効果を模倣した自動ビデオ再生を実現するWeChatアプレットの例

需要背景:

ミニプログラムページに GIF ダイナミック画像を挿入しますが、GIF 画像は通常サイズが大きいです。代わりに、自動ビデオ再生モードを使用して GIF 画像の効果をシミュレートし、ページの表示を豊かにします。ビデオを自動的に再生します。コントロール バーやサウンドはなく、自動的にループします。

技術的な問題:

WeChat ミニプログラムは同じページにあるため、複数のビデオがある場合 (ビデオは 3 つ以下にすることをお勧めします)、遅延が発生したり、クラッシュしたりすることがあります。
developer.weixin.qq.com/community/d…

プラン:

ミニプログラムコミュニティの議論計画を参照してください。ビデオが画面の表示領域に表示されない場合は、画像を使用して場所を占め、画面に表示され、画像をビデオに置き換えて自動的に再生します。

コードノート:

ビデオ タグは wx:if によって制御され、イメージ タグは可視性スタイルによって占有されます。

<view class="container" style="width: {{videoWidth}}rpx;height: {{videoHeight}}rpx">
  <image class="image" style="visibility: {{play ? 'hidden' : 'visible'}};" id="image_{{videoId}}" src="{{poster}}" />
  <video class="video" wx:if="{{play}}" id="video_{{videoId}}" controls="{{controls}}" object-fit='contain' show-center-play-btn="{{showCenterPlayBtn}}" enable-progress-gesture="{{enableProgressGesture}}" direction="{{direction}}" enable-play-gesture="{{enablePlayGesture}}" muted="{{muted}}" loop="{{loop}}" src="{{videoUrl}}" />
</ビュー>
。容器 {
    位置: 相対的;
    幅: 100%;
    高さ: 100%;
}
。画像 {
    位置: 絶対;
    上: 0;
    左: 0;
    右: 0;
    下部: 0;
    zインデックス: 10;
    幅: 100%;
    高さ: 100%;
}
。ビデオ {
    幅: 100%;
    高さ: 100%;
}
成分({
    プロパティ:
        // ビデオの幅 videoWidth: {
            タイプ: 数値、
            値: 0,
        },
        // ビデオの高さ videoHeight: {
            タイプ: 数値、
            値: 0,
        },
        // ビデオポスター/カバーポスター: {
            タイプ: 文字列、
            価値: ''、
        },
        // ビデオリンク videoUrl: {
            タイプ: 文字列、
            価値: ''、
        },
        // 再生進行状況バーコントロールを表示するかどうか: {
            タイプ: ブール値、
            値: false、
        },
        // 中央の再生ボタンを表示するかどうか showCenterPlayBtn: {
            タイプ: ブール値、
            値: false、
        },
        // ミュートされていますか: {
            タイプ: ブール値、
            値: true、
        },
        // ミュートボタンを表示するかどうか showMuteBtn: {
            タイプ: ブール値、
            値: true、
        },
        // ジェスチャーコントロールの進行を有効にするかどうか enableProgressGesture: {
            タイプ: ブール値、
            値: false、
        },
        // ジェスチャーコントロールの再生を有効にするかどうか enablePlayGesture: {
            タイプ: ブール値、
            値: false、
        },
        // 方向: {
            タイプ: 数値、
            値: 0,
        },
        //再生開始時間を秒単位で指定します showPlayTime: {
            タイプ: 数値、
            値: 0,
        },
        // ビデオ ID (一意の識別子)
        ビデオID: {
            タイプ: 文字列、
            価値: ''、
        },
        // 再生するかどうか play: {
            タイプ: ブール値、
            値: false、
        },
        //再生をループするかどうか loop: {
            タイプ: ブール値、
            値: true、
        },
    },
    データ: {
        paly: false, // 再生するかどうか context: null, // 作成されたビデオインスタンスオブジェクト},
    生涯:
        添付() {
            this.videObserve();
        },
    },
    メソッド: {
        // ビデオコンポーネントが可視領域に入るかどうかを監視する videObserve() {
            this._observer = this.createIntersectionObserver({
                すべて観察: true、
            });

            this._observer.relativeToViewport().observe(`#image_${this.data.videoId}`, (res) => {
                //res.intersectionRatio === 0 は交差がないことを意味しますif (res.intersectionRatio === 0) {
                    this.setData({
                        再生: 偽、
                    });
                } それ以外 {
                    const ctx = this.data.context || wx.createVideoContext(`video_${this.data.videoId}`, this);
                    (ctx)の場合{
                        この.setData(
                            {
                                コンテキスト: ctx,
                                プレイ: 真、
                            },
                            () => {
                                // 遅延は wxml ノードが作成されるのを待ち、ノードを取得した後に再生します。そうしないと再生が失敗する可能性があります。setTimeout(() => {
                                    ctx.play();
                                }, 400);
                            }
                        );
                    }
                }
            });
        },
    },
});

レンダリング

ビデオは可視領域に入った後にのみ読み込まれ、再生が開始されます。ビデオが可視領域から外れると、play=false が設定され、ビデオタグがクリアされ、つまりビデオがクリアされます。

今後の最適化ポイント

現在、ビデオのレンダリングが開始されると、黒い画面が表示されます。後で白に変更できるかどうかを確認します(白は黒よりも受け入れられます)、ミニプログラムビデオのサポートにも依存します。

現在、1 つの画面で同時に再生できるビデオの数に制限はありません。ビデオの幅と高さが比較的小さい場合、1 つの画面に多くのビデオが表示され、遅延やクラッシュが発生する可能性があります。

要約する

WeChatミニプログラムを使用してビデオを自動的に再生し、GIFアニメーションを模倣する方法についての記事はこれで終わりです。ビデオを自動的に再生し、GIFアニメーションを模倣するその他の関連ミニプログラムについては、123WORDPRESS.COMで以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も123WORDPRESS.COMを応援してください。

以下もご興味があるかもしれません:
  • 画像をクリックするとビデオが自動的に再生されます

<<:  Dockerプライベートウェアハウスの構築とインターフェース管理の詳細な説明

>>:  MySQL に大量のデータを挿入する 4 つの方法の例

推薦する

実務経験7年のフロントエンドスーパーバイザーによる経験共有

今日はベテランの貴重な経験を共有します。著者は技術管理の経験が7年あり、多い時は80人以上を率いてい...

JDカルーセル効果を実現するための純粋なHTMLとCSS

JD カルーセルは、動的な効果を追加せず、主に位置決めの知識を使用して、純粋な HTML と CS...

mysql バックアップ スクリプト mysqldump の使い方の詳細な説明

この記事では、参考までにMySQLバックアップスクリプトを紹介します。具体的な内容は次のとおりです。...

XHTML の一般的なタグ

XHTML タグとは何ですか? XHTML タグ要素は、XHTML ドキュメントの基本的なコンポーネ...

格納可能なセカンダリメニューを実装するための JavaScript

JavaScriptで格納可能なセカンダリメニューを実装するための具体的なコードは参考までに。具体...

IdeaはリモートDockerをデプロイし、ファイルを構成する

1. LinuxサーバーのDocker構成ファイルを変更する vim /usr/lib/system...

Webpack コンポーネントの使用状況統計を実装するための 50 行のコード

背景最近、リーダーからコンポーネント ライブラリを構築するように依頼があり、プロジェクトで現在使用さ...

MySql マスタースレーブレプリケーションメカニズムの包括的な分析

目次マスタースレーブレプリケーションメカニズム非同期レプリケーション準同期レプリケーションマスタース...

Linux の netstat コマンドの詳細な紹介

目次1. はじめに2. 出力情報の説明3. netstatの共通パラメータ4. netstatネット...

Vueデータプロキシの詳細な説明

目次1. これからお話しするのは、フロントエンド担当者がvue-cliで完了できるソリューション、デ...

Docker に ElasticSearch 6.x をインストールする詳細なチュートリアル

まず、イメージをプルします(またはコンテナを作成するだけで、自然にプルされます)。 docker p...

プライベートレジストリ内の画像を照会または取得する方法

Dockerはプライベートレジストリ内のイメージを照会または取得するために、 docker 検索 1...

React コンポーネント間で通信する 3 つの方法 (シンプルで使いやすい)

目次1. 親子コンポーネント通信2. クロスレベルコンポーネント通信1. レイヤーごとに値を渡す2....

Vue.jsは背景テーブルコンポーネントのカプセル化を管理します

目次問題分析なぜカプセル化なのかパッケージの内容は何ですか?テーブルコンポーネントをカプセル化するデ...

VueでEchartsチャートの幅と高さの適応を実現する実践

目次1. インストールとインポート2. 手ぶれ補正機能を定義する3. チャートコードを描くinit ...