๐จ What I Designed
https://github.com/suojae/flutter_ui_lab/blob/main/lib/2025/01/31.dart
flutter_ui_lab/lib/2025/01/31.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
์ฌ์ฉํ ์ฃผ์ ์์ ฏ: ClipRect, BackdropFilter, ImageFilter
What is ClipRect?
ClipRect๋ ์์์์ ฏ(child)์ ์ฌ๊ฐํ ํํ๋ก ํด๋ฆฌํํ๋ ์ญํ ์ ํ๋ค. ํ๋ฉด ์ ์ฒด์ ์์ ฏ์ด ์๋๋ผ๋ ClipRect๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋ถ์์ญ๋ง ํ์ํ ์ ์๋ค. ์ด ๋ ์ฃผ์ํ ์ ์ ๋ ์ด์์ ์์ฒด์๋ ์ํฅ์ ์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ํด๋ฆฌํ๋ ๋ฐ๊นฅ๋ถ๋ถ์ ๋ณด์ด์ง ์์ง๋ง ์ค์ ๋ก ๊ณต๊ฐ์ ๊ทธ๋๋ก ์ฐจ์งํ๊ฒ ๋๋ค.
ClipRect๋ก ์ฃผ์ํ ์ ์ GPU์์ ์ถ๊ฐ์ ์ธ ํด๋ฆฌํ ์ฐ์ฐ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๊ณผ๋ํ๊ฒ ์ฌ์ฉ๋๋ฉด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ ๊ผญ ํ์ํ ๋๋ง ์ฌ์ฉํด์ผํ๋ค. ์ค์ ๋ก ๊ณต์๋ฌธ์์๋ ๋ถํ์ํ ํด๋ฆฌํ์ ์์ ์ ์ฑ๋ฅ๊ฐ์ ํ ์ฌ๋ก๋ฅผ ์๊ฐ์ค์ธ๋ฐ , 2018๋ 5์ ๊ธฐ์ค์ผ๋ก Flutter ๊ฐค๋ฌ๋ฆฌ ์ฑ์ ํ๊ท ํ๋ ์ ๋์คํฐํ ์๊ฐ์ด ์ฝ 35ms์๋๋ฐ, ์ด๋ 60fps์ ๋ถ๋๋ฌ์ด ๋ ๋๋ง์ ์ํ 16ms๋ฅผ ์ด๊ณผํ๋ ์์น์๋ค. ๋ถํ์ํ ํด๋ฆฝ ๊ด๋ จ ์์ ์ ์ ๊ฑฐํจ์ผ๋ก์จ, ํ๋ ์๋น 35ms์์ 17.5ms๋ก ๊ฑฐ์ 2๋ฐฐ์ ์๋ ํฅ์์ ์ด๋ฃจ์๋ค๊ณ ๋์์๋ค.
What is BackdropFilter?
BackdropFilter๋ Flutter์์ ํน์ ์์ ฏ์ ๋ฐฐ๊ฒฝ์ ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ๊ฑฐ๋ ๊ทธ๋ํฝ ํํฐ๋ฅผ ์ ์ฉํ ๋์ฌ์ฉํ๋ ์์ ฏ์ด๋ค. ์ด๋ ์ฃผ์ํ ๊ฒ์ BackdropFilter ๊ฐ ์ ์ฉ๋ ์์ ฏ ๋ค์ ์๋๊ฒ๋ค์ ํ๋ ค์ง์ง๋ง BackdropFilter ์์ Child๋ ํ๋ ค์ง์ง ์๋๋ค. ์์ฝ๋๋ฅผ ๋ณด๋ฉด BackdropFilter ์์ Child๋ก Center(Text()) ์์ ฏ์ด ์์ง๋ง
์์ ๊ฐ์ด Child๋ถ๋ถ์ ๊ทธ๋๋ก ์ ์ง๋๊ณ ๋ท๋ฐฐ๊ฒฝ๋ง blurํจ๊ณผ๊ฐ ์ ์ฉ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
What is ImageFilter?
ImageFilter๋ Flutter์์ ๊ทธ๋ํฝ ํํฐ๋ฅผ ์ ์ฉํ๋ API์ด๋ค. ์ฃผ์ ํํฐ๋ก๋ ๋๊ฐ์ง - ๋ธ๋ฌํจ๊ณผ์ ํ๋ ฌ ๋ณํ - ๊ฐ ์๋ค.
์ ํ๋ ฌ๋ณํ๊ณผ ๋ธ๋ฌํจ๊ณผ๊ฐ ๊ฐ์ด์๋๊ฑฐ์ง ๋ผ๋ ์๊ตฌ์ฌ์ด ๋ค์ด ์ฐพ์๋ดค๋๋ฐ ๋ธ๋ฌ ํจ๊ณผ๋ฅผ ์ ์ฉํ๋ ๋ฐฉ์์ด ๊ต์ฅ์ด ํฅ๋ฏธ๋ก์ ๋ค. ๋ธ๋ฌํจ๊ณผ์ ๊ธฐ๋ณธ์๋ฆฌ๋ ์ฃผ๋ณ ํฝ์ ์ ์์ด์ ํ๊ท ๊ฐ์ ๋ง๋ ๋ค.
๋ธ๋ฌ ํจ๊ณผ๋ฅผ ํ ์ค ์์ฝํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๐ ๋ธ๋ฌ ํจ๊ณผ = ์๋ ํฝ์ ๊ฐ × ๋ธ๋ฌ ์ปค๋ → ํฝ์ ๊ฐ์ด ์ฃผ๋ณ๊ณผ ์์ด๋ฉด์ ํํํ๋๋ ํจ๊ณผ
๋ด๋ถ ์ฝ๋๋ฅผ ๋ฏ์ด๋ณด๋ฉด blur๋ฉ์๋๋ ๊ฐ์ฐ์์ ๋ธ๋ฌ ๋ฐฉ์์ ์ ์ฉํ๋ค๊ณ ์ฃผ์์ด ๋ฌ๋ ค์๋ค. ๊ทธ๋ผ ๊ฐ์ฐ์์ ๋ธ๋ฌ๋ ๋ฌด์์ผ๊น? ์์ ํน์ ํ๋ ฌ์ ๊ณฑํ๋ค๊ณ ํ๋๋ฐ ๋๊ฐ์ ์๊ฐ ์๋ ํ๋ ฌ์ ๊ณฑํ๋ ๊ฒ์ด ์๋ "๊ฐ์ฐ์ค ๋ถํฌ" ๊ธฐ๋ฐ์ผ๋ก ์๊ฐ ๋ถํฌ๋ ํ๋ ฌ๊ฐ์ ๋ณธ๋ ํฝ์ ํ๋ ฌ์ ๊ณฑํด์ ์ข๋ ๋ถ๋๋ฝ๊ณ ์์ฐ์ค๋ฌ์ด blur์ฒ๋ฆฌ๋ฐฉ๋ฒ์ด๋ค.
๋ ํ๋ ฌ์ ๋น๊ตํ๋ฉด ์ ์ ์๋ฏ์ด ์ผ์ชฝ ํ๋ ฌ์ ์ผ์ ๊ฐ์ ๊ณฑํด blur์ฒ๋ฆฌ๋ฅผ, ์ค๋ฅธ์ชฝ์ ๊ฐ์ฐ์ค ๋ถํฌ์ ๋ฐ๋ฅธ ๊ฐ ํ๋ ฌ์ ๊ณฑํด blur ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ๋๋ค. ์๋ ์ค์ฌ ํฝ์ ๊ฐ์ด ๊ฐ์ฅ ํฌ๊ณ ์ฃผ๋ณ๋ถ๋ก ์ ์ง์ ์ผ๋ก ๊ฐ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ฐ์์ ๋ธ๋ฌ๋ sigmaX์ sigmaY์ ๋ฐ๋ผ ํฝ์ ์ X์ถ(๊ฐ๋ก)๊ณผ Y์ถ(์ธ๋ก) ๋ฐฉํฅ์ผ๋ก ํ์ฐ์ํจ๋ค. (์ฆ ํ๋ ฌ๊ฐ์ด sigmaX์ sigmaY์ ๋ฐ๋ผ ์์ํ ๋จ์ด์ง๋ฉฐ ํ๋ฆฟํ ๊ฐ๋๊ฐ ๊ฐํด์ง๋ค.)
์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด sigmaX = 100, sigmaY = 0 (์ผ์ชฝ)์์๋ ๊ฐ๋ก ๋ฐฉํฅ์ผ๋ก ์ค๋ฌด๋ฌ๊ฐ ์๊ธฐ๊ณ , sigmaX = 0, sigmaY = 100 (์ค๋ฅธ์ชฝ)์์๋ ์ธ๋ก ๋ฐฉํฅ์ผ๋ก ์ค๋ฌด๋ฌ๊ฐ ์๊ธฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ ํํํ์๋ฉด
๋ธ๋ฌ๋ ์ด๋ฏธ์ง์ ํฝ์ ์ ํผ๋จ๋ฆฌ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
- ๋ถ์ ์ข์ฐ๋ก๋ง ๋ฌธ์ง๋ฅด๋ฉด? ๐ ์์๋ ๋ฐฉํฅ์ ์น ํด์ง์ง ์์์ ์ค๋ฌด๋ฌ๊ฐ ์๊น.
- ๋ถ์ ์์๋๋ก๋ง ๋ฌธ์ง๋ฅด๋ฉด? ๐ ์ข์ฐ ๋ฐฉํฅ์ด ์น ํด์ง์ง ์์์ ์ค๋ฌด๋ฌ๊ฐ ์๊น.
๐ก ๋ธ๋ฌ๋ ๋๊ฐ๋ค
- sigmaX = 100, sigmaY = 0 → ๊ฐ๋ก ๋ฐฉํฅ์ผ๋ก๋ง ํผ์ง
- sigmaX = 0, sigmaY = 100 → ์ธ๋ก ๋ฐฉํฅ์ผ๋ก๋ง ํผ์ง
๊ทธ๋์ ์ด๊ฑธ ํ๋ฌํฐ ๊ฐ๋ฐ์๊ฐ ์๋ฉด ์ด๋ค๊ฒ ์ข์๊น?
์ฌ์ฉ์๊ฐ ํ๋ํ๋งํผ Sigma๊ฐ์ ๊ฐ์ค์์ผฐ๋๋ ์ฌ๋ฐ๋ ํจ๊ณผ๋ฅผ ๊ตฌํํ ์ ์๋ค! (๊ฐ์ฑ๋น..์ต๊ณ ..! ๐ญ) ๋์ค์ ์ด๊ฑธ๋ก ์ฐจ๋ผ๋ฆฌ ์ ์ฒด๋ทฐ์ ์๊ทธ๋ง๊ฐ์ ๋ฃ๊ณ ์ฌ์ฉ์๊ฐ ํฐ์นํ๋๋ถ๋ถ๋ง ์๊ทธ๋ง๋ฅผ 0์ผ๋ก ๋ฃ์ด์ ์ ๋ฆฌ์ฐฝ์ ๊น์ ๋ฆ๋ ์ ๋๋ฉ์ด์ ์ ์ค ์ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๊ธ๋์ค๋ชจํผ์ฆ ๊ตฌํ์ ๋ง์ ์ฝ๋์์ฒด๋ ๋จ์ํ์ง๋ง ๊ทธ ์์ ์๋ฆฌ๋ ๊ต์ฅํ "์ํ"์ ์์ญ์์ ์ ์ ์์๋ค. ๋์ค์ ์ด ์ง์๊ฐ์ง๊ณ ์ฌ๋ฐ๋ ํจ๊ณผ๋ ์ ๋๋ฉ์ด์ ์ ๋ฃ์ด๋ณด๊ณ ์ถ๋ค ใ ๐ค
'Daily UI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Bouncing Button in Flutter (0) | 2025.02.01 |
---|---|
Blob Animation in Flutter (0) | 2025.01.30 |
Shadow Box (0) | 2025.01.29 |