マウスで大きさを指定してCanvasに矩形を描画する.ただし,一度描画した矩形を消さない.
- <!DOCTYPE html>
- <html>
- <head>
- <style>
- canvas {
- border: solid 1px #000066;
- }
- </style>
- <meta charset="utf-8" />
- <title>Canvas マウスで矩形を描画</title>
- <script type="text/javascript">
- "use strict";
- window.addEventListener("load", function () {
- var
- canvas, context, // カンバスとコンテクスト
- x1, y1, // 描画領域中のマウスの位置(mousedown)
- x2, y2, // 描画領域中のマウスの位置(mousemove, mouseup)
- draw_flag, // 描画中か否か(ドラッグ中か否か)
- rects; // 描画済みの矩形群
- canvas = document.getElementById("canvas1");
- context = canvas.getContext("2d");
- draw_flag = false;
- rects = [];
- // マウスダウンの処理
- canvas.addEventListener("mousedown", function (e) {
- var rect;
- // ドラッグ中
- draw_flag = true;
- // イベントのターゲット(キャンバス)の座標を取得
- rect = e.target.getBoundingClientRect();
- // マウスダウンの座標を記憶
- x1 = x2 = e.clientX - rect.left;
- y1 = y2 = e.clientY - rect.top;
- }, false);
- // マウスムーブの処理
- canvas.addEventListener("mousemove", function (e) {
- var bcr, i;
- // ドラッグ中でなければ何もしない.
- if (draw_flag === false) {
- return;
- }
- // イベントのターゲット(キャンバス)の座標を取得
- bcr = e.target.getBoundingClientRect();
- // canvasをクリア
- context.clearRect(0, 0, bcr.right, bcr.bottom);
- // 描画済みの矩形群を再描画
- context.strokeStyle = "#000000";
- for (i = 0; i < rects.length; i += 1) {
- context.strokeRect(rects[i].x, rects[i].y, rects[i].w, rects[i].h);
- }
- // マウスアップの座標
- x2 = e.clientX - bcr.left;
- y2 = e.clientY - bcr.top;
- // 矩形を描画
- context.strokeStyle = "#FF0000";
- context.beginPath();
- context.strokeRect(x1, y1, x2 - x1, y2 - y1);
- }, false);
- // マウスアップの処理
- canvas.addEventListener("mouseup", function (e) {
- var bcr, i;
- // ドラッグ中でなければ何もしない.
- if (draw_flag === false) {
- return;
- }
- // イベントのターゲット(キャンバス)の座標を取得
- bcr = e.target.getBoundingClientRect();
- // canvasをクリア
- context.clearRect(0, 0, bcr.right, bcr.bottom);
- // マウスアップの座標
- x2 = e.clientX - bcr.left;
- y2 = e.clientY - bcr.top;
- // 新たに描画された矩形を矩形群rectsに追加
- rects.push({x: x1, y: y1, w: x2 - x1, h: y2 - y1});
- // 矩形群を描画
- context.strokeStyle = "#000000";
- context.beginPath();
- for (i = 0; i < rects.length; i += 1) {
- context.strokeRect(rects[i].x, rects[i].y, rects[i].w, rects[i].h);
- }
- // ドラッグ中ではない
- draw_flag = false;
- }, false);
- });
- </script>
- </head>
- <body>
- <canvas id="canvas1" width="300" height="200"></canvas>
- </body>
- </html>
- マウスムーブの処理とマウスアップの処理で,キャンバスをクリアする代わりに,それまでに描画された全ての矩形を再描画するようにすればよい.
- 再描画するには,描画された全ての矩形群の位置と大きさを保持する必要があるので,そのための変数rects(配列)を導入し(20行目),マウスアップの度に新たな矩形(の位置と大きさ)をrectsに追加する.
- マウスムーブの処理
- 矩形群の再描画は黒で(51行目から55行目).
- 新たな矩形の描画は赤で(60行目から602行目).
- マウスアップの処理
- 新たな矩形を矩形群rectsに追加(79行目から80行目).配列への追加メソッドはpush.
- 矩形群の描画は黒で(81行目から86行目).