[Web] スマートフォンとHTML5のCanvasを用いたお絵描きを実装してみた
HTML5のCanvasというグラフィックを描ける機能と、スマートフォンを掛け合わせて、
スマホで絵を書くWebアプリのサンプルを作成してみました。
サンプルアプリを紹介しつつ、 Canvasで絵を描く実装、タップイベントとの連携、スマホ対応のためのmetaタグなどの 実装内容を記載します(*´∇`*)
Canvas上を指でなぞると線を書くことが出来て、 色の変更と線の太さの変更を行うことができます。
また、ホーム画面に保存としてから、作成されたホーム画面アイコンから起動すると、 検索バーなどの無いアプリ風な画面で立ち上がります。 ぜひお試してみて頂けると幸いです。
http://www.yoheim.net/labo/html5/canvas/canvasForTouch.html
まずは、Canvasで絵を描くところ、色を選択するところ、線の太さを選ぶところ、 お絵描き内容を削除するところの実装です。
(HTML)
まずは、HTMLのmetaタグを用いて、横幅と初期倍率を行います。
続いて、iPhoneSafari特有の、スクロールするとびよーんと 画面外が表示される動作を防ぐJavaScriptを記述します。
最後に、iPhone独自設定のmetaタグを行い、 「ホーム画面に追加」→「ホーム画面から起動」した際に、 Safariのヘッダ部分を隠す設定を行います。
また、ステータスバーを黒色半透明にする設定もしてみました(ここは好みですが)。
また面白いネタがあったら、ブログに記載したいと思います。
最後までお読み頂きましてありがとうございました!
サンプルアプリを紹介しつつ、 Canvasで絵を描く実装、タップイベントとの連携、スマホ対応のためのmetaタグなどの 実装内容を記載します(*´∇`*)
サンプル内容
Canvasを用いたお絵描きアプリを、iPhoneに最適化してみました。Canvas上を指でなぞると線を書くことが出来て、 色の変更と線の太さの変更を行うことができます。
また、ホーム画面に保存としてから、作成されたホーム画面アイコンから起動すると、 検索バーなどの無いアプリ風な画面で立ち上がります。 ぜひお試してみて頂けると幸いです。
http://www.yoheim.net/labo/html5/canvas/canvasForTouch.html
お絵描き機能の実装内容
ここからは実装内容を書きたいと思います。まずは、Canvasで絵を描くところ、色を選択するところ、線の太さを選ぶところ、 お絵描き内容を削除するところの実装です。
(HTML)
<div class="main"> <div class="toolbar"> <ul> <li id="black"></li> <li id="blue"></li> <li id="red"></li> <li id="green"></li> <li id="small">S</li> <li id="middle">M</li> <li id="large">L</li> </ul> </div> <div class="canvas"><canvas id="myCanvas"></canvas></div> <input id="delete_button" type="button" value="delete"/> </div>(CSS)
/* グローバルな設定 */ * {margin:0px; padding:0px;} body {width:500px;} .title {padding:10px; margin-top:44px;} .main {padding-left:10px; margin:auto;} /* 色や太さを選択する部分のCSS */ .toolbar li {width:44px; height:44px; margin:auto;list-style-type: none; border:1px solid #ccc; border-radius:6px; margin:10px; display:block; float:left;} #black {background-color:black;} #red {background-color:red;} #green {background-color:green;} #blue {background-color:blue;} #small {text-align:center; line-height:44px; font-size:100%;} #middle {text-align:center; line-height:44px; font-size:200%;} #large {text-align:center; line-height:44px; font-size:400%;} /* お絵描きする部分のCSS */ .canvas {width:450px; height:400px; border:1px solid #ccc;} .canvas canvas {width:450px; height:400px;} /* 削除ボタンのCSS */ #delete_button {width:450px; height:44px; margin-top:10px;}(JavaScript)
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> <script type="text/javascript"> window.addEventListener("load", function () { // 必要な変数を宣言しておく var canvas = document.getElementById("myCanvas"); var c = canvas.getContext("2d"); var w = 450; var h = 400; var drawing = false; var oldPos; // CanvasとContextを初期化する canvas.width = w; canvas.height = h; c.strokeStyle = "#000000"; c.lineWidth = 5; c.lineJoin = "round"; c.lineCap = "round"; // タップ開始時に、絵を描く準備をする canvas.addEventListener("touchstart", function (event) { drawing = true; oldPos = getPosT(event); }, false); // タップ終了時に、絵を描く後処理を行う canvas.addEventListener("touchend", function () { drawing = false; }, false); // gestureイベント(2本指以上で触ると発生するやつ)の // 終了時にも絵を描く後処理を行う canvas.addEventListener("gestureend", function () { console.log("mouseout"); drawing = false; }, false); // 実際に絵を描く処理 // 前回に保存した位置から現在の位置迄線を引く canvas.addEventListener("touchmove", function (event) { var pos = getPosT(event); if (drawing) { c.beginPath(); c.moveTo(oldPos.x, oldPos.y); c.lineTo(pos.x, pos.y); c.stroke(); c.closePath(); oldPos = pos; } }, false); // タップ位置を取得する為の関数群 function scrollX(){return document.documentElement.scrollLeft || document.body.scrollLeft;} function scrollY(){return document.documentElement.scrollTop || document.body.scrollTop;} function getPosT (event) { var mouseX = event.touches[0].clientX - $(canvas).position().left + scrollX(); var mouseY = event.touches[0].clientY - $(canvas).position().top + scrollY(); return {x:mouseX, y:mouseY}; } // 色と線の太さを設定する関数 $("#black").click(function () {c.strokeStyle = "black";}); $("#blue").click(function () {c.strokeStyle = "blue";}); $("#red").click(function () {c.strokeStyle = "red";}); $("#green").click(function () {c.strokeStyle = "green";}); $("#small").click(function () {c.lineWidth = 5;}); $("#middle").click(function () {c.lineWidth = 10;}); $("#large").click(function () {c.lineWidth = 20;}); // 削除ボタンの動作 $("delete_button").click(function () { c.clearRect(0, 0, $(canvas).width(), $(canvas).height()); }); }, false); </script>
スマートフォンでCanvasを用いる為の設定や実装
続いて、スマートフォン用にカスタマイズするプログラミングです。まずは、HTMLのmetaタグを用いて、横幅と初期倍率を行います。
<meta name="viewport" content="width=500px initial-scale=0.64" />今回は、bodyがwidth=500pxのため、初期倍率は「320 / 500 = 0.64」としました。
続いて、iPhoneSafari特有の、スクロールするとびよーんと 画面外が表示される動作を防ぐJavaScriptを記述します。
// ブラウザのデフォルト動作を禁止する関数 // 指での捜査時に、ビヨーンと画面外が表示される箇所とかを防ぐ // ただし、liやbuttonといった色変更や太さ変更や削除機能を持つ // 要素は、その動作をさせたいので、デフォルド動作禁止から除外する function stopDefault(event) { if (event.touches[0].target.tagName.toLowerCase() == "li") {return;} if (event.touches[0].target.tagName.toLowerCase() == "input") {return;} event.preventDefault(); } // タッチイベントの初期化 document.addEventListener("touchstart", stopDefault, false); document.addEventListener("touchmove", stopDefault, false); document.addEventListener("touchend", stopDefault, false); // ジェスチャーイベントの初期化 document.addEventListener("gesturestart", stopDefault, false); document.addEventListener("gesturechange", stopDefault, false); document.addEventListener("gestureend", stopDefault, false);
最後に、iPhone独自設定のmetaタグを行い、 「ホーム画面に追加」→「ホーム画面から起動」した際に、 Safariのヘッダ部分を隠す設定を行います。
また、ステータスバーを黒色半透明にする設定もしてみました(ここは好みですが)。
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
最後に
スマートフォンでHTML5を自在に使えるようになると、 面白いアプリが色々と作れそうです。今後、積極的に取り組んでいきたい分野です。また面白いネタがあったら、ブログに記載したいと思います。
最後までお読み頂きましてありがとうございました!