https://goni95.tistory.com/173
์๋๋ก์ด๋์์ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ๋๋ฉ์ด์ ์ข ๋ฅ๋ ๋ค์ํฉ๋๋ค. ๊ทธ๋์ ์ ๋๋ฉ์ด์ ์ ์ ํ๋ถํฐ ๋ฌด์์ ์ ํํ ์ง ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉ ๋ฐฉ๋ฒ๊น์ง ์ ๋ฆฌํด๋ณผ๊น ํฉ๋๋ค.
๊ฐ๋ ์ ์ฐ์ ์ ๋ฆฌํด๋๊ณ ๊ฐ๊ฐ์ API๋ฅผ ์ฌ์ฉํ ์ผ์ด ์์ ๋ ์์ ๋ฅผ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค.
์ฐ์ ์ ๋๋ฉ์ด์ API์ ์ข ๋ฅ๋ ์๋์ ๊ฐ์ด ์ ๋ง ๋ค์ํฉ๋๋ค.
- ViewAnimations (API 1)
- ValueAnimator, ObjectAnimator (API 11)
- ViewPropertyAnimator (API 12)
- Transitions (API 19)
- AnimatedVectorDrawable (API 21์ ์ถ๊ฐ๋์์ง๋ง AndroidX๋ก ํ์ ๋ฒ์ ๋ ์ฌ์ฉ ๊ฐ๋ฅ)
- Physics, MotionLayout (AndroidX)
1. ViewAnimations
์๋๋ก์ด๋ ๊ฐ์ฅ ์ด๊ธฐ์ ์ฐ์ด๋ API
1-1. Tween Animation
View์ ์ ์ฉ๋๋ ์ ๋ฏธ๋ค์ด์ ์ผ๋ก View์ ํฌ๊ธฐ / ์์น / ํ์ / ํฌ๋ช ๋(ํ์ด๋) ์กฐ์ ์ ๋ด๋นํ๋ฉฐ res/anim/ ๋๋ ํ ๋ฆฌ์ <scale>, <translate>, <rotate>, <alpha> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ xml ํ์ผ์ ์ ์ํ๋ฉด ๋ฉ๋๋ค.
1-2. Frame Animation
๋น๋์ค ํ๋ ์์ฒ๋ผ ์คํ๋๋ ์ ๋๋ฉ์ด์ ์ผ๋ก XML์ ์ ์๋ ์ ๋๋ฉ์ด์ ์ ์์ฐจ์ ์ผ๋ก ํ์ํฉ๋๋ค. drawable์ ์ฌ์ฉํ์ฌ ์ ์ฉ๋๊ณ res/drawable/ ๋๋ ํ ๋ฆฌ์ <animation-list>, <item> ํ๊ทธ ๋ฑ์ ์ฌ์ฉํด ์์ฐจ์ ์ผ๋ก ํ์ํ drawable ๋ชฉ๋ก์ ์ง์
์ฃผ์ํ ์ ์ ViewAnimations View์ ์์ฑ์ด ๋ฐ๋์ง ์๊ธฐ ๋๋ฌธ์, View๋ฅผ ๋ค๋ฅธ ์์น๋ก ์ด๋์ํค๋ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ๋๋ผ๋ View์ ์์ฑ์ ์ฒ์ ์์น์ ๊ทธ๋๋ก ์๊ธฐ ๋๋ฌธ์ ํด๋ฆญ ์ด๋ฒคํธ ๋ฑ์ ์ด๋ฒคํธ์ ๋ฐ์ํ์ง ๋ชปํฉ๋๋ค.
์์์ ๋งํ ์ฃผ์ํ ์ ๊ณผ View Animations๋ก ๊ตฌํํ ์ ์๋ ๊ฒ์ ViewProperyAnimator๋ฅผ ์ฌ์ฉํด๋ ๊ตฌํํ ์ ์๊ณ ๋ ๋น ๋ฅด๊ณ ๊ฐ๊ฒฐํ๊ธฐ ๋๋ฌธ์ ์ ์ฐ์ด์ง ์๋๋ค๊ณ ํฉ๋๋ค.
2. Property Animation(ValueAnimator, ObjectAnimator)
๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํ์ฌ ์ ๋๋ฉ์ด์ ์ ์ง์ ํ๊ธฐ ๋๋ฌธ์ Property Animation์ผ๋ก ๋ถ๋ฆฝ๋๋ค.
์ง์ ํ ์ ์๋ ์์ฑ์ ์๋์ ๊ฐ์ต๋๋ค.
- Duration : ์ฌ์ ์๊ฐ ์ง์
- Time interpolation : ์๊ฐ์ ๋ฐ๋ฅธ ์์ฑ ๊ฐ์ ๋ณํ ์ ๋๋ฅผ ์ง์
- Repeat count and behavior : ์ ๋๋ฉ์ด์ ๋ฐ๋ณต์ ์ง์ / ์ญ๋ฐฉํฅ ์ฌ์ ๊ฐ๋ฅ
- Animator sets : ์ ๋๋ฉ์ด์ ์ ๋์์ ํน์ ์์ฐจ์ ์ผ๋ก ์ฌ์
- Frame refresh delay : ์ ๋๋ฉ์ด์ ํ๋ ์์ ์๋ก ๊ณ ์นจ ๋น๋๋ฅผ ์ง์
2-1. ValueAnimator
ValueAnimator๋ ๋ค๋ฅธ ์ ๋๋ฉ์ด์ API์ ๊ธฐ๋ฐ์ด ๋ ์ ๋๋ก ํจ์ฌ ๊ฐ๋ ฅํด์ง API๋ก, View ๋๋ View๊ฐ ์๋ ๊ฐ์ฒด ๋ฑ ๋ชจ๋ ๊ฒ๋ค์ Animation ํจ๊ณผ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
์ค์ํ ์ ์ ์ ๋๋ฉ์ด์ ๊ฐ์ ์ ์ฉํ ์์น๋ฅผ ์ง์ ํ๋ onAnimationUpdate() ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๊ธฐ ์ํ ValueAnimator.AnimatorUpdateListener๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
ValueAnimator ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋๋ฉ์ด์ ํํ int, float, ์์ ๊ฐ ์งํฉ์ ์ง์ ํ์ฌ ์ ๋๋ฉ์ด์ ์ด ์งํ๋๋ ๋์ ํน์ ์ ํ์ ๊ฐ์ ์ ๋๋ฉ์ด์ ํํ ์ ์๊ณ , Factory method์ธ onInt(), ofFloat(), ofObject() ์ค ํ๋๋ฅผ ํธ์ถํ์ฌ ์ป์ ์ ์์ต๋๋ค.
2-2. ObjectAnimator
ValueAnimator์ ํ์ ํด๋์ค๋ก ValueAnimator์ ํ์ด๋ฐ ์์ง ๋ฐ ๊ฐ ๊ณ์ฐ๊ณผ ๋์ ๊ฐ์ฒด์ ๋ช ๋ช ๋ property์ ์ ๋๋ฉ์ด์ ํํ๋ ๊ธฐ๋ฅ์ ๊ฒฐํฉํฉ๋๋ค.
๋ฐ๋ผ์ property๊ฐ ์๋์ผ๋ก ์ ๋ฐ์ดํธ ๋๊ธฐ ๋๋ฌธ์ ValueAnimator.AnimatorUpdateListener๋ฅผ ๊ตฌํํ ํ์๊ฐ ์์ด์ง๋ฏ๋ก ๊ฐ์ฒด์ ์ ๋๋ฉ์ด์ ํ๊ฐ ํจ์ฌ ์ฌ์์ง๋๋ค.
ValueAnimator๋ ์ฝ๋์์ ValueAnimator.ofFloat(0f).addUpdateListener { ... }.start()
์์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, ObjectAnimaotr๋ ObjectAnimator.ofFloat(view, View.ALPHA, 0f).start()
๋ฐฉ์๊ณผ res/animator/ ๋๋ ํ ๋ฆฌ์ <objectAnimator> ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
3. ViewPropertyAnimator
ValueAnimator๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ ๊ฐ์ฒด๋ฅผ ์ง์ Animator object๋ก ์ธ์คํด์คํ ํ ํ์๊ฐ ์์ผ๋ฏ๋ก, ์๋๋ก์ด๋์์ ์ ๊ณตํ๋ ๊ฐ๋จํ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค ์ ์๋ API ์ ๋๋ค. ์ ๋๋ฉ์ด์ ์ ์์ฐจ ์ฒ๋ฆฌ์ ์ปค์คํฐ๋ง์ด์งํ ์ ๋๋ฉ์ด์ ๋ฑ์ ๋ณต์กํ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ ์ ์์ต๋๋ค.
animate() ๋ฉ์๋๋ฅผ ํตํด์ ๊ตฌํํ์ง๋ง, ์์ฒด์ ์ผ๋ก ๋ฐ๋ณต ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์์ ๋ฐ๋ก ๋ฐ๋ณต์ํค๋๋ก ์ฒ๋ฆฌํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ ๋๋ฉ์ด์ ์ด ์งํ ์ค์ ๋ค์ start()๋ฅผ ํ๋ฉด, ์ด์ ์ ๋๋ฉ์ด์ ์ด ๋ฉ์ถ ์ง์ ๋ถํฐ ๋ค์ ์์ํฉ๋๋ค.
๋ฐ์์ ๋ฐ๋ก ์ ๋๋ฉ์ด์ ์ ์งํ ์ํฉ์ ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋๋ฉ์ด์ ์ ์คํ์ํค๊ณ ์ ๊ฒฝ ์ธ ํ์ ์๋ *fire-and-forget ํ์์ผ๋ก ์ฐ์ ๋๋ค.
4. Transitions
*Shared Element Transition์ ๊ตฌํํ ๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ฉฐ, ์กํฐ๋นํฐ ๊ฐ ์ ํ ์ ๊ณต์ ์์์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํฉ๋๋ค. ๋์ผํ ์กํฐ๋นํฐ ๋ด์์ View ๋ณ๊ฒฝ ์ฌํญ์ ์ ๋๋ฉ์ด์ ์ผ๋ก ํ์ํ ์ ์์ต๋๋ค.
Transition์ ์กํฐ๋นํฐ A์์ ์ปจํ ์ธ ๋ ์ด์์์ผ๋ก ์ ํํ ๋ ์กํฐ๋นํฐ B์ ์ ์๋ Transition์ ๋ฐ๋ผ ์ ๋๋ฉ์ด์ ๋ฉ๋๋ค.
android.transition.Transition์๋ ๋ฏธ๋ฆฌ ์ ์๋ ์ธ ๊ฐ์ง(Explode, Slide, Fade)์ Transition์ด ์์ต๋๋ค.
5. AnimatedVectorDrawable
ObjectAnimator ๋๋ AnimatorSet์ ์ฌ์ฉํ์ฌ ์ ์๋ ์ ๋๋ฉ์ด์ ์ผ๋ก VectorDrawable์ ์์ฑ์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํฉ๋๋ค.
AndroidX ์ฌ์ฉ ์ AnimatedVectorDrawableCompat์ผ๋ก ์ฌ์ฉ๋๊ณ ๊ธฐ์กด์ UI Thread์์ ์คํ๋๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ์๋๋ก์ด๋ 7.1 (Nougat-MR1 : API 25)๋ถํด RenderThread์์ ์คํ๋ฉ๋๋ค.
ํน์ ์ง์ ์ผ๋ก seekํ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ *fire-and-forget ํ์์ผ๋ก ์ฌ์ฉ๋๊ณ ์ฌ์ธํ ์ปจํธ๋กค์ด ํ์ํ ๊ฒฝ์ฐ Lottie๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
6. MotionLayout
ConstraintLayout 2.0.0 ๋ถํฐ ์ถ๊ฐ๋ API๋ก ConstraintLayout์ด๋ฉด์ ์ ๋๋ฉ์ด์ ์ ์ค์ ์ ๋ ์๋ก์ด ViewGroup ์ ๋๋ค.
MotionScenes๋ผ๋ xml ํ์ผ์ <Transition> <OnSwipe> <ConstraintSet> ๋ฑ์ ํ๊ทธ๋ฅผ ์ ์ํด ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ๋ง๋ค์ด๋ผ ์ ์์ต๋๋ค.
๊ณ ์ฐฐ
์ด๋ ๊ฒ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ ๋ ์ฌ์ฉํ ์ ์๋ API ๋ค์ ํ์ธํด๋ดค๋๋ฐ, ๊ตฌํ๋ ์ ๋๋ฉ์ด์ ์ ๋ํ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๋ฉด ์ ๋ง ์ด์๊ณ ํ๋ คํ ์ ๋๋ฉ์ด์ ์ ์ฐพ์๋ณผ ์ ์์ต๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ์ฌ์ฉํ๋ ์ฑ์์ ๊ทธ๋ฐ ๊ธฐ๋ฅ๋ค์ ํ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ง์ด ์ฐพ์๋ณด๊ธฐ ์ด๋ ต๋ค๊ณ ์๊ฐ๋ฉ๋๋ค.
์ฌ์ค ์ค์ ๋ก ๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ธํ๋ฉฐ ๊ตฌํํด์ผ ํ๊ธฐ๋๋ฌธ์ UI๋ฅผ ๊ตฌํํ ๋ ๋ง์ ์๊ฐ์ด ์์๋๊ธฐ๋ ํ๊ณ MVP, MVVM ๊ฐ์ ์ํคํ ์ฒ ํจํด์ ์ฌ์ฉํ๋ ์ด์ ์ค ํ๋๊ฐ View๊ฐ ํ๋ ์ผ์ ์ค์ด๋ ค๋ ๊ฒ์ธ๋ฐ, ์ ๋๋ฉ์ด์ ์ ์คํ๋ ค View Layer์ ์์ ์ ๋ถ์ฌํ์ฌ ๋ณต์ก๋๊ฐ ์ฌ๋ผ๊ฐ๊ณ ์ ์ง๋ณด์ ๋น์ฉ๋ ๋ง๋ง์น ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ UI๋ฅผ ์ ๋ฐ์ดํธํ๋ Animator๋ ์ ๋๋ฉ์ด์ ์ด ์คํ๋๋ ๊ฒฝ์ฐ ์ถ๊ฐ ๋ ๋๋ง ์์ ์ ์ ๋ฐํ๊ธฐ ๋๋ฌธ์ ์ฑ ์ฑ๋ฅ์ ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
ํ๋ คํ๊ณ ๋ณต์กํ Animation ๊ตฌํ์ด ์ฌ์ฉ์์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ค๋ ๊ถ๊ทน์ ์ธ ๋ชฉ์ ์ ๋นํด ๊ฐ์ฑ๋น๊ฐ ๋จ์ด์ง๋ ์ต์ํ ํ๋ ค๋ ๊ฒ์ด ์๋๊น ์ถ์ต๋๋ค.
UI ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ ๋ Profile GPU Rendering ๋๊ตฌ๋ฅผ ์ด์ฉํด ์ ๋๋ฉ์ด์ ๋จ๊ณ๋ฅผ ๋ชจ๋ํฐ๋ง ํ๋ฉฐ ์ฑ ์ฑ๋ฅ์ ์ด๋์ ๋ ์ํฅ์ ์ฃผ๋์ง ํ์ธํ๋ฉฐ ์์ ํ๋ ๊ฒ์ด ์ข๊ณ ๊ตฌํํ๋ ค๋ ์ ๋๋ฉ์ด์ ์ ๋ฐ๋ผ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฐ์ด๋
๊ทธ๋ผ ๊ตฌํํ๋ ค๋ ์ ๋๋ฉ์ด์ ์ ๋ํด ์ ์ ํ Animator๋ฅผ ์ ํํ๋ ๊ฐ์ด๋๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
์์ฐจ์ (์ฌ๋ฌ ๊ฐ์ ์ ๋๋ฉ์ด์ ์ด ์ฐจ๋ก๋๋ก ์คํ)
๋์์ (์ฌ๋ฌ ๊ฐ์ ์ ๋๋ฉ์ด์ ์ด ๋์์ ์คํ)
1. ํน๋ณํ ๊ด๋ฆฌ๊ฐ ํ์์๊ณ ํ๋์ ๋ทฐ์์ ์์ฐจ์ , ๋์์ , ๋ฐ๋ณต์ ์ธ ์ ๋๋ฉ์ด์ ์ด ์๋ ๊ฐ๋จํ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด ViewPropertAnimator๋ฅผ ์ฌ์ฉ
2. ํ๋์ ๋ทฐ์์ ๋ทฐ์ ๋ชจ๋ ์์ฑ์ ์ด์ฉํ๋ฉฐ ์์ฐจ์ , ๋์์ ์ ๋๋ฉ์ด์ ์ด ์๋ ๊ฐ๋จํ๊ณ ๋ฐ๋ณต์ ์ธ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด ObjectAnimator๋ฅผ ์ฌ์ฉ
3. ํ๋์ ๋ทฐ์์ ๋์์ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด PropertyValueHolder๋ฅผ ์ฌ์ฉ
4. ๋ฐ๋ณต์ ์ด์ง ์๊ณ ์ฌ๋ฌ ๊ฐ์ ๋ทฐ๋ค์ ์์ฐจ์ , ๋์์ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด AnimatorSet์ ์ฌ์ฉ
5. ๋ทฐ ๋๋ ๊ฐ์ฒด์ ์์ฑ์ด ์๋ ๊ฒ์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ๊ฑฐ๋ ์ ๋๋ฉ์ด์ ์ ์ปค์คํฐ๋ง์ด์ง์ ๊ทน๋ํ ํ๊ณ ์ถ๋ค๋ฉด ValueAnimator๋ฅผ ์ฌ์ฉ
6. Shared Elemnet Transition์ ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด Transitions์ ์ฌ์ฉ
7. ์์ง์ด๋ ๋ฒกํฐ ์์ด์ฝ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด AnimatedVectorDrawable ๋๋ Lottie๋ฅผ ์ฌ์ฉ
*fire-and-forget : ๋ฌด๊ธฐ ์ด์ฉ ์ฒด๊ณ ์ค, ๋ชฉํ๋ฅผ ํญ์ ์ง์ํ์ง ์๊ณ , ๋ฐ์ฌ ์ ์ฒ์์๋ง ํ๊ฒ์ ์ง์ ํ์ฌ ๋ฏธ์ฌ์ผ์ ๋ ๋ฆฌ๋ฉด ์์์ ํ๊ฒ์ ์ซ์๊ฑฐ๋ผ ๋ฏฟ๊ณ ๋ฐ์ฌ ํ ์ ๊ฒฝ๋๋ ๋ฐฉ์์ ์๋ฏธํฉ๋๋ค. ์ฆ, ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ํ๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ฉด ๋ฅ๋์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์
*Shared Element Transition : Android 5.0 (Lolipop : API 21) ๋ถํฐ ๋์จ ๊ฐ๋ ์ผ๋ก, Activity๋ฅผ ์ ํํ ๋ View๋ฅผ ๋ง์น ๊ณต์ ํ๋ ๊ฒ ๊ฐ์ ๋๋์ผ๋ก ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ์ฃผ๋ ๊ธฐ๋ฒ์ ๋๋ค.
https://seosh817.tistory.com/18
https://github.com/lgvalle/Material-Animations
https://giantsol.github.io/android-animations/
https://velog.io/@tltty123/Android-ValueAnimator