ホームページ > ウェブフロントエンド > H5 チュートリアル > キャンバスを使用してカスタムアバター機能を実装する方法

キャンバスを使用してカスタムアバター機能を実装する方法

php中世界最好的语言
リリース: 2018-03-27 11:39:36
オリジナル
3595 人が閲覧しました

今回は、canvasを使ってカスタムアバター機能を実装する方法と、canvasを使ってカスタムアバター機能を実装する際の注意事項を紹介します。実際の事例を見てみましょう。

前に書いてあります:

2日前、Tiger公式サイトのカスタムアバター機能はFlashで実装されていると上司から言われました。インストールされていない場合は手動で「許可」する必要があります。フラッシュして実行します。それで、同じ機能を Canvas を使って実装してほしいと言われました。へへ、私はたまたま最近 Canvas を勉強していたので、喜んで同意しました (実際、勉強していないなら、なぜ同意しませんか、ははは~)

結果表示:

Gitアドレス:https://github.com/ry928330/portraitDIY

機能説明:

  • 左、または小さなボックスにマウスを置きます。右下隅のストレッチ ボックスをクリックすると、ボックスで覆われた画像が自動的にインターセプトされ、右側の複数のコンテナに再描画されます。

  • 幅と高さを入力して、必要なアバターのサイズをカスタマイズします。現在、同じ幅と高さのアバター画像のみがサポートされています。

実装の詳細:

写真が配置されている領域のスクリーンショットを撮りたいため、写真が配置されている領域をカバーするキャンバスを作成する必要があります。ここでは、渡された DOM 内の要素のクラス名に基づいて同じ位置にキャンバスを作成し、元の DOM 要素の上にかぶせる関数を与えます:

function createCanvasByClassName(tag) {
    var canvasInitialWidth = $('.' + tag).width();
    var canvasInitialHeight = $('.' + tag).height();
    var left = $('.' + tag).offset().left - $('.' + tag).parent('.portraitContainer').offset().left + 1;
    var top = $('.' + tag).offset().top - $('.' + tag).parent('.portraitContainer').offset().top + 1;
    //var left = $('.' + tag).offset().left + 1;
    //var top = $('.' + tag).offset().top + 1;
    clearCanvasObj.left = $('.' + tag).offset().left + 1;
    clearCanvasObj.top = $('.' + tag).offset().top + 1;
    // clearCanvasObj.left = left;
    // clearCanvasObj.top = top;
    var canvasElement = $('<canvas></canvas>');
    var randomNum = Math.floor(getRandom(0, 10000));
    clearCanvasObj.canvasId = randomNum;
    canvasElement.attr({
        id: 'canvas',
        width: canvasInitialWidth,
        height: canvasInitialHeight
    });
    canvasElement.css({
        position: 'absolute',
        top: top, 
        left: left
    });
    //$('body').append(canvasElement);
    var appendEle = $('.portraitContainer').append(canvasElement);
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    //ctx.fillStyle = "rgba(211,211,216,0.5)";
    ctx.clearRect(0, 0, canvasInitialWidth, canvasInitialHeight);
    ctx.fillStyle = "rgba(0,0,0, 0.4)";
    ctx.fillRect(0, 0, canvasInitialWidth, canvasInitialHeight);
    return canvas;
}
ログイン後にコピー

このキャンバスを使用すると、何でもできますあなたの写真が操作されている領域に必要です。まず、全体を薄い黒の影で塗り、最初の小さなボックス領域内の色を消します。次に、mousedown、mousemove、mouseup イベントをページ全体に追加します。これらのイベントが実行する機能は、ページに実装するドラッグ アンド ドロップ機能に似ています。コードは次のとおりです。

この関数では、ドラッグの境界条件に注意する必要があります。1 つは、画像が配置されている DOM の外側の境界にボックスをドラッグできないことです。もう 1 つは、マウスがその領域に置かれている場合です。小さなボックスは、マウスのスタイルが変更されます。ボックスのドラッグプロセス中に、ボックスの移動領域を継続的に再描画し(つまり、影を継続的に描画し)、新しい位置でclearRect関数を呼び出して、小さなボックスを再度消去します。ドラッグまたはストレッチのプロセス中に、ProduceSmallPic 関数を継続的に呼び出して、右側のコンテナのコンテナ サイズに応じて必要なアバターを継続的に再描画します (各コンテナはキャンバスです)。コードは次のとおりです:

