사전적 의미로 명시적이라는 뜻을 갖고있고 모든 animation에 대한 통제권, 즉 구현을 개발자가 직접한다.
단점은 개발자가 손수 구현해야하기 때문에 컨트롤할 것이 많아지고 이는 굉장히 복잡한 작업이 된다.
animation을 적용하려면 StatefulWidget이여야한다?! => 왜냐하면 animation이 실행되는 과정이 state class의 state 객체를 사용하기 때문이다.
이때 간단하게 StatelessWidget에 wrapper command( ctrl+shift+R
)를 입력하면 자동으로 StatefulWidget으로 변한다.
즉, 애니메이션이 실행되는 한 flutter 뒤편에서 상태 설정과 UI를 항상 업데이트한다. 이는 내부 상태를 업데이트하고 빌드 메서드를 다시 실행하기 위해서, 그래서 StatefulWidget이 필요한 것이다.
일반적으로 Controller 변수는 속성이 초기화될 때 => 클래스가 인스턴스화 될 때 사용이 불가능하다. 그래서 initState 메서드를 이용하여 따로 설정해주어야 한다.
이는 당연하게도 순서상 build가 되기 전 즉, vue.js의 생명주기를 빌리자면 mount 되기 전에 animation controller가 생성되어야하기 때문에
initState 메서드를 사용한다.
다만 앞서 언급했듯 인스턴스화 < 여기 < build메서드 실행 에 위치해야하기 때문에 클래스가 생성될 땐 아직 존재하지 않는다는 late
키워드를 사용하여 클래스 생성시 에러가 뜨는 것을 방지한다.
그리고 해당 Controller의 타입은 AnimationController
라는 타입이 될 것이다. 참고로 이는 flutter에서 제공하는 타입이다.
vsync는 ticker라는 타입의 매개변수를 받고 바로 이 변수가 실제로 초당 60회로 animation을 실행할 수 있도록 해주는 객체가 담겨있는 곳이다.
그리고 이 ticker라는 타입을 받기위해 특별히 with
다트 키워드를 사용하여 state 클래스가 state 뿐만 아니라 tickerProvider 또한 함께 상속받을 수 있도록 해준다. 즉, 병합을 하도록 해준다.
그리고 혹시 animation controller가 여러개 필요하다면 TickerProviderStateMixin 를 확장(with
)하면 된다.
그리고 vsync에 this
키워드로 해당 state 클래스 전체를 할당하면 사용자 눈에 보이는 전체 UI가 움직일 것이다.
애니메이션 컨트롤러는 프레임률 정보를 얻게 되고 프레임당 한 번씩 애니메이션을 실행다.
그리고 이 builer가 갖는 요소의 함수의 매개변수는 context, child가 있는데 이 child 속성에는 움직일 대상(위젯)을 넣어주면 된다.
이는 애니메이션의 기능을 향상시키기 위해 애니메이션 아이템의 모든 부분이 재구성되거나 재평가되지 않도록 한다.
이때 child 속성을 반드시 넣어서 모든 요소가 불필요하게 초당 60회 재평가되는 것을 막고 실제로 animate 해야할 부분만 설정해주면 된다.
여기서(SlideStransition)는 position 속성을 원하고 Animation 타입의 객체를 원한다. 이는 우리가 앞서 만들었던 Controller를 넣어주면 된다. 그리고 바로 해당 Controller에서 제공하는 .drive()
메서드로 위치를 잡아줄 것이기 때문이다.
이 drive()
메서드는 위에서 설정한 lowerBound, upperBound가 필요하지 않고 offSet에 대한 animation 값이 필요하기 때문에 animatable한 Tween
이라는 객체를 사용하여 넣어주면 된다.
시작과 끝 값을 넣어주면 되고 이는 Offset 클래스를 이요하면 되낟.
추가적으로 offSet 클래스의 0
은 종료 상태를 뜻하고 0.3
은 0을 기준으로 30% 정도 밑에 있다는 것이다.
CurvedAnimation
를 생성하여 animation이 동작하는 속도의 빠르기를 조절할 수 있다. 마치 CSS의 transition : ease-out
처럼이제 controller와 어느 요소를 어떻게 움직일지까지 정했다면 해당 컨트롤러를 실행해주면 된다.
여기서는 최초 load할 때 동작했으면 해서 initState 함수에 붙였다.