feat: 可否增加打开视频自动全屏的功能 issues #37
This commit is contained in:
@ -11,18 +11,15 @@ import 'package:hive/hive.dart';
|
||||
import 'package:media_kit/media_kit.dart';
|
||||
import 'package:media_kit_video/media_kit_video.dart';
|
||||
import 'package:pilipala/http/video.dart';
|
||||
import 'package:pilipala/plugin/pl_player/models/data_source.dart';
|
||||
import 'package:pilipala/plugin/pl_player/index.dart';
|
||||
import 'package:pilipala/utils/feed_back.dart';
|
||||
import 'package:pilipala/utils/storage.dart';
|
||||
import 'package:screen_brightness/screen_brightness.dart';
|
||||
import 'package:universal_platform/universal_platform.dart';
|
||||
// import 'package:wakelock_plus/wakelock_plus.dart';
|
||||
|
||||
import 'models/data_status.dart';
|
||||
import 'models/play_speed.dart';
|
||||
import 'models/play_status.dart';
|
||||
|
||||
Box videoStorage = GStrorage.video;
|
||||
Box setting = GStrorage.setting;
|
||||
|
||||
class PlPlayerController {
|
||||
Player? _videoPlayerController;
|
||||
@ -84,6 +81,7 @@ class PlPlayerController {
|
||||
int _cid = 0;
|
||||
int _heartDuration = 0;
|
||||
bool _enableHeart = true;
|
||||
bool _isFirstTime = true;
|
||||
|
||||
Timer? _timer;
|
||||
Timer? _timerForSeek;
|
||||
@ -248,6 +246,8 @@ class PlPlayerController {
|
||||
int cid = 0,
|
||||
// 历史记录开关
|
||||
bool enableHeart = true,
|
||||
// 是否首次加载
|
||||
bool isFirstTime = true,
|
||||
}) async {
|
||||
try {
|
||||
_autoPlay = autoplay;
|
||||
@ -261,6 +261,7 @@ class PlPlayerController {
|
||||
_bvid = bvid;
|
||||
_cid = cid;
|
||||
_enableHeart = enableHeart;
|
||||
_isFirstTime = isFirstTime;
|
||||
|
||||
if (_videoPlayerController != null &&
|
||||
_videoPlayerController!.state.playing) {
|
||||
@ -281,6 +282,12 @@ class PlPlayerController {
|
||||
if (!_listenersInitialized) {
|
||||
startListeners();
|
||||
}
|
||||
bool autoEnterFullcreen =
|
||||
setting.get(SettingBoxKey.enableAutoEnter, defaultValue: false);
|
||||
if (autoEnterFullcreen && _isFirstTime) {
|
||||
await Future.delayed(const Duration(milliseconds: 100));
|
||||
triggerFullScreen();
|
||||
}
|
||||
} catch (err) {
|
||||
dataStatus.status.value = DataStatus.error;
|
||||
print('plPlayer err: $err');
|
||||
@ -397,6 +404,8 @@ class PlPlayerController {
|
||||
}
|
||||
|
||||
List<StreamSubscription> subscriptions = [];
|
||||
final List<VoidCallback> _positionListeners = [];
|
||||
final List<Function(PlayerStatus status)> _statusListeners = [];
|
||||
|
||||
/// 播放事件监听
|
||||
void startListeners() {
|
||||
@ -408,11 +417,21 @@ class PlPlayerController {
|
||||
} else {
|
||||
// playerStatus.status.value = PlayerStatus.paused;
|
||||
}
|
||||
|
||||
/// 触发回调事件
|
||||
for (var element in _statusListeners) {
|
||||
element(event ? PlayerStatus.playing : PlayerStatus.paused);
|
||||
}
|
||||
makeHeartBeat(_position.value.inSeconds, type: 'status');
|
||||
}),
|
||||
videoPlayerController!.stream.completed.listen((event) {
|
||||
if (event) {
|
||||
playerStatus.status.value = PlayerStatus.completed;
|
||||
|
||||
/// 触发回调事件
|
||||
for (var element in _statusListeners) {
|
||||
element(PlayerStatus.completed);
|
||||
}
|
||||
} else {
|
||||
// playerStatus.status.value = PlayerStatus.playing;
|
||||
}
|
||||
@ -423,6 +442,11 @@ class PlPlayerController {
|
||||
if (!isSliderMoving.value) {
|
||||
_sliderPosition.value = event;
|
||||
}
|
||||
|
||||
/// 触发回调事件
|
||||
for (var element in _positionListeners) {
|
||||
element();
|
||||
}
|
||||
makeHeartBeat(event.inSeconds);
|
||||
}),
|
||||
videoPlayerController!.stream.duration.listen((event) {
|
||||
@ -714,6 +738,78 @@ class PlPlayerController {
|
||||
_isFullScreen.value = val;
|
||||
}
|
||||
|
||||
// 全屏
|
||||
Future<void> triggerFullScreen({bool status = true}) async {
|
||||
FullScreenMode mode = FullScreenModeCode.fromCode(
|
||||
setting.get(SettingBoxKey.fullScreenMode, defaultValue: 0))!;
|
||||
|
||||
if (!isFullScreen.value && status) {
|
||||
/// 按照视频宽高比决定全屏方向
|
||||
switch (mode) {
|
||||
case FullScreenMode.auto:
|
||||
if (direction.value == 'horizontal') {
|
||||
/// 进入全屏
|
||||
await enterFullScreen();
|
||||
// 横屏
|
||||
await landScape();
|
||||
} else {
|
||||
// 竖屏
|
||||
await verticalScreen();
|
||||
}
|
||||
break;
|
||||
case FullScreenMode.vertical:
|
||||
|
||||
/// 进入全屏
|
||||
await enterFullScreen();
|
||||
// 横屏
|
||||
await verticalScreen();
|
||||
break;
|
||||
case FullScreenMode.horizontal:
|
||||
|
||||
/// 进入全屏
|
||||
await enterFullScreen();
|
||||
// 横屏
|
||||
await landScape();
|
||||
break;
|
||||
}
|
||||
|
||||
toggleFullScreen(true);
|
||||
var result = await showDialog(
|
||||
context: Get.context!,
|
||||
useSafeArea: false,
|
||||
builder: (context) => Dialog.fullscreen(
|
||||
backgroundColor: Colors.black,
|
||||
child: PLVideoPlayer(
|
||||
controller: this,
|
||||
headerControl: headerControl,
|
||||
),
|
||||
),
|
||||
);
|
||||
if (result == null) {
|
||||
// 退出全屏
|
||||
exitFullScreen();
|
||||
await verticalScreen();
|
||||
toggleFullScreen(false);
|
||||
}
|
||||
} else if (isFullScreen.value) {
|
||||
Get.back();
|
||||
exitFullScreen();
|
||||
await verticalScreen();
|
||||
toggleFullScreen(false);
|
||||
}
|
||||
}
|
||||
|
||||
void addPositionListener(VoidCallback listener) =>
|
||||
_positionListeners.add(listener);
|
||||
void removePositionListener(VoidCallback listener) =>
|
||||
_positionListeners.remove(listener);
|
||||
void addStatusLister(Function(PlayerStatus status) listener) {
|
||||
_statusListeners.add(listener);
|
||||
}
|
||||
|
||||
void removeStatusLister(Function(PlayerStatus status) listener) =>
|
||||
_statusListeners.remove(listener);
|
||||
|
||||
/// 截屏
|
||||
Future screenshot() async {
|
||||
final Uint8List? screenshot =
|
||||
|
@ -159,67 +159,6 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
widget.controller.brightness.value = value;
|
||||
}
|
||||
|
||||
Future<void> triggerFullScreen() async {
|
||||
PlPlayerController _ = widget.controller;
|
||||
mode = FullScreenModeCode.fromCode(
|
||||
setting.get(SettingBoxKey.fullScreenMode, defaultValue: 0))!;
|
||||
|
||||
if (!_.isFullScreen.value) {
|
||||
/// 按照视频宽高比决定全屏方向
|
||||
switch (mode) {
|
||||
case FullScreenMode.auto:
|
||||
if (_.direction.value == 'horizontal') {
|
||||
/// 进入全屏
|
||||
await enterFullScreen();
|
||||
// 横屏
|
||||
await landScape();
|
||||
} else {
|
||||
// 竖屏
|
||||
await verticalScreen();
|
||||
}
|
||||
break;
|
||||
case FullScreenMode.vertical:
|
||||
|
||||
/// 进入全屏
|
||||
await enterFullScreen();
|
||||
// 横屏
|
||||
await verticalScreen();
|
||||
break;
|
||||
case FullScreenMode.horizontal:
|
||||
|
||||
/// 进入全屏
|
||||
await enterFullScreen();
|
||||
// 横屏
|
||||
await landScape();
|
||||
break;
|
||||
}
|
||||
|
||||
_.toggleFullScreen(true);
|
||||
var result = await showDialog(
|
||||
context: Get.context!,
|
||||
useSafeArea: false,
|
||||
builder: (context) => Dialog.fullscreen(
|
||||
backgroundColor: Colors.black,
|
||||
child: PLVideoPlayer(
|
||||
controller: _,
|
||||
headerControl: _.headerControl,
|
||||
),
|
||||
),
|
||||
);
|
||||
if (result == null) {
|
||||
// 退出全屏
|
||||
exitFullScreen();
|
||||
await verticalScreen();
|
||||
_.toggleFullScreen(false);
|
||||
}
|
||||
} else {
|
||||
Get.back();
|
||||
exitFullScreen();
|
||||
await verticalScreen();
|
||||
_.toggleFullScreen(false);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
animationController.dispose();
|
||||
@ -559,13 +498,13 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
if (dy > _distance && dy > threshold) {
|
||||
if (_.isFullScreen.value) {
|
||||
// 下滑退出全屏
|
||||
await triggerFullScreen();
|
||||
await widget.controller.triggerFullScreen(status: false);
|
||||
}
|
||||
_distance = 0.0;
|
||||
} else if (dy < _distance && dy < -threshold) {
|
||||
if (!_.isFullScreen.value) {
|
||||
// 上滑进入全屏
|
||||
await triggerFullScreen();
|
||||
await widget.controller.triggerFullScreen();
|
||||
}
|
||||
_distance = 0.0;
|
||||
}
|
||||
@ -606,7 +545,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
position: 'bottom',
|
||||
child: BottomControl(
|
||||
controller: widget.controller,
|
||||
triggerFullScreen: triggerFullScreen),
|
||||
triggerFullScreen: widget.controller.triggerFullScreen),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
Reference in New Issue
Block a user