まずはデモを見てみましょう。
機能の説明
- ペン: 描画モードのオン/オフを切り替えます。
- レッド: 描画色を赤に変更します。もう一度クリックすると黒に戻ります。
- クリア: canvasをクリアします。
- 確定: 現在のcanvasの内容を画像として下に表示します。
- 描画の太さは入力フィールドで調整できます。
HTMLの構造
まず、描画ボードに必要なHTML要素を定義します。<canvas>
要素が描画の領域となり、いくつかのボタンで機能を制御します。
<div class="custom-draw-board" style="border:2px solid #ccc">
<canvas id="customCanvas" width="300" height="300"></canvas>
<hr>
<button onclick="customBeginDraw()">ペン</button>
<button onclick="customChangeToRed()">レッド</button>
<button onclick="customClearCanvas()">クリア</button>
<button onclick="customSubmitCanvas()">確定</button>
<input type="number" id="customThickness" min="1" value="1">
<hr>
<img src="" alt="" id="customCanvasImage">
</div>
CSSのスタイル
次に、描画ボードを適切に表示するための簡単なCSSスタイルを追加します。
.custom-draw-board {
width: 300px;
margin: 30px auto;
}
JavaScriptの実装
// HTMLドキュメントから特定の要素を選択
var customCanvas = document.querySelector('#customCanvas'); // お絵描きボードのキャンバス要素
var customButtons = document.querySelectorAll('.custom-draw-board button'); // お絵描きボードの全ボタン
var customInput = document.querySelector('#customThickness'); // 線の太さを制御する入力フィールド
var ctx = customCanvas.getContext('2d'); // canvasの2Dレンダリングコンテキストを取得
var customThicknessValue; // 現在の線の太さを保持する変数
// 描画太さの監視
// 線の太さを制御する入力フィールドの値が変更されたか定期的にチェック
setInterval(function(event){
if(customThicknessValue != document.getElementById("customThickness").value){
customThicknessValue = document.getElementById("customThickness").value; // 新しい値を変数に保存
}
}, 100); // 100ミリ秒ごとにチェック
// ペン機能の切り替え
function customBeginDraw(){
if(customButtons[0].style.backgroundColor === 'red'){ // ペンボタンが既にアクティブなら
customButtons[0].style.backgroundColor = ''; // ボタンの背景色をリセット
customCanvas.removeEventListener('mousedown', customStart); // 描画開始イベントを削除
}else{ // ペンボタンが非アクティブなら
customButtons[0].style.backgroundColor = 'red'; // ボタンをアクティブにする
customCanvas.addEventListener('mousedown', customStart); // マウスが押された時に描画を開始するイベントを追加
}
}
// 色を赤に変更
function customChangeToRed(){
if(customButtons[1].style.backgroundColor === 'red'){ // 色変更ボタンが既にアクティブなら
customButtons[1].style.backgroundColor = ''; // ボタンの背景色をリセット
ctx.strokeStyle = '#000000'; // 描画色を黒に戻す
}else{
customButtons[1].style.backgroundColor = 'red'; // ボタンをアクティブにする
ctx.strokeStyle = 'red'; // 描画色を赤に変更
}
}
// canvasのクリア
function customClearCanvas(){
ctx.clearRect(0, 0, 300, 300); // canvas全体をクリア
}
// 描画開始
function customStart(e){
ctx.beginPath(); // 新しい描画パスを開始
ctx.lineWidth = customThicknessValue; // 線の太さを設定
ctx.lineJoin = 'round'; // 線の結合点を丸くする
ctx.lineCap = 'round'; // 線の端を丸くする
var { offsetX: startX, offsetY: startY } = e; // クリックされた座標を取得
ctx.moveTo(startX, startY); // 描画開始点を設定
customCanvas.addEventListener('mousemove', customDraw); // マウスが動いている間、描画を続けるイベントを追加
customCanvas.addEventListener('mouseleave', customStopDrawing); // マウスがキャンバスから離れたら描画を停止するイベントを追加
}
// 描画停止
function customStopDrawing(){
customCanvas.removeEventListener('mouseleave', customStopDrawing); // 描画停止イベントを削除
customCanvas.removeEventListener('mousemove', customDraw); // 描画続行イベントを削除
}
// 描画実行
function customDraw(e){
var { offsetX: currentX, offsetY: currentY } = e; // 現在のマウス座標を取得
ctx.lineTo(currentX, currentY); // 最後の点から現在の点まで線を引く
ctx.stroke(); // 描画を実行
}
// 描画内容の確定
function customSubmitCanvas(){
var img = document.querySelector('#customCanvasImage'); // 確定された描画を表示する画像要素を選択
img.src = customCanvas.toDataURL('image/png'); // canvasの内容を画像データとして取得し、画像要素のソースに設定
img = null; // クリア
}
アップグレード
この基本的なお絵描きボードをさらにアップグレードして、より機能豊富で使いやすいツールにするためには、いくつかの方法が考えられます。
ここでは、そのうちのいくつかを探ってみましょう。
色の選択機能の追加
現在のデモでは赤と黒のみが使用できますが、色選択パレットを追加して、ユーザーが豊富な色から選べるようにすると、さらに表現の幅が広がります。
HTMLの<input type="color">
を使用すると、簡単に色選択器を実装できます。
線の太さ調整機能の向上
線の太さをより詳細に調整できるスライダーを実装することで、ユーザーはより繊細な描画が可能になります。
現在は数値入力のみですが、<input type="range">
を使うことで直感的なスライダーに変更できます。
やり直し/元に戻す機能
描画中にミスをした場合に、一歩前に戻れる「元に戻す」機能や、やり直す機能は、ユーザー体験を向上させます。
これには、ユーザーのアクションを配列に保存し、やり直しや元に戻しの操作を行うたびにその配列を参照するロジックが必要です。
レイヤー機能の追加
より複雑な絵を描くためには、レイヤー機能が非常に有用です。これにより、ユーザーは背景、中間層、前景など、異なるレイヤーに分けて作業できるようになります。
各レイヤーは個別の<canvas>
要素として実装できます。
保存と共有機能
ユーザーが描いた絵をローカルに保存したり、ソーシャルメディアで共有できるようにする機能は、アプリケーションの価値を高めます。画像を保存するには、CanvasのtoDataURL()
メソッドを使用して画像データを生成し、それをファイルとして保存するか、リンクとして共有できます。
タッチサポートの強化
タブレットやスマートフォンでの使用を考慮して、タッチイベントに対応させることで、より幅広いデバイスでの使用が可能になります。touchstart
、touchmove
、touchend
イベントを利用して、マウスイベントと同様の描画機能を実現できます。
コメント