Make a single touch drawing app in Framer. 프래이머를 이용한 그림판 만들기.

in framer •  7 years ago  (edited)

프래이머를 이용해서 그림판을 만들어 볼 것입니다.

동그란 레이어를 이용해서 터치가 일어난 부분에 점을 찍는 형식으로

그리는 것은 한계가 있습니다. 


여기서는 svg 를 이용하여 벡터 그림을 그리도록 하겠습니다.


frame_l = new Layer
size : Screen.size
backgroundColor: "ddddcc"


먼저 드로잉할 레이어를 만들어줍니다.

화면크기와 같게 해줍니다.


svgA = []
tmpSvg = new SVGLayer
parent: frame_l
backgroundColor: null


SVG 를 저장해둘 배열을 하나 만들어서 각 선들을 저장해둘 것입니다.

선이 그려질 동안 보여질 임시용 SVG 레이어를 생성합니다. 


drawing = false	
lineData = ""


드로잉 상태를 구분할 변수와 

선이 그려지는 정보를 가질 SVG 데이터  변수를 선언합니다.


draw = (e)->
x = Events.touchEvent(e).clientX
y = Events.touchEvent(e).clientY
return x+" "+y


이벤트 값을 이용하여 좌표를 문자열로 반환하는 함수를 생성합니다.


frame_l.on Events.TouchStart,(e) ->
drawing = true
lineData = "M "+draw(e)


처음 터치가 시작되면 M 으로 시작하는 좌표를 SVG 데이터변수에 저장합니다.

draw 함수를 이용해 좌표값을 설정합니다.


frame_l.on Events.TouchMove,(e) ->
lineData += " L "+draw(e)
if drawing then tmpSvg.svg = "<svg><path d='"+lineData+"' fill='transparent' stroke='black' />"


터치 손가락을 움직이면 선이 그려집니다.

선이 그려지는 부분은 L 로 시작하는 좌표값을 저장합니다.

drawing 중일때는 tmpSvg 레이어에 저장되는 좌표 데이터를 svg 값에 넣어줍니다.

이렇게 하면 그림이 그려질때의 선을 즉시 보여줄 수 있습니다.

이 부분이 없으면 손을 떼야만 선이 표시됩니다.


frame_l.on Events.TouchEnd,(e) ->
drawing = false
if lineData.indexOf("L") isnt -1
shape = new SVGLayer
svg: "<svg><path d='"+lineData+"' fill='transparent' stroke='black' />"
backgroundColor: null
parent: frame_l
svgA.push(shape)
tmpSvg.svg = ""


터치를 떼면  drawing 을 끝내고 저장된 그림 데이터를 

svgLayer 를 이용해서 선으로 생성합니다.

생성된 레이어는 svgA 에 저장합니다.

임시로 그려진 선 데이터는 삭제합니다.


그림판이 완성되었습니다.

선이 그려진 레이어들을 각각 저장하고 있어서 

이후에 svg 레이어를 하나씩 지우면 그리기 취소 기능을 만들 수 있습니다.


Framer 에서 SVG 를 이용한 그림판 만드는 방법이었습니다.


감사합니다.





Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

@songgmo, let me be the first to welcome you to Steemit! Congratulations on making your first post! I gave you a $.02 vote! Would you be so kind as to follow me back in return?

Framer 강의 감사합니다.! ^^

별말씀을요~.