function mousemoveFunc(event) {
    /* Act on the event */
    var nowMouseX = event.clientX - clearCanvasObj.left;
    var nowMouseY = event.clientY - clearCanvasObj.top;
    if (nowMouseX >= clearCanvasObj.xStart && nowMouseX <= clearCanvasObj.xStart + clearCanvasObj.width && nowMouseY >= clearCanvasObj.yStart && nowMouseY <= clearCanvasObj.yStart + clearCanvasObj.height) {
        clearCanvasObj.isCanvasArea = true;
        //clearCanvasObj.isRightCorner = false;
        imgContainerCanvas.style.cursor = &#39;move&#39;;
    } else if ((nowMouseX >= clearCanvasObj.xStart + clearCanvasObj.width - 10) && (nowMouseX <= clearCanvasObj.xStart+ clearCanvasObj.width + 10) 
        && (nowMouseY >= clearCanvasObj.yStart + clearCanvasObj.height - 10) && (nowMouseY <= clearCanvasObj.yStart + clearCanvasObj.height + 10)) {
        clearCanvasObj.isCanvasArea = true;
        //clearCanvasObj.beginDraw = false;
        imgContainerCanvas.style.cursor = &#39;se-resize&#39;;
    } 
    else {
        clearCanvasObj.isCanvasArea = false;
        //clearCanvasObj.isRightCorner = false;
        imgContainerCanvas.style.cursor = &#39;default&#39;;
    }
    var outerDomWidth = $(".imgContainer").width();
    var outerDomHeight = $(".imgContainer").height();
    var xDistance = event.clientX - clearCanvasObj.mouseX;
    var yDistance = event.clientY - clearCanvasObj.mouseY;
    //var outerCTX = canvas.getContext(&#39;2d&#39;);
    //移动小方框
    if (clearCanvasObj.beginDraw && clearCanvasObj.isCanvasArea && !clearCanvasObj.isRightCorner) {
        ry_CTX.fillStyle = clearCanvasObj.color;
        // console.log(&#39;1&#39;, clearCanvasObj.xStart, clearCanvasObj.yStart)
        ry_CTX.fillRect(clearCanvasObj.xStart, clearCanvasObj.yStart, clearCanvasObj.width, clearCanvasObj.height);
        //outerCTX.fillRect(0, 0, canvas.width, canvas.height);
        clearCanvasObj.xStart += xDistance;
        clearCanvasObj.yStart += yDistance;
        //判断方框是否达到边界
        if (clearCanvasObj.xStart <= 0) {
            clearCanvasObj.xStart = 0;
        }
        if (clearCanvasObj.yStart <= 0) {
            clearCanvasObj.yStart = 0;
        }
        if ((clearCanvasObj.xStart + clearCanvasObj.width) >= outerDomWidth) {
            clearCanvasObj.xStart = outerDomWidth - clearCanvasObj.width;
        }
        if ((clearCanvasObj.yStart + clearCanvasObj.height) >= outerDomHeight) {
            clearCanvasObj.yStart = outerDomHeight - clearCanvasObj.height;
        }
        // console.log('2', clearCanvasObj.xStart, clearCanvasObj.yStart)
        ry_CTX.clearRect(clearCanvasObj.xStart, clearCanvasObj.yStart, clearCanvasObj.width, clearCanvasObj.height);
        produceSmallPic(clearCanvasObj.xStart+clearCanvasObj.left, clearCanvasObj.yStart+clearCanvasObj.top, clearCanvasObj.width, clearCanvasObj.height, imageURL)
        clearCanvasObj.mouseX = event.clientX;
        clearCanvasObj.mouseY = event.clientY;
    }
    //拖拽小方框
    if (clearCanvasObj.isRightCorner) {
        ry_CTX.fillStyle = clearCanvasObj.color;
        ry_CTX.fillRect(clearCanvasObj.xStart, clearCanvasObj.yStart, clearCanvasObj.width, clearCanvasObj.height);
        var realDistance = Math.min(xDistance, yDistance)
        clearCanvasObj.width +=  realDistance;
        clearCanvasObj.height += realDistance;
        //拖动时边界条件的判断
        if (clearCanvasObj.xStart + clearCanvasObj.width >= outerDomWidth) {
            clearCanvasObj.width = outerDomWidth - clearCanvasObj.xStart;
            clearCanvasObj.height = outerDomWidth - clearCanvasObj.xStart;
        }
        if (clearCanvasObj.yStart + clearCanvasObj.height >= outerDomHeight) {
            clearCanvasObj.width = outerDomHeight - clearCanvasObj.yStart;
            clearCanvasObj.height = outerDomHeight - clearCanvasObj.yStart;
        }
        if (clearCanvasObj.width <= 10) {
            clearCanvasObj.width = 10;
        }
        if (clearCanvasObj.height <= 10) {
            clearCanvasObj.height = 10;
        }
        ry_CTX.clearRect(clearCanvasObj.xStart, clearCanvasObj.yStart, clearCanvasObj.width, clearCanvasObj.height);
        produceSmallPic(clearCanvasObj.xStart+clearCanvasObj.left, clearCanvasObj.yStart+clearCanvasObj.top, clearCanvasObj.width, clearCanvasObj.height, imageURL);
        clearCanvasObj.mouseX = event.clientX;
        clearCanvasObj.mouseY = event.clientY;
    }                            
}
ログイン後にコピー
この関数の役割について説明します。ここでは、imageURL というパラメーターに注意する必要があります。この URL は、画像が配置されている DOM から変換されます。 DOM が配置されている領域を画像に変換する必要があるため、drawImage 関数を使用して必要な領域をキャプチャできるようになります。そこで、まず html2canvas ライブラリ関数を使用して、画像が配置されている DOM をキャンバスに変換し、次にこのキャンバスを画像に変換して画像アドレス imageURL を取得します。

function produceSmallPic(imageURL,left, top, width, height) {
    var img = new Image();
    img.src = imageURL;
    var targetCtx = new Array();
    var targetCanvas = null;
    img.onload = function() {
        portraitGroupsArr.forEach(function(item, index) {
            targetCanvas = document.getElementById(item.class);
            targetCtx.push(targetCanvas.getContext('2d'));
            targetCtx[index].clearRect(0,0, item.width, item.height);
            targetCtx[index].drawImage(img, left - clearCanvasObj.left, top - clearCanvasObj.top, width, height, 0, 0 , item.width, item.height);
        })
    }
}
ログイン後にコピー
次に、右側の Canvas コンテナを使用して画像を返します。振り返ってみると、プロセス全体はそれほど単純ではありません。

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

H5 は Canvas にカスタム パス アニメーションを実装します

H5 ページで APP を呼び出す方法

以上がキャンバスを使用してカスタムアバター機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート