Flutter: ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ” ํ˜•์‹ ์ง€์›(SVG ์•„๋‹˜)

์— ๋งŒ๋“  2016๋…„ 02์›” 12์ผ  ยท  183์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: flutter/flutter

์ด์ „ ๋…ผ์˜์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์šฐ๋ฆฌ๋Š” ์™„์ „ํ•œ SVG ์ง€์›์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์–‘์— ๋„ˆ๋ฌด ๋น„์‹ธ๊ณ , ๋ฌด๊ฒ๊ฑฐ๋‚˜, Flutter์— ์ด๋ฏธ ์žˆ๋Š” ๊ฒƒ๊ณผ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค.
  • ์ง€์›๋˜๋Š” ํ˜•์‹์—์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ๊ทธ๋ž˜ํ”ฝ ์—”์ง„(Skia)์—์„œ ํšจ๊ณผ์ ์ด๊ณ  ํšจ์œจ์ ์ด๋ฉฐ ์ตœ์ ํ™”๋˜์–ด ์žˆ์Œ์„ ๊ฐ•์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์ฒด ๋Ÿฐํƒ€์ž„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์ง€์›ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋นŒ๋“œ ์‹œ ํ˜•์‹์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
P4 crowd framework passed first triage new feature

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์™€ ๋ฐ€๋„๋ฅผ ์ง€์›ํ•˜๋Š” ์•ฑ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ๋ฒกํ„ฐ ์ง€์›์ด ์ค‘์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•„์ด์ฝ˜์ด ์ƒ๊น๋‹ˆ๋‹ค.

flutter-send-icon

๋Œ€์‹ :

material-send-icon

๋ชจ๋“  183 ๋Œ“๊ธ€

๊ธฐํƒ€ ์ž„์˜์ ์ธ ์ƒ๊ฐ(๋ชจ๋“  ๊ฒƒ์ด ๋‚ด ๊ฒƒ์ด ์•„๋‹˜):

  • ์šฐ๋ฆฌ๋Š” ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๊ธฐ์กด ๊ธฐ๋Œ€๊ฐ€ ์žˆ๋Š” ํ˜•์‹์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์ •๋ง๋กœ ์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด SVG๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด ์Šคํฌ๋ฆฝํŒ…, HTML, SMIL ๋“ฑ์„ ํฌํ•จํ•œ ์™„์ „ํ•œ SVG ์ง€์›์„ ๊ธฐ๋Œ€ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ์˜ ํ˜•์‹์„ drawAtlas์™€ ๊ฐ™์€ Skia์˜ ์„ฑ๋Šฅ ๊ธฐ๋Šฅ์— ๋ช…์‹œ์ ์œผ๋กœ ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋งž์ถฐ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์™€ ๋ฐ€๋„๋ฅผ ์ง€์›ํ•˜๋Š” ์•ฑ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ๋ฒกํ„ฐ ์ง€์›์ด ์ค‘์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•„์ด์ฝ˜์ด ์ƒ๊น๋‹ˆ๋‹ค.

flutter-send-icon

๋Œ€์‹ :

material-send-icon

@HansMuller

Kris๋Š” ์ด์— ๋Œ€ํ•ด์„œ๋„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์‹œ ์ผ๋ถ€ ์ œํ•œ๋œ SVG ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด SVG ์„ค๋ช…์„ ๊ธฐ๋ฐ˜์œผ๋กœ MD ์•„์ด์ฝ˜ ์œ„์ ฏ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ ์ค‘ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ  ์›๋ž˜ ๋””์ž์ธ์— ๋Œ€ํ•œ ์ถฉ์‹ค๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ ์•„์ด์ฝ˜์˜ ๊ฒฝ์šฐ ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ ์•„์ด์ฝ˜ ๊ธ€๊ผด์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@appforartists Cocoa๋„ android.view๋„ ์•„์ด์ฝ˜์— ๋ฒกํ„ฐ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@abarth iOS์— ๋Œ€ํ•ด ๋†€๋ž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜๋“œ์ฝ”๋”ฉ๋œ 3.5์ธ์น˜ ํ™”๋ฉด์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ๊ทธ ์ดํ›„๋กœ ์ง€์›๋˜๋Š” ํ•ด์ƒ๋„์˜ ์ •์‹ ์  ๋ชจ๋ธ/๋‹จ์ˆœ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฝค ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ฐธ์กฐ: ๊ฐ iPhone์˜ ๋„ˆ๋น„๊ฐ€ ๋™์ผํ•˜๊ฑฐ๋‚˜ ์›๋ž˜ ์•„์ดํŒจ๋“œ์™€ ์•„์ดํŒจ๋“œ ๋ฏธ๋‹ˆ๋Š” ๊ฐ™์€ ํ•ด์ƒ๋„๋ฅผ ๊ฐ€์ง) ๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ๋ชจ๋ฅด์ง€๋งŒ ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ๋ฒกํ„ฐ ๊ธฐ๋ฐ˜์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์€ ์•ฝ๊ฐ„ ๋†€๋ž์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ๊ฒฝ์šฐ๋“  ์•„์ด์ฝ˜์€ ์œ„์˜ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ๊ฐ™์ด ์•จ๋ฆฌ์–ด์‹ฑ๋˜์–ด ๋ณด์ด์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ๋ฒกํ„ฐ๋Š” ํ•ด์ƒ๋„ ๋…๋ฆฝ์„ฑ์„ ์œ„ํ•œ ์ข‹์€ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์˜ˆ์œ ์•„์ด์ฝ˜์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. : ์Šค๋งˆ์ผ :

์˜ˆ์œ ์•„์ด์ฝ˜์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

์•„์ด์ฝ˜์—์„œ ๋ณด๊ณ  ์žˆ๋˜ ํ•ด์ƒ๋„ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? @krisgiesing ์€ ๋งŽ์€ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ด์ƒ๋„ ์ธ์‹ ์ž์‚ฐ ๋ถ„์„๊ธฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ•ด์ƒ๋„ ์ธ์‹ ์ง€์›์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•˜๋ฏ€๋กœ ์ง€๊ธˆ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์‹œ๊ฐ„์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3x์˜ ๊ธฐ๊ธฐ ํ”ฝ์…€ ๋น„์œจ์ด 2.6 ์ธ ๊ฒƒ ๊ฐ™์œผ๋ฉฐ, ์ด๋Š” ์•„๋งˆ๋„ ์ž์‚ฐ์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€๊ธˆ ์ด ํŠน์ •ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋ณด๊ณ  ์žˆ๋‹ค. ์žฅ์น˜ ํ”ฝ์…€ ๋น„์œจ์€ 2.625์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์˜ˆ์ƒ๋˜๋Š” 3.0x ์ž์‚ฐ์„ ์„ ํƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ Œ๋”๋ง ์ค‘์— ์ผ์ข…์˜ ์ถ”๊ฐ€ ์•จ๋ฆฌ์–ด์‹ฑ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ @abarth ๊ฐ€ ๊ธ€๊ผด๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ ์•„์ด์ฝ˜์˜ ๊ฒฝ์šฐ๋ฅผ ์ˆ˜์ •ํ–ˆ์ง€๋งŒ ํ•ด์ƒ๋„ ์ข…์†์  ํฌ๊ธฐ ์กฐ์ •์ด ํ•„์š”ํ•œ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์ด๋ฏธ์ง€ ์ž์‚ฐ์„ ๋Œ€์‹ ํ•˜์—ฌ ์—ฌ์ „ํžˆ ์กฐ์‚ฌ ์ค‘์ž…๋‹ˆ๋‹ค.

๋ฒกํ„ฐ ํ˜•์‹ ์ง€์›์— ์ ‘์„ ์ด๋ฏ€๋กœ ์ด๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ๋˜ ๋‹ค๋ฅธ ๋ฒ„๊ทธ๋ฅผ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค.

#2337 ์ฐธ์กฐ

Android๋Š” SVG์˜ ์„ฑ๋Šฅ์ด ์ข‹์€ ํ•˜์œ„ ์ง‘ํ•ฉ์ธ "VectorDrawable" ํ˜•์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์›์ด ์žˆ๊ณ  Android ํŒ€์—์„œ ์„ฑ๋Šฅ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•œ ๊ฒฝ์šฐ ๋™์ผํ•œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

VectorDrawable์€ ํ™•์‹คํžˆ SVG์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€๋งŒ ํ•˜์œ„ ์ง‘ํ•ฉ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ XML์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๋Š” XML์ด ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์„ฑ๋Šฅ์ด ์ข‹์€ ๋ฒกํ„ฐ ํ˜•์‹์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ๊ฑฐ์˜ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. :-)

VectorDrawable์„ ์—„๊ฒฉํ•œ ํ•˜์œ„ ์ง‘ํ•ฉ์œผ๋กœ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋˜์—ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ข‹์€ _render_ ์„ฑ๋Šฅ ๋ณด์žฅ๊ณผ ์‚ฌ์šฉ ํŽธ์˜์„ฑ ์‚ฌ์ด์—์„œ ๊ท ํ˜• ์žกํžŒ ์ ˆ์ถฉ์•ˆ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. VectorDrawable ์‚ฌ์–‘์€ ๊ฒฝ๋กœ ๋ฐ์ดํ„ฐ ๊ตฌ๋ฌธ๊ณผ ๊ฐ™์€ ์ฃผ์š” ์˜์—ญ์— ๋Œ€ํ•œ SVG ์‚ฌ์–‘์„ ์ž์ฃผ ๋”ฐ๋ฅด๋ฏ€๋กœ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” SVG ์ž์‚ฐ์„ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜ํ•˜๊ณ  ๊ธฐ์กด Android ์•ฑ์— ์ด๋ฏธ ํฌํ•จ๋œ VectorDrawable์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

XML์ด ๊ตฌ๋ฌธ ๋ถ„์„์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— XML์ด ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ๋ฐฉํ•ด ์š”์†Œ๋ผ๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Flutter์˜ 60fps ์•ฑ ๋ชฉํ‘œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์„ฑ๋Šฅ์˜ ์ข…๋ฅ˜์ธ _render_ ์„ฑ๋Šฅ์€ ํ•œ ๋ฒˆ ์ˆ˜ํ–‰ํ•˜๊ณ  ์บ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ ๋ถ„์„ ๋‹จ๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ Skia๊ฐ€ ๊ทธ๋ ค์•ผ ํ•˜๋Š” ๋ฒกํ„ฐ ์ž‘์—… ์„ธํŠธ์— ๋” ๋งŽ์ด ์˜์กดํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์š”์ ์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ์ž‘์—…์ด ์ด๋ฏธ ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฏ€๋กœ "2.0 ๋ฆด๋ฆฌ์Šค ์ดํ›„" ์ด์ •ํ‘œ์—์„œ ๋ณด๋ฅ˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๋Š๋‚Œ์„ ์ง€์šธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ ์•„์ด์ฝ˜์— ๋จธํ‹ฐ๋ฆฌ์–ผ ๋””์ž์ธ ๊ธ€๊ผด์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ง์ ‘ dart:ui ํ˜ธ์ถœ์ด๋‚˜ CustomPaint ์œ„์ ฏ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋Š˜ Flutter ์œ„์— ์ด๊ฒƒ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋ฐฉํ•ด๊ฐ€ ๋˜๋Š” ์žฅ์• ๋ฌผ์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค: https://docs.flutter.io/flutter/widgets/CustomPaint-class. HTML. ํ˜„์žฌ๋กœ์„œ๋Š” ๊ทธ๋Ÿฌํ•œ ๊ตฌ์ถ•์— ๋Œ€ํ•œ ์ฆ‰๊ฐ์ ์ธ ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹ค.

$.02 - ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ์ด ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €( ๋ฐ ๊ฒฝ์Ÿ์ž ํ”„๋ ˆ์ž„์›Œํฌ์ธ React Native ๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์ด ํ•ดํ‚น๋จ)๋„ SVG๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๋‚ด๋ณด๋‚ด๊ธฐ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŒ€์˜ ๊ฐ ์•„์ด์ฝ˜ ๋˜๋Š” ์•„ํŠธ ์ž์‚ฐ์— ๋Œ€ํ•ด ์ตœ์†Œ 3๊ฐœ์˜ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ SVG ํŒŒ์ผ์ด ๋ชจ๋“  ํ•ด์ƒ๋„์—์„œ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜๋ฉด ์ด๋Š” ์ข‹์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

Hixie์˜ ์œ„ ์˜๊ฒฌ์— ๋Œ€ํ•ด ๊ธฐ์กด ๊ธฐ๋Œ€๊ฐ€ ๊ฐ€์น˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋ฐฉํ•ดํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” SVG ๋””์Šคํ”Œ๋ ˆ์ด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›(์ €์™€ ์ œ ํŒ€์˜ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ)์„ ํ›จ์”ฌ ๋” ์ข‹์•„ํ•˜๊ณ  ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋Š” PNG๋ฅผ ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋Š” ์ˆ˜์˜ PNG์— ์˜์กดํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ™•์žฅ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด ํ•ด์ƒ๋„์˜ ์ˆ˜.

ํŒ€์„ ์œ„ํ•ด ๊ธ€๊ผด์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ๋Œ์•„๊ฐ€๊ณ  ์žˆ์ง€๋งŒ ๊ธ€๊ผด ํ˜•์‹์ด ์•ฑ์—์„œ ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” ์ค„ ๋†’์ด ๋ฐ ๋ฌธ์ž ๊ฐ„๊ฒฉ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ํ˜•์‹์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ SVG ์ง€์›๋งŒํผ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธ€๊ผด์€ ๊ณ ์ •๋œ ํ•ด์ƒ๋„(12px, 16px, 20px, 36px...)๋กœ ํ‘œ์‹œ๋˜๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

๋ฉ‹์ง„ Flutter ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. :)

SVG ์ง€์›์„ ์›ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด SVG ์ง€์›์„ Flutter์šฉ Dart ํŒจํ‚ค์ง€๋กœ ๊ตฌํ˜„ํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ด€์‹ฌ ์žˆ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ๋“œ๋กœ์ž‰์„ ์œ„ํ•œ ์ €์ˆ˜์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ https://docs.flutter.io/flutter/dart-ui/dart-ui-library.html ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

ํŒ€์—์„œ: Dart ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์†”๋ฃจ์…˜์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋„˜๊ฒจ.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? Flutter์˜ ์ „์ฒด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” Dart ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์€ Dart ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. "์ถฉ๋ถ„ํžˆ ์ข‹์€" ์กฐ๊ฑด์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด ์–ผ๋งˆ ์ „์— ์ˆœ์ˆ˜ Dart์—์„œ (๋‹จ์ˆœํ•˜๊ณ  ํฌ๊ด„์ ์ด์ง€ ์•Š์€) SVG ํŒŒ์„œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/matanlurey/svg

๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์†Œ ์‚ฌ์†Œํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ใ…. dart:ui ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋Ÿฐํƒ€์ž„ SVG -> SvgRenderElement ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
๋น„. SVG๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ™˜ํ•˜๋Š” ๋นŒ๋“œ ํƒ€์ž„ ์ปดํŒŒ์ผ ๋‹จ๊ณ„๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

// compiled from star.svg
void drawStarSvg(canvas, width, height) { ... }

@deborah-ufw ๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋ฉด ์ฑ„ํŒ…์„ ํ†ตํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”. ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์‹œ๊ฒ ์–ด์š”?

์•ˆ๋…•ํ•˜์„ธ์š” Seth, matanlurey ๋ฐ Hixie - ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €๋Š” ์•„๋งˆ๋„ Dart ํ”Œ๋Ÿฌ๊ทธ์ธ ์†”๋ฃจ์…˜์„ ๊ฑฐ๋ถ€ํ•œ ๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ์ˆ˜์„ ์—”์ง€๋‹ˆ์–ด์˜€๊ธฐ ๋•Œ๋ฌธ์— ๊นŠ์ด ์ด์•ผ๊ธฐํ•  ์ ์ ˆํ•œ ์‚ฌ๋žŒ์ด ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด Github ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๊ทธ๋“ค์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ  ๊ทธ๋“ค์˜ ์ฝ”๋ฉ˜ํŠธ์— ๋Œ€ํ•œ ๊ธฐ์ˆ ์ ์ธ ์ด์œ ๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ์š”์ฒญํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ http://gitter.im/flutter/flutter ๋ฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ https://flutter.io/support/์— ๋‚˜์—ด๋œ ๊ธฐํƒ€ ์—ฐ๋ฝ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์—”์ง€๋‹ˆ์–ด์™€ ์ง์ ‘ ์ฑ„ํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! :๋””

๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ http://svgpp.org/ ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ธฐ๋ณธ ์ˆ˜์ค€์—์„œ ํ†ตํ•ฉํ•˜๊ณ  Flutter ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ์™„์ „ํ•œ SVG ์ง€์›์„ ์œ„ํ•œ ์ตœ์ƒ์˜ ํฌ๊ธฐ/์„ฑ๋Šฅ ํŠน์„ฑ์„ ์ œ๊ณตํ•  ๊ฒƒ์ด์ง€๋งŒ ์ข…์†์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋น„์šฉ์„ ํฌ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—”์ง„ ์ˆ˜์ค€์—์„œ SVG ์ง€์›์„ ์ฐพ๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ํ‘œ์ค€์˜ ์™„์ „ํ•œ ์ง€์›์„ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๊ฑฐ๋‚˜ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ˜ธ์†Œ์˜ ์ผ๋ถ€๋Š” ๊ต์ฐจ ๊ธฐ๋Šฅ ํŒ€๊ณผ ๊ธฐ์กด ๋„๊ตฌ์— ๋Œ€ํ•œ ์ง€์›์ž…๋‹ˆ๋‹ค.

Skia๊ฐ€ ๊ธฐ๋ณธ์ ์ธ SVG ์ง€์›์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ Flutter์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‚˜์š”?

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด, ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์‹คํ—˜์ ์ด๊ณ  ๋ถ€๋ถ„์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. https://bugs.chromium.org/p/skia/issues/detail?id=5596 ๋น„ํŠธ ์—ฌ๊ธฐ์— ์—ด๋ฆฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 1๋…„์ด ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋˜ํ•œ ๋กœ๋“œ๋งต์— ๋‚˜์—ดํ•˜๊ณ  ์žˆ์ง€๋งŒ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋‹ค์‹œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

SVG ์ง€์›์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์ธ SVG ๋ฌธ์„œ ๋ชจ๋ธ์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—”์ง„ ์ˆ˜์ค€์—์„œ SVG๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์ด์น˜์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Flutter๊ฐ€ SVG๋ฅผ ์ง€์›ํ•œ๋‹ค๋ฉด, ์‹ค์ œ SVG๋ฅผ ์‹ค์ œ๋กœ ์‹ค์ œ๋กœ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๊ถ๊ทน์ ์ธ ๋ชฉํ‘œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์„ ๋ฌด์‹ฌ์ฝ” ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ Flutter์˜ ์ฒ ํ•™์— ์–ด๊ธ‹๋‚ฉ๋‹ˆ๋‹ค.

SVG ๋ฌธ์„œ ๋ชจ๋ธ์„ SVG ์ง€์›์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์œผ๋กœ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ๋‚ด๊ฐ€ ์—ผ๋‘์— ๋‘๊ณ  ์žˆ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์˜ˆ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ˆ˜์ค€ ์ง€์›์„ ํ†ตํ•ด ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—”์ง„ ์ž์ฒด๊ฐ€ SVG ๋ฐ์ดํ„ฐ(์ค‘์š”ํ•œ ํ•˜์œ„ ์ง‘ํ•ฉ)๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ SVG ํ•˜์œ„ ์ง‘ํ•ฉ์— ์˜ํ•ด ์ •์˜๋œ ๋ฒกํ„ฐ ์ด๋ฏธ์ง€ ์ž์‚ฐ์„ ๋ Œ๋”๋งํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋ถ„๋ช…ํžˆ ๊ทธ๊ฒƒ๋ณด๋‹ค ๋” ํฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์กด SVG ์ž์‚ฐ์„ ๊ฐ€์ ธ์™€์„œ ๋ชจ๋‘ ๋ถ€ํ”ผ๊ฐ€ ํฐ ๋ž˜์Šคํ„ฐ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํ•ด์ƒ๋„์—์„œ ์ ์ ˆํ•˜๊ฒŒ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์˜ˆ, SVG ์ž์‚ฐ ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ์ •๋ง ์ข‹์ง€๋งŒ SVG ์‚ฌ์–‘์€ 800ํŽ˜์ด์ง€๊ฐ€ ๋„˜์Šต๋‹ˆ๋‹ค. Skia(๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์—์„œ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ์ •์  ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ณต์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด ์ฃผ๋ง์—๋งŒ ์•„๋ฅด๋ฐ”์ดํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ”๋กœ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ˆ˜๋งŽ์€ SVG ํŒŒ์ผ์ด ์žˆ์ง€๋งŒ ๋ชจ๋‘ ๋™์ผํ•œ ํ•ญ๋ชฉ(flaticon์˜ ์•„์ด์ฝ˜ ๋ชจ์Œ)์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด ๊ธฐ๋Šฅ์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ƒ˜ํ”Œ SVG ํŒŒ์ผ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์นด๋ฅผ๋กœ์Šค.

์ €๋„ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ƒ๊ฐํ•ด๋‚ธ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—”์ง„ ๋ ˆ๋ฒจ ๊ตฌํ˜„

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋งค๋ ฅ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

  1. ์ด๋ก ์ ์œผ๋กœ image: new AssetImage('graphics/background.svg') ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•˜์—ฌ ์ผ๋ถ€ C/C++ ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  SVG ๋ฐ์ดํ„ฐ๋ฅผ Skia ๋ Œ๋”๋ง ๋ช…๋ น์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ์—”์ง„ ์ˆ˜์ค€์—์„œ Skia์— ์ƒ๋‹นํžˆ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ข‹์€ ํ›„๋ณด
  3. WebKit์˜ SVG ๋กœ์ง์€ ๊ต‰์žฅํ•˜์ง€๋งŒ ์˜์กด์„ฑ์ด ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  4. librsvg๊ฐ€ ๋„ˆ๋ฌด ์ž˜ ์ด์‹๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(Cairo์™€ ๊ธด๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜๊ณ  Rust๋กœ ๊ธฐ๋ณธ ์–ธ์–ด๋กœ ์ „ํ™˜๋จ - ์ตœ์†Œํ•œ Skia๋ฅผ ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•จ).

๊ทธ๋Ÿฌ๋‚˜ ์ตœ์†Œํ•œ ๋ช‡ ๊ฐ€์ง€ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ…์ŠคํŠธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ
  • CSS๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌ(๋งŒ์•ฝ ์žˆ๋‹ค๋ฉด? ๊ทธ๋Ÿฌ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ์ž‘์—…์ด ์•„๋‹™๋‹ˆ๋‹ค)
  • ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ(๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์„ ๋ณด๋‹ค ์›ํ™œํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ)์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹คํŠธ ๋ ˆ๋ฒจ ๊ตฌํ˜„

  1. Flutter์˜ dart:ui ๋Š” SVG๊ฐ€ ์ด๋ฏธ ํ•„์š”๋กœ ํ•˜๋Š” Skia์˜ ๋งŽ์€ ๊ธฐ๋ณธ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ํ…์ŠคํŠธ ๋ Œ๋”๋ง์ด ์—”์ง„ ์ˆ˜์ค€๋ณด๋‹ค ์ด ์ˆ˜์ค€์—์„œ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  3. ๋” ๋งŽ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์œ ์ง€/ํ™•์žฅํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ตฌ๋ฌธ ๋ถ„์„ ๋กœ์ง๊ณผ์˜ ์ง์ ‘์ ์ธ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋ณด๋‹ค ์ €๋ ดํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ์™ธ ๋ฐ/๋˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด?)

๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • CSS ์ง€์›์ด ํ›จ์”ฌ ์ข‹์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง€์›ํ•˜๋Š” ๋ฐ ํ›จ์”ฌ ๋„์›€์ด ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋” ๋Š๋ฆด ์ˆ˜ ์žˆ์Œ

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ

์ƒ˜ํ”Œ SVG์— ๊ด€ํ•œ ํ•œ 1.1 ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์—์„œ ์ง€์›๋˜๋Š” SVG(๋˜๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ ์ง€์›๋˜๋Š” ๊ฒฝ์šฐ ๋ถ€๋ถ„์ ์œผ๋กœ ์ง€์›๋˜๋Š” SVG)๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
https://github.com/w3c/web-platform-tests/tree/master/svg/import

๋˜๋Š” ์—ฌ๊ธฐ์—์„œ ์ผ๋ถ€ PNG ๋น„๊ต: https://www.w3.org/Graphics/SVG/Test/20110816/


@cbazza , ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ์‹œ์ ์—์„œ ์ €๋Š” Dart ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ๊ตฌํ˜„์— ๋” ๊ธฐ์šธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์•„์ด์ฝ˜ ์œ ํ˜• ์ง€์›์€ IconData์™€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ํฌ์ธํŠธ๋‹น ๋‹จ์ผ ๊ฒฝ๋กœ๋งŒ ์ง€์›ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

dart:ui ์œ„์— 'Dart ๋ ˆ๋ฒจ ๊ตฌํ˜„'์„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

2๊ฐ€์ง€ ๊ธฐ๋ณธ ์‚ฌ์šฉ ์‚ฌ๋ก€:

(1) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •์  ์•„์ด์ฝ˜ svg ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
"์ด๋ฏธ์ง€: new AssetImage('graphics/background.svg')", ์—ฌ๊ธฐ์„œ
ํŒŒ์ผ์€ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ๋˜๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋™์ ์œผ๋กœ.

(2) DSX๋ฅผ ํ†ตํ•œ ์œ„์ ฏ ๊ธฐ๋ฐ˜ svg ์ง€์›(JSX ์œ ์‚ฌ ๊ตฌ์„ฑ)
๋‹ค์Œ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
https://github.com/react-native-community/react-native-svg

'ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ'์™€ ๊ด€๋ จํ•˜์—ฌ ํ•„์š”ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์‹ค์ œ ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ w3 ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. SVG ์ง€์›์€ ์ข…์†์ ์ž…๋‹ˆ๋‹ค.
dart:ui ๊ฐ€ ์ง€์›ํ•˜๋Š” ํ•ญ๋ชฉ์— ๋”ฐ๋ผ ์›ํ•˜๋Š” svg ํŒŒ์ผ์— ๋‹ค์Œ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด
dart:ui ๋กœ ํ•  ์ˆ˜ ์—†๋Š” ์ผ, ๋‚˜๋Š” ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค
๋นจ๋ฆฌ ์•Œ์•„๋ณด์‹ญ์‹œ์˜ค.

์นด๋ฅผ๋กœ์Šค.

๋ฐ˜์‘ํ˜• ๊ธฐ๋ณธ SVG ๋ชจ๋ธ๋กœ ๊ฐ€์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ w3 ์ œํ’ˆ๊ตฐ์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ, ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šด์ง€์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ๊ธฐ์ค€์„ ์ œ๊ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค)

๋งž์•„์š” ๋ญ”๊ฐ€ ์˜คํ•ด๊ฐ€ ์žˆ๋Š”๋“ฏ...
(1)์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ํ‘œ์ค€ SVG ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  dart:ui (Skia)๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ์ตœ๋Œ€ํ•œ ์ง€์›ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
SVG์™€ ๊ฐ™์€ ๊ตฌ์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์œ„์ ฏ์„ ์ƒ์„ฑํ•˜๋Š” (2)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ•ด๋‹น react-native-svg ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ๋‹ค๋ฅธ 2๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

@cbazza ์•ฑ์˜ svgs ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ฃผ๋กœ ์•„์ด์ฝ˜์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ƒ‰ svgs์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋Œ€ํ‘œ์ ์ธ ์ตœ๊ทผ svgs๋ฅผ ์„ ํƒํ•˜์—ฌ Dropbox์— ์žˆ๋Š” zip ํŒŒ์ผ์— ๋Œ€ํ•œ ๋งํฌ์ž…๋‹ˆ๋‹ค. https://www.dropbox.com/s/dp38wxc22625cvc/icons.zip?dl=0

์—ฌ๊ธฐ์— ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. SVG Flutter ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ™œ์„ฑํ™”๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ๋‹ค์†Œ SVG ํŒŒ์ผ ์‹œํ€€์Šค์˜ ์ผ๋ถ€ ์ตœ์†Œํ•œ์˜ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚˜์ค‘์— ์•„์ด์ฝ˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” Dart ํŒŒ์ผ์„ ๋คํ”„ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. vitool .

์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AnimatedIcons ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ์œผ๋ฉฐ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ ์•ฑ ( cd dev/manual_tests; flutter run -t lib/animated_icons.dart )์„ ์‹คํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ ์ด๊ฑฐ๋‚˜ ์™„์ „ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ์•„์ด์ฝ˜ ์„ธํŠธ์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ๋ˆ„๊ตฐ๊ฐ€๋Š” ์ด๋ฅผ ๋ถ„๊ธฐ/ํ™•์žฅํ•  ๊ถŒํ•œ์ด ์žˆ๋‹ค๊ณ  ๋Š๊ปด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‹จ์ƒ‰ ์•„์ด์ฝ˜์— ๋Œ€ํ•ด @deborah-ufw ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ์•„์ด์ฝ˜ ๊ธ€๊ผด์„ ๋งŒ๋“ค๊ณ  ์•„์ด์ฝ˜ ์œ„์ ฏ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•„์ด์ฝ˜์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@amirh ๋Š” ์ƒ‰์ƒ ๋ฒกํ„ฐ ๊ธ€๊ผด์„ ๋งŒ๋“ค๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@amirh ์œ„์˜ ์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์€ ๊ฒฝ์šฐ ๊ธ€๋ฆฌํ”„๋ฅผ ์•„์ด์ฝ˜์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ธ€๊ผด์„ ๋งŒ๋“ค๊ณ  ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ SVG๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ถ”๊ฐ€ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. SVG ์ง€์›์€ ๊ธ€๊ผด๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ zoechi๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ƒ‰์ƒ์ด ์žˆ๋Š” ๋ฒกํ„ฐ ์•„ํŠธ๋Š” ๊ธ€๊ผด๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ ์•„์ด์ฝ˜์„ ๋ณด๊ณ  ๋‹จ์ƒ‰ ์•„์ด์ฝ˜๋งŒ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

@deborah-ufw, ํŒŒ์ผ์— ๋Œ€ํ•ด ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ์ œ๊ฐ€ ์ฐพ๋˜ ๊ฒƒ์ด์—ˆ๊ณ  ์ด๋ฏธ ์ œ ํŒŒ์ผ์— ์—†๋Š” ๊ฒƒ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

@amirh , ๋„ค, ๋‹น์‹ ์˜ ํ›Œ๋ฅญํ•œ ์ž‘ํ’ˆ์„ ์ด๋ฏธ ๋ณด์•˜์Šต๋‹ˆ๋‹ค ;)

svg ๋˜๋Š” vector asset xml์„ flutter์šฉ ์ด๋ฏธ์ง€์— ์†Œ์Šค๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋งˆ์นจ๋‚ด ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ?

@Hixie : ๋‹ค์ค‘ ํ”Œ๋žซํผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋ฐ”์ผ ํŒ€์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์ง„์ •ํ•œ ๊ณ ์ถฉ์ด์ง€๋งŒ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ถ€๋ถ„์ ์ด๊ณ  ๋น„๊ต์  ๊ฐ„๋‹จํ•œ SVG ์ง€์› ๋งŒ ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ (์žฌ)๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. SVG ํ‘œ์ค€ ์œ ์ง€ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ด๊ฒƒ์€ ๋ฌด๋ชจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์ง€๋งŒ Flutter๋Š” ์ผ๋ฐ˜ ํ‘œ์ค€ ์ž‘์„ฑ์ž๊ฐ€ ์•„๋‹Œ ๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Flutter๊ฐ€ ์‹ค์ œ์ ์ธ ๊ณ ํ†ต์„ ๋œ์–ด์ค€๋‹ค๋ฉด ๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ์ž์˜ ๋งˆ์Œ์„ ์‚ฌ๋กœ์žก์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๋Ÿฌํ•œ ์˜ค๋žœ ์š”๊ตฌ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์› ์ ‘๊ทผ ๋ฐฉ์‹์€ Flutter ๊ฒฝ์Ÿ์ž Xamarin ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค(Xamarin ๊ฒฝํ—˜ 5๋…„์—์„œ - ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋””์ž์ธ ๋„๊ตฌ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ณ , ๋„ˆ๋ฌด ์ œํ•œ์ ์ด๋ฉฐ, ์•ˆ์ •์ ์ด์ง€ ์•Š์œผ๋ฉฐ, ์œ ๋ฃŒ ๋ฐ/๋˜๋Š” ๋น„๊ณต๊ฐœ ์†Œ์Šค).

์ด ๋•Œ๋ฌธ์— Xamarin ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์‹คํŒจํ•œ ๊ณณ์—์„œ Flutter ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์„ฑ๊ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋‚™๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‹ค์šฉ์ ์ด๋ผ๊ณ  ์ถ”์ •ํ•œ๋‹ค. SVG ์•„์ด์ฝ˜์— ๋Œ€ํ•œ ๋ถ€๋ถ„ ์ง€์›์€ Flutter ํŒ€์ด ๊ธฐ์กด Skia ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Š” Flutter์˜ ๋ชฉํ‘œ์— ์ž˜ ๋ถ€ํ•ฉํ•ฉ๋‹ˆ๋‹ค . ๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ๋ก์ ์ธ ์‹œ๊ฐ„ ๋‚ด์— ์•„๋ฆ„๋‹ต๊ณ  ๊ณ ์„ฑ๋Šฅ์˜ UX๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ƒ์‚ฐ์„ฑ, ์ถฉ์‹ค๋„ ๋ฐ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค(SVG๋Š” ๋ชจ๋“  PNG๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํฌ๋ฆฌ์—์ดํ‹ฐ๋ธŒ ๋””์ž์ด๋„ˆ ๋„๊ตฌ(์˜ˆ: Adobe)์—์„œ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋ณธ ์•ฑ ์•„์ด์ฝ˜์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์ƒ์‚ฐ์ ์ธ ์›Œํฌํ”Œ๋กœ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ PNG ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ƒ์‚ฐ์„ฑ๊ณผ ์•ฑ ํฌ๊ธฐ ์ธก๋ฉด์—์„œ ๋งค์šฐ ๋‚ญ๋น„์ ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์•„์ด์ฝ˜์„ ์ตœ๋Œ€ 9๊ฐœ์˜ ๊ณ ์ • ๋น„ํŠธ๋งต(Android 6๊ฐœ, iOS 3๊ฐœ)์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ œ๊ณตํ•œ ๋‹ค์Œ ๋Ÿฐํƒ€์ž„์— ํ›„์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ์›์‹œ์ ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ํ•ด์ƒ๋„์˜ ํฌ๊ธฐ์™€ ๋ณ€ํ˜•์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๊พธ์ค€ํžˆ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์œ ์พŒํ•œ ํ˜์‹ ์ ์ด๊ณ  ์ƒ์‚ฐ์ ์ธ Flutter ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์—์„œ ์•„ํ”ˆ ์—„์ง€์†๊ฐ€๋ฝ์œผ๋กœ ํŠ€์–ด๋‚˜์˜ต๋‹ˆ๋‹ค. Flutter๋Š” ์—ฌ๊ธฐ์—์„œ ๊ฐœ๋ฐœ์ž์˜ ๋งˆ์Œ๊ณผ ๋งˆ์Œ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ง„์ •ํ•œ ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ @dnfield ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ Flutter์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์žฅ์• ๋ฌผ๋กœ ์–ธ๊ธ‰๋œ SVG ๊ธฐ๋Šฅ ์€ ์ œ ๊ฒฝํ—˜์ƒ ๊ด€๋ จ์ด ์—†๊ฑฐ๋‚˜ ํ•ด๋‹น ๋””์ž์ธ ์ž์‚ฐ์— ๋Œ€ํ•ด PNG๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„ ๋ถˆํŽธํ•  ์ •๋„๋กœ ๋“œ๋ฌธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Don't care: CSS, HTML, SMIL, ๋ฌธ์„œ ๋ชจ๋ธ, ์Šคํฌ๋ฆฝํŒ…
์• ๋‹ˆ๋ฉ”์ด์…˜, ํ…์ŠคํŠธ: ์ด๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ธฐ์ˆ ๋กœ ๋Œ€์ฒดํ•  ๋งŒํผ ํฌ๊ท€ํ•ฉ๋‹ˆ๋‹ค.

์ด ์„ค๋ช…์˜ ๊ธธ์ด๊ฐ€ ์†”๋ฃจ์…˜์˜ ๊ฐ€์น˜๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ—‰!

@VincentH-Net ๋‚˜๋„ ์•„ํŒŒ์„œ 100% ๋™๊ฐ!!! SVG ํŒŒ์ผ ์ค‘ ์ผ๋ถ€๋ฅผ ์ €์—๊ฒŒ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค. ์•„๋งˆ๋„ Xamarin์€ SVG ์ง€์›์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ์—”์ง„์˜ ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด SVG ์ง€์›์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Flutter with Skia์˜ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ ์†”๋ฃจ์…˜์ด ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ๋งค์šฐ ๋‚™๊ด€ํ•ฉ๋‹ˆ๋‹ค.

FWIW, Xamarin์—๋Š” SkiaSharp์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Skia๋„ ์žˆ์Šต๋‹ˆ๋‹ค. SVG๋Š” ์ตœ์†Œํ•œ์˜ ๊ตฌํ˜„์—๋„ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ @cbazza ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ท€ํ•˜์™€ ํ˜‘๋ ฅํ•˜๋Š” ๋ฐ ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ธก๋ฉด์—์„œ Lottie๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@dnfield ์ด Lottie ์• ๋‹ˆ๋ฉ”์ด์…˜์€ Flutter ์œ„์ ฏ์œผ๋กœ ์‰ฝ๊ฒŒ ๋‹ค์‹œ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@dnfield , ์œ„์ ฏ์—์„œ ์ƒ์œ„ ์ˆ˜์ค€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ์—”์ง„ ์ˆ˜์ค€์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•˜์œ„ ์ˆ˜์ค€ ์‚ฌ๋žŒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋น„๋™๊ธฐ svg ๊ตฌ๋ฌธ ๋ถ„์„, ์บ์‹œ๋˜์–ด ๋ Œ๋”๋ง ์—…๋ฐ์ดํŠธ ์‹œ ์บ”๋ฒ„์Šค๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” '๊ทธ๋ฆผ' ๊ตฌ์„ฑ ๋“ฑ).
๋„ค, Lottie ์ž‘์—…์€ ๋””์ž์ด๋„ˆ/๊ฐœ๋ฐœ์ž ์›Œํฌํ”Œ๋กœ์— ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค.
@zoechi ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘๋™ํ•˜๋Š” Lottie ์œ„์ ฏ์„ ๊ฐ„๋‹จํžˆ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ ์œ„์ ฏ์„ ์‚ฌ์šฉํ•˜์—ฌ ์†์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์œ„์˜ ๋‚ด ์ด์ „ ๋ชฉํ‘œ(2)๊ฐ€ ์œ„์ ฏ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ํ•จ๊ป˜ ์ž˜ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ์ง€๋งŒ(๋”ฐ๋ผ์„œ ๋‚˜๋„ ํ•˜๊ณ  ์‹ถ์€ ์ด์œ ).

@zoechi - ๋ชฉํ‘œ๋Š” ๋””์ž์ด๋„ˆ๊ฐ€ ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ฒƒ์„ ๋งŒ๋“ค๊ณ  ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ชฉํ‘œ๋Š” ์‚ฌ์ „ ์ปดํŒŒ์ผ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๊ณ  ๋Ÿฐํƒ€์ž„ ์‹œ ๋ฆฌ์†Œ์Šค๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

SVG์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์˜ˆ, ๊ฐœ๋ฐœ์ž๋Š” ํ™•์‹คํžˆ SVG ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ Dart๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ƒ์ ์œผ๋กœ๋Š” ๋ฒกํ„ฐ ๋“œ๋กœ์ž‰(SVG ์—ฌ๋ถ€) ๋ฆฌ์†Œ์Šค๋ฅผ ํฌํ•จํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์— ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•ด์„œ, ์ €๋Š” ๋””์ž์ด๋„ˆ์—๊ฒŒ ๋ฒกํ„ฐ ์ž์‚ฐ์„ ํ•œ ๋ฒˆ ์ƒ์„ฑํ•˜๊ณ  ์ตœ์†Œํ•œ์˜ ์ˆ˜์ •์œผ๋กœ Flutter ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์‹œํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค(๋””์ž์ด๋„ˆ๊ฐ€ ์ด๋ฅผ ๋‹ค์–‘ํ•œ ๋ž˜์Šคํ„ฐ ํ˜•์‹์œผ๋กœ 5๋ฒˆ ๋‚ด๋ณด๋‚ด์ง€ ์•Š๊ณ ๋„ Apple ๋˜๋Š” Samsung์ด ๋‹ค์Œ ์ „ํ™”๋ฅผ ์ถœ์‹œํ•˜๋Š” ์ฆ‰์‹œ ๋ฌดํšจํ™”๋จ).

๋‹ค์–‘ํ•œ ๋ž˜์Šคํ„ฐ ํ˜•์‹

์˜ˆ, ์ง€๋‚œ 10๋…„์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

https://github.com/luberda-molinet/FFImageLoading ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ Skia๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Xamarin์šฉ SVG๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

@escamoteur

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ๋งŒ ๋นผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ;)

์ตœ๊ทผ์— Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ”๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๋ˆˆ์— ๋„๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„์ด์ฝ˜์ด ์„ ๋ช…ํ•˜๊ณ  ์•ฑ ํฌ๊ธฐ๊ฐ€ ํ›จ์”ฌ ์ž‘์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์–‘ํ•œ ์ด๋ฏธ์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ๊ณ  ๋น ๋ฆ…๋‹ˆ๋‹ค. ์ด @2 , @3 , @4 , @5 ,.... ์†”๋ฃจ์…˜์€ Flutter์™€ ๊ฐ™์€ ํ˜„๋Œ€์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ํ•œ ๊ฑธ์Œ ๋ฌผ๋Ÿฌ๋‚œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ์™œ ๋‹น์‹ ์ด ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ”์„ ๋‹ด๋‹นํ•˜๋Š” ํŒ€์— ๊ฐˆ ์ˆ˜ ์—†๊ณ  ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋“ค์˜ ์•„์ด๋””์–ด๋‚˜ ๊ตฌํ˜„(๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ ์บ”๋ฒ„์Šค์— ๊ทธ๋ ค์ง„ ์ผ๋ถ€ SVG๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€์•˜์Šต๋‹ˆ๋‹ค. path ์š”์†Œ๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ ๊ฐ€์žฅ ๊นŒ๋‹ค๋กญ์ง€๋งŒ ๋…ธ์ถœ๋˜๋ฉด ์ •๋ง ๋„์›€์ด ๋˜๋Š” Skia API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์—”์ง„์— ๋…ธ์ถœ์‹œํ‚ค๋Š” ์‹คํ—˜์„ ํ–ˆ๊ณ , ์ข€ ๋” ๋‹ค๋“ฌ์„ ์‹œ๊ฐ„์ด ์ƒ๊ธฐ๋ฉด PR์„ ์—ด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๋žต์ ์ธ ์•„์ด๋””์–ด๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” Skia API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SVG ๋ฐ์ดํ„ฐ ๋ฌธ์ž์—ด์—์„œ dart:ui Path ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ๋ฐฉ๋ฒ•์€ static Path Path.parseFromSvgData(String svgData) -> Path ์ž…๋‹ˆ๋‹ค.

์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ณ€ํ˜•/ํš/์ฑ„์šฐ๊ธฐ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. @amirh ๊ฐ€ ํ•œ ์ž‘์—…์—์„œ ์ƒ๋‹นํ•œ ์–‘์˜ ๊ฒƒ์„ ๋นŒ๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(SkParsePath์—๋Š” ์—†๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๊ณ  SkParsePath์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ SkParsePath๋Š” ๊ฐ ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น์— ๋Œ€ํ•ด ์™•๋ณต์ด ์•„๋‹Œ ๊ฒฝ๋กœ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ ์ธก์— ํ•œ ๋ฒˆ ์™•๋ณต). ์ €๋„ ๋น„์Šทํ•œ ์ด์œ ๋กœ @matanlurey ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

https://github.com/flutter/flutter/blob/master/dev/tools/vitool/lib/vitool.dart , https://github.com/dnfield/flutter_svg (ํ˜„์žฌ ๋‘ SVG๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Œ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ์บ”๋ฒ„์Šค์— ํฌํ•จ๋จ) ๋ฐ https://github.com/dnfield/engine/tree/path_svg (ํ˜„์žฌ Lottie์— ๋Œ€ํ•œ PathMeasure/PathMetrics ๊ด€๋ จ ์ž‘์—…๋„ ํฌํ•จ๋˜์–ด ์žˆ์Œ).

์•ˆ๋…•ํ•˜์„ธ์š” @dnfield ์ž…๋‹ˆ๋‹ค .

๋‹ค์Œ์€ ๊ท€ํ•˜์˜ ์ดˆ๊ธฐ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ œ ์˜๊ฒฌ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฌด์Šจ ๋ง์„ ํ•˜๋“  ์—ฌ๋Ÿฌ๋ถ„์˜ ์—ด์ •๊ณผ ์ฝ”๋”ฉ ์ง„ํ–‰์— ์•„๋ฌด๋Ÿฐ ์ฐจ์ด๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์ด ํ• ์ˆ˜๋ก ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ฌธ์ œ๋Š” ์•„ํ‚คํ…์ฒ˜์ด๋ฉฐ ์—ฌ๊ธฐ์— ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. UI๊ฐ€ 60ํ”„๋ ˆ์ž„/์ดˆ๋กœ ์‘๋‹ตํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ๊ฐ ํ”„๋ ˆ์ž„์ด UI๋ฅผ ์ฐจ๋‹จํ•˜๊ธฐ ์ „์— ์‹คํ–‰ํ•˜๋Š” ๋ฐ ~16ms๋งŒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ ˆ๋ฐ˜์ด Flutter์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  SVG ํŒŒ์„œ์— 8ms๋ฅผ ๋‚จ๊ฒจ๋‘๊ณ  ํœด๋Œ€์ „ํ™”/ํƒœ๋ธ”๋ฆฟ์ด ์•„๋ฌด๋ฆฌ ๊ฐ•๋ ฅํ•˜๋”๋ผ๋„ ํ•ด๋‹น ๊ธฐ๊ฐ„์— SVG ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋Š๋ฆฐ ์žฅ์น˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ณ  ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ต์‹ฌ์€ ๊ฐ ํ”„๋ ˆ์ž„์ด ์ตœ๋Œ€ 8ms๊นŒ์ง€๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค์Œ ํ”„๋ ˆ์ž„์—์„œ ๋ฐ˜ํ™˜ ๋ฐ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— dart:xml ์„ ์‚ฌ์šฉํ•˜์—ฌ XML์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ „์ฒด ํŒŒ์ผ์ด ๊ตฌ๋ฌธ ๋ถ„์„๋  ๋•Œ๊นŒ์ง€ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ์€ 8ms ์•ˆ์— ๋ชจ๋“  ๊ฒƒ์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ธ‰ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ์ƒ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ํšจ๊ณผ๊ฐ€์žˆ์„ ๊ณ„ํš์ด ์žˆ์ง€๋งŒ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๋ฏ€๋กœ ํ•ญ์ƒ ๋‹น์‹ ์˜ ์ž‘์—…์„ ๊ฐ€์ ธ ์™€์„œ ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์ฒ˜๋Ÿผ ๊ณ„์† ํ•ด์ฃผ์…จ์œผ๋ฉดํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋””์ž์ธ์€ ํ˜„์žฌ ์ด๋ฏธ์ง€ ๋กœ๋“œ ๊ธฐ๋Šฅ(AssetImage ๋ฐ NetworkImage)์— ์—ฐ๊ฒฐ๋˜๋ฉฐ ์‚ฌ์šฉ์ž๋Š” '.png' ๋Œ€์‹  '.svg'๋ฅผ ์ง€์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์นด๋ฅผ๋กœ์Šค.

@cbazza ๊ทธ๋ƒฅ ์•„์ด๋””์–ด: ํŒŒ์‹ฑ์€ ๋ถ„๋ฆฌํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UI ๊ฒฉ๋ฆฌ ์ด์™ธ์˜ ๊ฒฉ๋ฆฌ์—์„œ ๋ฉ”์‹œ์ง€ ์ฑ„๋„๊ณผ ํ†ต์‹ ํ•˜๊ณ  ๋ณต์‚ฌ ๋Œ€์‹  ์ฐธ์กฐ๋กœ ๊ฒฉ๋ฆฌ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์ด ์ˆ˜ํ–‰๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ƒํƒœ๋‚˜ ์ง„ํ–‰ ์ƒํ™ฉ์€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ).

@cbazza - ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” dart_xml์ด ์ด์— ๋Œ€ํ•œ ์ตœ์„ ์˜ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ, ์ž‘๋™ํ•˜๊ณ  ๋“œ๋กœ์ž‰ ๋กœ์ง ์ฃผ๋ณ€์—์„œ ์•ฝ๊ฐ„์˜ ์ง„ํ–‰์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค(๋น„๋™๊ธฐ XML ํŒŒ์„œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋™์•ˆ ์ด๊ฒƒ์„ ์™„์ „ํžˆ ์ฐจ๋‹จํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค). ๋‚˜๋Š” ๋˜ํ•œ ImageProvider ๊ตฌํ˜„์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ชจํ˜ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด API์— ๋Œ€ํ•ด ์–ด๋–ค ์‹์œผ๋กœ๋“  ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ตœ์†Œํ•œ SVG ๊ทธ๋ฆฌ๊ธฐ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•„๋งˆ๋„ ๊ดœ์ฐฎ์€ ํœด๋Œ€ํฐ์—์„œ ๊ฐ„๋‹จํ•œ ๊ฒƒ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

XML/SVG ์ฝ๊ธฐ/ํŒŒ์‹ฑ API ์ž‘์—…์„ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@zoechi - ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌ๋” ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ๋‚˜์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ๋” ๋‚˜์€ ๊ตฌ๋ฌธ ๋ถ„์„ ์‹œ๊ฐ„์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@zoechi ์˜ˆ, ๊ฒฉ๋ฆฌ๋ฅผ ๋ณด์•˜์ง€๋งŒ ๊ธฐ๋ณธ ๊ฐ’(null, num, bool, double, String)๊ณผ ๋ชฉ๋ก ๋ฐ ๋งต๋งŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐœ์ฒด ๋ฐ/๋˜๋Š” ๊ฐœ์ฒด ํŠธ๋ฆฌ๋Š” ์ „๋‹ฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋น„๋™๊ธฐ ๊ฒฝ๋กœ๊ฐ€ ๋” ์ข‹์•„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. async xml ํŒŒ์‹ฑ์„ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์ ์€ ์œ„์ ฏ์ด๋‚˜ ์š”์†Œ ํŠธ๋ฆฌ์™€ ๊ฐ™์€ ๋ชจ๋“  ๋น„๋™๊ธฐ ํŠธ๋ฆฌ ์ฒ˜๋ฆฌ์— ๊ฐœ๋…์ด ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์˜ˆ๋ฅผ ๋“ค์–ด React์˜ Fiber์—์„œ์™€ ๊ฐ™์ด ๋น„๋™๊ธฐ ์กฐ์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. :)

