Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
aabd1ce4
Commit
aabd1ce4
authored
Jan 20, 2016
by
Adam Barth
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1317 from abarth/port_widgets
Port most of widgets to AnimationController
parents
e4940a01
24872f69
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
203 additions
and
211 deletions
+203
-211
theme.dart
packages/flutter/lib/src/material/theme.dart
+7
-8
dismissable.dart
packages/flutter/lib/src/widgets/dismissable.dart
+50
-46
heroes.dart
packages/flutter/lib/src/widgets/heroes.dart
+3
-3
implicit_animations.dart
packages/flutter/lib/src/widgets/implicit_animations.dart
+101
-111
mimic.dart
packages/flutter/lib/src/widgets/mimic.dart
+9
-12
routes.dart
packages/flutter/lib/src/widgets/routes.dart
+14
-14
status_transitions.dart
packages/flutter/lib/src/widgets/status_transitions.dart
+6
-6
transitions.dart
packages/flutter/lib/src/widgets/transitions.dart
+13
-11
No files found.
packages/flutter/lib/src/material/theme.dart
View file @
aabd1ce4
...
...
@@ -41,10 +41,9 @@ class Theme extends InheritedWidget {
}
}
/// An animated value that interpolates [BoxConstraint]s.
class
AnimatedThemeDataValue
extends
AnimatedValue
<
ThemeData
>
{
AnimatedThemeDataValue
(
ThemeData
begin
,
{
ThemeData
end
,
Curve
curve
,
Curve
reverseCurve
})
:
super
(
begin
,
end:
end
,
curve:
curve
,
reverseCurve:
reverseCurve
);
/// An animated value that interpolates [ThemeData]s.
class
ThemeDataTween
extends
Tween
<
ThemeData
>
{
ThemeDataTween
({
ThemeData
begin
,
ThemeData
end
})
:
super
(
begin:
begin
,
end:
end
);
ThemeData
lerp
(
double
t
)
=>
ThemeData
.
lerp
(
begin
,
end
,
t
);
}
...
...
@@ -71,18 +70,18 @@ class AnimatedTheme extends AnimatedWidgetBase {
}
class
_AnimatedThemeState
extends
AnimatedWidgetBaseState
<
AnimatedTheme
>
{
AnimatedThemeDataValue
_data
;
ThemeDataTween
_data
;
void
forEach
Variable
(
Variable
Visitor
visitor
)
{
void
forEach
Tween
(
Tween
Visitor
visitor
)
{
// TODO(ianh): Use constructor tear-offs when it becomes possible
_data
=
visitor
(
_data
,
config
.
data
,
(
dynamic
value
)
=>
new
AnimatedThemeDataValue
(
value
));
_data
=
visitor
(
_data
,
config
.
data
,
(
dynamic
value
)
=>
new
ThemeDataTween
(
begin:
value
));
assert
(
_data
!=
null
);
}
Widget
build
(
BuildContext
context
)
{
return
new
Theme
(
child:
config
.
child
,
data:
_data
.
value
data:
_data
.
evaluate
(
animation
)
);
}
...
...
packages/flutter/lib/src/widgets/dismissable.dart
View file @
aabd1ce4
...
...
@@ -72,23 +72,23 @@ class Dismissable extends StatefulComponent {
class
_DismissableState
extends
State
<
Dismissable
>
{
void
initState
()
{
super
.
initState
();
_dismiss
Performance
=
new
Performance
(
duration:
_kCardDismissDuration
);
_dismiss
Performance
.
addStatusListener
((
PerformanceStatus
status
)
{
_dismiss
Controller
=
new
AnimationController
(
duration:
_kCardDismissDuration
);
_dismiss
Controller
.
addStatusListener
((
PerformanceStatus
status
)
{
if
(
status
==
PerformanceStatus
.
completed
)
_handleDismissCompleted
();
});
}
Performance
_dismissPerformance
;
Performance
_resizePerformance
;
AnimationController
_dismissController
;
AnimationController
_resizeController
;
Size
_size
;
double
_dragExtent
=
0.0
;
bool
_dragUnderway
=
false
;
void
dispose
()
{
_dismiss
Performance
?.
stop
();
_resize
Performance
?.
stop
();
_dismiss
Controller
?.
stop
();
_resize
Controller
?.
stop
();
super
.
dispose
();
}
...
...
@@ -101,11 +101,11 @@ class _DismissableState extends State<Dismissable> {
void
_handleDismissCompleted
()
{
if
(!
_dragUnderway
)
_startResize
Performance
();
_startResize
Animation
();
}
bool
get
_isActive
{
return
_size
!=
null
&&
(
_dragUnderway
||
_dismiss
Performance
.
isAnimating
);
return
_size
!=
null
&&
(
_dragUnderway
||
_dismiss
Controller
.
isAnimating
);
}
void
_maybeCallOnResized
()
{
...
...
@@ -118,21 +118,20 @@ class _DismissableState extends State<Dismissable> {
config
.
onDismissed
();
}
void
_startResize
Performance
()
{
void
_startResize
Animation
()
{
assert
(
_size
!=
null
);
assert
(
_dismiss
Performance
!=
null
);
assert
(
_dismiss
Performance
.
isCompleted
);
assert
(
_resize
Performance
==
null
);
assert
(
_dismiss
Controller
!=
null
);
assert
(
_dismiss
Controller
.
isCompleted
);
assert
(
_resize
Controller
==
null
);
setState
(()
{
_resizePerformance
=
new
Performance
()
..
duration
=
_kCardResizeDuration
_resizeController
=
new
AnimationController
(
duration:
_kCardResizeDuration
)
..
addListener
(
_handleResizeProgressChanged
);
_resize
Performance
.
play
();
_resize
Controller
.
forward
();
});
}
void
_handleResizeProgressChanged
()
{
if
(
_resize
Performance
.
isCompleted
)
if
(
_resize
Controller
.
isCompleted
)
_maybeCallOnDismissed
();
else
_maybeCallOnResized
();
...
...
@@ -141,18 +140,18 @@ class _DismissableState extends State<Dismissable> {
void
_handleDragStart
(
_
)
{
setState
(()
{
_dragUnderway
=
true
;
if
(
_dismiss
Performance
.
isAnimating
)
{
_dragExtent
=
_dismiss
Performance
.
progress
*
_size
.
width
*
_dragExtent
.
sign
;
_dismiss
Performance
.
stop
();
if
(
_dismiss
Controller
.
isAnimating
)
{
_dragExtent
=
_dismiss
Controller
.
value
*
_size
.
width
*
_dragExtent
.
sign
;
_dismiss
Controller
.
stop
();
}
else
{
_dragExtent
=
0.0
;
_dismiss
Performance
.
progress
=
0.0
;
_dismiss
Controller
.
value
=
0.0
;
}
});
}
void
_handleDragUpdate
(
double
delta
)
{
if
(!
_isActive
||
_dismiss
Performance
.
isAnimating
)
if
(!
_isActive
||
_dismiss
Controller
.
isAnimating
)
return
;
double
oldDragExtent
=
_dragExtent
;
...
...
@@ -180,11 +179,11 @@ class _DismissableState extends State<Dismissable> {
// Rebuild to update the new drag endpoint.
// The sign of _dragExtent is part of our build state;
// the actual value is not, it's just used to configure
// the
performance
s.
// the
animation
s.
});
}
if
(!
_dismiss
Performance
.
isAnimating
)
_dismiss
Performance
.
progress
=
_dragExtent
.
abs
()
/
_size
.
width
;
if
(!
_dismiss
Controller
.
isAnimating
)
_dismiss
Controller
.
value
=
_dragExtent
.
abs
()
/
_size
.
width
;
}
bool
_isFlingGesture
(
ui
.
Offset
velocity
)
{
...
...
@@ -217,20 +216,20 @@ class _DismissableState extends State<Dismissable> {
}
void
_handleDragEnd
(
ui
.
Offset
velocity
)
{
if
(!
_isActive
||
_dismiss
Performance
.
isAnimating
)
if
(!
_isActive
||
_dismiss
Controller
.
isAnimating
)
return
;
setState
(()
{
_dragUnderway
=
false
;
if
(
_dismiss
Performance
.
isCompleted
)
{
_startResize
Performance
();
if
(
_dismiss
Controller
.
isCompleted
)
{
_startResize
Animation
();
}
else
if
(
_isFlingGesture
(
velocity
))
{
double
flingVelocity
=
_directionIsYAxis
?
velocity
.
dy
:
velocity
.
dx
;
_dragExtent
=
flingVelocity
.
sign
;
_dismiss
Performance
.
fling
(
velocity:
flingVelocity
.
abs
()
*
_kFlingVelocityScale
);
}
else
if
(
_dismiss
Performance
.
progress
>
_kDismissCardThreshold
)
{
_dismiss
Performance
.
forward
();
_dismiss
Controller
.
fling
(
velocity:
flingVelocity
.
abs
()
*
_kFlingVelocityScale
);
}
else
if
(
_dismiss
Controller
.
value
>
_kDismissCardThreshold
)
{
_dismiss
Controller
.
forward
();
}
else
{
_dismiss
Performance
.
reverse
();
_dismiss
Controller
.
reverse
();
}
});
}
...
...
@@ -250,20 +249,26 @@ class _DismissableState extends State<Dismissable> {
}
Widget
build
(
BuildContext
context
)
{
if
(
_resize
Performance
!=
null
)
{
if
(
_resize
Controller
!=
null
)
{
// make sure you remove this widget once it's been dismissed!
assert
(
_resize
Performance
.
status
==
PerformanceStatus
.
forward
);
assert
(
_resize
Controller
.
status
==
PerformanceStatus
.
forward
);
AnimatedValue
<
double
>
squashAxisExtent
=
new
AnimatedValue
<
double
>(
_directionIsYAxis
?
_size
.
width
:
_size
.
height
,
end:
0.0
,
Animated
<
double
>
squashAxisExtent
=
new
Tween
<
double
>(
begin:
_directionIsYAxis
?
_size
.
width
:
_size
.
height
,
end:
0.0
).
animate
(
new
CurvedAnimation
(
parent:
_resizeController
,
curve:
_kCardResizeTimeCurve
);
return
new
SquashTransition
(
performance:
_resizePerformance
.
view
,
width:
_directionIsYAxis
?
squashAxisExtent
:
null
,
height:
!
_directionIsYAxis
?
squashAxisExtent
:
null
));
return
new
AnimatedBuilder
(
animation:
squashAxisExtent
,
builder:
(
BuildContext
context
,
Widget
child
)
{
return
new
SizedBox
(
width:
_directionIsYAxis
?
squashAxisExtent
.
value
:
null
,
height:
!
_directionIsYAxis
?
squashAxisExtent
.
value
:
null
);
}
);
}
...
...
@@ -278,11 +283,10 @@ class _DismissableState extends State<Dismissable> {
child:
new
SizeObserver
(
onSizeChanged:
_handleSizeChanged
,
child:
new
SlideTransition
(
performance:
_dismissPerformance
.
view
,
position:
new
AnimatedValue
<
FractionalOffset
>(
FractionalOffset
.
zero
,
position:
new
Tween
<
FractionalOffset
>(
begin:
FractionalOffset
.
zero
,
end:
_activeCardDragEndPoint
),
)
.
animate
(
_dismissController
)
,
child:
config
.
child
)
)
...
...
packages/flutter/lib/src/widgets/heroes.dart
View file @
aabd1ce4
...
...
@@ -378,7 +378,7 @@ class HeroParty {
Animated
<
double
>
_currentAnimation
;
void
_clearCurrent
Performance
()
{
void
_clearCurrent
Animation
()
{
_currentAnimation
?.
removeStatusListener
(
_handleUpdate
);
_currentAnimation
=
null
;
}
...
...
@@ -386,7 +386,7 @@ class HeroParty {
void
setAnimation
(
Animated
<
double
>
animation
)
{
assert
(
animation
!=
null
||
_heroes
.
length
==
0
);
if
(
animation
!=
_currentAnimation
)
{
_clearCurrent
Performance
();
_clearCurrent
Animation
();
_currentAnimation
=
animation
;
_currentAnimation
?.
addStatusListener
(
_handleUpdate
);
}
...
...
@@ -402,7 +402,7 @@ class HeroParty {
source
.
_resetChild
();
}
_heroes
.
clear
();
_clearCurrent
Performance
();
_clearCurrent
Animation
();
if
(
onQuestFinished
!=
null
)
onQuestFinished
();
}
...
...
packages/flutter/lib/src/widgets/implicit_animations.dart
View file @
aabd1ce4
This diff is collapsed.
Click to expand it.
packages/flutter/lib/src/widgets/mimic.dart
View file @
aabd1ce4
...
...
@@ -3,7 +3,6 @@
// found in the LICENSE file.
import
'dart:async'
;
import
'dart:ui'
as
ui
;
import
'package:flutter/animation.dart'
;
import
'package:flutter/rendering.dart'
;
...
...
@@ -42,7 +41,7 @@ class MimicOverlayEntry {
// Animation state
GlobalKey
_targetKey
;
Curve
_curve
;
Performance
_performance
;
AnimationController
_controller
;
/// Animate the entry to the location of the widget that has the given target key.
///
...
...
@@ -63,10 +62,10 @@ class MimicOverlayEntry {
_targetKey
=
targetKey
;
_curve
=
curve
;
// TODO(abarth): Support changing the animation target when in flight.
assert
(
_
performance
==
null
);
_
performance
=
new
Performance
(
duration:
duration
)
assert
(
_
controller
==
null
);
_
controller
=
new
AnimationController
(
duration:
duration
)
..
addListener
(
_overlayEntry
.
markNeedsBuild
);
return
_
performance
.
play
();
return
_
controller
.
forward
();
}
/// Cause the overlay entry to rebuild during the next pipeline flush.
...
...
@@ -84,8 +83,8 @@ class MimicOverlayEntry {
void
dispose
()
{
_targetKey
=
null
;
_curve
=
null
;
_
performance
?.
stop
();
_
performance
=
null
;
_
controller
?.
stop
();
_
controller
=
null
;
_key
.
stopMimic
();
_key
=
null
;
_overlayEntry
.
remove
();
...
...
@@ -98,16 +97,14 @@ class MimicOverlayEntry {
Rect
globalBounds
=
_initialGlobalBounds
;
Point
globalPosition
=
globalBounds
.
topLeft
;
if
(
_targetKey
!=
null
)
{
assert
(
_
performance
!=
null
);
assert
(
_
controller
!=
null
);
assert
(
_curve
!=
null
);
RenderBox
box
=
_targetKey
.
currentContext
?.
findRenderObject
();
if
(
box
!=
null
)
{
// TODO(abarth): Handle the case where the transform here isn't just a translation.
Point
localPosition
=
box
.
localToGlobal
(
Point
.
origin
);
double
t
=
_curve
.
transform
(
_performance
.
progress
);
// TODO(abarth): Add Point.lerp.
globalPosition
=
new
Point
(
ui
.
lerpDouble
(
globalPosition
.
x
,
localPosition
.
x
,
t
),
ui
.
lerpDouble
(
globalPosition
.
y
,
localPosition
.
y
,
t
));
double
t
=
_curve
.
transform
(
_controller
.
value
);
globalPosition
=
Point
.
lerp
(
globalPosition
,
localPosition
,
t
);
}
}
...
...
packages/flutter/lib/src/widgets/routes.dart
View file @
aabd1ce4
...
...
@@ -96,7 +96,7 @@ abstract class TransitionRoute<T> extends OverlayRoute<T> {
Animated
<
double
>
_animation
;
AnimationController
_controller
;
/// Called to create the
Performance object
that will drive the transitions to
/// Called to create the
animation controller
that will drive the transitions to
/// this route from the previous one, and back to the previous route from this
/// one.
AnimationController
createAnimationController
()
{
...
...
@@ -105,8 +105,8 @@ abstract class TransitionRoute<T> extends OverlayRoute<T> {
return
new
AnimationController
(
duration:
duration
,
debugLabel:
debugLabel
);
}
/// Called to create the
PerformanceView
that exposes the current progress of
/// the transition controlled by the
Performance object
created by
/// Called to create the
animation
that exposes the current progress of
/// the transition controlled by the
animation controller
created by
/// [createAnimationController()].
Animated
<
double
>
createAnimation
()
{
assert
(
_controller
!=
null
);
...
...
@@ -166,32 +166,32 @@ abstract class TransitionRoute<T> extends OverlayRoute<T> {
}
void
didPopNext
(
Route
nextRoute
)
{
_updateForward
Performance
(
nextRoute
);
_updateForward
Animation
(
nextRoute
);
super
.
didPopNext
(
nextRoute
);
}
void
didChangeNext
(
Route
nextRoute
)
{
_updateForward
Performance
(
nextRoute
);
_updateForward
Animation
(
nextRoute
);
super
.
didChangeNext
(
nextRoute
);
}
void
_updateForward
Performance
(
Route
nextRoute
)
{
void
_updateForward
Animation
(
Route
nextRoute
)
{
if
(
nextRoute
is
TransitionRoute
&&
canTransitionTo
(
nextRoute
)
&&
nextRoute
.
canTransitionFrom
(
this
))
{
Animated
<
double
>
current
=
_forwardAnimation
.
masterAnimation
;
if
(
current
!=
null
)
{
if
(
current
is
TrainHoppingAnimation
)
{
TrainHoppingAnimation
new
Performance
;
new
Performance
=
new
TrainHoppingAnimation
(
TrainHoppingAnimation
new
Animation
;
new
Animation
=
new
TrainHoppingAnimation
(
current
.
currentTrain
,
nextRoute
.
animation
,
onSwitchedTrain:
()
{
assert
(
_forwardAnimation
.
masterAnimation
==
new
Performance
);
assert
(
new
Performance
.
currentTrain
==
nextRoute
.
animation
);
_forwardAnimation
.
masterAnimation
=
new
Performance
.
currentTrain
;
new
Performance
.
dispose
();
assert
(
_forwardAnimation
.
masterAnimation
==
new
Animation
);
assert
(
new
Animation
.
currentTrain
==
nextRoute
.
animation
);
_forwardAnimation
.
masterAnimation
=
new
Animation
.
currentTrain
;
new
Animation
.
dispose
();
}
);
_forwardAnimation
.
masterAnimation
=
new
Performance
;
_forwardAnimation
.
masterAnimation
=
new
Animation
;
current
.
dispose
();
}
else
{
_forwardAnimation
.
masterAnimation
=
new
TrainHoppingAnimation
(
current
,
nextRoute
.
animation
);
...
...
@@ -322,7 +322,7 @@ class _ModalScopeState extends State<_ModalScope> {
void
_animationStatusChanged
(
PerformanceStatus
status
)
{
setState
(()
{
// The
performances'
states are our build state, and they changed already.
// The
animation's
states are our build state, and they changed already.
});
}
...
...
packages/flutter/lib/src/widgets/status_transitions.dart
View file @
aabd1ce4
...
...
@@ -24,24 +24,24 @@ abstract class StatusTransitionComponent extends StatefulComponent {
class
_StatusTransitionState
extends
State
<
StatusTransitionComponent
>
{
void
initState
()
{
super
.
initState
();
config
.
animation
.
addStatusListener
(
_
performance
StatusChanged
);
config
.
animation
.
addStatusListener
(
_
animation
StatusChanged
);
}
void
didUpdateConfig
(
StatusTransitionComponent
oldConfig
)
{
if
(
config
.
animation
!=
oldConfig
.
animation
)
{
oldConfig
.
animation
.
removeStatusListener
(
_
performance
StatusChanged
);
config
.
animation
.
addStatusListener
(
_
performance
StatusChanged
);
oldConfig
.
animation
.
removeStatusListener
(
_
animation
StatusChanged
);
config
.
animation
.
addStatusListener
(
_
animation
StatusChanged
);
}
}
void
dispose
()
{
config
.
animation
.
removeStatusListener
(
_
performance
StatusChanged
);
config
.
animation
.
removeStatusListener
(
_
animation
StatusChanged
);
super
.
dispose
();
}
void
_
performance
StatusChanged
(
PerformanceStatus
status
)
{
void
_
animation
StatusChanged
(
PerformanceStatus
status
)
{
setState
(()
{
// The
performance
's state is our build state, and it changed already.
// The
animation
's state is our build state, and it changed already.
});
}
...
...
packages/flutter/lib/src/widgets/transitions.dart
View file @
aabd1ce4
...
...
@@ -126,23 +126,25 @@ abstract class TransitionWithChild extends TransitionComponent {
Widget
buildWithChild
(
BuildContext
context
,
Widget
child
);
}
class
SlideTransition
extends
TransitionWithChild
{
class
SlideTransition
extends
AnimatedComponent
{
SlideTransition
({
Key
key
,
this
.
position
,
Animated
<
FractionalOffset
>
position
,
PerformanceView
performance
,
this
.
transformHitTests
:
true
,
Widget
child
})
:
super
(
key:
key
,
performance:
performance
,
child:
child
);
this
.
child
})
:
position
=
position
,
super
(
key:
key
,
animation:
position
);
final
AnimatedValue
<
FractionalOffset
>
position
;
bool
transformHitTests
;
final
Animated
<
FractionalOffset
>
position
;
final
bool
transformHitTests
;
final
Widget
child
;
Widget
buildWithChild
(
BuildContext
context
,
Widget
child
)
{
performance
.
updateVariable
(
position
);
return
new
FractionalTranslation
(
translation:
position
.
value
,
transformHitTests:
transformHitTests
,
child:
child
);
Widget
build
(
BuildContext
context
)
{
return
new
FractionalTranslation
(
translation:
position
.
value
,
transformHitTests:
transformHitTests
,
child:
child
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment