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;