Canvasで作るお絵かきアプリ

この記事は[tomowarkar ひとりAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)の14日目の記事です。

# はじめに
昔に描いたコードを持ってきたので、コードが少し古く、初心者感丸出しですがご容赦を。

スマートフォンに対応させたのがポイントです。

# デモサイト
[デモサイト](https://tomowarkar.github.io/blog_content/animation/make_circle/mobile.html)
# コード全文
### index.html
- 描画エリア設定
- カラーパッド設定
- 削除ボタン設定

```html
<!doctype html>
<html>
	<head>
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
		<title></title>
	</head>
	<body>
		<div id="hitarea"><canvas id="canvas"></canvas></div>
		<input type="color" id="color" value="#ff7f7f">
		<input type="button" id="removePaint" value="clear" onclick="removePaint()">
	</body>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
</html>
```
### style.css
```style.css
body {
	margin: 0;
	overflow: hidden;
}
#color{
	position: absolute;
	margin: 0;
	width: 54px;
	height:58px;
	right: 10px;
	bottom: 60px;
	border: none;
	background: none;
}
#removePaint{
	position: absolute;
	margin: 0;
	width: 50px;
	height:50px;
	right: 15px;
	bottom: 10px;
	background: lightgray;
}
```
### script.js

```script.js
var canvas = document.getElementById( 'canvas' );
var ctx = document.getElementById("canvas").getContext("2d");
canvas.width  = window.innerWidth;
canvas.height = window.innerHeight;

function drawCoordinates(x,y,mouseX,mouseY){
	ctx.beginPath();
	ctx.moveTo(mouseX, mouseY);
	ctx.lineTo(x, y);
	ctx.lineCap = "round";
	ctx.lineWidth = 10;
	ctx.strokeStyle = defocolor;
	ctx.closePath();
	ctx.stroke();
	mouseX = x;
	mouseY = y;
}

var $document = $(document);
var $hitarea = $('#hitarea');
var $x = $('#x');
var $y = $('#y');
var supportTouch = 'ontouchend' in document;// タッチイベントが利用可能かの判別

var EVENTNAME_TOUCHSTART = supportTouch ? 'touchstart' : 'mousedown';
var EVENTNAME_TOUCHMOVE = supportTouch ? 'touchmove' : 'mousemove';
var EVENTNAME_TOUCHEND = supportTouch ? 'touchend' : 'mouseup';

var mouseX = "";
var mouseY = "";

var updateXY = function(event) {
	var original = event.originalEvent;
	var x, y;
	if(original.changedTouches) {
		x = original.changedTouches[0].pageX;
		y = original.changedTouches[0].pageY;
	} else {
		x = event.pageX;
		y = event.pageY;
	}
	$x.text(x);
	$y.text(y);
	return [x,y];
};

// イベント設定
var handleStart = function(event) {
	event.preventDefault();// タッチによる画面スクロールを止める
	[x,y] = updateXY(event);
	mouseX = x;
	mouseY = y;
	bindMoveAndEnd();
};
var handleMove = function(event) {
	event.preventDefault(); // タッチによる画面スクロールを止める
	[x,y] = updateXY(event);
	drawCoordinates(x,y,mouseX,mouseY)
	mouseX = x;
	mouseY = y;
};
var handleEnd = function(event) {
	[x,y] = updateXY(event);
	drawCoordinates(x,y,mouseX,mouseY)
	mouseX = "";
	mouseY = "";
	unbindMoveAndEnd();
};
var bindMoveAndEnd = function() {
	$document.on(EVENTNAME_TOUCHMOVE, handleMove);
	$document.on(EVENTNAME_TOUCHEND, handleEnd);
};
var unbindMoveAndEnd = function() {
	$document.off(EVENTNAME_TOUCHMOVE, handleMove);
	$document.off(EVENTNAME_TOUCHEND, handleEnd);
};

$hitarea.on(EVENTNAME_TOUCHSTART, handleStart);

let defocolor = "#ff7f7f";
function watchColorPicker(event) {
	defocolor = event.target.value;
}
document.querySelector("#color").addEventListener("change", watchColorPicker, false);

function removePaint() {
	ctx.beginPath();
	ctx.fillStyle = "#FFFFFD";
	ctx.fillRect(0, 0, canvas.width,canvas.height);
}
```
# おわりに
以上明日も頑張ります！！
[tomowarkar ひとりAdvent Calendar Advent Calendar 2019](https://qiita.com/advent-calendar/2019/tomowarkar)

# 参考
https://nymemo.com/jquery/1278