accessibility: remove animations (overlay)
This commit is contained in:
parent
2280a3fa65
commit
808d2de3bd
15 changed files with 69 additions and 57 deletions
|
@ -16,9 +16,6 @@ class Durations {
|
||||||
static const iconAnimation = Duration(milliseconds: 300);
|
static const iconAnimation = Duration(milliseconds: 300);
|
||||||
static const sweeperOpacityAnimation = Duration(milliseconds: 150);
|
static const sweeperOpacityAnimation = Duration(milliseconds: 150);
|
||||||
static const sweepingAnimation = Duration(milliseconds: 650);
|
static const sweepingAnimation = Duration(milliseconds: 650);
|
||||||
|
|
||||||
// static const staggeredAnimation = Duration(milliseconds: 375);
|
|
||||||
// static const staggeredAnimationPageTarget = Duration(milliseconds: 800);
|
|
||||||
static const dialogFieldReachAnimation = Duration(milliseconds: 300);
|
static const dialogFieldReachAnimation = Duration(milliseconds: 300);
|
||||||
|
|
||||||
static const appBarTitleAnimation = Duration(milliseconds: 300);
|
static const appBarTitleAnimation = Duration(milliseconds: 300);
|
||||||
|
@ -43,9 +40,6 @@ class Durations {
|
||||||
static const filterRowExpandAnimation = Duration(milliseconds: 300);
|
static const filterRowExpandAnimation = Duration(milliseconds: 300);
|
||||||
|
|
||||||
// viewer animations
|
// viewer animations
|
||||||
static const viewerVerticalPageScrollAnimation = Duration(milliseconds: 500);
|
|
||||||
static const viewerOverlayAnimation = Duration(milliseconds: 200);
|
|
||||||
static const viewerOverlayChangeAnimation = Duration(milliseconds: 150);
|
|
||||||
static const thumbnailScrollerScrollAnimation = Duration(milliseconds: 200);
|
static const thumbnailScrollerScrollAnimation = Duration(milliseconds: 200);
|
||||||
static const thumbnailScrollerShadeAnimation = Duration(milliseconds: 150);
|
static const thumbnailScrollerShadeAnimation = Duration(milliseconds: 150);
|
||||||
static const viewerVideoPlayerTransition = Duration(milliseconds: 500);
|
static const viewerVideoPlayerTransition = Duration(milliseconds: 500);
|
||||||
|
@ -67,8 +61,6 @@ class Durations {
|
||||||
static const highlightScrollInitDelay = Duration(milliseconds: 800);
|
static const highlightScrollInitDelay = Duration(milliseconds: 800);
|
||||||
static const videoOverlayHideDelay = Duration(milliseconds: 500);
|
static const videoOverlayHideDelay = Duration(milliseconds: 500);
|
||||||
static const videoProgressTimerInterval = Duration(milliseconds: 300);
|
static const videoProgressTimerInterval = Duration(milliseconds: 300);
|
||||||
|
|
||||||
// static Duration staggeredAnimationDelay = Durations.staggeredAnimation ~/ 6 * timeDilation;
|
|
||||||
static const doubleBackTimerDelay = Duration(milliseconds: 1000);
|
static const doubleBackTimerDelay = Duration(milliseconds: 1000);
|
||||||
static const softKeyboardDisplayDelay = Duration(milliseconds: 300);
|
static const softKeyboardDisplayDelay = Duration(milliseconds: 300);
|
||||||
static const searchDebounceDelay = Duration(milliseconds: 250);
|
static const searchDebounceDelay = Duration(milliseconds: 250);
|
||||||
|
@ -107,6 +99,11 @@ class DurationsData {
|
||||||
final Duration staggeredAnimation;
|
final Duration staggeredAnimation;
|
||||||
final Duration staggeredAnimationPageTarget;
|
final Duration staggeredAnimationPageTarget;
|
||||||
|
|
||||||
|
// viewer animations
|
||||||
|
final Duration viewerVerticalPageScrollAnimation;
|
||||||
|
final Duration viewerOverlayAnimation;
|
||||||
|
final Duration viewerOverlayChangeAnimation;
|
||||||
|
|
||||||
// delays & refresh intervals
|
// delays & refresh intervals
|
||||||
final Duration staggeredAnimationDelay;
|
final Duration staggeredAnimationDelay;
|
||||||
|
|
||||||
|
@ -114,13 +111,20 @@ class DurationsData {
|
||||||
this.expansionTileAnimation = const Duration(milliseconds: 200),
|
this.expansionTileAnimation = const Duration(milliseconds: 200),
|
||||||
this.staggeredAnimation = const Duration(milliseconds: 375),
|
this.staggeredAnimation = const Duration(milliseconds: 375),
|
||||||
this.staggeredAnimationPageTarget = const Duration(milliseconds: 800),
|
this.staggeredAnimationPageTarget = const Duration(milliseconds: 800),
|
||||||
|
this.viewerVerticalPageScrollAnimation = const Duration(milliseconds: 500),
|
||||||
|
this.viewerOverlayAnimation = const Duration(milliseconds: 200),
|
||||||
|
this.viewerOverlayChangeAnimation = const Duration(milliseconds: 150),
|
||||||
}) : staggeredAnimationDelay = staggeredAnimation ~/ 6;
|
}) : staggeredAnimationDelay = staggeredAnimation ~/ 6;
|
||||||
|
|
||||||
factory DurationsData.noAnimation() {
|
factory DurationsData.noAnimation() {
|
||||||
return DurationsData(
|
return DurationsData(
|
||||||
expansionTileAnimation: const Duration(microseconds: 1), // as of Flutter v2.5.1, `ExpansionPanelList` throws if animation duration is zero
|
// as of Flutter v2.5.1, `ExpansionPanelList` throws if animation duration is zero
|
||||||
|
expansionTileAnimation: const Duration(microseconds: 1),
|
||||||
staggeredAnimation: Duration.zero,
|
staggeredAnimation: Duration.zero,
|
||||||
staggeredAnimationPageTarget: Duration.zero,
|
staggeredAnimationPageTarget: Duration.zero,
|
||||||
|
viewerVerticalPageScrollAnimation: Duration.zero,
|
||||||
|
viewerOverlayAnimation: Duration.zero,
|
||||||
|
viewerOverlayChangeAnimation: Duration.zero,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ class InteractiveThumbnail extends StatelessWidget {
|
||||||
context,
|
context,
|
||||||
TransparentMaterialPageRoute(
|
TransparentMaterialPageRoute(
|
||||||
settings: const RouteSettings(name: EntryViewerPage.routeName),
|
settings: const RouteSettings(name: EntryViewerPage.routeName),
|
||||||
pageBuilder: (c, a, sa) {
|
pageBuilder: (context, a, sa) {
|
||||||
final viewerCollection = CollectionLens(
|
final viewerCollection = CollectionLens(
|
||||||
source: collection.source,
|
source: collection.source,
|
||||||
filters: collection.filters,
|
filters: collection.filters,
|
||||||
|
|
|
@ -14,8 +14,8 @@ class BottomGestureAreaProtector extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Selector<MediaQueryData, double>(
|
return Selector<MediaQueryData, double>(
|
||||||
selector: (c, mq) => mq.systemGestureInsets.bottom,
|
selector: (context, mq) => mq.systemGestureInsets.bottom,
|
||||||
builder: (c, systemGestureBottom, child) {
|
builder: (context, systemGestureBottom, child) {
|
||||||
return Positioned(
|
return Positioned(
|
||||||
left: 0,
|
left: 0,
|
||||||
right: 0,
|
right: 0,
|
||||||
|
|
|
@ -19,7 +19,7 @@ class DirectMaterialPageRoute<T> extends PageRouteBuilder<T> {
|
||||||
}) : super(
|
}) : super(
|
||||||
settings: settings,
|
settings: settings,
|
||||||
transitionDuration: Duration.zero,
|
transitionDuration: Duration.zero,
|
||||||
pageBuilder: (c, a, sa) => builder(c),
|
pageBuilder: (context, a, sa) => builder(context),
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
|
@ -88,11 +88,12 @@ class MapButtonPanel extends StatelessWidget {
|
||||||
builder: (context, bounds, child) {
|
builder: (context, bounds, child) {
|
||||||
final degrees = bounds.rotation;
|
final degrees = bounds.rotation;
|
||||||
final opacity = degrees == 0 ? .0 : 1.0;
|
final opacity = degrees == 0 ? .0 : 1.0;
|
||||||
|
final animationDuration = context.select<DurationsData, Duration>((v) => v.viewerOverlayAnimation);
|
||||||
return IgnorePointer(
|
return IgnorePointer(
|
||||||
ignoring: opacity == 0,
|
ignoring: opacity == 0,
|
||||||
child: AnimatedOpacity(
|
child: AnimatedOpacity(
|
||||||
opacity: opacity,
|
opacity: opacity,
|
||||||
duration: Durations.viewerOverlayAnimation,
|
duration: animationDuration,
|
||||||
child: MapOverlayButton(
|
child: MapOverlayButton(
|
||||||
icon: Transform(
|
icon: Transform(
|
||||||
origin: iconSize.center(Offset.zero),
|
origin: iconSize.center(Offset.zero),
|
||||||
|
|
|
@ -70,8 +70,8 @@ class _AppDrawerState extends State<AppDrawer> {
|
||||||
child: ListTileTheme.merge(
|
child: ListTileTheme.merge(
|
||||||
selectedColor: Theme.of(context).colorScheme.secondary,
|
selectedColor: Theme.of(context).colorScheme.secondary,
|
||||||
child: Selector<MediaQueryData, double>(
|
child: Selector<MediaQueryData, double>(
|
||||||
selector: (c, mq) => mq.effectiveBottomPadding,
|
selector: (context, mq) => mq.effectiveBottomPadding,
|
||||||
builder: (c, mqPaddingBottom, child) {
|
builder: (context, mqPaddingBottom, child) {
|
||||||
final iconTheme = IconTheme.of(context);
|
final iconTheme = IconTheme.of(context);
|
||||||
return SingleChildScrollView(
|
return SingleChildScrollView(
|
||||||
padding: EdgeInsets.only(bottom: mqPaddingBottom),
|
padding: EdgeInsets.only(bottom: mqPaddingBottom),
|
||||||
|
|
|
@ -108,7 +108,7 @@ class _MapPageContentState extends State<MapPageContent> with SingleTickerProvid
|
||||||
_dotEntryNotifier.addListener(_updateInfoEntry);
|
_dotEntryNotifier.addListener(_updateInfoEntry);
|
||||||
|
|
||||||
_overlayAnimationController = AnimationController(
|
_overlayAnimationController = AnimationController(
|
||||||
duration: Durations.viewerOverlayAnimation,
|
duration: context.read<DurationsData>().viewerOverlayAnimation,
|
||||||
vsync: this,
|
vsync: this,
|
||||||
);
|
);
|
||||||
_overlayScale = CurvedAnimation(
|
_overlayScale = CurvedAnimation(
|
||||||
|
@ -238,8 +238,8 @@ class _MapPageContentState extends State<MapPageContent> with SingleTickerProvid
|
||||||
),
|
),
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
Selector<MediaQueryData, double>(
|
Selector<MediaQueryData, double>(
|
||||||
selector: (c, mq) => mq.size.width,
|
selector: (context, mq) => mq.size.width,
|
||||||
builder: (c, mqWidth, child) => ValueListenableBuilder<CollectionLens?>(
|
builder: (context, mqWidth, child) => ValueListenableBuilder<CollectionLens?>(
|
||||||
valueListenable: _regionCollectionNotifier,
|
valueListenable: _regionCollectionNotifier,
|
||||||
builder: (context, regionCollection, child) {
|
builder: (context, regionCollection, child) {
|
||||||
final regionEntries = regionCollection?.sortedEntries ?? [];
|
final regionEntries = regionCollection?.sortedEntries ?? [];
|
||||||
|
@ -333,7 +333,7 @@ class _MapPageContentState extends State<MapPageContent> with SingleTickerProvid
|
||||||
context,
|
context,
|
||||||
TransparentMaterialPageRoute(
|
TransparentMaterialPageRoute(
|
||||||
settings: const RouteSettings(name: EntryViewerPage.routeName),
|
settings: const RouteSettings(name: EntryViewerPage.routeName),
|
||||||
pageBuilder: (c, a, sa) {
|
pageBuilder: (context, a, sa) {
|
||||||
return EntryViewerPage(
|
return EntryViewerPage(
|
||||||
collection: regionCollection,
|
collection: regionCollection,
|
||||||
initialEntry: initialEntry,
|
initialEntry: initialEntry,
|
||||||
|
|
|
@ -75,7 +75,7 @@ class EmbeddedDataOpener extends StatelessWidget with FeedbackMixin {
|
||||||
context,
|
context,
|
||||||
TransparentMaterialPageRoute(
|
TransparentMaterialPageRoute(
|
||||||
settings: const RouteSettings(name: EntryViewerPage.routeName),
|
settings: const RouteSettings(name: EntryViewerPage.routeName),
|
||||||
pageBuilder: (c, a, sa) => EntryViewerPage(
|
pageBuilder: (context, a, sa) => EntryViewerPage(
|
||||||
initialEntry: tempEntry,
|
initialEntry: tempEntry,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -101,7 +101,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with FeedbackMixin,
|
||||||
_horizontalPager = PageController(initialPage: _currentHorizontalPage);
|
_horizontalPager = PageController(initialPage: _currentHorizontalPage);
|
||||||
_verticalPager = PageController(initialPage: _currentVerticalPage.value)..addListener(_onVerticalPageControllerChange);
|
_verticalPager = PageController(initialPage: _currentVerticalPage.value)..addListener(_onVerticalPageControllerChange);
|
||||||
_overlayAnimationController = AnimationController(
|
_overlayAnimationController = AnimationController(
|
||||||
duration: Durations.viewerOverlayAnimation,
|
duration: context.read<DurationsData>().viewerOverlayAnimation,
|
||||||
vsync: this,
|
vsync: this,
|
||||||
);
|
);
|
||||||
_topOverlayScale = CurvedAnimation(
|
_topOverlayScale = CurvedAnimation(
|
||||||
|
@ -355,8 +355,8 @@ class _EntryViewerStackState extends State<EntryViewerStack> with FeedbackMixin,
|
||||||
);
|
);
|
||||||
|
|
||||||
child = Selector<MediaQueryData, double>(
|
child = Selector<MediaQueryData, double>(
|
||||||
selector: (c, mq) => mq.size.height,
|
selector: (context, mq) => mq.size.height,
|
||||||
builder: (c, mqHeight, child) {
|
builder: (context, mqHeight, child) {
|
||||||
// when orientation change, the `PageController` offset is not updated right away
|
// when orientation change, the `PageController` offset is not updated right away
|
||||||
// and it does not trigger its listeners when it does, so we force a refresh in the next frame
|
// and it does not trigger its listeners when it does, so we force a refresh in the next frame
|
||||||
WidgetsBinding.instance!.addPostFrameCallback((_) => _onVerticalPageControllerChange());
|
WidgetsBinding.instance!.addPostFrameCallback((_) => _onVerticalPageControllerChange());
|
||||||
|
@ -412,13 +412,18 @@ class _EntryViewerStackState extends State<EntryViewerStack> with FeedbackMixin,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _goToVerticalPage(int page) {
|
Future<void> _goToVerticalPage(int page) async {
|
||||||
|
final animationDuration = context.read<DurationsData>().viewerVerticalPageScrollAnimation;
|
||||||
|
if (animationDuration > Duration.zero) {
|
||||||
// duration & curve should feel similar to changing page by vertical fling
|
// duration & curve should feel similar to changing page by vertical fling
|
||||||
return _verticalPager.animateToPage(
|
await _verticalPager.animateToPage(
|
||||||
page,
|
page,
|
||||||
duration: Durations.viewerVerticalPageScrollAnimation,
|
duration: animationDuration,
|
||||||
curve: Curves.easeOutQuart,
|
curve: Curves.easeOutQuart,
|
||||||
);
|
);
|
||||||
|
} else {
|
||||||
|
_verticalPager.jumpToPage(page);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onVerticalPageChanged(int page) {
|
void _onVerticalPageChanged(int page) {
|
||||||
|
|
|
@ -47,8 +47,8 @@ class _InfoPageState extends State<InfoPage> {
|
||||||
child: NotificationListener<ScrollNotification>(
|
child: NotificationListener<ScrollNotification>(
|
||||||
onNotification: _handleTopScroll,
|
onNotification: _handleTopScroll,
|
||||||
child: Selector<MediaQueryData, double>(
|
child: Selector<MediaQueryData, double>(
|
||||||
selector: (c, mq) => mq.size.width,
|
selector: (context, mq) => mq.size.width,
|
||||||
builder: (c, mqWidth, child) {
|
builder: (context, mqWidth, child) {
|
||||||
return ValueListenableBuilder<AvesEntry?>(
|
return ValueListenableBuilder<AvesEntry?>(
|
||||||
valueListenable: widget.entryNotifier,
|
valueListenable: widget.entryNotifier,
|
||||||
builder: (context, mainEntry, child) {
|
builder: (context, mainEntry, child) {
|
||||||
|
@ -109,10 +109,11 @@ class _InfoPageState extends State<InfoPage> {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _goToViewer() {
|
void _goToViewer() {
|
||||||
|
final animationDuration = context.read<DurationsData>().viewerVerticalPageScrollAnimation;
|
||||||
ShowImageNotification().dispatch(context);
|
ShowImageNotification().dispatch(context);
|
||||||
_scrollController.animateTo(
|
_scrollController.animateTo(
|
||||||
0,
|
0,
|
||||||
duration: Durations.viewerVerticalPageScrollAnimation,
|
duration: animationDuration,
|
||||||
curve: Curves.easeInOut,
|
curve: Curves.easeInOut,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,8 +82,8 @@ class _ViewerBottomOverlayState extends State<ViewerBottomOverlay> {
|
||||||
return BlurredRect(
|
return BlurredRect(
|
||||||
enabled: hasEdgeContent && blurred,
|
enabled: hasEdgeContent && blurred,
|
||||||
child: Selector<MediaQueryData, Tuple3<double, EdgeInsets, EdgeInsets>>(
|
child: Selector<MediaQueryData, Tuple3<double, EdgeInsets, EdgeInsets>>(
|
||||||
selector: (c, mq) => Tuple3(mq.size.width, mq.viewInsets, mq.viewPadding),
|
selector: (context, mq) => Tuple3(mq.size.width, mq.viewInsets, mq.viewPadding),
|
||||||
builder: (c, mq, child) {
|
builder: (context, mq, child) {
|
||||||
final mqWidth = mq.item1;
|
final mqWidth = mq.item1;
|
||||||
final mqViewInsets = mq.item2;
|
final mqViewInsets = mq.item2;
|
||||||
final mqViewPadding = mq.item3;
|
final mqViewPadding = mq.item3;
|
||||||
|
@ -176,12 +176,12 @@ class _BottomOverlayContent extends AnimatedWidget {
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width: availableWidth,
|
width: availableWidth,
|
||||||
child: Selector<MediaQueryData, Orientation>(
|
child: Selector<MediaQueryData, Orientation>(
|
||||||
selector: (c, mq) => mq.orientation,
|
selector: (context, mq) => mq.orientation,
|
||||||
builder: (c, orientation, child) {
|
builder: (context, orientation, child) {
|
||||||
Widget? infoColumn;
|
Widget? infoColumn;
|
||||||
|
|
||||||
if (settings.showOverlayInfo) {
|
if (settings.showOverlayInfo) {
|
||||||
infoColumn = _buildInfoColumn(orientation);
|
infoColumn = _buildInfoColumn(context, orientation);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mainEntry.isMultiPage && multiPageController != null) {
|
if (mainEntry.isMultiPage && multiPageController != null) {
|
||||||
|
@ -205,12 +205,13 @@ class _BottomOverlayContent extends AnimatedWidget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildInfoColumn(Orientation orientation) {
|
Widget _buildInfoColumn(BuildContext context, Orientation orientation) {
|
||||||
final infoMaxWidth = availableWidth - infoPadding.horizontal;
|
final infoMaxWidth = availableWidth - infoPadding.horizontal;
|
||||||
final twoColumns = orientation == Orientation.landscape && infoMaxWidth / 2 > _subRowMinWidth;
|
final twoColumns = orientation == Orientation.landscape && infoMaxWidth / 2 > _subRowMinWidth;
|
||||||
final subRowWidth = twoColumns ? min(_subRowMinWidth, infoMaxWidth / 2) : infoMaxWidth;
|
final subRowWidth = twoColumns ? min(_subRowMinWidth, infoMaxWidth / 2) : infoMaxWidth;
|
||||||
final positionTitle = _PositionTitleRow(entry: pageEntry, collectionPosition: position, multiPageController: multiPageController);
|
final positionTitle = _PositionTitleRow(entry: pageEntry, collectionPosition: position, multiPageController: multiPageController);
|
||||||
final hasShootingDetails = details != null && !details!.isEmpty && settings.showOverlayShootingDetails;
|
final hasShootingDetails = details != null && !details!.isEmpty && settings.showOverlayShootingDetails;
|
||||||
|
final animationDuration = context.select<DurationsData, Duration>((v) => v.viewerOverlayChangeAnimation);
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: infoPadding,
|
padding: infoPadding,
|
||||||
|
@ -219,7 +220,7 @@ class _BottomOverlayContent extends AnimatedWidget {
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
if (positionTitle.isNotEmpty) positionTitle,
|
if (positionTitle.isNotEmpty) positionTitle,
|
||||||
_buildSoloLocationRow(),
|
_buildSoloLocationRow(animationDuration),
|
||||||
if (twoColumns)
|
if (twoColumns)
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(top: _interRowPadding),
|
padding: const EdgeInsets.only(top: _interRowPadding),
|
||||||
|
@ -231,7 +232,7 @@ class _BottomOverlayContent extends AnimatedWidget {
|
||||||
entry: pageEntry,
|
entry: pageEntry,
|
||||||
multiPageController: multiPageController,
|
multiPageController: multiPageController,
|
||||||
)),
|
)),
|
||||||
_buildDuoShootingRow(subRowWidth, hasShootingDetails),
|
_buildDuoShootingRow(subRowWidth, hasShootingDetails, animationDuration),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -244,15 +245,15 @@ class _BottomOverlayContent extends AnimatedWidget {
|
||||||
multiPageController: multiPageController,
|
multiPageController: multiPageController,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
_buildSoloShootingRow(subRowWidth, hasShootingDetails),
|
_buildSoloShootingRow(subRowWidth, hasShootingDetails, animationDuration),
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildSoloLocationRow() => AnimatedSwitcher(
|
Widget _buildSoloLocationRow(Duration animationDuration) => AnimatedSwitcher(
|
||||||
duration: Durations.viewerOverlayChangeAnimation,
|
duration: animationDuration,
|
||||||
switchInCurve: Curves.easeInOutCubic,
|
switchInCurve: Curves.easeInOutCubic,
|
||||||
switchOutCurve: Curves.easeInOutCubic,
|
switchOutCurve: Curves.easeInOutCubic,
|
||||||
transitionBuilder: _soloTransition,
|
transitionBuilder: _soloTransition,
|
||||||
|
@ -264,8 +265,8 @@ class _BottomOverlayContent extends AnimatedWidget {
|
||||||
: const SizedBox(),
|
: const SizedBox(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Widget _buildSoloShootingRow(double subRowWidth, bool hasShootingDetails) => AnimatedSwitcher(
|
Widget _buildSoloShootingRow(double subRowWidth, bool hasShootingDetails, Duration animationDuration) => AnimatedSwitcher(
|
||||||
duration: Durations.viewerOverlayChangeAnimation,
|
duration: animationDuration,
|
||||||
switchInCurve: Curves.easeInOutCubic,
|
switchInCurve: Curves.easeInOutCubic,
|
||||||
switchOutCurve: Curves.easeInOutCubic,
|
switchOutCurve: Curves.easeInOutCubic,
|
||||||
transitionBuilder: _soloTransition,
|
transitionBuilder: _soloTransition,
|
||||||
|
@ -278,8 +279,8 @@ class _BottomOverlayContent extends AnimatedWidget {
|
||||||
: const SizedBox(),
|
: const SizedBox(),
|
||||||
);
|
);
|
||||||
|
|
||||||
Widget _buildDuoShootingRow(double subRowWidth, bool hasShootingDetails) => AnimatedSwitcher(
|
Widget _buildDuoShootingRow(double subRowWidth, bool hasShootingDetails, Duration animationDuration) => AnimatedSwitcher(
|
||||||
duration: Durations.viewerOverlayChangeAnimation,
|
duration: animationDuration,
|
||||||
switchInCurve: Curves.easeInOutCubic,
|
switchInCurve: Curves.easeInOutCubic,
|
||||||
switchOutCurve: Curves.easeInOutCubic,
|
switchOutCurve: Curves.easeInOutCubic,
|
||||||
transitionBuilder: (child, animation) => FadeTransition(
|
transitionBuilder: (child, animation) => FadeTransition(
|
||||||
|
|
|
@ -81,8 +81,8 @@ class _VideoControlOverlayState extends State<VideoControlOverlay> with SingleTi
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
child = Selector<MediaQueryData, double>(
|
child = Selector<MediaQueryData, double>(
|
||||||
selector: (c, mq) => mq.size.width - mq.padding.horizontal,
|
selector: (context, mq) => mq.size.width - mq.padding.horizontal,
|
||||||
builder: (c, mqWidth, child) {
|
builder: (context, mqWidth, child) {
|
||||||
final buttonWidth = OverlayButton.getSize(context);
|
final buttonWidth = OverlayButton.getSize(context);
|
||||||
final availableCount = ((mqWidth - outerPadding * 2) / (buttonWidth + innerPadding)).floor();
|
final availableCount = ((mqWidth - outerPadding * 2) / (buttonWidth + innerPadding)).floor();
|
||||||
final quickActions = settings.videoQuickActions.take(availableCount - 1).toList();
|
final quickActions = settings.videoQuickActions.take(availableCount - 1).toList();
|
||||||
|
|
|
@ -45,8 +45,8 @@ class ViewerTopOverlay extends StatelessWidget {
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.all(outerPadding),
|
padding: const EdgeInsets.all(outerPadding),
|
||||||
child: Selector<MediaQueryData, double>(
|
child: Selector<MediaQueryData, double>(
|
||||||
selector: (c, mq) => mq.size.width - mq.padding.horizontal,
|
selector: (context, mq) => mq.size.width - mq.padding.horizontal,
|
||||||
builder: (c, mqWidth, child) {
|
builder: (context, mqWidth, child) {
|
||||||
final buttonWidth = OverlayButton.getSize(context);
|
final buttonWidth = OverlayButton.getSize(context);
|
||||||
final availableCount = ((mqWidth - outerPadding * 2 - buttonWidth) / (buttonWidth + innerPadding)).floor();
|
final availableCount = ((mqWidth - outerPadding * 2 - buttonWidth) / (buttonWidth + innerPadding)).floor();
|
||||||
|
|
||||||
|
|
|
@ -90,8 +90,8 @@ class _PanoramaPageState extends State<PanoramaPage> {
|
||||||
return Visibility(
|
return Visibility(
|
||||||
visible: overlayVisible,
|
visible: overlayVisible,
|
||||||
child: Selector<MediaQueryData, EdgeInsets>(
|
child: Selector<MediaQueryData, EdgeInsets>(
|
||||||
selector: (c, mq) => mq.viewPadding + mq.viewInsets,
|
selector: (context, mq) => mq.viewPadding + mq.viewInsets,
|
||||||
builder: (c, mqPadding, child) {
|
builder: (context, mqPadding, child) {
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.all(8) + EdgeInsets.only(right: mqPadding.right, bottom: mqPadding.bottom),
|
padding: const EdgeInsets.all(8) + EdgeInsets.only(right: mqPadding.right, bottom: mqPadding.bottom),
|
||||||
child: OverlayButton(
|
child: OverlayButton(
|
||||||
|
|
|
@ -48,8 +48,8 @@ class VideoSubtitles extends StatelessWidget {
|
||||||
);
|
);
|
||||||
|
|
||||||
return Selector<MediaQueryData, Orientation>(
|
return Selector<MediaQueryData, Orientation>(
|
||||||
selector: (c, mq) => mq.orientation,
|
selector: (context, mq) => mq.orientation,
|
||||||
builder: (c, orientation, child) {
|
builder: (context, orientation, child) {
|
||||||
final bottom = orientation == Orientation.portrait ? .5 : .8;
|
final bottom = orientation == Orientation.portrait ? .5 : .8;
|
||||||
final viewportSize = context.read<MediaQueryData>().size;
|
final viewportSize = context.read<MediaQueryData>().size;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue