๐จ What I Designed
https://github.com/suojae/flutter_ui_lab/blob/main/lib/2025/01/30.dart
๐ 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π๋ก ๋ณํํ๋ฉด์ ํ๋์ ์ ๋๋ฉ์ด์ ์ฌ์ดํด์ด ๋ง๋ค์ด์ง๋ค.
(์ ์ผ๊ฐํจ์๊ฐ ์์ ์ขํ์ธ์ง๊น์ง์ธ์ง ๋ด์ผ๋ฉด ๋๋ฌด ๊ธ์ด ๊ธธ์ด์ง๊น๋ด ์๋ต ๊ณ ๋ฑํ๊ต ์ํ์ ๋ณต์ตํด๋ณด์)
์ด๋ rawOffset ๊ณ์ฐํ๋ ์ฝ๋์์ i๋ฅผ ๋ํ๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ ์ด๊ฒ ์ง์ง ์ค์ํ๋ค. i๊ฐ ์์ผ๋ฉด ๋ชจ๋ ์ ์ sin๊ฐ์ด ๋์ผํด์ ๋ชจ๋ ์ ๋ค์ด ๊ทธ๋ฅ ๋์์ ๊ฐ์ ํฌ๊ธฐ๋ก ์ปค์ง๊ณ ๋์์ ์ค์ด๋ค๊ธฐ๋ง ํด์ ์ถ๋ ๊ฑฐ๋ฆฌ์ง๊ฐ ์๋๋ค.
โญโโโโโโโโฎ
โ โ
โ โ
โ โ โฌ
๊ฐ ์ ์ ๋ถ๋๋ฌ์ด ๊ณก์ ์ผ๋ก ์ฐ๊ฒฐ
โ โ
โ โ
โฐโโโโโโโโฏ
์ด๊ฑธ ์ดํดํ๊ธฐ ์ฝ๊ฒ ํํํ๋ฉด For๋ฌธ ํ๋ ๋๋๋ง๋ค ํ ๋๋ฆฌ์ ์ ํ๋๋ฅผ ์ฐ๋๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. i๋ฅผ ๋ํ์ง์์ผ๋ฉด ๋จ์ํ ๊ฐ๋๋ง ๋ค๋ฅธ์ฑ๋ก ๋ฐฐ์น๊ฐ ๋๊ณ ์ถ๋ ์ ์์ด ์ปค์ก๋ค ์์์ก๋ค๋ง Sinํจ์์ ๋ฐ๋ผ ์์ง์ด๊ฒ ๋๋ค. ๊ทธ๋์ ์ ์ ์์น๋ฅผ ๋ค์ฑ๋กญ๊ฒ ์ฃผ๊ธฐ์ํด ์ ์ด 18๊ฐ์ธ ๊ฒฝ์ฐ sin(0~17)์ ๊ฐ ์ ์ ๋ฐ์ง๋ฆ๋ง๋ค ๋ํด์ฃผ์ด ์ ๋ค์ ๋ฐฐ์นํ๋ค ๊ณก์ ์ผ๋ก ์ฐ๊ฒฐํด์ ์ถ๋ ์ด๊ฒํ๋ค.
๐ ์ ํ ๋๋ฆฌ ์ ์ ์์น๊ฐ ์ ํ ๋์์ผ๋ฉด Path๋ฅผ ํตํด Blob์ ๊ทธ๋ฆฐ๋ค.
์ด์ ํํ๋ก ์ ์ฅ๋ ์ ๋ค์ ์์น๋ฅผ ๊บผ๋ด์ ์ค์ ๋ก ์ ์ ์ด์ด์ค๋ค. ์ฒซ๋ฒ์งธ ์ขํ(points[0].dx, dy)๋ถํฐ ์์ํด์ for๋ฌธ์ ๋๋ ค ํ ๋ฐํด ์ฅ๊ทธ๋ฅด๋ฅผ ์ ๋ค์ ์ด์ด์ค๋ค.
์ด๋ ๊ฐ ์ ๋ค์ ๋ถ๋๋ฝ๊ฒ ์ด์ด์ฃผ๋๊ฒ ํฌ์ธํธ์ธ๋ฐ ์ฌ๊ธฐ์ ๋ฒ ์ง์ด ๊ณก์ ์ด ์ฌ์ฉ๋๋ค.
๐ Point[0] ๊ณผ Point[1] ์ ๊ณก์ ์ฒ๋ฆฌ๋ก ๋ง๋ฌด๋ฆฌ
'Daily UI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Bouncing Button in Flutter (0) | 2025.02.01 |
---|---|
Glassmorphism in Flutter (0) | 2025.01.31 |
Shadow Box (0) | 2025.01.29 |