feat: 简单实现弹幕功能
This commit is contained in:
@ -89,6 +89,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
vsync: this, duration: const Duration(milliseconds: 300));
|
||||
videoController = widget.controller.videoController!;
|
||||
widget.controller.headerControl = widget.headerControl;
|
||||
widget.controller.danmuWidget = widget.danmuWidget;
|
||||
defaultBtmProgressBehavior = setting.get(SettingBoxKey.btmProgressBehavior,
|
||||
defaultValue: BtmProgresBehavior.values.first.code);
|
||||
|
||||
@ -159,67 +160,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();
|
||||
@ -472,6 +412,10 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
}
|
||||
}),
|
||||
|
||||
/// 弹幕面板
|
||||
if (widget.danmuWidget != null)
|
||||
Positioned.fill(top: 4, child: widget.danmuWidget!),
|
||||
|
||||
/// 手势
|
||||
Positioned.fill(
|
||||
left: 16,
|
||||
@ -559,13 +503,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 +550,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