added overlay disappear after a short time

This commit is contained in:
Myzel394 2022-08-14 17:30:36 +02:00
parent f5fd31d592
commit 2339fd27a0
6 changed files with 147 additions and 66 deletions

View File

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
class TimelineOverlay extends ChangeNotifier {
bool _showOverlay = true;
bool get showOverlay => _showOverlay;
void hideOverlay() => setShowOverlay(false);
void restoreOverlay() => setShowOverlay(true);
void setShowOverlay(bool showOverlay) {
_showOverlay = showOverlay;
notifyListeners();
}
}

View File

@ -1,8 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:share_location/controllers/memory_slide_controller.dart'; import 'package:share_location/controllers/memory_slide_controller.dart';
import 'package:share_location/controllers/status_controller.dart'; import 'package:share_location/controllers/status_controller.dart';
import 'package:share_location/enums.dart'; import 'package:share_location/enums.dart';
import 'package:share_location/foreign_types/memory.dart'; import 'package:share_location/foreign_types/memory.dart';
import 'package:share_location/models/timeline_overlay.dart';
import 'package:share_location/widgets/status.dart'; import 'package:share_location/widgets/status.dart';
import 'memory.dart'; import 'memory.dart';
@ -66,8 +68,10 @@ class _MemorySlideState extends State<MemorySlide>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Status( return Consumer<TimelineOverlay>(
builder: (context, overlayController, _) => Status(
controller: controller, controller: controller,
disabled: !overlayController.showOverlay,
child: MemoryView( child: MemoryView(
creationDate: widget.memory.creationDate, creationDate: widget.memory.creationDate,
location: widget.memory.location, location: widget.memory.location,
@ -96,6 +100,7 @@ class _MemorySlideState extends State<MemorySlide>
} }
}, },
), ),
),
); );
} }
} }

View File

@ -7,10 +7,12 @@ const BAR_HEIGHT = 4.0;
class Status extends StatefulWidget { class Status extends StatefulWidget {
final StatusController? controller; final StatusController? controller;
final Widget child; final Widget child;
final bool disabled;
const Status({ const Status({
Key? key, Key? key,
required this.child, required this.child,
this.disabled = false,
this.controller, this.controller,
}) : super(key: key); }) : super(key: key);
@ -29,6 +31,12 @@ class _StatusState extends State<Status> with TickerProviderStateMixin {
if (widget.controller != null && animationController == null) { if (widget.controller != null && animationController == null) {
initializeAnimation(); initializeAnimation();
} }
if (widget.disabled) {
animationController?.stop();
} else {
animationController?.forward();
}
} }
@override @override
@ -75,6 +83,10 @@ class _StatusState extends State<Status> with TickerProviderStateMixin {
height: BAR_HEIGHT, height: BAR_HEIGHT,
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: SMALL_SPACE), padding: const EdgeInsets.symmetric(horizontal: SMALL_SPACE),
child: AnimatedOpacity(
duration: const Duration(milliseconds: 500),
curve: Curves.linearToEaseOut,
opacity: widget.disabled ? 0.0 : 1.0,
child: (widget.controller == null) child: (widget.controller == null)
? ClipRRect( ? ClipRRect(
borderRadius: BorderRadius.circular(HUGE_SPACE), borderRadius: BorderRadius.circular(HUGE_SPACE),
@ -99,6 +111,7 @@ class _StatusState extends State<Status> with TickerProviderStateMixin {
), ),
), ),
), ),
),
], ],
); );
} }

View File

@ -1,8 +1,12 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import 'package:share_location/constants/spacing.dart'; import 'package:share_location/constants/spacing.dart';
import 'package:share_location/controllers/memory_slide_controller.dart'; import 'package:share_location/controllers/memory_slide_controller.dart';
import 'package:share_location/foreign_types/memory.dart'; import 'package:share_location/foreign_types/memory.dart';
import 'package:share_location/models/timeline_overlay.dart';
import 'package:share_location/widgets/memory_slide.dart'; import 'package:share_location/widgets/memory_slide.dart';
class TimelinePage extends StatefulWidget { class TimelinePage extends StatefulWidget {
@ -24,9 +28,12 @@ class TimelinePage extends StatefulWidget {
} }
class _TimelinePageState extends State<TimelinePage> { class _TimelinePageState extends State<TimelinePage> {
final timelineOverlayController = TimelineOverlay();
final pageController = PageController(); final pageController = PageController();
late final MemorySlideController controller; late final MemorySlideController controller;
Timer? overlayRemover;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -52,6 +59,7 @@ class _TimelinePageState extends State<TimelinePage> {
@override @override
void dispose() { void dispose() {
controller.dispose(); controller.dispose();
timelineOverlayController.dispose();
super.dispose(); super.dispose();
} }
@ -61,11 +69,23 @@ class _TimelinePageState extends State<TimelinePage> {
return GestureDetector( return GestureDetector(
onTapDown: (_) { onTapDown: (_) {
controller.setPaused(true); controller.setPaused(true);
overlayRemover = Timer(
const Duration(milliseconds: 200),
timelineOverlayController.hideOverlay,
);
}, },
onTapUp: (_) { onTapUp: (_) {
overlayRemover?.cancel();
controller.setPaused(false); controller.setPaused(false);
timelineOverlayController.restoreOverlay();
}, },
onTapCancel: () { onTapCancel: () {
overlayRemover?.cancel();
timelineOverlayController.restoreOverlay();
controller.setPaused(false); controller.setPaused(false);
}, },
onHorizontalDragEnd: (details) { onHorizontalDragEnd: (details) {
@ -85,6 +105,8 @@ class _TimelinePageState extends State<TimelinePage> {
); );
} }
}, },
child: ChangeNotifierProvider<TimelineOverlay>(
create: (_) => timelineOverlayController,
child: Stack( child: Stack(
fit: StackFit.expand, fit: StackFit.expand,
children: <Widget>[ children: <Widget>[
@ -101,15 +123,26 @@ class _TimelinePageState extends State<TimelinePage> {
), ),
Padding( Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
top: LARGE_SPACE, left: MEDIUM_SPACE, right: MEDIUM_SPACE), top: LARGE_SPACE,
left: MEDIUM_SPACE,
right: MEDIUM_SPACE,
),
child: Consumer<TimelineOverlay>(
builder: (context, overlayController, _) => AnimatedOpacity(
duration: const Duration(milliseconds: 500),
curve: Curves.linearToEaseOut,
opacity: overlayController.showOverlay ? 1.0 : 0.0,
child: Text( child: Text(
DateFormat('dd. MMMM yyyy').format(widget.date), DateFormat('dd. MMMM yyyy').format(widget.date),
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline1, style: Theme.of(context).textTheme.headline1,
), ),
), ),
),
),
], ],
), ),
),
); );
} }
} }

View File

@ -310,6 +310,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "1.0.2"
nested:
dependency: transitive
description:
name: nested
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
path: path:
dependency: "direct main" dependency: "direct main"
description: description:
@ -457,6 +464,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.0" version: "0.3.0"
provider:
dependency: "direct main"
description:
name: provider
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.3"
quiver: quiver:
dependency: transitive dependency: transitive
description: description:

View File

@ -45,6 +45,7 @@ dependencies:
intl: ^0.17.0 intl: ^0.17.0
property_change_notifier: ^0.3.0 property_change_notifier: ^0.3.0
path: ^1.8.1 path: ^1.8.1
provider: ^6.0.3
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: