Daily UI

Blob Animation in Flutter

flutter developer 2025. 1. 30. 09:28

๐ŸŽจ What I Designed

https://github.com/suojae/flutter_ui_lab/blob/main/lib/2025/01/30.dart

 

flutter_ui_lab/lib/2025/01/30.dart at main · suojae/flutter_ui_lab

Contribute to suojae/flutter_ui_lab development by creating an account on GitHub.

github.com


๐Ÿ”Ž  How I Made It

์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„ ์ˆœ์„œ

1. ๋จผ์ € ์›์˜ ์ค‘์‹ฌ์„ ์„ค์ •ํ•œ๋‹ค.

2. ์› ํ…Œ๋‘๋ฆฌ๋ฅผ ์ด๋ฃจ๋Š” ์ ์„ ์„ค์ •ํ•œ๋‹ค.

3. ํ…Œ๋‘๋ฆฌ์— ์žˆ๋Š” ์ ๋“ค์˜ ๊ฐ๋„ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

4. Blob์˜ ๊ธฐ๋ณธ ๋ฐ˜์ง€๋ฆ„์„ ์„ค์ •ํ•œ๋‹ค.

5. ํ…Œ๋‘๋ฆฌ์˜ ์ ๋“ค์„ ์ถœ๋ ์ด๊ฒŒํ•œ๋‹ค. (Sinํ•จ์ˆ˜ ์ด์šฉ)

6. ์ถœ๋ ์ด๋ฉด์„œ ๋ณ€ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐ˜์ง€๋ฆ„์„ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฐ์ ์— ์ ์šฉํ•œ๋‹ค.

7. ๊ฐ ์ ๋“ค์˜ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

8. ๋ณ€ํ•˜๋Š” ์ ๋“ค์˜ ์œ„์น˜๋ฅผ Bezier๊ณก์„ ์œผ๋กœ ์ ์„ ์—ฐ๊ฒฐํ•œ๋‹ค.

9. AnimationController๋กœ ๊ฐ์‹ธ์„œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋˜๊ฒŒํ•œ๋‹ค.

 

๊ฐ ๋‹จ๊ณ„๋ณ„๋กœ ์ข€๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž

 

๐Ÿ“Œ  ๋จผ์ € ์›์˜ ์ค‘์‹ฌ๊ณผ ์› ํ…Œ๋‘๋ฆฌ๋ฅผ ์ด๋ฃจ๋Š” ์  ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •ํ•œ๋‹ค

์›์˜ ์ค‘์‹ฌ ์ขŒํ‘œ๋ฅผ ์„ค์ •ํ•˜์—ฌ Blob์˜ ์ค‘์‹ฌ์ด ๊ณ ์ •๋˜๋„๋ก ํ•œ๋‹ค.

 

๐Ÿ“Œ  ๊ฐ ์ ๋“ค์˜ ๊ฐ๋„ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

์™œ ์œ„ ์ˆ˜์‹์ด ๊ฐ ์ ๋“ค์˜ ๊ฐ๋„์ฐจ์ด์ผ๊นŒ? ๋จผ์ € 2.0 * π ๋Š” 360๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  pointCount๋Š” ์›ํ…Œ๋‘๋ฆฌ์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ํ•œ๋ฐ”ํ€ด ๋„๋Š” ๊ฐ๋„์— ์›ํ…Œ๋‘๋ฆฌ์— ์žˆ๋Š” ๊ฐ ์ ๋“ค์ด ๊ท ๋“ฑํ•˜๊ฒŒ ๋ฐฐ์น˜๋˜๋ ค๋ฉด 2π / ์  ๊ฐœ์ˆ˜๋งŒํผ ๊ฐ„๊ฒฉ์„ ๋‘๊ณ  ๋ฐฐ์น˜ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ ์ ๊ฐ„์˜ ๊ฐ๋„์ฐจ์ด๊ฐ€ ์œ„์™€ ๊ฐ™์€ ์ˆ˜์‹์ด๋œ๋‹ค.

 

๐Ÿ“Œ  Blob์˜ ๊ธฐ๋ณธ ๋ฐ˜์ง€๋ฆ„์„ ์„ค์ •ํ•œ๋‹ค

์—ฌ๊ธฐ์„œ BaseRaduys๋Š” ์ถœ๋ ์ด๊ธฐ์ „ Blob์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐ˜์ง€๋ฆ„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ „์ฒดํ™”๋ฉด ๋„ˆ๋น„์˜ 0.35๋กœ ์žก์•˜๋‹ค.  ์ด๊ฒŒ ์ด ๊ธฐ๋ณธ ๋ฐ˜์ง€๋ฆ„์„ ์ค‘์‹ฌ์œผ๋กœ amplitude๊ฐ€ ๋”ํ•ด์ง€๊ณ  ๋นผ์ง€๋ฉด์„œ ๋ฐ˜์ง€๋ฆ„์ด ๋ณ€ํ•˜๋ฉด์„œ ์ถœ๋ ์ด๊ฒŒ๋œ๋‹ค.

 

๐Ÿ“Œ  For๋ฌธ์„ ๋Œ๋ ค Blob์  ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค

์ด์ œ Blob์˜ ์ค‘์‹ฌ, ๊ฐ๋„, ๋ฐ˜์ง€๋ฆ„์ด ์…‹ํŒ…๋˜์—ˆ์œผ๋‹ˆ ํ…Œ๋‘๋ฆฌ์˜ ์ ๋“ค๋ถ€ํ„ฐ ๋ฐฐ์น˜ํ•ด์„œ Blob์˜ ๊ธฐ์ดˆํ˜•ํƒœ๋ฅผ ๊ทธ๋ ค์ค€๋‹ค. ์ด๋•Œ cos๊ณผ sin์„ ํ†ตํ•ด ๊ฐ ํ…Œ๋‘๋ฆฌ ์ ์˜ ์ขŒํ‘œ๋ฅผ ์ฐ์–ด์ค€๋‹ค. (์ฆ‰ ์‚ผ๊ฐํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์› ํ…Œ๋‘๋ฆฌ ์ ๋“ค์˜ ์ขŒํ‘œ๋ฅผ ์ฐ์–ด์ค€๋‹ค) ํ…Œ๋‘๋ฆฌ ์ ์˜ ๊ฐœ์ˆ˜๋งŒํผ for๋ฌธ์„ ๋Œ๋ฆฌ๊ณ  ์ขŒํ‘œ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ํ•ด๋‹น ์ขŒํ‘œ์— point.add() ๋กœ ์ ์˜ x์ขŒํ‘œ์™€ y์ขŒํ‘œ ํŠœํ”Œ์„ ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.

 

์ด๋•Œ ํ…Œ๋‘๋ฆฌ ์ ๋“ค์˜ ์œ„์น˜๋ฅผ ์›€์ง์—ฌ ์ถœ๋ ์ด๊ฒŒ ํ•˜๊ธฐ์œ„ํ•ด ์ƒ์„ฑ์ž์—์„œ ๊ฐ’์„ ๋ฐ›๊ฒŒ๋˜๋Š”๋ฐ ์™ธ๋ถ€์—์„œ AnimatinoController๋ฅผ ํ†ตํ•ด  0 → 1 → 0์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๋ณ€ํ•˜๋Š” ๊ฐ’์„ ์ฃผ์ž…ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ value * 2 * pi ๋Š” 0 ~ 1์„ 0 ~ 2π๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด์„œ ํ•˜๋‚˜์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‚ฌ์ดํด์ด ๋งŒ๋“ค์–ด์ง„๋‹ค. 

 

https://study-all-night.tistory.com/102

(์™œ ์‚ผ๊ฐํ•จ์ˆ˜๊ฐ€ ์›์˜ ์ขŒํ‘œ์ธ์ง€๊นŒ์ง€์ธ์ง€ ๋‹ด์œผ๋ฉด ๋„ˆ๋ฌด ๊ธ€์ด ๊ธธ์–ด์งˆ๊นŒ๋ด ์ƒ๋žต ๊ณ ๋“ฑํ•™๊ต ์ˆ˜ํ•™์„ ๋ณต์Šตํ•ด๋ณด์ž

 

์ด๋•Œ rawOffset ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ์—์„œ i๋ฅผ ๋”ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๊ฒŒ ์ง„์งœ ์ค‘์š”ํ•˜๋‹ค.  i๊ฐ€ ์—†์œผ๋ฉด ๋ชจ๋“ ์ ์˜ sin๊ฐ’์ด ๋™์ผํ•ด์„œ ๋ชจ๋“  ์ ๋“ค์ด ๊ทธ๋ƒฅ ๋™์‹œ์— ๊ฐ™์€ ํฌ๊ธฐ๋กœ ์ปค์ง€๊ณ  ๋™์‹œ์— ์ค„์–ด๋“ค๊ธฐ๋งŒ ํ•ด์„œ ์ถœ๋ ๊ฑฐ๋ฆฌ์ง€๊ฐ€ ์•Š๋Š”๋‹ค.

 

        โ•ญโ”€โ”€โ”€โ—โ”€โ”€โ”€โ•ฎ
      โ—         โ—
    โ—             โ—
   โ—               โ—  โฌ… ๊ฐ ์ ์„ ๋ถ€๋“œ๋Ÿฌ์šด ๊ณก์„ ์œผ๋กœ ์—ฐ๊ฒฐ
    โ—             โ—
      โ—         โ—
        โ•ฐโ”€โ”€โ”€โ—โ”€โ”€โ”€โ•ฏ

์ด๊ฑธ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด For๋ฌธ ํ•˜๋‚˜ ๋Œ๋•Œ๋งˆ๋‹ค ํ…Œ๋‘๋ฆฌ์˜ ์  ํ•˜๋‚˜๋ฅผ ์ฐ๋Š”๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. i๋ฅผ ๋”ํ•˜์ง€์•Š์œผ๋ฉด ๋‹จ์ˆœํžˆ ๊ฐ๋„๋งŒ ๋‹ค๋ฅธ์ฑ„๋กœ ๋ฐฐ์น˜๊ฐ€ ๋˜๊ณ  ์ถœ๋ ์ž„ ์—†์ด ์ปค์กŒ๋‹ค ์ž‘์•„์กŒ๋‹ค๋งŒ Sinํ•จ์ˆ˜์— ๋”ฐ๋ผ ์›€์ง์ด๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ ์˜ ์œ„์น˜๋ฅผ ๋‹ค์ฑ„๋กญ๊ฒŒ ์ฃผ๊ธฐ์œ„ํ•ด ์ ์ด 18๊ฐœ์ธ ๊ฒฝ์šฐ sin(0~17)์„  ๊ฐ ์ ์˜ ๋ฐ˜์ง€๋ฆ„๋งˆ๋‹ค ๋”ํ•ด์ฃผ์–ด ์ ๋“ค์„ ๋ฐฐ์น˜ํ•œ๋’ค ๊ณก์„ ์œผ๋กœ ์—ฐ๊ฒฐํ•ด์„œ ์ถœ๋ ์ด๊ฒŒํ•œ๋‹ค.

 

๐Ÿ“Œ  ์› ํ…Œ๋‘๋ฆฌ ์ ์˜ ์œ„์น˜๊ฐ€ ์…‹ํŒ…๋˜์—ˆ์œผ๋ฉด Path๋ฅผ ํ†ตํ•ด Blob์„ ๊ทธ๋ฆฐ๋‹ค.

์ด์ œ ํŠœํ”Œ๋กœ ์ €์žฅ๋œ ์ ๋“ค์˜ ์œ„์น˜๋ฅผ ๊บผ๋‚ด์™€ ์‹ค์ œ๋กœ ์„ ์„ ์ด์–ด์ค€๋‹ค. ์ฒซ๋ฒˆ์งธ ์ขŒํ‘œ(points[0].dx, dy)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ for๋ฌธ์„ ๋Œ๋ ค ํ•œ ๋ฐ”ํ€ด ์‚ฅ๊ทธ๋ฅด๋ฅผ ์ ๋“ค์„ ์ด์–ด์ค€๋‹ค.

 

์ด๋•Œ ๊ฐ ์ ๋“ค์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด์–ด์ฃผ๋Š”๊ฒŒ ํฌ์ธํŠธ์ธ๋ฐ ์—ฌ๊ธฐ์„œ ๋ฒ ์ง€์–ด ๊ณก์„ ์ด ์‚ฌ์šฉ๋œ๋‹ค.

 

 

 

 

๐Ÿ“Œ  Point[0] ๊ณผ Point[1] ์˜ ๊ณก์„ ์ฒ˜๋ฆฌ๋กœ ๋งˆ๋ฌด๋ฆฌ