@dnfield ์˜ˆ ๋น„๋™๊ธฐ xml/svg ํŒŒ์„œ/ํ”„๋กœ์„ธ์„œ์—์„œ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

์›น ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SVG๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๋ฒ„ํŠผ์—๋Š” ๋„ˆ๋ฌด ๋ฌด๊ฒ๊ณ  webview๊ฐ€ 60 ํ”„๋ ˆ์ž„/์ดˆ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„์ง€ ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„์ด์ฝ˜์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €๋Š” iOS ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ด์ œ iOS 11๋„ ๋ฒกํ„ฐ ์ž์‚ฐ์„ ์ง€์› ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. SVG๊ฐ€ ์•„๋‹ˆ๋ผ PDF์ž…๋‹ˆ๋‹ค. PDF ๋ฒกํ„ฐ ์ž์‚ฐ์„ ์ง€์›ํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”. Quartz๋Š” ๋‚ด๋ถ€ ๋ Œ๋”๋ง ์‹œ์Šคํ…œ์„ ์œ„ํ•ด PDF์™€ ๋งŽ์€ ์—ญ์‚ฌ์  ์—ฐ๊ด€์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ iOS ์žฅ์น˜์—์„œ ์ด ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Skia๋Š” PDF ๋ Œ๋”๋Ÿฌ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ํŒŒ์ผ ํ˜•์‹(IMO)์€ ์ง€์›๋˜๋Š” ๊ฒƒ๊ณผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ ๋ชจํ˜ธ์„ฑ์„ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค(์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆ˜์ • ๋„๊ตฌ๋กœ ์ข‹์ง€ ์•Š์Œ).

PDF๋Š” SVG๋ณด๋‹ค ๋ณต์žกํ•˜๊ณ  PDF/X ํ•˜์œ„ ์ง‘ํ•ฉ(๋ฒกํ„ฐ ์ž์‚ฐ์— ์‚ฌ์šฉ๋จ)์€ ์ธ์‡„์šฉ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Flutter์—์„œ PDF ๋ Œ๋”๋ง ์ง€์›์„ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ SVG์— ์ถฉ์‹คํ•ฉ์‹œ๋‹ค.

svg(์ , ์„ , ๊ณก์„ , ์ฑ„์šฐ๊ธฐ, ์ด๋™)์˜ ๋‹จ์ˆœํ•œ VectorDrawable ํ•˜์œ„ ์ง‘ํ•ฉ์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. Flutter๋Š” RAD๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์ง„์ •ํ•œ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ(๋ฐ์Šคํฌํ†ฑ ์ถœ์‹œ ์˜ˆ์ •)์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Android ๋ฐ Apple ํ”Œ๋žซํผ์€ ๋ชจ๋‘ 60"+ 4HD ํ™”๋ฉด์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

PS ์‹ค๋ก€์ง€๋งŒ, iOS๋ฅผ ํฌํ•จํ•œ ๋งŽ์€ ํ”Œ๋žซํผ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” Kotlin์œผ๋กœ ์ธํ•ด VG๊ฐ€ ์—†์œผ๋ฉด (ํ”Œ๋Ÿฌํ„ฐ ํŒ€) ์ž‘์—…์ด ์‚ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  Kotlin์€ ์•„์ง ๋ฒ ํƒ€ ๋ฒ„์ „์ด์ง€๋งŒ Flutter๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. :(

@ohir Kotlin ๋„ค์ดํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ iOS์™€ Android ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•˜๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ณด๊ธฐ(๋‹จ์ผ ์ฝ”๋“œ)๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”. ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์œ„์ ฏ ์ถ”์ƒํ™”์˜ kotlin ๋ฒ„์ „์„ ๋งŒ๋“ค ์˜๋„๊ฐ€ ์—†๋‹ค๋ฉด?

๊ฐ€๋Šฅ์„ฑ์ด ๋ฌดํ•œํ•˜๊ธฐ ๋•Œ๋ฌธ์— Kotlin ์›์ฃผ๋ฏผ์ด ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€ ๊ณผ์†Œํ‰๊ฐ€ํ•˜์ง€ ๋ง™์‹œ๋‹ค. Cocos2d-x๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Flutter์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋งŒ๋“œ๋Š” ์‹คํ—˜์—์„œ Flutter๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์˜คํ”ˆ ์†Œ์Šค์ด๊ณ  ๊ต์ฐจ ์ˆ˜๋ถ„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์„ ๋„ˆ๋ฌด ๋ฐ/๋˜๋Š” React Native ๋ฐ/๋˜๋Š” Flutter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

์˜ˆ, ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž์˜ kotlin ์‚ฌ๋ž‘๊ณผ ์ฑ„ํƒ์€ ์—„์ฒญ๋‚˜๊ณ  ํ”Œ๋žซํผ ๊ฐ„ ์ปดํŒŒ์ผ์€ ๋ฌดํ•œํ•œ ๊ฐ€๋Šฅ์„ฑ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋Š˜๋‚  ๋ชจ๋ฐ”์ผ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์šฉ Flutter ๋ฒ ํƒ€์™€ Kotlin ๋„ค์ดํ‹ฐ๋ธŒ ๋ฒ ํƒ€๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์–ด์จŒ๋“  ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

@lukaspili ์ง€๊ธˆ๊นŒ์ง€ Android์šฉko๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด์•„์›ƒ DSL์€ ๊ฐ ํ”Œ๋žซํผ ํ•˜์œ„ ํŠธ๋ฆฌ์— ํฌํ•จ๋œ apko , linko ๋ฐ winko*์—์„œ๋„ ๊ทธ๋Œ€๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ Flutter VG ๋ฌธ์ œ์— ๋Œ€ํ•œ OT์ž…๋‹ˆ๋‹ค. [*์€(๋Š”) ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.]

๋ชจ๋“  ์—ด์ •์ ์ธ ๋Œ€ํ™”์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๋ฒกํ„ฐ ํ˜•์‹ ๋ฐ API์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ์š”๊ตฌ ์‚ฌํ•ญ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ฃผ์ œ์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! :)

์‚ฌ๋žŒ๋“ค์€ ์ด๊ฒƒ์„ SVG ์ง€์› ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„๊ณ  ์ด๊ฒƒ์„ ์ผ๋ถ€ TBD ํ”Œ๋Ÿฌํ„ฐ ๋ฒกํ„ฐ ํ˜•์‹์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›๋ž˜ ๋ฌธ์ œ๋Š” ์ผ์ข…์˜ Flutter ๊ด€๋ จ ๋ฒกํ„ฐ ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

svg์™€ ๊ฐ™์€ ์ง€์›์„ ์œ„ํ•ด @cbazza ๋งŒ์„ธ. ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ฑ์˜ ์ „์ฒด UI๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด์ฝ˜์ด ์•„๋‹Œ svgs๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

ํ”Œ๋Ÿฌํ„ฐ๋กœ ์ด๋™ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ png๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์•ฑ ํฌ๊ธฐ๊ฐ€ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ปค์ง€๊ณ  ๋ณด๊ธฐ ํ‰ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ํŒŒ์ผ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” URL์„ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค.

๋”ฐ๋ผ์„œ ์ด ์‹œ์ ์—์„œ ์ €๋Š” Flatbuffer ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ถ”๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Skia๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ฐ™์ด ๋ฒกํ„ฐ ๋“œ๋กœ์ž‰ ๋ช…๋ น์„ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š” Flatbuffer ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด SVG์™€ ๋ฐ˜ ์ƒํ˜ธ ์šด์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๊ณ (์˜ˆ: SVG ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” SVG -> Flatbuffer ๋ณ€ํ™˜ ๋„๊ตฌ ๋˜๋Š” Android Vector Drawable XML -> Flatbuffer๊ฐ€ ์žˆ์Œ) ๋งŽ์€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SVG์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค(์ŠคํŠธ๋ฆฌ๋ฐ XML ๊ตฌ๋ฌธ ๋ถ„์„ ๋ถ€์กฑ, SVG ๊ฒฝ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ ๋‹ค์Œ ๋น„ํŠธ ๋‹จ์œ„๋กœ ๊ธฐ๋ณธ์œผ๋กœ ๋ณด๋‚ด์•ผ ํ•จ). ๋‚˜๋Š” ๋˜ํ•œ SVG ํ˜•์‹๋ณด๋‹ค ๋” ์ž‘์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(๋น„๋ก ์–ผ๋งˆ๋‚˜ ์ž˜ ํ™•์žฅ๋ ์ง€๋Š” ๋‘๊ณ  ๋ณผ ์ผ์ด์ง€๋งŒ).

๋˜ํ•œ ์ฃผ์–ด์ง„ SVG์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ณ€ํ™˜ ๋„๊ตฌ์—์„œ ๋ฏธ๋ฆฌ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: "ForeignElements๋Š” ์ด ํ˜•์‹์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค").

Flatbuffer ํŒŒ์‹ฑ ๋น„ํŠธ๋Š” Dart ๋˜๋Š” C++์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. dart์˜ ํ•œ ๊ฐ€์ง€๋Š” ๊ฒฝ๋กœ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  Canvas์—์„œ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด Skia์— ๋ช…๋ น์„ ์ผ๊ด„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

SVG๋ฅผ Skia ๋…ธ๋“œ ์ž‘์—…์œผ๋กœ ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐ ๋‹ค์ด์ œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด SVG์˜ ๋Ÿฐํƒ€์ž„ ๊ตฌ๋ฌธ ๋ถ„์„์ด ๋ชจ๋‘ ์ œ๊ฑฐ๋˜๊ณ  ์ค‘๊ฐ„ ๋ฒ„ํผ์˜ ์œ ์ง€ ๋ชจ๋“œ ์บ์‹ฑ์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

@sandrobilbeisi ๋‹น์‹ ์€ https://github.com/amirh/flutter/commit/69de4bbf3177d9766a386c55b27a12619da43a05 ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ์ฃผ๋ชฉํ• ๋งŒํ•œ ... ๊ทธ๋ฆฌ๊ณ  vitool๋„ ์žˆ์Šต๋‹ˆ๋‹ค https://github.com/flutter/flutter/blob/master/dev/tools/vitool/lib/vitool.dart

ํ•˜์ง€๋งŒ Xcode๊ฐ€ iOS ๊ฒฐ๊ณผ๋ฌผ์„ ์œ„ํ•œ SVG ์ž์‚ฐ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋นŒ๋“œ ๋‹จ๊ณ„๋กœ ๋” ๋งŽ์ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@sandrobilbeisi ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋™์•ˆ svgs์—์„œ ๋น„ํŠธ๋งต์„ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ?

BTW Xamarin ํŒจํ‚ค์ง€ ffimageloading์€ ๋ Œ๋”๋ง๋œ ๋น„ํŠธ๋งต์„ ์บ์‹œํ•˜๋ฏ€๋กœ ํ•œ ๋ฒˆ๋งŒ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋„คํŠธ์›Œํฌ ์ด๋ฏธ์ง€์™€ ํฌ๊ธฐ๊ฐ€ ์กฐ์ •๋œ ์ด๋ฏธ์ง€๋ฅผ ์บ์‹œํ•˜์—ฌ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋น„ํŠธ๋งต์ด ์•„๋‹ˆ๋ผ ์›๋ž˜ < ์บ”๋ฒ„์Šค > ์˜ ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ์—”์ง„์ธ Skia
https://skia.org/ ( ps 12๋…„ ์ „ Google์— ์ธ์ˆ˜๋จ : http://www.satine.org/archives/2007/03/05/the-skia-source-code-dilemma/ )

svg๋ฅผ skia ์ด๋ฏธ์ง€ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

๋„ค

SVG ํ…Œ์ŠคํŠธ ํŒŒ์ผ์— ๋Œ€ํ•œ @cbazza ๋งํฌ: https://github.com/slingshotapp/artwork

ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€์—์„œ vitool์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚ด ํ”„๋กœ์ ํŠธ์— .g.dart ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋Š” ๋งŽ์€ ๋น„๊ณต๊ฐœ ํด๋ž˜์Šค์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<flutter>/dev/tools/vitool ์˜ ๋„๊ตฌ ์ฐธ์กฐ: #dart bin/main.dart --asset-name=_$hello --output=here.g.dart ./test_assets/horizontal_bar_relative.svg

@emilieroberts ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๋‹น ํŒŒ์ผ์€ SVG ํ˜•์‹์ด ์•„๋‹ˆ๋ผ SVG์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ์‚ฌ์šฉ์ž ์ง€์ • Android ๋ฒกํ„ฐ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

@cbazza oops, ์‹ค์ œ๋กœ - ๋Œ€๋ถ€๋ถ„์˜ svgs๊ฐ€ ํ˜„์žฌ ๊ฑฐ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค :)

@cbazza ์‚ฌ์šฉ์ž ์ •์˜ Android ๋ฒกํ„ฐ์˜ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Android ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ”๊ณผ ๋‹ฌ๋ฆฌ <svg ํƒœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ vitool๋กœ ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€๋Š” ๋†€๋ž์ง€๋งŒ ์–ด๋””์—์„œ๋„ ๋ฌธ์„œ์˜ ํ”์ ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. AnimatedIcons.arrow_menu ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Flutter SDK ์™ธ๋ถ€์˜ ์ž์‚ฐ์—์„œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ž‘์—…๋„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@fmatosqg ๋งž์Šต๋‹ˆ๋‹ค . vitool์—์„œ ์ƒ์„ฑํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” Flutter์— ์ ํ•ฉํ•œ ๋ฒกํ„ฐ ํ˜•์‹์ด ๋ฌด์—‡์ธ์ง€(์ด ๋ฌธ์ œ์—์„œ ์ถ”์ )์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ๋ฏธํ•ด๊ฒฐ ์งˆ๋ฌธ์ด ์žˆ๊ณ  ํŠน์ • ํ˜•์‹์„ ์ง€์›ํ•˜๋Š” ๊ณต๊ฐœ API๋ฅผ ํ”ผํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฏธ๋ž˜์— ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).
AnimatedIcon์— ๋Œ€ํ•œ ํ˜„์žฌ API ํ‘œ๋ฉด์„ ํ†ตํ•ด ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ vitool์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ๊ตฌํ˜„ ๋ฐ ๋ฒกํ„ฐ ํ˜•์‹์„ ๊ณ„์† ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

vitool์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด packages/flutter/lib/src/material/animated_icons ์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€๋กœ ํฌํ•จํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. AnimatedIcon์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค).

๋ถˆํŽธ์„ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ์‹œ์ผ ๋‚ด์— ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์„ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํŠนํžˆ https://github.com/flutter/flutter/issues/13834 ๊ฐ€ ์ง„ํ–‰๋œ๋‹ค๋ฉด ์ด ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ๊ฒƒ์ด ๋ชจ๋†€๋ฆฌ์‹ SDK์˜ ์ผ๋ถ€๊ฐ€ ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์ด ๊ณต์‹ ๋˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ํŒจํ‚ค์ง€๋ผ๋ฉด ํŠน๋ณ„ํžˆ ๊ฑฑ์ •ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

ํฐ G ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Shiny (Go ๋ฐ์Šคํฌํƒ‘ ํ”„๋ ˆ์ž„์›Œํฌ)๋ฅผ ์œ„ํ•ด ๋งŒ๋“  svg์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ์••์ถ• ํ˜•์‹ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ ํ‘œํ˜„์ด๋ฉฐ ๊ธฐ๋ณธ Android ์‹คํ–‰๊ธฐ ์•„์ด์ฝ˜ ํฌ๊ธฐ๋ฅผ 100๋ฐ”์ดํŠธ ๋ฏธ๋งŒ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์Šค๋ ˆ๋“œ ๋ฐ IMSO์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ๋ฒกํ„ฐ ๊ทธ๋ฆฌ๊ธฐ๋Š” Skia์˜ ์˜๋ฌด์—ฌ์•ผ ํ•˜๋ฉฐ Flutter๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•œ ํ‘œํ˜„์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. res/ svg ํŒŒ์ผ์„ ๋‚ด๋ถ€ ํ˜•์‹์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋„๊ตฌ์˜ ์˜๋ฌด์ž…๋‹ˆ๋‹ค.
[ @amirh Re: ์ข‹์€ ๋ฒกํ„ฐ ํ˜•์‹์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์—ด๋ฆฐ ์งˆ๋ฌธ ]

