fix: pip aspectRatio

related #543

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-03-27 20:42:06 +08:00
parent a15b932a69
commit 63a7fa95f5
5 changed files with 44 additions and 22 deletions

View File

@@ -519,14 +519,12 @@ class _VideoDetailPageState extends State<VideoDetailPage>
// } // }
void enterPip() { void enterPip() {
if (Get.currentRoute.startsWith('/video')) { if (Get.currentRoute.startsWith('/video') &&
videoDetailController.floating?.enable( videoDetailController.floating != null) {
EnableManual( Utils.enterPip(
aspectRatio: Rational( videoDetailController.floating!,
videoDetailController.data.dash!.video!.first.width!, videoDetailController.data.dash!.video!.first.width!,
videoDetailController.data.dash!.video!.first.height!, videoDetailController.data.dash!.video!.first.height!,
),
),
); );
} }
} }

View File

@@ -558,14 +558,12 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
// } // }
void enterPip() { void enterPip() {
if (Get.currentRoute.startsWith('/video')) { if (Get.currentRoute.startsWith('/video') &&
videoDetailController.floating?.enable( videoDetailController.floating != null) {
EnableManual( Utils.enterPip(
aspectRatio: Rational( videoDetailController.floating!,
videoDetailController.data.dash!.video!.first.width!, videoDetailController.data.dash!.video!.first.width!,
videoDetailController.data.dash!.video!.first.height!, videoDetailController.data.dash!.video!.first.height!,
),
),
); );
} }
} }

View File

@@ -2451,17 +2451,15 @@ class HeaderControlState extends State<HeaderControl> {
await Future.delayed( await Future.delayed(
const Duration(seconds: 3), () {}); const Duration(seconds: 3), () {});
} }
final Rational aspectRatio = Rational( if (!context.mounted) return;
Utils.enterPip(
widget.floating!,
widget widget
.videoDetailCtr.data.dash!.video!.first.width!, .videoDetailCtr.data.dash!.video!.first.width!,
widget widget
.videoDetailCtr.data.dash!.video!.first.height!, .videoDetailCtr.data.dash!.video!.first.height!,
); );
if (!context.mounted) return; }
await widget.floating!.enable(EnableManual(
aspectRatio: aspectRatio,
));
} else {}
}, },
icon: const Icon( icon: const Icon(
Icons.picture_in_picture_outlined, Icons.picture_in_picture_outlined,

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/hero_dialog_route.dart'; import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/hero_dialog_route.dart';
import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart'; import 'package:PiliPlus/common/widgets/interactiveviewer_gallery/interactiveviewer_gallery.dart';
import 'package:floating/floating.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -122,3 +123,16 @@ extension BrightnessExt on Brightness {
Brightness get reverse => Brightness get reverse =>
this == Brightness.light ? Brightness.dark : Brightness.light; this == Brightness.light ? Brightness.dark : Brightness.light;
} }
extension RationalExt on Rational {
/// Checks whether given [Rational] instance fits into Android requirements
/// or not.
///
/// Android docs specified boundaries as inclusive.
bool get fitsInAndroidRequirements {
final aspectRatio = numerator / denominator;
final min = 1 / 2.39;
final max = 2.39;
return (min <= aspectRatio) && (aspectRatio <= max);
}
}

View File

@@ -37,6 +37,7 @@ import 'package:crypto/crypto.dart';
import 'package:device_info_plus/device_info_plus.dart'; import 'package:device_info_plus/device_info_plus.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flex_seed_scheme/flex_seed_scheme.dart'; import 'package:flex_seed_scheme/flex_seed_scheme.dart';
import 'package:floating/floating.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -58,6 +59,19 @@ class Utils {
static final _numRegExp = RegExp(r'([\d\.]+)([千万亿])?'); static final _numRegExp = RegExp(r'([\d\.]+)([千万亿])?');
static void enterPip(Floating floating, int width, int height) {
Rational aspectRatio = Rational(width, height);
floating.enable(
EnableManual(
aspectRatio: aspectRatio.fitsInAndroidRequirements
? aspectRatio
: height > width
? const Rational.vertical()
: const Rational.landscape(),
),
);
}
static ThemeData getThemeData({ static ThemeData getThemeData({
required ColorScheme colorScheme, required ColorScheme colorScheme,
required bool isDynamic, required bool isDynamic,