티스토리 뷰

플러터에서 공식적으로 제공하는 인터페이스를 활용하여 페이지 전환 애니메이션을 커스터마이징하는 방법은 크게 두 가지로 나눌 수 있습니다.
PageTransitionsBuilder
첫 번째 방법은 PageTransitionsBuilder를 이용하는 것으로, 이를 ThemeData.pageTransitionsTheme에 적용하여 앱 전반의 페이지 전환 애니메이션을 일괄적으로 변경할 수 있습니다.
이 방식은 MaterialPageRoute 등과 같은 기본적인 PageRoute에서 PageTransitionsBuilder를 참조하여 전환 애니메이션을 적용하는 구조를 활용하는 것입니다. 다만, MaterialPageRoute가 아닌 별도의 PageRoute를 사용하는 경우에는 PageTransitionsBuilder를 적용할 필요가 없으며, 이럴 경우 해당 빌더를 굳이 사용할 이유가 없기 때문에 추천하지 않습니다.
다음은 PageTransitionsBuilder를 활용하여 커스텀 전환 애니메이션을 적용하는 예제입니다.
bash
class CustomPageTransitionsBuilder extends PageTransitionsBuilder {
@override
Widget buildTransitions<T>(
PageRoute<T> route,
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child
) {
final isExiting = animation.status == AnimationStatus.reverse;
final animValue = isExiting
? Curves.easeInQuart.transformInternal(animation.value)
: Curves.easeOutQuart.transformInternal(animation.value);
return Opacity(opacity: animValue, child: child);
}
@override
DelegatedTransitionBuilder? get delegatedTransition => ...;
}
이렇게 정의한 CustomPageTransitionsBuilder를 ThemeData.pageTransitionsTheme에 적용하면 앱 전반에서 해당 애니메이션이 적용됩니다.
bash
return MaterialApp(
theme: ThemeData(
pageTransitionsTheme: PageTransitionsTheme(
builders: { // 플랫폼 별로 적용 가능
TargetPlatform.android: CustomPageTransitionsBuilder(),
TargetPlatform.windows: CustomPageTransitionsBuilder(),
}
)
),
home: ...
);
PageRoute
두 번째 방법은 PageRoute 클래스를 직접 상속하여 새로운 PageRoute 서브클래스를 만드는 방식입니다, 해당 방법을 사용하면 buildTransitions 메서드를 직접 오버라이드하여 페이지 전환 애니메이션을 각 페이지마다 전환 효과를 다르게 적용하는 것도 충분히 가능합니다.
다음은 PageRoute를 상속하는 서브클래스의 간단한 구현 예제입니다.
bash
class CustomPageRoute extends PageRoute {
// ... 생성자 부분 생략
@override
Widget buildTransitions(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child
) {
final isExiting = animation.status == AnimationStatus.reverse;
final animValue = isExiting
? Curves.easeInQuart.transformInternal(animation.value)
: Curves.easeOutQuart.transformInternal(animation.value);
return Opacity(opacity: animValue, child: child);
}
@override
DelegatedTransitionBuilder? get delegatedTransition => (
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
bool allowSnapshotting,
Widget? child,
) {
return ...
};
// ... 이하 생략
}
이 방식은 특정 페이지에 대해서만 커스텀 전환 애니메이션을 적용할 수 있으며, Navigator.push를 사용할 때 CustomPageRoute를 직접 전달하여 활용합니다.
따라서 해당 방식은 전역적인 테마 변경 없이 특정 PageRoute에 한정하여 전환 애니메이션을 조정할 수 있다는 점에서 유연성이 더 높습니다. (또한 저는 개인적으로 커스텀할 때 해당 방식이 더 편합니다.)
bash
Navigator.push(context, CustomPageRoute(...));
방법 | 적용 범위 | 장점 | 단점 |
PageTransitionsBuilder | MaterialPageRoute를 사용할 때 전역 적용 | 한 번의 설정으로 앱 전반에 일괄 적용 가능 | MaterialPageRoute를 사용하지 않는 경우 불필요 |
PageRoute | 특정 PageRoute에 한정하여 적용 가능 | 특정 페이지에만 원하는 애니메이션 적용 가능 | 매번 직접 CustomPageRoute를 사용해야 함 |
참고사항
보시면 알려드린 두 방식들 모두 delegatedTransition getter를 선언하여 Widget을 반환할 수 있습니다. 이 getter는 현재 페이지가 아닌, 새로운 페이지가 push될 때 fade-out 효과가 적용되는 기존 페이지의 위젯을 반환하는 역할을 합니다.

이 두 가지 방법과 정보를 적절히 활용하면, 앱의 전환 효과를 원하는 스타일로 커스터마이징할 수 있습니다. 마지막으로 해당 글을 읽어주셔서 감사합니다.
'플러터 (Flutter)' 카테고리의 다른 글
[Flutter] 성능과 유연한 AppBar 구현 패키지 (0) | 2025.01.28 |
---|---|
[Flutter] Inkwell를 대체하기 위한 패키지 (터치 효과) (0) | 2024.10.09 |
[Flutter] 플러터를 모에화해보자~ (플러터짱 with AI) (0) | 2024.07.29 |
[Flutter] Ticker에 대하여 (1) | 2023.06.12 |
[Flutter] 위젯이 화면 상에서 사라지거나 위젯 트리 상에 존재하지 않았을 때도 상태를 유지하는 방법 (0) | 2023.02.13 |
- Total
- Today
- Yesterday
- svg
- webpack
- JavaScript
- github
- 터치 효과
- 객체 지향
- 안드로이드 개발
- TypeScript
- 커스텀 요소
- pageroute
- html custom element
- 객체지향
- 조건부 타입
- omit
- web
- 최적화
- android
- jetpack compose
- Flutter
- 디자인 패턴
- 플러터
- 전환 애니메이션
- 깃허브
- Reflow
- pagetransitionsbuilder
- 팩토리 메서드
- 타입스크립트
- 안드로이드
- Factory Method
- 리플 효과
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |