Mini-Player-Wischgeste steuert PlayerExpansionController statt lokalen Versatz
This commit is contained in:
+30
-40
@@ -4,7 +4,7 @@ import 'package:provider/provider.dart';
|
||||
|
||||
import '../shared/theme.dart';
|
||||
import 'audio_handler.dart';
|
||||
import 'now_playing_screen.dart';
|
||||
import 'player_expansion_controller.dart';
|
||||
import 'wischen.dart';
|
||||
|
||||
/// Kompakte Wiedergabe-Leiste über der Bottom-Nav.
|
||||
@@ -52,23 +52,20 @@ class _Leiste extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _LeisteState extends State<_Leiste> {
|
||||
/// Wie weit der Finger die Leiste gerade zieht — nur zur Anzeige, die
|
||||
/// eigentliche Entscheidung fällt erst bei [onVerticalDragEnd]/
|
||||
/// [onHorizontalDragEnd]. `dy` bleibt <= 0: nach unten ist unbelegt, ein
|
||||
/// Mitführen dorthin würde Wirkung vortäuschen, die es nicht gibt.
|
||||
Offset _versatz = Offset.zero;
|
||||
bool _ziehtGerade = false;
|
||||
/// Für die horizontale Titel-Wechsel-Geste (unverändert).
|
||||
double _horizontalVersatz = 0;
|
||||
bool _ziehtHorizontalGerade = false;
|
||||
|
||||
void _oeffne(BuildContext context) => Navigator.of(context).push(
|
||||
MaterialPageRoute(builder: (_) => const NowPlayingScreen()),
|
||||
);
|
||||
/// Rohe, aufsummierte vertikale Zugstrecke seit Gestenbeginn — exakt wie
|
||||
/// bisher `_versatz.dy`, nur ohne die Optik-Verantwortung (die liegt jetzt
|
||||
/// im PlayerExpansionController). Wird für [PlayerExpansionController.
|
||||
/// dragEnd] gebraucht, das dieselbe rohe Strecke wie wischen.dart erwartet;
|
||||
/// aus `progress` ließe sich das wegen des Clampings nicht mehr exakt
|
||||
/// zurückrechnen.
|
||||
double _vertikaleStrecke = 0;
|
||||
|
||||
void _zurueckschnappen() {
|
||||
setState(() {
|
||||
_ziehtGerade = false;
|
||||
_versatz = Offset.zero;
|
||||
});
|
||||
}
|
||||
void _oeffne(BuildContext context) =>
|
||||
context.read<PlayerExpansionController>().open(context);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -87,30 +84,26 @@ class _LeisteState extends State<_Leiste> {
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
GestureDetector(
|
||||
// Wischen wie in jeder anderen Musik-App: nach oben öffnet die
|
||||
// Vollbild-Wiedergabe, seitwärts wechselt den Titel. Die Leiste
|
||||
// folgt dabei sichtbar dem Finger — sonst blieb ein
|
||||
// bedächtiges, aber weites Wischen (unter der Schwung-Schwelle)
|
||||
// ganz ohne Reaktion.
|
||||
onVerticalDragUpdate: (details) => setState(() {
|
||||
_ziehtGerade = true;
|
||||
final dy = _versatz.dy + details.delta.dy;
|
||||
_versatz = Offset(_versatz.dx, dy > 0 ? 0 : dy);
|
||||
}),
|
||||
onVerticalDragEnd: (details) {
|
||||
final oeffnet = oeffnetVollbildMitStrecke(
|
||||
_versatz.dy, details.velocity.pixelsPerSecond.dy);
|
||||
_zurueckschnappen();
|
||||
if (oeffnet) _oeffne(context);
|
||||
onVerticalDragStart: (_) => _vertikaleStrecke = 0,
|
||||
onVerticalDragUpdate: (details) {
|
||||
_vertikaleStrecke += details.delta.dy;
|
||||
context.read<PlayerExpansionController>().dragBy(details.delta.dy);
|
||||
},
|
||||
onVerticalDragEnd: (details) => context
|
||||
.read<PlayerExpansionController>()
|
||||
.dragEnd(context, _vertikaleStrecke,
|
||||
details.velocity.pixelsPerSecond.dy),
|
||||
onHorizontalDragUpdate: (details) => setState(() {
|
||||
_ziehtGerade = true;
|
||||
_versatz = Offset(_versatz.dx + details.delta.dx, _versatz.dy);
|
||||
_ziehtHorizontalGerade = true;
|
||||
_horizontalVersatz += details.delta.dx;
|
||||
}),
|
||||
onHorizontalDragEnd: (details) {
|
||||
final wechsel = titelWechselMitStrecke(
|
||||
_versatz.dx, details.velocity.pixelsPerSecond.dx);
|
||||
_zurueckschnappen();
|
||||
_horizontalVersatz, details.velocity.pixelsPerSecond.dx);
|
||||
setState(() {
|
||||
_ziehtHorizontalGerade = false;
|
||||
_horizontalVersatz = 0;
|
||||
});
|
||||
switch (wechsel) {
|
||||
case Wechsel.naechster:
|
||||
handler.skipToNext();
|
||||
@@ -123,14 +116,11 @@ class _LeisteState extends State<_Leiste> {
|
||||
child: InkWell(
|
||||
onTap: () => _oeffne(context),
|
||||
child: AnimatedContainer(
|
||||
// Während des Ziehens sofort folgen (keine Verzögerung);
|
||||
// beim Loslassen ohne Wirkung sichtbar zurückschnappen.
|
||||
duration: _ziehtGerade
|
||||
duration: _ziehtHorizontalGerade
|
||||
? Duration.zero
|
||||
: MeloMotion.ruhig(context, MeloMotion.normal),
|
||||
curve: MeloMotion.curve,
|
||||
transform:
|
||||
Matrix4.translationValues(_versatz.dx, _versatz.dy, 0),
|
||||
transform: Matrix4.translationValues(_horizontalVersatz, 0, 0),
|
||||
height: MiniPlayer.hoehe,
|
||||
child: Row(
|
||||
children: [
|
||||
|
||||
Reference in New Issue
Block a user