-
Notifications
You must be signed in to change notification settings - Fork 32
/
page_transitions.dart
151 lines (135 loc) · 5.06 KB
/
page_transitions.dart
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import 'package:flutter/material.dart';
class YaruPageTransitionsTheme extends PageTransitionsTheme {
const YaruPageTransitionsTheme._({required super.builders});
/// Horizontal slide and fade page transitions.
///
/// This page transitions theme is best suited for applications using a
/// horizontal navigation pattern, such as classic desktop wizards or master-
/// detail applications in portrait mode.
static const horizontal = YaruPageTransitionsTheme._(
builders: {
TargetPlatform.linux: _horizontalBuilder,
TargetPlatform.macOS: _horizontalBuilder,
TargetPlatform.windows: _horizontalBuilder,
},
);
/// Vertical slide and fade page transitions.
///
/// This page transitions theme is best suited for applications using a
/// vertical navigation pattern, such as master-detail applications in
/// landscape mode.
static const vertical = YaruPageTransitionsTheme._(
builders: {
TargetPlatform.linux: _verticalBuilder,
TargetPlatform.macOS: _verticalBuilder,
TargetPlatform.windows: _verticalBuilder,
},
);
static const _horizontalBuilder = _YaruHorizontalPageTransitionsBuilder();
static const _verticalBuilder = _YaruVerticalPageTransitionsBuilder();
}
class _YaruHorizontalPageTransitionsBuilder extends PageTransitionsBuilder {
const _YaruHorizontalPageTransitionsBuilder();
@override
Widget buildTransitions<T>(
PageRoute<T>? route,
BuildContext? context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) {
return _YaruHorizontalPageTransitions(
animation: animation,
secondaryAnimation: secondaryAnimation,
child: child,
);
}
}
class _YaruHorizontalPageTransitions extends StatelessWidget {
_YaruHorizontalPageTransitions({
required Animation<double> animation,
required Animation<double> secondaryAnimation,
required this.child,
}) : _position = animation.drive(_tween.chain(_fastOutSlowInTween)),
_secondaryPosition = secondaryAnimation
.drive(_secondaryTween.chain(_fastOutSlowInTween)),
_opacity = animation.drive(_easeInTween),
_secondaryOpacity = secondaryAnimation.drive(_easeInTween);
static final _tween = Tween(begin: const Offset(0.2, 0.0), end: Offset.zero);
static final _secondaryTween =
Tween(begin: Offset.zero, end: const Offset(-0.2, 0.0));
static final _fastOutSlowInTween = CurveTween(curve: Curves.fastOutSlowIn);
static final _easeInTween = CurveTween(curve: Curves.easeIn);
final Animation<Offset> _position, _secondaryPosition;
final Animation<double> _opacity, _secondaryOpacity;
final Widget child;
@override
Widget build(BuildContext context) {
final textDirection = Directionality.of(context);
return SlideTransition(
position: _secondaryPosition,
textDirection: textDirection,
child: FadeTransition(
opacity: ReverseAnimation(_secondaryOpacity),
child: SlideTransition(
position: _position,
textDirection: textDirection,
child: FadeTransition(opacity: _opacity, child: child),
),
),
);
}
}
class _YaruVerticalPageTransitionsBuilder extends PageTransitionsBuilder {
const _YaruVerticalPageTransitionsBuilder();
@override
Widget buildTransitions<T>(
PageRoute<T>? route,
BuildContext? context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) {
return _YaruVerticalPageTransitions(
animation: animation,
secondaryAnimation: secondaryAnimation,
child: child,
);
}
}
class _YaruVerticalPageTransitions extends StatelessWidget {
_YaruVerticalPageTransitions({
required Animation<double> animation,
required Animation<double> secondaryAnimation,
required this.child,
}) : _position = animation.drive(_tween.chain(_fastOutSlowInTween)),
_secondaryPosition = secondaryAnimation
.drive(_secondaryTween.chain(_fastOutSlowInTween)),
_opacity = animation.drive(_easeInTween),
_secondaryOpacity = secondaryAnimation.drive(_easeOutTween);
static final _tween = Tween(begin: const Offset(0.0, 0.1), end: Offset.zero);
static final _secondaryTween =
Tween(begin: Offset.zero, end: const Offset(0.0, 0.0));
static final _fastOutSlowInTween = CurveTween(curve: Curves.fastOutSlowIn);
static final _easeInTween = CurveTween(curve: Curves.easeIn);
static final _easeOutTween = CurveTween(curve: Curves.easeOutExpo);
final Animation<Offset> _position, _secondaryPosition;
final Animation<double> _opacity, _secondaryOpacity;
final Widget child;
@override
Widget build(BuildContext context) {
final textDirection = Directionality.of(context);
return SlideTransition(
position: _secondaryPosition,
textDirection: textDirection,
child: FadeTransition(
opacity: ReverseAnimation(_secondaryOpacity),
child: SlideTransition(
position: _position,
textDirection: textDirection,
child: FadeTransition(opacity: _opacity, child: child),
),
),
);
}
}