๊ทธ๋ž˜์„œ FWIW์—์„œ flutter_svg์—์„œ ๋ชจ๋“  ๊ทธ๋ฆผ์ด ์‹ค์ œ๋กœ ์ค‘๊ฐ„ ๊ฐœ์ฒด์— ์˜ํ•ด ์ˆ˜ํ–‰๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๊ณต์‹ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. SVG ๊ด€๋ จ ์ž‘์—…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ SVG๋ฅผ ํ•ด๋‹น ๊ฐœ์ฒด์— ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ํ˜•์‹์„ ์™„์ „ํžˆ ์•ˆ์ •ํ™”ํ•˜๋ ค๋ฉด ์•„์ง ํ•ด์•ผ ํ•  ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ํ…์ŠคํŠธ ์ง€์›์„ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ๋งค์šฐ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

Android Vector Drawables์— ๋Œ€ํ•œ ์ง€์›์„ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ด์‹ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค(์™ธ๋ถ€ ์ƒ‰์ƒ ๋ฐ ์Šคํƒ€์ผ ์ฐธ์กฐ ๋“ฑ์— ๋Œ€ํ•œ ์ง€์› ์ œ์™ธ, ์•„์ง ํด๋ฆฝ ๊ฒฝ๋กœ ๋˜๋Š” ๊ธฐํƒ€ ๊ธฐ๋Šฅ์€ ์ง€์›ํ•˜์ง€ ์•Š์Œ). ์ด๋Ÿฐ ์‹์œผ๋กœ Shiny๋ฅผ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ํ˜•์‹์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€์›ํ•ด์•ผ ํ•  ๋งŽ์€ ํฅ๋ฏธ๋กœ์šด ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์‹œ์ ์—์„œ SVG๋ฅผ ํ†ตํ•ด ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง€๊ธˆ์€ ๊ทธ๊ฒƒ์ด ์ œ ์ฃผ์š” ์ดˆ์ ์ž…๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์™€ JSX ์ง€์›์— ๋Œ€ํ•œ ๊ธด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์€ ํ›„ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ์ง€์šธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Flutter ํŒ€์€ _์ž์‹ ๋“ค์ด_ ๋Š๋ผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋Š๋ผ๋Š” ๊ฐœ๋ฐœ์ž์˜ ์š”๊ตฌ์— ๋”ฐ๋ผ ์ˆ˜์ฒœ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋ ค๊ฐˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ Flutter๋Š” Apache์™€ ๊ฐ™์€ "์ธํ๋ฒ ์ดํ„ฐ" ํ”„๋กœ์ ํŠธ๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ๋œ ๊ธฐ๋Šฅ์€ Flutter ํŒ€ ์ž์ฒด์˜ ๊ธฐ์—ฌ๋กœ ์˜คํ”ˆ ์†Œ์Šค ๋ฐฉ์‹์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์˜ํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ถฉ๋ถ„ํ•œ ์ง€์›, ํšจ๋Šฅ ๋ฐ ์ธ๊ธฐ๋ฅผ ์–ป์œผ๋ฉด ํ•ต์‹ฌ Flutter ํ”„๋ ˆ์ž„์›Œํฌ์— ํฌํ•จ๋  ํ›„๋ณด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์˜ ๋ณด์ปฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋˜๋Š” ๊ฐ€์Šด๊ณผ ๋ˆˆ์น์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค "์ž…์ด ์žˆ๋Š” ๊ณณ์— ์ฝ”๋“œ"๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ  Flutter ํŒ€์ด ํ•ต์‹ฌ ์—”์ง€๋‹ˆ์–ด๋ง์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ •์ค‘ํ•˜๊ฒŒ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒ„ํ‚ท 5์™€ ๊ฐ™์€ ์ด์ •ํ‘œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ํŒ€์ด ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ณ  ๋ฒ„ํ‚ท 6์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค๋ฅธ ์ด์ •ํ‘œ๋ฅผ ๋ณด๋ฉด ๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ”Œ๋Ÿฌํ„ฐ ์ฝ”์–ด์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” "ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋‘์—๊ฒŒ ์ž‘๋™ํ•˜๊ณ  ๋ชจ๋‘๊ฐ€ ์›ํ•œ๋‹ค"๋Š” ๊ฒƒ ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“œ๋Š” ์ด์œ ์ด์ง€๋งŒ ์ด ์ €์žฅ์†Œ๋‚˜ ๋‹ค๋ฅธ ํ”Œ๋Ÿฌํ„ฐ ์ €์žฅ์†Œ์— ์ถ”๊ฐ€ํ•˜๊ธฐ์—๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ฒƒ๋“ค์˜ ์˜ˆ: @dnfield ๊ฐ€ ์—”์ง„์— ์ถ”๊ฐ€ํ•˜์—ฌ ๊ทธ๊ฐ€ ์†Œ์œ ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ด์ ์„ ์–ป๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์—”์ง„์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ๊ธฐํšŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ชฉ์†Œ๋ฆฌ๋ฅผ ๋‚ด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ํ†ต๊ณผํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ž…์ด ์žˆ๋Š” ๊ณณ์— ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ํˆฌ๋ช…์„ฑ์ด ๋†’๊ณ  ๊ฐœ๋ฐœ์ž์˜ ๋ง์„ ๋ถ„๋ช…ํžˆ ๊ฒฝ์ฒญํ•˜์ง€๋งŒ ๋ฏผ์ฃผ์ฃผ์˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ถ”๋ก  ์—†์ด ๋Œ€์ค‘ ํˆฌํ‘œ๊ฐ€ ์Šน๋ฆฌํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์˜ˆ, Flutter์˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ํ† ๋ก ์œผ๋กœ ์ธํ•ด ์ฃผ์˜๊ฐ€ ์‚ฐ๋งŒํ•ด์ง€์ง€ ์•Š์„๊นŒ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. :-) ์šฐ๋ฆฌ๋Š” ํ† ๋ก ์„ ์ฝ๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์˜๊ฒฌ์„ ๋งค์šฐ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ์—๋Š” ๋ช…ํ™•ํ•œ ์ง€์นจ ์›์น™ ์ด ์žˆ์œผ๋ฉฐ ๊ฐ€์žฅ ํฐ ๋ชฉ์†Œ๋ฆฌ์— ๋ฐ˜์‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ์ „์ฒด๊ฐ€ ๋ฌด์—‡์— ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์‹ ์ค‘ํ•œ ์‹œ์žฅ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ์„ ๋‚จ๊ธฐ๋Š” ํฅ๋ฏธ๋กœ์šด ๋Œ€ํ™”. Flutter ํŒ€์€ Flutter์—์„œ ๋””์ž์ธ ๋‹จ๊ณ„(SVG)์—์„œ ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ์œผ๋กœ ์ด๋™ํ•  ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๊ถŒ์žฅํ•ฉ๋‹ˆ๊นŒ?

@lukepighetti https://github.com/dnfield/flutter_svg ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฌ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” Flutter์˜ SVG ํŒŒ์ผ์— ๋Œ€ํ•ด ์ œ๊ณต๋˜๋Š” ์†”๋ฃจ์…˜์— ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” flutter_svg ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

SVG ์ง€์›์€ ๋‚ด ์ƒ๊ฐ์— ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํƒ‘ ์•ฑ ๋ฐ ์›น์‚ฌ์ดํŠธ์™€ ๊ฐ™์€ ๋” ํฐ ํ™”๋ฉด์—์„œ Flutter๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์ด๊ฒƒ์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

@socialmammoth ์–ด๋–ค ๊ฒฐํ•จ์ด ์žˆ๋Š”์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ž ์‹œ ์ˆ™๊ณ ํ•ด ์˜จ ํ•œ ๊ฐ€์ง€๋Š” .skp(SKIAPICT) ํ˜•์‹์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์ง์ ‘ ํ•˜์ง€ ์•Š๋Š” ๋ฐ๋Š” ์ถฉ๋ถ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜•์‹์€ Skia์˜ ํฐ ๋ฒ„์ „์ด ๋  ๋•Œ๋งˆ๋‹ค ๋ฒ„์ „์ด ์•ˆ์ •์ ์œผ๋กœ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ Chrome/Chromium์—์„œ SKP(๋ Œ๋”๋ง๋œ SVG)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋˜๋Š” ๋ชจ๋“  Skia ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น์„ ์ด๋ฏธ ์ง€์›ํ•˜๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค. ๋Œ€๋‹ค์ˆ˜์˜ SKP๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

SVG์—์„œ Dart/Flutter ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก SVG ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ์ฝ”๋“œ ์ƒ์„ฑ ์œ ํ˜•์˜ ์†”๋ฃจ์…˜์„ ๋งŒ๋“ค ๊ณ„ํš์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ SKP to Dart ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์กฐ์‚ฌํ•˜๋Š” ๊ฒƒ์ด ๋” ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Flutter SVG์šฉ์œผ๋กœ ์ž‘์„ฑ๋œ ์ผ๋ถ€ ์ฝ”๋“œ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ(์˜ˆ: RawPicture ๋ฐ ๊ด€๋ จ ์ธํ”„๋ผ๋กœ ์ด์‹๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋žต RawImage ์— ํ•ด๋‹นํ•˜๋ฉฐ SKP์˜ ์ถœ๋ ฅ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์–ด์จŒ๋“  SVG ๋ Œ๋”๋ง์˜ ๊ฑฐ์˜ ํ‘œ์ค€์ธ Chrome์—์„œ ๋ Œ๋”๋งํ•œ SVG์—์„œ ์ƒ์„ฑ๋จ). SVG๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ณ  ํ—ค๋“œ๋ฆฌ์Šค Chromium์„ ํ˜ธ์ถœํ•˜์—ฌ SKP๋กœ ๋ Œ๋”๋งํ•œ ๋‹ค์Œ SKP๋ฅผ Flutter๊ฐ€ ๋Ÿฐํƒ€์ž„์— ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ Dart ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ํฐ ์˜์—ญ ์ค‘ ํ•˜๋‚˜๋Š” ๋Ÿฐํƒ€์ž„์— ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ์„ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: SvgPicture.network ). ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์ œํ•œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๊ฐ€์น˜ ์žˆ๊ณ /ํ—ˆ์šฉ๋˜๋Š” ์†”๋ฃจ์…˜์ธ์ง€์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ์‹œ์ ์—์„œ Flutter์—์„œ SVG์— ๋Œ€ํ•œ "๊ธฐ๋ณธ" ์ง€์›์„ ๋ฐ›์ง€ ๋ชปํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ฏฟ์Œ์œผ๋กœ ์ด ๋ง์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ SVG ์ž์ฒด์— ๋ธŒ๋ผ์šฐ์ €/HTML ๋ Œ๋”๋ง ์†Œํ”„ํŠธ์›จ์–ด ์™ธ๋ถ€์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋งŽ์€ ์ˆ˜ํ•˜๋ฌผ(XML, CSS, ์™ธ๋ถ€ ์ž์‚ฐ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ)์ด ์žˆ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์‹œ๋„ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์— ๋งŽ์€ ํŒฝ์ฐฝ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋Œ€์–ด. ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒ๋‹นํ•œ ์–‘์˜ SVG๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ(ํŠนํžˆ ํ˜„์žฌ filterEffect s ๋ฐ textPath )์€ ์•„๋งˆ๋„ ์—”์ง„์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์กฐ์ •์˜ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ์—์„œ ์ง์ ‘ SVG๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ํ˜•์‹ ๊ธฐ๋Šฅ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ๋งŒ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋”๋ผ๋„ ์ฃผ์š” ์ด์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Flutter ์ „์šฉ ๋ฒกํ„ฐ ํ˜•์‹์„ ๊ฐ–๋Š” ๊ฒƒ์€ Android๊ฐ€ VectorDrawables๋กœ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋Š”๋ฐ, ์ด๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ SVG์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋งŽ์€ ๋„๊ตฌ์˜ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ํ˜•์‹ ๋ณ€ํ™˜์œผ๋กœ ์ธํ•ด ๋””์ž์ธ์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

Flutter๊ฐ€ 2018๋…„ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ด๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— Flutter๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ SVG๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ƒํƒœ๊ณ„๊ฐ€ ์„ฑ์žฅํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ก ํŠธ ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ Flutter์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@dnfield

.skp(SKIAPICT) ํ˜•์‹.

IMHO ํฅ๋ฏธ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹. ๊ทธ๋Ÿฌ๋‚˜ Flutter ๋„๊ตฌ(์ ์–ด๋„ AS์—์„œ๋Š”)๋Š” ๋ณ€ํ™˜์„ ์›ํ™œํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋””์ž์ด๋„ˆ๋Š” ํ˜„์žฌ Android์˜ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ” ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋ถ€๊ณผํ•˜๋Š” ์ œํ•œ ์‚ฌํ•ญ์— ์–ด๋Š ์ •๋„ ์ต์ˆ™ํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ํ•ด์•ผ ํ•  ์ผ๊ณผ ํ•˜์ง€ ๋ง์•„์•ผ ํ•  ์ผ์„ ํ™•์‹คํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ๊ฐœ๋ฐœ์ž์˜ ๊ฒฝ์šฐ ๋งค๋‰ด์–ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. " svg ๋„๋ฉด์„ ์—ฌ๊ธฐ์— ๋“œ๋กญํ•˜๊ณ  ์—ฌ๊ธฐ์— ์ฃผ์„์„ ๋‹ฌ๊ณ  ๋งˆ์Œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. svg๊ฐ€ ์ง€์›๋˜๋Š” SVG ํ•˜์œ„ ์ง‘ํ•ฉ(์—ฌ๊ธฐ ์ฐธ์กฐ)์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ ๋˜๋Š” ๋ถ„์„๊ธฐ( flutter analyze )๊ฐ€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์˜ svg์— ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ". ๋˜๋Š” ๊ทธ๋Ÿฐ ๊ฒƒ.

@dnfield

์ƒ์„ฑํ•  Chrome/Chromium ๊ฐ€์ ธ์˜ค๊ธฐ

PoC ๋ฐ ํ…Œ์ŠคํŠธ์—๋Š” ์ ํ•ฉํ•˜์ง€๋งŒ ์‹ค์ œ ์†”๋ฃจ์…˜ IMHO๋Š” ๊ทธ๋ ‡๊ฒŒ ํฐ ์ข…์†์„ฑ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ฒ ํƒ€์—์„œ ๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ '์–ด๋ ค์šด ๋ฐฉ๋ฒ•'์œผ๋กœ ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. skPicture๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ์‰ฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ทธ๋ฆผ์„ ์–ป์œผ๋ ค๋ฉด. ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค. ๋””์ž์ด๋„ˆ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋…ธํŠธ๋ถ ๋ฎ๊ฐœ ์•„๋ž˜์— ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์žˆ๋Š” ํฐ ์–‘๋™์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์˜ˆ์ˆ  ์ž‘ํ’ˆ์€ ์ž์ฃผ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž… ๋‹จ๊ณ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ถœ์‹œ ์‹œ์ ์ด ๋‹ค๊ฐ€์˜ค๊ณ  ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ฒ„๊ทธ ํ—ŒํŒ… ์—ดํ’์— ํœฉ์‹ธ์ž…๋‹ˆ๋‹ค.

[์ฆ‰. ์šฐ๋ฆฌ๋Š” ์ผ์น˜ํ•˜๋Š” svg ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”Œ๋Ÿฌํ„ฐ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ํฌ๋กฌ์ด ์ „์ ์œผ๋กœ ๋””์ž์ด๋„ˆ์˜ ์†์— ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž์˜ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.]

์ถ”์‹ . launcher_icons ํŒจํ‚ค์ง€ ๋ฐฉ์‹์€ ์‹œ์ž‘ํ•  ๋•Œ flutter packages pub run flutter_svg_to_skp:main -i path/to/svgs -o path/to/skps ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-- ๋‚ด ยข2

@cachapa

๋„คํŠธ์›Œํฌ์—์„œ ์ง์ ‘ SVG๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Œ

์ด๊ฒƒ์€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃฐ ๋ณ„๋„์˜ ๊ฑฐ๋Œ€ํ•œ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.
๊ฐ€๋Šฅํ•œ ๋น„ํ˜ธํ™˜์„ฑ๊ณผ ์ƒ์‚ฐ์ž์˜ ๋ณ€๋•์— ๋Œ€ํ•ด.
๋จผ์ € "๋„คํŠธ์›Œํฌ์—์„œ SVG ๋กœ๋“œ" ํŒจํ‚ค์ง€๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐœ๋ฐœ์ž ์ œ๊ณต ๋ฒกํ„ฐ ํ˜•์‹์„ ๊ทธ๋ฆฌ๋Š” ์—”์ง„์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. :)

@cachapa ๋ฐ @ohir - flutter_svg _already_๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•œ SVG ๋กœ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค( SvgPicture.network ). ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ํŒจํ‚ค์ง€๋Š” ๊ฒฐ๊ตญ SVG ์‚ฌ์–‘ ์ „์ฒด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ์‹ค์ œ๋กœ ๋Œ€๋ถ€๋ถ„์˜ SVG๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์‚ฌ์–‘์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ์ ์˜ ์ฃผ์š” ์˜ˆ์™ธ๋Š” fliterEffect ์ด๊ณ  (ํ๋ฆผ ํšจ๊ณผ, ์ƒ‰์ƒ ํ•„ํ„ฐ ๋“ฑ์ด ์—†์Œ) ๋งŽ์€ ํ…์ŠคํŠธ ๊ด€๋ จ ์ง€์›์ด ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค( marker s๋Š” ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ xlink:href ์ฐธ์กฐ์˜ certian ์œ ํ˜•์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์ฒด CSS ์‚ฌ์–‘, ์Šคํฌ๋ฆฝํŒ… ๋ฐ ์ƒํ˜ธ ์ž‘์šฉ๊ณผ ๊ฐ™์ด ๋‚ด๊ฐ€ ์˜๋„์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@lukepighetti ์›น ๊ธฐ๋ฐ˜ ํ”„๋ก ํŠธ ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋งŒ ๊ธฐ๋Œ€๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Qt๋Š” SVG๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ ์ œํ•œ๋œ ํ•˜์œ„ ์ง‘ํ•ฉ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. GNOME์€ librsvg๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ธˆ ๋” ์ง€์›ํ•˜์ง€๋งŒ ๋‹ค์‹œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(Linux ํ™˜๊ฒฝ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์–ด๋ ต์Šต๋‹ˆ๋‹ค). resvg์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ ๊ทธ๊ฒƒ์„ ํ†ตํ•ฉํ•˜๋Š” GUI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

@dnfield ๋‹น์‹ ์ด ํ›Œ๋ฅญํ•œ ์ผ์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ผ์„ ๋น„ํŒํ•˜๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฉฐ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ƒ‰์ƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์•„ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ์ž์‹ ์˜ ์ƒ‰์„ ์„ ํƒํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์˜ˆ์ˆ ๊ฐ€๋„ ์•„๋‹ˆ๊ณ  ์ƒ‰๋งน์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

Flutter๋Š” ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ SVG๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์›น ํŽ˜์ด์ง€์—์„œ ์ง์ ‘ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜จ ์ž์‚ฐ์„ ์ˆ˜์ • ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด ํ•˜๋‚˜๋‹˜๊ป˜๋Š” ์ตœ์†Œํ•œ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ƒ‰์ƒ์ด ํ•„์š”ํ•˜๊ณ  ํšจ๊ณผ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ด ๋ฌธ์ œ๋ผ๋ฉด ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ๋Šฅ์„ ์ผœ๋„๋ก ๊ฐ•์š”ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ ๋Œ ์ˆ˜ ์žˆ๋„๋ก ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

SVG์— ๋Œ€ํ•œ ์ „์ฒด ์‚ฌ์–‘ ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. @lukepighetti ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. Hummingbird์—์„œ๋Š” ์ด๊ฒƒ์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ Flutter๋ฅผ ๋น„์›ƒ๊ณ  ์–ด๋ ค์šด ํŒจ์Šค๋ฅผ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@yjbanov ์กฐ์ฐจ๋„ ์—ฌ๊ธฐ ๊ทธ์˜ ๊ธฐ์‚ฌ์—์„œ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค: https://medium.com/flutter-io/hummingbird-building-flutter-for-the-web-e687c2a023a8

@dnfield ๊ฐ€ 'resvg'๋ฅผ ์–ธ๊ธ‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— @SocialMammoth ๋Š” ์•„๋งˆ๋„ flutter_svg๋„ ์™„์ „ํ•œ svg ์ง€์› ๋Œ€์‹  'SVG ์ •์ ' ์ง€์›์„ ๋ชฉํ‘œ๋กœ ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
http://www.w3.org/TR/SVG11/feature#SVG -์ •์ ,
๋ชจ๋“  ์‚ฌ๋žŒ์„ ํ–‰๋ณตํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Chrome์กฐ์ฐจ๋„ ๋ชจ๋“  SVG ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŠนํžˆ ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์“ฐ๋Š” ํ…์ŠคํŠธ ๋ Œ๋”๋ง์€ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์ง€๋‚œ ๋ช‡ ๋…„ ๋™์•ˆ ์ง„์ „์ด ์—†์Œ). ์ฆ‰, ์™„์ „ํ•œ SVG ์ง€์›์ด ํ˜„์‹ค์ ์ด์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. SVG-static์€ ํ•ฉ๋ฆฌ์ ์ธ ํ•˜์œ„ ์ง‘ํ•ฉ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. flutter_svg์—์„œ ํ…์ŠคํŠธ hadling(๊ฒฝ๋กœ์˜ ํ…์ŠคํŠธ ํฌํ•จ), ํ•„ํ„ฐ ๋ฐ ๋งˆ์Šคํฌ๊ฐ€ ๊ทธ๋ฆฌ์›Œ์ง‘๋‹ˆ๋‹ค. https://drifted.in/horologium-app/ ์™€ ๊ฐ™์€ ๋นŒ๋“œ๋ฅผ ์œ„ํ•ด Flutter์—์„œ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@SocialMammoth

Flutter๋Š” ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ SVG๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”. Flutter ์•ฑ์€ ๊ฐ„๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋ชจ๋“  SVG๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ „๋Šฅํ•œ ํŒจํ‚ค์ง€์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ "๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ” ํ˜•์‹ ์ง€์›" ( SVG ์ง€์› ์•ˆ ํ•จ)์ด๋ผ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ชฉํ‘œ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋ชจ๋“  ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์—์„œ ๋น„ํŠธ๋งต ์ž์‚ฐ์„ ์ตœ๋Œ€ํ•œ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์—”์ง„ ์ˆ˜์ค€์—์„œ. @dnfield ๋Š” ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ํ›Œ๋ฅญํ•œ ์ผ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ”Œ๋Ÿฌํ„ฐ(skia) ์—”์ง„์ด๋‚˜ ์•ฑ ์ž์ฒด๋ฅผ ํ™•์žฅํ•˜์ง€ ์•Š๊ณ  Dart์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ์„ ์–ป์„ ๋•Œ์ž…๋‹ˆ๋‹ค. .skp ์‚ฌ์šฉ์€ ๊ทธ ๋ชฉํ‘œ๋ฅผ ์œ„ํ•œ ์ข‹์€ ์„ ํƒ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ด๋ฏธ Android์˜ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ”๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ณ  ์ด๋ฏธ ์—”์ง„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋””์ž์ด๋„ˆ๋Š” ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ์ˆ˜์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ohir ๋‚˜๋Š” ๊ทธ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ๋™์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. SVG ํŒŒ์ผ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ •๋ง ๋‚˜์œ ๋†๋‹ด์ž…๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚˜๋Š” flutter๊ฐ€ svg๊ฐ€ ์œ ์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. svg๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ ํ˜•์‹๋ณด๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ SVG๋Š” ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉํ•  ํ‘œ์ค€ ๋ฒกํ„ฐ ํ˜•์‹์ด์ง€๋งŒ SVG์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ํ•ญ์ƒ ์ผ๋ฐ˜์ ์ธ ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฒกํ„ฐ ์ž์‚ฐ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์ตœ์†Œ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. .skp ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ฒกํ„ฐ ํ˜•์‹์ด ์œ ๋น„์ฟผํ„ฐ์Šค์ธ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” Adobe Illustrator, Affinity Designer ๋ฐ Inkscape์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ SVG๋Š” ๊ฑฐ์˜ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  SVG ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํŒจ์Šค ํš ๋ฐ ์ฑ„์šฐ๊ธฐ๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ถŒ์œ„์žˆ๊ฒŒ ๋งํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ .skp ๋ฅผ ์ง€์›ํ•˜๋„๋ก ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค๋“ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค SVG์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@lukepighetti : Dan์˜ ์•„์ด๋””์–ด๋Š” ์—”์ง„์˜ ๋‚ด๋ถ€ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์˜ ํ•ต์‹ฌ์€ SVG๋ฅผ ์—”์ง„์ด ์ดํ•ดํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ณ€ํ™˜๊ธฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ํ•œ Inkscape๊ฐ€ ์ด ํ˜•์‹์„ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด์ œ๋Š” ์˜๊ตฌ์‹ฌ์ด ๋“ค์—ˆ์ง€๋งŒ ์˜ค๋Š˜์€ ์กฐ๊ธˆ ์กฐ์‚ฌํ•œ ๊ฒฐ๊ณผ ํฌ๋กฌ ์ž๋™ํ™”๊ฐ€ ์ž˜ ์ง€์›๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ—ค๋“œ๋ฆฌ์Šค ํฌ๋กฌ ์„ ๋ Œ๋”๋ง ํ”„๋ก์‹œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด svg->skp ๋ณ€ํ™˜๊ธฐ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ๋ฌด๊ฒ์ง€๋งŒ ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ๋‚ฎ์€ ๋งค๋‹ฌ๋ฆฐ ๊ณผ์ผ, @dnfield :).

๊ฑฐ์˜ 3๋…„ ์ „์— @Hixie ๊ฐ€ ์„ค์ •ํ•œ ๋ชฉํ‘œ ์™€ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.

@dnfield ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ €๋ฅผ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค.
.skp ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Skia Picture์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

dart:ui ์—๋„ Dart Land์—์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” Skia Picture์— ๋Œ€ํ•œ ๋ž˜ํผ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด ๊ทธ๋ฆผ์˜ ๋‚ด์šฉ์—๋Š” ๋‹ค๋ฅธ Skia ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ Chrome์˜ ๊ธฐ๋Šฅ์€ ๋ชจ๋“  Skia ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด dart:ui ์˜ ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(Flutter ์—”์ง„์„ ํ†ตํ•ด ์ œ๊ณต๋˜๋Š” ํ•ญ๋ชฉ์œผ๋กœ ์ œํ•œ๋จ)? '์„ฑ๋Šฅ' ์ฃผ์žฅ์— ๋Œ€ํ•ด์„  ์ข€ ์ด์ƒํ•˜์ง€ ์•Š๋‚˜์š”? Flutter engine & dart:ui ๋Š” ๋Š๋ฆฐ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” Skia๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜์ง€๋งŒ(์„ฑ๋Šฅ ์ˆ˜์น˜๋Š” ํ‘œ์‹œํ•˜์ง€ ์•Š์Œ) Chrome์—์„œ ์ƒ์„ฑํ•œ .skp ํŒŒ์ผ์„ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ .skp ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์•„์ด์ฝ˜์˜ ์ƒ‰์ƒ์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„์ด์ฝ˜์ด 2๊ฐ€์ง€ ์ด์ƒ์˜ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด?

Flutter์—์„œ Dart๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ํ”ฝ์…€์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜ค๋ž˜๋œ ์ฃผ์žฅ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‚˜์—๊ฒŒ 'svg static'์„ ์ง€์›ํ•˜๋Š” flutter_svg ํŒจํ‚ค์ง€๋Š” Dart ๋žœ๋“œ์˜ ๋ฏธ๋ž˜ ํ˜์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์•ผ ํ•  ๊ธธ์ž…๋‹ˆ๋‹ค. Dart๋ฅผ ์šฐํšŒํ•˜๊ณ  C++์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋ฉด Dart๊ฐ€ ํ•ดํ‚นํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

Skia๋Š” SVG๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Flutter๊ฐ€ SVG ์ง€์›์„ ์ง์ ‘ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด Flutter ํŒ€์€ Skia ํŒจํ‚ค์ง€ ํฌ๊ธฐ๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. Skia๊ฐ€ SVG๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ๋ชฐ๋ž์ง€๋งŒ ์ง€์›ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋‚ฎ์€ ๋งค๋‹ฌ๋ฆฐ ๊ณผ์ผ์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ Skia๊ฐ€ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Flutter์— Lottie ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Skia๋Š” SVG์—์„œ ๊ทธ๋ฆผ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ SVG ์ƒ์„ฑ์— ๋Œ€ํ•œ ์‹คํ—˜์ ์ธ ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ์œ ์šฉํ•˜์ง€ ์•Š์Œ).

์˜ˆ, ํŒจํ‚ค์ง€ ํฌ๊ธฐ๊ฐ€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

SVG ์ง€์›์„ ์š”์ฒญ ํ•˜๋ ค๋ฉด https://github.com/flutter/flutter/issues/15501 ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด ๋ฒ„๊ทธ๋Š” ํŠนํžˆ SVG๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ณ  ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ํ˜•์‹์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์•„์ด์ฝ˜. ๋™์ ์œผ๋กœ ์ƒ‰์ƒ์„ ๋‹ค์‹œ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ์ •์  ์ด๋ฏธ์ง€(์˜ˆ: ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋จ) ๋ฐ ๋Œ€์ƒ ๋ Œ๋” ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์„ธ๋ถ€ ์ˆ˜์ค€์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๊ฐ€ ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

  • ์• ๋‹ˆ๋ฉ”์ด์…˜ ์•„์ด์ฝ˜: ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋‘ ๊ฐœ์˜ ์•„์ด์ฝ˜๊ณผ ํ•˜๋‚˜์—์„œ ๋‹ค๋ฅธ ์•„์ด์ฝ˜์œผ๋กœ ์›ํ™œํ•˜๊ฒŒ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

  • ๋ฐฐ๊ฒฝ: ํ™”๋ฉด๋ณด๋‹ค ํ›จ์”ฌ ๋” ํด ์ˆ˜ ์žˆ๋Š” ์ด๋ฏธ์ง€, ์‹œ์ฐจ๋กœ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๊ฐ€ ์—†์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ชจ์–‘, ๊ทธ๋ผ๋””์–ธํŠธ ๋ฐ ๊ทธ๋ฆผ์ž๊ฐ€ ์žˆ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ์ˆœํ•œ ์žฅ๋ฉด.

๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ์— ๋Œ€ํ•œ ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์— ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค. ๊ฐ์‚ฌ ํ•ด์š”.

๋‹จ์ผ ๊ทธ๋ž˜ํ”ฝ์œผ๋กœ ์—ฌ๋Ÿฌ ํ•ด์ƒ๋„ ์ง€์›, ํŠนํžˆ ๊ณ ํ•ด์ƒ๋„ ํ™”๋ฉด์— ๋Œ€ํ•œ ์ƒ์œ„ ํ˜ธํ™˜์„ฑ

๋‚ด ์•ฑ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํšŒ์˜์˜ ๋™๋ฐ˜์ž์ž…๋‹ˆ๋‹ค. ์ด๋™ ๋ฐ ํ™•๋Œ€/์ถ•์†Œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ํ˜ธํ…” ์ง€๋„๋ฅผ ํฌํ•จํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ณ ํ•ด์ƒ๋„ ๋ž˜์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํฌ๊ธฐ์™€ ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ ๋น„์‹ค์šฉ์ ์ž…๋‹ˆ๋‹ค. ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ์€ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ๋งค์šฐ ๋ถˆํŽธํ•˜๊ณ  ์˜จ๋ผ์ธ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ํฌํ•จ๋œ PDF ์›น ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋งž์ถคํ˜• '์‹ค์ œ ์œ ์‚ฌ' ๋…ธ๋ธŒ๋Š” ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ์—†์ด๋Š” ์‚ฌ์‹ค์ƒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ํšŒ์ „, ๊ธฐ์šธ์ด๊ธฐ ๋˜๋Š” ์ „๋‹จ์„ ๋…น์ด๋Š” ๊ฒƒ.

Dan์˜ ๋ง์— ๋ง๋ถ™์ด์ž๋ฉด: 1kB์˜ ๋ฒกํ„ฐ ์†Œ์Šค๋งŒ์œผ๋กœ๋„ 7์ธ์น˜ ํƒœ๋ธ”๋ฆฟ๊ณผ 105์ธ์น˜ 4HD TV ๋ชจ๋‘์—์„œ ์„ธ๋ฐ€ํ•˜๊ณ  ๋ถ€๋“œ๋Ÿฌ์šด ํ™”๋ฉด์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 10 ๋˜๋Š” 14"(์บ์…” ๋Œ€๋ฉด) ๋ฐ 5 ๋˜๋Š” 7"(๊ณ ๊ฐ ๋Œ€๋ฉด) ํ™”๋ฉด์šฉ ๊ธˆ์ „ ๋“ฑ๋ก๊ธฐ ํ‚ค์˜ค์Šคํฌ ์•ฑ์˜ ์ตœ๊ทผ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  5000๊ฐœ ์ด์ƒ์˜ ๋ฒกํ„ฐ ๋“œ๋กœ์ž‰ ์„ธํŠธ๋Š” ํฌ๊ธฐ๊ฐ€ 5MB ๋ฏธ๋งŒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋œ ์ •ํ™•ํ•œ ๋‘ ํ™”๋ฉด์— ๋Œ€ํ•ด png๋กœ ๋ณ€ํ™˜๋œ '์•ผ์ฑ„' ํ•˜์œ„ ์ง‘ํ•ฉ(~150)์€ 30MB๋ฅผ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ธ๋ฒคํ† ๋ฆฌ ์„ธํŠธ๋Š” GBytes ๋ฒ”์œ„์—์„œ ๋๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PS ๋‹ค์Œ์œผ๋กœ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์„ ํƒ๋œ ์ฑ„์šฐ๊ธฐ๋ฅผ ํ†ตํ•ด ์ •์˜๋œ ํ„ฐ์น˜ ์˜์—ญ์ด ์žˆ๋Š” ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ ์ •์ ์ด์ง€๋งŒ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ํ’๋ถ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ „์ฒด ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์ˆ˜์ฒœ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋Œ€ํ™”์‹ ๊ธฐ๊ณ„ ์ž‘๋™ ์„ค๋ช…์„œ์—์„œ์™€ ๊ฐ™์ด.

