이슈
Flutter
를 통해 UI
를 개발하던 도중 화면 진입 시 최초에는 AppBar
가 투명색이었다가, 스크롤을 내릴수록 AppBar
의 색상이 나타나게 하고 싶었다. 다만 AppBar
가 투명색일 때도 그 위의 action
버튼들은 보였으면 좋겠다. 어떻게 구현할 수 있을까?
해결
핵심
NotificaionListener
를 통해 스크롤을 인식한 후AnimationController
를 사용해 색상 변경
코드
1 |
|
결과
고찰
애니메이션
Flutter
가 타 프레임워크에 비해 갖는 가장 큰 강력함 중 하나는 바로 높은 성능의 애니메이션을 쉽게 구현할 수 있다는 것이다. 물론 이러한 애니메이션을 라이브러리 없이 구현하려면 Animation
, AnimationController
, AnimatedBuilder
등등 애니메이션에 관한 flutter
내장 기본 클래스들에 대한 높은 이해도가 필요하다. 하지만 한 번 익혀두면 정말 그 어떠한 애니메이션도 구현할 수 있게 된다.
그리고 AnimationController
의 vsync
속성을 사용하기 위해선 클래스가 TickerProviderStateMixin
상속을 받아야한다.
스크롤
스크롤 인식은 NotificationListener
의 인자로 ScrollNotification
을 통해 구현된 scrollListener
를 전달하여 수행한다. 이때 스크롤 길이에 따라 어느정도 속도로 AppBar
의 색상이 변할지 정해주어야 하는데, 위 코드에서 animationSpeed
라는 double
타입 상수가 그 역할을 한다. 사용자가 스크롤한 길이를 본 상수로 나눠 적절한 값을 취하는 방식으로 애니메이션 속도를 조정할 수 있다.
상단바 및 AppBar 높이
AppBar
를 AnimatedBuilder
의 builder
로 넣기 위해 결론적으로 Container
안에 AppBar
가 들어가게 되는데, 이때 Container
의 높이를 정확히 차지해야할 만큼 지정해주어야 한다. 흔히 우리가 말하는 AppBar
는 사실 최상단의 상단바까지 포함한다. AppBar
와 상단바의 높이는 다음과 같이 코드 내에서 구할 수 있다.
- 상단바 높이
1
double statusBarHeight = MediaQuery.of(context).padding.top;
- AppBar 높이
1
double appBarHeight = kToolbarHeight;
기기 상단바 높이의 경우, MediaQuery
를 통해 top
의 padding
값을 통해 구할 수 있다.
반면 AppBar
와 같은 경우 이미 flutter
내부에 kToolbarHeight
라는 상수로 정해져있다!
따라서 위의 전체 코드와 같이 바로 kToolbarHeight
로 사용할 수 있다.