1. ホーム
  2. Web制作
  3. html5

キャンバスラバーバンド線引き塗布方法

2022-01-31 19:55:58

ラバーバンディングとはどういう意味ですか?

描画を輪ゴムのように引き伸ばすことを指します。

例は以下の通りです:point_down。

アイデア

アイデアは非常にシンプルで、輪ゴムの描画機能だけ注目すべき、以下はマウスダウン、マウスムーブ、マウスアップの3段階のアイデアをまとめたものです。

mousedown:開始位置の記録、ドラッグ(ドラッグ状態かどうかの記録)をtrueに設定、getImageData( Rubber band effect key 1 )

mousemove: ドラッグ時の位置posを取得、putImageData( Corresponds to getImageData, rubber band effect key 2 ), posとstartに基づき線を引く。

マウスアップ:ドラッグをfalseに戻す

key マウスクリック時の画像を記録するのがputImageData()、復元に対応するのがgetImageData()であり、CanvasのputImageData()、getImageData()メソッドが鍵を握っているのです。この2つのメソッドが実行されないと、次のような効果があります。

putImageData() は、すべての "scanned" 行を消去することと等価です。

コード

  <canvas id="canvas" width="600" height="400" style="border: 1px solid black;"> </canvas& gt;
    <script type="text/javascript">
        let canvas = document.getElementById('canvas'),
            ctx = canvas.getContext('2d'),
            canvasLeft = canvas.getBoundingClientRect().left, //getBoundingClientRect() to get the element position
            canvasTop = canvas.getBoundingClientRect().top;
        let imageData; //record image data
        let start = new Map([['x',null],['y',null]]);
        let drag = false;//record whether it is in the dragging state
        canvas.onmousedown = function (e) {
            let pos = positionInCanvas(e, canvasLeft, canvasTop);
            start.set('x', pos.x);
            start.set('y', pos.y);
            drag = true;
            //record imageData
            imageData = ctx.getImageData(0,0,canvas.width,canvas.height);
        }
        canvas.onmousemove = function (e) {
            if(drag === true){
               let pos = positionInCanvas(e, canvasLeft, canvasTop);
               // equivalent to erasing all the scanned lines and redrawing
               ctx.putImageData(imageData, 0, 0);
               ctx.beginPath();
               ctx.moveTo(start.get('x'), start.get('y'));
               ctx.lineTo(pos.x, pos.y);
               ctx.stroke();
            }

        }
        canvas.onmouseup = function (e) {
            drag = false;
        }
        function positionInCanvas (e, canvasLeft, canvasTop) {//Get the mouse click position in the canvas
         return {
                  x:e.clientX - canvasLeft,
                  y:e.clientY - canvasTop
          }       
        }    

    </script>

以上、本記事の全内容をご紹介しましたが、皆様の学習のお役に立てれば幸いです。また、Script Houseをより一層応援していただければ幸いです。