Post

Mobile Canvas๐ŸŽจ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ๐Ÿ–Œ

Why?

VP host์—์„œ simple-canvas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ.

(ios ๊ธฐ๊ธฐ์—์„œ ๊ทธ๋ฆฌ๊ธฐ ์ขŒํ‘œ ์•ˆ๋งž์Œ ๋“ฑ)

๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฌธ์ œ ์—†์ด ์ž‘๋™ํ•˜๋Š” ์‹ฌํ”Œํ•œ Painter ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ํ•จ.

How?

  • React + TypeScript
  • EventEmitter
  • EventListener

Painter Constructor

  • canvas (html canvas element)
  • drawOn, figures - ์Šคํ† ๋ฆฌ์ง€ ์ €์žฅ
  • isDrawing (mousedown ์—ฌ๋ถ€)
  • color, thickness
  • removeDrawEvent (์–ธ๋งˆ์šดํŠธ ๋  ๋•Œ ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ)

Painter ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

color, thickness ๊ฐ’ ์ „๋‹ฌ

setTarget

๋ Œ๋”๋ง ํ›„ ๋ทฐ์–ด์™€ ํ˜ธ์ŠคํŠธ์˜ Cavnas Element๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด setTarget ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Cavnas Element๋ฅผ ์ „๋‹ฌ

addDrawEvent

EventListner๋“ค์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

drawStart

touchstart๋‚˜ mousedown ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด isDrawing์„ true๋กœ ๋ฐ”๊พธ๊ณ , ๊ทธ๋ฆฌ๊ธฐ ์ƒ‰์ƒ์™€ ๋‘๊ป˜๋ฅผ ์„ค์ •ํ•œ๋‹ค.

draw

position ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„ ์‹ค์ œ๋กœ canvas์— ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฐ๋‹ค.

๊ทธ๋ฆฐ ์ขŒํ‘œ๋ฅผ position ๋ฐฐ์—ด์— ์ง‘์–ด๋„ฃ๋Š”๋‹ค.

drawEnd

isDrawing์„ true๋กœ ๋ฐ”๊พธ๊ณ , position ๋ฐฐ์—ด์„ figures ๋ฐฐ์—ด์— ์ง‘์–ด๋„ฃ๊ณ  ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•œ๋‹ค.

redraw

์ƒˆ๋กœ๊ณ ์นจ ์‹œ ์Šคํ† ๋ฆฌ์ง€์— drawOn๊ณผ figures ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์ด์ „์— ๊ทธ๋ ธ๋˜ ๋‚ด์—ญ์„ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค.



์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ์ 

  • ๋ชจ๋ฐ”์ผ์—์„œ ํ™”๋ฉด์„ ์ƒํ•˜๋กœ ๋“œ๋ž˜๊ทธํ•˜๋ฉด ์ƒˆ๋กœ๊ณ ์นจ ๋™์ž‘์œผ๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
1
2
3
if (e.target === this.canvas) {
  e.preventDefault();
}


  • ํ„ฐ์น˜ํ•œ ์ขŒํ‘œ์™€ ์‹ค์ œ๋กœ ๊ทธ๋ ค์ง€๋Š” ์ขŒํ‘œ์— ์ฐจ์ด๊ฐ€ ๋‚˜๋Š” ์ด์Šˆ

Element.getBoundingClientRect()๋Š” window๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์—˜๋ฆฌ๋จผํŠธ์˜ ์œ„์น˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

mouse/touch event๋Œ€๋กœ ๊ทธ๋ฆฌ๋ฉด ์œ„์น˜ ๊ฐ’์ด ๋”ํ•ด์ ธ์„œ ๊ทธ๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์— ์œ„์น˜ ๊ฐ’์„ ๋นผ์ฃผ์–ด์•ผ ํ•œ๋‹ค.


1
2
3
4
const rect = this.canvas!.getBoundingClientRect();

const x = e.touches[0].clientX - rect.left;
const y = e.touches[0].clientY - rect.top;


Using Touch Events with the HTML5 Canvas

This post is licensed under CC BY 4.0 by the author.