๊ฟˆ์€ ์ œ์ณ๋‘๊ณ  - ์šฐ๋ฆฌ ๋””์ž์ด๋„ˆ๋“ค์ด ๋จผ์ € ๊ฐ„๋‹จํ•œ ๋ฒกํ„ฐ ๋“œ๋กœ์ž‰์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜์„ธ์š” :)

์ง€๊ธˆ๊นŒ์ง€ ํ”ผ๋“œ๋ฐฑ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋งค์šฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

@ohir "ํšŒ์ „, ๊ธฐ์šธ์ด๊ธฐ ๋˜๋Š” ๋…น์ด๊ธฐ"์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์‹ค์ œ๋กœ ๋งค์šฐ ๋งŒ์กฑํ•˜๋Š” ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ path_parsing ํŒจํ‚ค์ง€(https://pub.dev/packages/path_parsing)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SVG ๊ฒฝ๋กœ ๋ฌธ์ž์—ด์—์„œ ์บ”๋ฒ„์Šค ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๋Š” CustomPainter ์œ„์ ฏ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฒฝ๋กœ(์ง์‚ฌ๊ฐํ˜•, ์› ๋“ฑ) ์ด์™ธ์˜ ๋‹ค๋ฅธ SVG ๋ชจ์–‘์˜ ๊ฒฝ์šฐ ์•ฝ๊ฐ„ ์ง€๋ฃจํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ์–ด๋ ต์ง€ ์•Š์€ ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น์œผ๋กœ ์ˆ˜๋™์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ๋ฒกํ„ฐ ์•„์ด์ฝ˜์— ์ •๋ง ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ ์•ฑ ์ „์ฒด์—์„œ ํฌ๊ธฐ์™€ ์ƒ‰์ƒ์ด ๋‹ค๋ฅธ ๋™์ผํ•œ ์œ„์ ฏ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://gist.github.com/jpotterm/7b30739e0af722baf97a397d9841d908

SVG ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์œ ์‚ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์บ”๋ฒ„์Šค ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น์„ ์ƒ์„ฑํ•˜๋Š” ๊ณต์‹ ํ”Œ๋Ÿฌํ„ฐ ๋ช…๋ น์ค„ ๋„๊ตฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ •๋ง ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Hixie
์˜ˆ. https://dribbble.com/shots/1083175-Air-conditioning-controller#
์ค‘์•™ ํšŒ์ „ ๋…ธ๋ธŒ์™€ ๊ทธ ์ฃผ์œ„์˜ ๊ฒŒ์ด์ง€๋Š” ํ˜„์žฌ Canvas API๋กœ ์„ธ์‹ฌํ•˜๊ฒŒ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ 2Kb(xml svg)์™€ ์•ฝ 300-500B์˜ ๋“œ๋กœ์–ด๋ธ”์— ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ '๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ' ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋œ Skia ์ˆ˜์ค€์˜ ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ๊ณผ ๊ธฐ๋ณธ์ ์ธ ์•„ํ•€ ๋ณ€ํ™˜์ด ์žˆ์—ˆ๋‹ค๋ฉด ์ด ๋…ธ๋ธŒ๋Š” ๊ฒŒ์ด์ง€ ์„ธ๊ทธ๋จผํŠธ์— ์ฑ„์šฐ๊ธฐ๋ฅผ ์ ์šฉํ•˜๊ณ  ํ‘œ์‹œ๊ธฐ ์ž‘์€ ์›์˜ ๊ฒฝ๋กœ๋ฅผ ํšŒ์ „ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์‚ด์•„ ์žˆ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ƒ‰์ƒ ๋ฐ ๊ธฐํƒ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ํฌํ•จ๋œ ์ด ์ „์ฒด ์†์žก์ด๊ฐ€ ๋””์ž์ด๋„ˆ๊ฐ€ ๊ณ„ํšํ•œ ๋Œ€๋กœ ์ •ํ™•ํ•˜๊ฒŒ ๊ทธ๋ ค์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฒกํ„ฐ ๋“œ๋กœ์ž‰ + ์ฑ„์šฐ๊ธฐ + ๊ทธ๋ผ๋””์–ธํŠธ + ์ข‹์€ ๋””์ž์ด๋„ˆ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://www.artua.com/app-design-deckadance/
๊ฐœ๋ฐœ์ž ์ธก์˜ Affine ๋ณ€ํ™˜์€ ์ด๋Ÿฌํ•œ ๋””์ž์ธ์„ ๋ฐ˜์‘์ ์ด๊ณ  ์ƒ๋™๊ฐ์žˆ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
์Šคํ ๋ฐ ์ „๋‹จ ๋ณ€ํ˜•: ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ œ์–ด ๋ ˆ๋ฒ„ ์‹œํ”„ํŠธ๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
(์‚ด๋ฐ”๋„๋ฅด ๋‹ฌ๋ฆฌ์˜ ์œ ๋ น์— ์˜ํ•ด ์œ ๋ฐœ๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” "๋ฉœํŠธ" ๋‹จ์–ด ์ด๋™ ;)

/์ฃผ์ œ๋ฅผ ๋ฒ—์–ด/

@jpotterm
SVG ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์œ ์‚ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์บ”๋ฒ„์Šค ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น์„ ์ƒ์„ฑํ•˜๋Š” ๊ณต์‹ ํ”Œ๋Ÿฌํ„ฐ ๋ช…๋ น์ค„ ๋„๊ตฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ •๋ง ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋น„์Šทํ•œ ๊ฒƒ์„ ์ƒ์‚ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์„์„ ์ฐพ๊ณ  ์ง€์ •๋œ SVG PathData๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Path ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” getter๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์›ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ์ •๋ฆฌํ•˜๊ณ  ์†Œ์Šค๋ฅผ ๊ณต๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ธฐ์—ฌํ•˜๋Š” ์•ฑ ์€ ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ์— ์™„๋ฒฝํ•˜๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์ž‘์€ ํ‘๋ฐฑ ๋ผ์ธ ์•„ํŠธ ๊ทธ๋ž˜ํ”ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ‰์ƒ์„ ์ง€์ •ํ•˜๊ณ  ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๋‹ค๋ฅธ ๋ฐ€๋„์—์„œ ์—ฌ๋Ÿฌ ์ƒ‰์ƒ์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋”์ฐํ•˜๊ณ  ์ง€์† ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ตœ์ข… ํŒจํ‚ค์ง€๋ฅผ ๊ฑฐ๋Œ€ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ์ด๋ฏธ์ง€๋Š” ์†์œผ๋กœ ๊ทธ๋ฆฐ โ€‹โ€‹๊ทธ๋ž˜ํ”ฝ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜๊ฒฌ์„ ๋ณด๋‚ด์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋งค์šฐ ๋„์›€์ด ๋˜๋Š” ์˜๊ฒฌ.

๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ํ˜•์‹์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์  ๊ทธ๋ž˜ํ”ฝ์ด ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์ฐจํŠธ
  • ๋กœ๋”ฉ ๋ฐ”
  • ๊ทธ๋ฆผ
  • ๋“ฑ

Skia๊ฐ€ SVG์˜ ํ•˜์œ„ ์ง‘ํ•ฉ(์–ด์จŒ๋“  ์œ ์šฉํ•œ ๋ถ€๋ถ„)์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Flutter๊ฐ€ ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์— ์‚ฌ์‹ค ๋งค์šฐ ๋†€๋ž์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜ˆ์ˆ ์— SVG๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ณ ํ’ˆ์งˆ์˜ ์ „์ฒด ํ™”๋ฉด ํƒœ๋ธ”๋ฆฟ PNG๋Š” 2MB ์ด์ƒ์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋™๋“ฑํ•œ SVG๋Š” 5-10kb๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐœ์˜ ํ™”๋ฉด์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํŒจํ‚ค์ง€์— 100kb๊ฐ€ ์•„๋‹Œ 20mb๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ๊ทธ๋ž˜ํ”ฝ์˜ ๊ฒฝ์šฐ ์ €๋Š” CustomPaint์˜ ์—ด๋ ฌํ•œ ํŒฌ์ด๋ฏ€๋กœ ์ฐจํŠธ, ๋กœ๋“œ ๋ง‰๋Œ€, ๊ทธ๋ฆฌ๊ธฐ ๋“ฑ๊ณผ ๊ฐ™์€ ์ž‘์—…์—๋Š” SVG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. CustomPaint API์— ๋Œ€ํ•ด ์šฐ๋ คํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์ •์‹ ์ ์œผ๋กœ HTML Canvas API์™€ ๋งŽ์ด ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ˆ, CustomPaint์—์„œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ์—๋Š” ๊ฒฌ๊ณ ํ•˜๊ณ  ๋งค์šฐ ๋น ๋ฅด๊ณ  ์•„๋ฆ„๋‹ต๊ฒŒ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

SVG๋ฅผ ์ง€์›ํ•˜๋ ค๋ฉด ๊ทธ๋ผ๋””์–ธํŠธ, ํš ๋“ฑ๊ณผ ๊ฐ™์€ ๋ชจ๋“  SVG ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Android ํ”„๋กœ์ ํŠธ์—์„œ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๊ฑฐ์˜ โ€‹โ€‹๋ชจ๋“  ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ฒฝ๊ณ  ํ”Œ๋ž˜๊ทธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋žซํผ์€ SVG ๋ฐ ๋ฒกํ„ฐ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ์˜ ๊ธฐ๋ณธ, ์ œ๋Œ€๋กœ ํ•˜์„ธ์š”!

@harounhajem ํ•ด๋‹น ์ฃผ์ œ์— ๋Œ€ํ•ด์„œ๋Š” https://github.com/flutter/flutter/issues/15501 ๋ฐ https://github.com/dnfield/flutter_svg ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ฐจํŠธ์— ๋Œ€ํ•œ @PierBover ํŠนํžˆ https://pub.dev/packages/charts_flutter ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋ฐฉ๊ธˆ Flutter์— ๋›ฐ์–ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Ionic 3์—์„œ Ionic 4๋กœ ๊ฐœ์ธ ์•ฑ์„ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ (๋‹ค์‹œ) ์™„์ „ํžˆ ๋‹ค๋ฅด๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ์•ฑ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ Flutter๋กœ ์ด๋™ํ•˜์—ฌ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด, ๋‚˜๋Š” ์ด ์•ฑ์„ ๋๋‚ด๊ณ  ์ž‘๋™์‹œ์ผฐ๊ณ  ์—ฌ๊ธฐ์—๋Š” ๋‚ด๊ฐ€ ๋‚ด ์•ฑ์— ์ค€๋น„ํ•œ ๋งŽ์€ ๊ทธ๋ž˜ํ”ฝ๊ณผ ์•„์ด์ฝ˜์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋””์ž์ด๋„ˆ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ด ๋””์ž์ธ์— ๋Œ€ํ•œ ๋น„์šฉ์„ ์ง€๋ถˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ์˜ SVG ์ž์‚ฐ์„ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ์ด ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋‚˜๋งŒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

(์™œ ์ด๊ฒƒ์ด ๋‹ซํžˆ์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ)

SVG๊ฐ€ ์•„๋‹Œ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ” ํ˜•์‹์„ ์ง€์›ํ•˜๋Š” ์‹ค์ œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—?

์˜ค, ๋‚ด ์ž˜๋ชป @jonahgreenthal. ๋‚˜๋Š” SVG ์ง€์›์„ ์ฐพ์•„ ์—ฌ๊ธฐ์— ์™”๊ณ  ์„ธ ๋ฒˆ์งธ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ๊ฐ™์€ ๊ฒƒ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

Uber๋Š” iOS์šฉ์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/uber/cyborg
Flutter์—์„œ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@dnfield ๋Š” svg๋ฅผ ์ƒˆ ์œ„์ ฏ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š”๋ฐ ์ž˜ ์ž‘๋™ํ–ˆ์ง€๋งŒ AssetImage ์†์„ฑ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CircleAvatar ์œ„์ ฏ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@Hixie ์‚ฌ์šฉ์ž๊ฐ€ ์•„์ด์ฝ˜์˜ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฏ€๋กœ svg ์•„์ด์ฝ˜์— ์—ฌ๋Ÿฌ ์ƒ‰์ƒ์ด ํ•„์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์†”๋ฃจ์…˜์— ํ…Œ๋งˆ ์ƒ‰์ƒ์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ํฌํ•จ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ SVG๋ฅผ ๊ธ€๊ผด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์•„์ด์ฝ˜ ํŒจํ‚ค์ง€์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์ œ์•ˆํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ ์•„์ด์ฝ˜์— ์—ฌ๋Ÿฌ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

4๋…„ ๋™์•ˆ ์œ ์šฉํ•œ ์†”๋ฃจ์…˜ ์—†์ด ๋‹ค์–‘ํ•œ ๋Œ“๊ธ€์„ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ - ์•„๋‹ˆ์š”, ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ์š”, ๊ณ„ํš๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์™œ ๋ฌธ์ œ/์–ด๋ ค์šด์ง€ ์ตœ์†Œํ•œ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Flutter_svg๋Š” ํ”Œ๋Ÿฌํ„ฐ์—์„œ SVG์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Rive๋Š” Flutter์šฉ ๋ฒกํ„ฐ ๊ธฐ๋ฐ˜ ํ˜•์‹๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ƒˆ๋กœ์šด ๋ฒกํ„ฐ ๊ธฐ๋ฐ˜ ํ˜•์‹์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค :)

@dnfield svgs ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๋ฐฐ๊ฒฝ ์†์„ฑ์ด ์žˆ๋Š” ์œ„์ ฏ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ƒˆ ํ˜•์‹์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ์ ์ ˆํ•œ svg ์ง€์›์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. Svg๋Š” ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•ฑ์„ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๊ณ  ์›น ์‚ฌ์ดํŠธ๋Š” svg๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋ชจ๋“  ํ•ด์ƒ๋„์—์„œ ๊ฐ€๋ณ๊ณ  ์•„๋ฆ„๋‹ค์šด ์•„๋ฆ„๋‹ค์šด ์• ๋‹ˆ๋ฉ”์ด์…˜ svg๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€์™€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€์‹  ์ผ๊ด€์„ฑ์„ ์ ์ ˆํ•˜๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก Flutter์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜๋œ svg๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค!

SVG๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ์ž‘๋™ํ•˜๋ฉฐ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ณณ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ƒˆ๋กœ์šด ๋ฒกํ„ฐ ๊ธฐ๋ฐ˜ ํ˜•์‹์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ? @d-silveira์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ๋‚ด์žฅ ์ถ”๊ฐ€, svg์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์ง€์›, ์ƒˆ๋กœ์šด ๋ฒกํ„ฐ ๊ธฐ๋ฐ˜ ํ˜•์‹์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋” ๋‚˜์€ ํœ ์„ ๋ฐœ๋ช…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. SVG๋Š” Flutter_svg๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Flutter์—์„œ ์ด๋ฏธ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

๋นŒ๋“œ ์‹œ์— svg๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Android์™€ ์œ ์‚ฌ - svg๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ Android ๊ฒฝ๋กœ ์ •์˜ xml์€ ์†Œ์Šค svg์—์„œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. Flutter ํ”„๋กœ์ ํŠธ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ๋ฒกํ„ฐ ์ž์‚ฐ์„ ๊ทธ๋ฆฌ๋Š” ๋ฐ ์žฌ์‚ฌ์šฉํ•  ๋‹คํŠธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Hixie ๋Š” ์ƒํ™ฉ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ๋…ผ์˜ํ•˜์ง€ ์•Š๊ฒ ์ง€๋งŒ ๊ทธ๋™์•ˆ svg๊ฐ€ ์•„๋‹Œ ์ด๋ฏธ์ง€๋งŒ ํ—ˆ์šฉํ•˜๋Š” ์ผ๋ถ€ ์œ„์ ฏ์„ ์–ด๋–ป๊ฒŒ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ๊ฒฝ ์†์„ฑ์ด ์žˆ๋Š” ๊ฒƒ๋“ค)

๊ทธ๊ฒƒ์€ flutter_svg์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ์š”์ฒญ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Hixie Flutter SVG๋Š” ๊ฑฐ๊ธฐ์— ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ด๋ฏธ์ง€๋ณด๋‹ค ์‚ฌ์ง„ ์ดฌ์˜์— ๋” ๊ด€๋Œ€ํ–ˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ์ถœ https://github.com/flutter/flutter/issues/49712

flutter_svg

์™œ ๊ทธ๋Ÿฐ ๊ฒ๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ flutter_svg ํŒจํ‚ค์ง€์™€ ์ „ํ˜€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

CircleAvatar(
  backgroundImage: MySVGImage(),
)

@Hixie flutter_svg๋Š” ์ผ๋ถ€ ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์šฉ์ ์ธ ์˜ˆ๋ฅผ ๋ณด์—ฌ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋์ ์—์„œ ์ด๋ฏธ์ง€ URL์„ ๋ฐ˜ํ™˜ํ•˜๋Š” REST API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋Š” ๋ฐฑ์˜คํ”ผ์Šค์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์ผ๋ถ€๋Š” png, ์ผ๋ถ€๋Š” jpg, ์ผ๋ถ€๋Š” svg์ž…๋‹ˆ๋‹ค. ๋ฐฑ์˜คํ”ผ์Šค๋Š” URL์— ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  HEAD๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฏธ๋ฆฌ ์ด๋ฏธ์ง€ ์œ ํ˜•์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
ํ”Œ๋Ÿฌํ„ฐ์˜ ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ์ด๋ฏธ์ง€ ์œ ํ˜•์„ ์ถ”์ธกํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ•์ œ๋กœ ์ ํ”„ํ•˜๋Š” ๋Œ€์‹  image.network์—์„œ URL์„ ์ˆ˜์‹ ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. svg์ธ ๊ฒฝ์šฐ flutter_svg๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ชจ๋“  ๊ฒƒ์€ ๋ชจ๋“  ๊ฒฝ์šฐ์— flutter_svg๊ฐ€ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ๋“œ๋กญ์ธ ๋Œ€์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์‚ฌ์‹ค์กฐ์ฐจ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! :ํ”ผ

SVG๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ผ๋ถ€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. :-)

์ด ํŠน์ • ๋ฌธ์ œ๋Š” SVG๊ฐ€ ์•„๋‹Œ ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ํ˜•์‹์„ ๊ฐ–๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ณ„๋„์˜ ๋ฌธ์ œ๋กœ ์ œ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋…ผ์˜์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์šฐ๋ฆฌ๋Š” ์™„์ „ํ•œ SVG ์ง€์›์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์–‘์— ๋„ˆ๋ฌด ๋น„์‹ธ๊ณ , ๋ฌด๊ฒ๊ฑฐ๋‚˜, Flutter์— ์ด๋ฏธ ์žˆ๋Š” ๊ฒƒ๊ณผ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค.
  • ์ง€์›๋˜๋Š” ํ˜•์‹์—์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ๊ทธ๋ž˜ํ”ฝ ์—”์ง„(Skia)์—์„œ ํšจ๊ณผ์ ์ด๊ณ  ํšจ์œจ์ ์ด๋ฉฐ ์ตœ์ ํ™”๋˜์–ด ์žˆ์Œ์„ ๊ฐ•์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์ฒด ๋Ÿฐํƒ€์ž„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์ง€์›ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋นŒ๋“œ ์‹œ ํ˜•์‹์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ”Œ๋Ÿฌํ„ฐ์— ์ตœ์ ํ™”๋œ ์ด๋ฏธ์ง€๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ฒกํ„ฐ ํ˜•์‹์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ์š”? ์œ„์˜ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ œ์•ˆ ๋œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ...

Rive์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด SVG ๋ณ€ํ™˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ด๋ฏธ Flutter๋ฅผ ์œ„ํ•œ ๋…์ (๊ทธ๋ฆฌ๊ณ  ์˜คํ”ˆ ์†Œ์Šค) ๋ฒกํ„ฐ ์—”์ง„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @luigi-rosso

Flutter ํ”„๋กœ์ ํŠธ์— svg ๊ฐ€์ ธ์˜ค๊ธฐ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๋‹คํŠธ ์ฝ”๋“œ/์ƒˆ๋กœ์šด ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ” ๋“ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ Android์—์„œ๋„ ๋™์ผํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ svg๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ (์ด๋Š” ๊ทธ๋‹ค์ง€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค) ๋Œ€์‹  ํ”„๋กœ์ ํŠธ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. svg๋Š” ๋‹ค์Œ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ง€์›๋˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ Android ๊ฒฝ๋กœ ์ •์˜๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

Flutter๋ฅผ ์œ„ํ•œ ์ข‹์€ ์•„์ด๋””์–ด๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ?

@giaur500 ์ด ๋ฌธ์ œ๋Š” ๊ทธ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. SVG์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์ œ์•ˆํ•  ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

๊ณต์ •ํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด, ์ด ํ˜ธ์˜ ๋งŽ์€ ์˜๊ฒฌ์€ SVG์™€ Flutter์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ฅด๋‹ค

SVG๋Š” ํ›Œ๋ฅญํ•œ ํ”ฝ์…€ ์ˆ˜์ค€์˜ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ํ›Œ๋ฅญํ•œ ํ”ฝ์…€์— ๋Œ€ํ•ด ์ตœ๊ณ ์ž…๋‹ˆ๋‹ค.

@lukepighetti ๋„ค. ๋ถˆํ–‰ํžˆ๋„ ๊ทธ๊ฒƒ๋“ค์€ ๋ชจ๋‘ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚ฌ๊ณ  ์—ฌ๊ธฐ์— ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด์„œ Flutter๊ฐ€ ๊ฐœ์„ ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋…ผ์˜์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์šฐ๋ฆฌ๋Š” ์™„์ „ํ•œ SVG ์ง€์›์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์–‘์— ๋„ˆ๋ฌด ๋น„์‹ธ๊ณ , ๋ฌด๊ฒ๊ฑฐ๋‚˜, Flutter์— ์ด๋ฏธ ์žˆ๋Š” ๊ฒƒ๊ณผ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค.
  • ์ง€์›๋˜๋Š” ํ˜•์‹์—์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ๊ทธ๋ž˜ํ”ฝ ์—”์ง„(Skia)์—์„œ ํšจ๊ณผ์ ์ด๊ณ  ํšจ์œจ์ ์ด๋ฉฐ ์ตœ์ ํ™”๋˜์–ด ์žˆ์Œ์„ ๊ฐ•์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์ฒด ๋Ÿฐํƒ€์ž„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์ง€์›ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋นŒ๋“œ ์‹œ ํ˜•์‹์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ ์‹œ๊ฐ„ ๋„๊ตฌ๋Š” ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฒกํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋ชจ๋“  ํ™”๋ฉด ๋ฐ€๋„๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ์ž์‚ฐ์„ ์ด๋ฏธ์ง€๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Apple iOS๋Š” PDF ์•„์ด์ฝ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋นŒ๋“œ ์‹œ์— svg๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Android์™€ ์œ ์‚ฌ - svg๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ Android ๊ฒฝ๋กœ ์ •์˜ xml์€ ์†Œ์Šค svg์—์„œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. Flutter ํ”„๋กœ์ ํŠธ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ๋ฒกํ„ฐ ์ž์‚ฐ์„ ๊ทธ๋ฆฌ๋Š” ๋ฐ ์žฌ์‚ฌ์šฉํ•  ๋‹คํŠธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์•„์š”

@giaur500 ์ด ๋ฌธ์ œ๋Š” ๊ทธ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. SVG์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์ œ์•ˆํ•  ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: https://github.com/flutter/flutter/issues/63752

์ด ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
VectorDrawable๊ณผ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ Android์˜ ๊ฒฝ์šฐ VectorDrawable ์ž์ฒด๋ฅผ ์ง€์›ํ•˜๋ ค๋Š” ์˜๋„๊ฐ€ ์ „ํ˜€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ƒํƒœ๊ณ„ ๋„์ž…์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ด๊ฒƒ์ด ์ œ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ๋‚จ์„ ์ˆ˜ ์žˆ๋„๋ก ์„ค๋“ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•์ ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ง์ ‘ ์‹œ๋„ํ•œ ์ ์ด ์—†์ง€๋งŒ flutter svg lib๋Š” at
๊ฒฝ๋กœ์™€ ๊ฐ™์€ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ”์˜ ์ตœ์†Œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ.

2020๋…„ 8์›” 15์ผ(ํ† ) 19:46 n00bmind, [email protected] ์ด(๊ฐ€) ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๋น„์Šทํ•œ ๊ฒƒ์„ ์ง€์›ํ•˜๋ ค๋Š” ์˜๋„๊ฐ€ ์ „ํ˜€ ์žˆ์Šต๋‹ˆ๊นŒ?
VectorDrawable ๋˜๋Š” Android์šฉ VectorDrawable ์ž์ฒด?

์ƒํƒœ๊ณ„ ๋„์ž…์„ ๊ณ ๋ คํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ €๋Š” ์ด๊ฒƒ์ด
๋‚ด๊ฐ€ ์›์–ด๋ฏผ์œผ๋กœ ๋‚จ๋„๋ก ์„ค๋“ํ•˜๋Š” ๊ฐ•์ ..

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/flutter/flutter/issues/1831#issuecomment-674375846 ,
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/ABI4Y4LWYSYEIWI3RRSSCK3SAZKO5ANCNFSM4B3FXMMQ
.

์ƒํƒœ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„์š”. ์ด ์Šค๋ ˆ๋“œ์—๋Š” ๊ฒฐ๋ก ์ด ์—†์œผ๋ฉฐ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ”๊ณผ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๊ฐœ๋ฐœํ•˜๋ ค๋Š” ๋‚ด ์•„์ด๋””์–ด๋Š” ์ฆ‰์‹œ ๋‹ซํž™๋‹ˆ๋‹ค.

flutter svg ํŒจํ‚ค์ง€๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ ์•ฑ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Vector Drawable์„ ์‚ฌ์šฉํ•œ ์ ์ด ์—†์œผ๋ฏ€๋กœ SVG์™€ ์–ด๋–ป๊ฒŒ ๋น„๊ต๋˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

flutter_svg ํŒจํ‚ค์ง€๋Š” ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
@lukepighetti ์„ฑ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ํ‰๊ฐ€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚ด ์‚ฌ์šฉ๋ฒ•์€ ์•ฑ์˜ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์Šคํ”Œ๋ž˜์‹œ ์ด๋ฏธ์ง€์™€ ๋ช‡ ๊ฐ€์ง€ ์•„์ด์ฝ˜ ํฌ๊ธฐ์˜ ๊ทธ๋ž˜ํ”ฝ์ด ๋  ๊ฒƒ์ด๋ฏ€๋กœ ๋ฉ‹์ง„ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

flutter_svg ํŒจํ‚ค์ง€๋Š” ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@lukepighetti ์„ฑ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ํ‰๊ฐ€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚ด ์‚ฌ์šฉ๋ฒ•์€ ์•ฑ์˜ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์Šคํ”Œ๋ž˜์‹œ ์ด๋ฏธ์ง€์™€ ๋ช‡ ๊ฐ€์ง€ ์•„์ด์ฝ˜ ํฌ๊ธฐ์˜ ๊ทธ๋ž˜ํ”ฝ์ด ๋  ๊ฒƒ์ด๋ฏ€๋กœ ๋ฉ‹์ง„ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๊ทธ๊ฒƒ์„ ๋งค์šฐ ๋†’๊ฒŒ ํ‰๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋ญ”๊ฐ€๋ฅผ ํ•˜๋„๋ก ํ”Œ๋Ÿฌํ„ฐ ํŒ€์— ์••๋ ฅ์„ ๊ฐ€ํ•˜๊ธฐ ์ „์— ์‹ค์ œ๋กœ ์‹œ๋„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@lukepighetti

๋‚ด๋ถ€์ ์œผ๋กœ ๋ญ”๊ฐ€๋ฅผ ํ•˜๋„๋ก ํ”Œ๋Ÿฌํ„ฐ ํŒ€์— ์••๋ ฅ์„ ๊ฐ€ํ•˜๊ธฐ ์ „์—.

์ด ํŠน์ • ๋ฌธ์ œ์˜ ์ง„์งœ ๋ฌธ์ œ๋Š” Skia ํ”Œ๋Ÿฌํ„ฐ ๊ทธ๋ž˜ํ”ฝ ์—”์ง„์ด ์—”์ง„์„ ํ˜ธ์ถœํ•˜์—ฌ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ๊ทธ๋ฆฌ๋Š” ์ƒ๋‹นํžˆ ๋ฌด๊ฑฐ์šด ๋‹คํŠธ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ์ตœ๊ณ  ์†๋„๋กœ ์‹คํ–‰๋˜๋Š” "๋“œ๋กœ์–ด๋ธ” ๊ฐ™์€" ๋ฒกํ„ฐ ํ˜•์‹์„ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ–์ถ”๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ์ •๋ง _(svg package)_ ์‹œ๋„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ณณ์—์„œ ํฐ ์†Œ๋ฆฌ๋กœ ๊ตฌ๊ธ€ ์ง์›๋“ค์—๊ฒŒ ์ด gh-issue์— ์ „ํ™”ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด 4๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ์€ ๋ถ€์ •์ ์ธ PR๋งŒ์ด 2020๋…„์˜ ๋ชจ๋ฐ”์ผ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ •๋ง๋กœ ์šฐ๋ฆฌ์—๊ฒŒ ํœด๋Œ€์ „ํ™”๋ฅผ ํœด๋Œ€ํ•˜๋„๋ก ๊ฐ•์š”ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ธฐ ์œ„ํ•ด Google์—์„œ ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๊ฑท์–ด์ฐจ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์•ฑ์— ์žˆ๋Š” ๊ทธ ๋ชจ๋“  ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ์˜ ๋ž˜์Šคํ„ฐ ๊ทธ๋ž˜ํ”ฝ.

[@ํž‰์‹œ]

๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ, ์ด๋Ÿฌํ•œ ํ”Œ๋Ÿฌํ„ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ตฌํ˜„์€ ์„ค๋ช…ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” @dnfield ์˜ flutter_svg ํŒจํ‚ค์ง€์™€ ๋งค์šฐ ์œ ์‚ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์œ ์ง€ ๊ด€๋ฆฌ์ž๋Š” ํ•ต์‹ฌ Flutter ํŒ€์— ์žˆ์œผ๋ฏ€๋กœ ํ’ˆ์งˆ์„ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€๊ฐ€ https://github.com/flutter/plugins ์— ์žˆ์œผ๋ฉด ๊ธฐ๋ถ„์ด ๋” ๋‚˜์•„์งˆ๊นŒ์š”?

์ œ๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋„๋ก ์ €๋ฅผ ๊ต์œกํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

@lukepighetti

๋ฌธ์ œ ์ œ๋ชฉ์˜ "SVG ์•„๋‹˜"์€ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๊ตต๊ฒŒ ํ‘œ์‹œ๋˜๋ฉฐ ๊นœ๋ฐ•์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ํŠนํžˆ svg ํ˜•์‹์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค .

OP(๊ทธ๋ฆฌ๊ณ  ๋‚˜)๋Š” Skia์˜ ๊ฒฝ๋กœ API๋ฅผ ๋…ธ์ถœํ•˜์—ฌ ์ž์‚ฐ ๊ทธ๋ž˜ํ”ฝ์ด ๊ณ ์ • ์—”๋””์•ˆ์˜ ์ด์ง„ ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ํฌ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. Dan์€ ์‹ฌ์ง€์–ด svg ์ž์‚ฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” flutter_svg์—์„œ ์ž‘๋™ ํ•˜๋Š” Skia์— ๋Œ€ํ•œ ํŒจ์น˜๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์šฐ๋ฆฌ๋Š” ์•ฑ ๋Ÿฐํƒ€์ž„์— xml์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์—”์ง„์„ ํ˜ธ์ถœํ•˜์—ฌ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ๋˜ํ•œ apk์— ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋Š” ์ •์  ์ž์‚ฐ์— ๋Œ€ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ” ํ˜•์‹ (์ด๋ฆ„์„ fvd ๋กœ ์ง€์ •)์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์ง€์›์œผ๋กœ ๋””์ž์ด๋„ˆ ์ž‘์—…์˜ ๊ตฌ๋ฌธ ๋ถ„์„์ด ํ•œ ๋ฒˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•ฑ ๋นŒ๋“œ ์‹œ fvd ํ˜•์‹์˜ ๊ฐœ์ฒด๊ฐ€ Skia์— ์ง์ ‘ throw๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ์•ฑ์—์„œ ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์•ฑ ํฌ๊ธฐ์— ๋ง‰๋Œ€ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ๋ˆˆ์— ๋„๊ฒŒ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [ ์ž๊ธฐ์†Œ๊ฐœ ]

์œ„์˜ ๋‚ด์šฉ์ด ๋‚ด๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ณ  ๋งˆ์นจ๋‚ด ํ•ด๊ฒฐํ•˜๋„๋ก ๋ถ€๋ฆ„์„ ์ •๋‹นํ™”ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
flutter_svg ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€๋กœ๋„.

Flutter๋Š” ๊ฒฝ์Ÿ ๊ธฐ์ˆ ์— ๋น„ํ•ด ๋˜ ๋‹ค๋ฅธ ์ด์ ์„ ๊ฐ€์งˆ ์ž๊ฒฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— flutter_svg๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ณธ์งˆ์ ์œผ๋กœ ์ž˜๋ชป๋œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ๋ช‡ ๊ฐ€์ง€ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ๊ฒƒ์กฐ์ฐจ ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฑ๋ถ„์œจ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ณ  ๋ Œ๋”๋ง์„ ์‹œ๋„ํ•  ๋•Œ ๋ฐ”๋กœ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋Œ“๊ธ€์€ flutter_svg ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋…ธํฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ flutter_svg๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

flutter_svg๋Š” ์Šคํฌ๋ฆฝํŒ…, HTML, SMIL ๋“ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ณด๊ธฐ์— ์ข‹๊ณ  ํŒŒ์ผ ์ž์‚ฐ, ๋„คํŠธ์›Œํฌ ๋˜๋Š” ์ผ๋ฐ˜ ๋ฌธ์ž์—ด์—์„œ SVG๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