فهرست منبع

控制器内部的全屏控制代码

cjl_macbook 6 سال پیش
والد
کامیت
6b1c2a3817

+ 61 - 0
example/lib/page/dialog_video_page.dart

@@ -0,0 +1,61 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+
+class DialogVideoPage extends StatefulWidget {
+  @override
+  _DialogVideoPageState createState() => _DialogVideoPageState();
+}
+
+class _DialogVideoPageState extends State<DialogVideoPage> {
+  IjkMediaController controller = IjkMediaController();
+
+  @override
+  void dispose() {
+    controller?.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(),
+      body: Center(
+        child: Column(
+          children: <Widget>[
+            AspectRatio(
+              aspectRatio: 1,
+              child: _buildIJKPlayer(),
+            ),
+            FlatButton(
+              child: Text("显示dialog"),
+              onPressed: showIJKDialog,
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+
+  void showIJKDialog() async {
+    await controller.setDataSource(
+      DataSource.network(
+          "http://img.ksbbs.com/asset/Mon_1703/05cacb4e02f9d9e.mp4"),
+    );
+    await controller.play();
+
+    await Future.delayed(Duration(seconds: 2));
+
+    showDialog(
+      context: context,
+      builder: (_) => IjkPlayer(
+            mediaController: controller,
+          ),
+    );
+  }
+
+  _buildIJKPlayer() {
+    return IjkPlayer(
+      mediaController: controller,
+    );
+  }
+}

+ 1 - 1
example/lib/page/full_screen.dart

@@ -154,7 +154,7 @@ class _FullScreen2State extends State<FullScreen2> {
             child: IjkPlayer(
               mediaController: controller,
               controllerWidgetBuilder: (ctl) {
-                return DefaultControllerWidget(
+                return DefaultIJKControllerWidget(
                   controller: ctl,
                   verticalGesture: false,
                 );

+ 2 - 0
example/lib/page/index.dart

@@ -1,5 +1,6 @@
 import 'package:flutter/material.dart';
 import 'package:ijkplayer_example/page/asset_page.dart';
+import 'package:ijkplayer_example/page/dialog_video_page.dart';
 import 'package:ijkplayer_example/page/full_screen.dart';
 import 'package:ijkplayer_example/page/gallery_page.dart';
 import 'package:ijkplayer_example/page/network.dart';
@@ -25,6 +26,7 @@ class _IndexPageState extends State<IndexPage> {
           buildButton("ListView中插入视频(未完成)", VideoList()),
           buildButton("全屏切换示例(自动)", FullScreen()),
           buildButton("全屏切换示例(手动)", FullScreen2()),
+          buildButton("在dialog中播放显示视频", DialogVideoPage()),
         ],
       ),
     );

+ 1 - 1
example/lib/page/video_list.dart

@@ -140,7 +140,7 @@ class _VideoItemState extends State<VideoItem> {
   }
 
   Widget _buildControllerWidget(IjkMediaController controller) {
-    return DefaultControllerWidget(
+    return DefaultIJKControllerWidget(
       controller: controller,
       verticalGesture: false,
     );

+ 1 - 1
lib/flutter_ijkplayer.dart

@@ -1,5 +1,5 @@
 export 'src/error.dart';
 export 'src/ijkplayer.dart';
 export 'package:flutter_ijkplayer/src/entity/video_info.dart';
-export 'src/widget/controller_widget_builder.dart' show DefaultControllerWidget;
+export 'src/widget/controller_widget_builder.dart' show DefaultIJKControllerWidget;
 export 'package:flutter_ijkplayer/src/helper/config.dart';

+ 1 - 1
lib/src/ijkplayer.dart

@@ -19,7 +19,7 @@ part 'engine/manager.dart';
 class IjkPlayer extends StatefulWidget {
   final IjkMediaController mediaController;
 
-  /// See [DefaultControllerWidget]
+  /// See [DefaultIJKControllerWidget]
   final ControllerWidgetBuilder controllerWidgetBuilder;
 
   /// See [buildDefaultIjkPlayer]

+ 53 - 6
lib/src/widget/controller_widget_builder.dart

@@ -13,7 +13,7 @@ typedef Widget ControllerWidgetBuilder(IjkMediaController controller);
 
 /// default create IJK Controller UI
 Widget defaultBuildIjkControllerWidget(IjkMediaController controller) {
-  return DefaultControllerWidget(
+  return DefaultIJKControllerWidget(
     controller: controller,
 //    verticalGesture: false,
 //    horizontalGesture: false,
@@ -23,7 +23,7 @@ Widget defaultBuildIjkControllerWidget(IjkMediaController controller) {
 /// Default Controller Widget
 ///
 /// see [IjkPlayer] and [ControllerWidgetBuilder]
-class DefaultControllerWidget extends StatefulWidget {
+class DefaultIJKControllerWidget extends StatefulWidget {
   final IjkMediaController controller;
 
   /// If [doubleTapPlay] is true, can double tap to play or pause media.
@@ -40,23 +40,26 @@ class DefaultControllerWidget extends StatefulWidget {
 
   final bool playWillPauseOther;
 
+  final bool fullScreen;
+
   /// The UI of the controller.
-  const DefaultControllerWidget({
+  const DefaultIJKControllerWidget({
     @required this.controller,
     this.doubleTapPlay = false,
     this.verticalGesture = true,
     this.horizontalGesture = true,
     this.volumeType = VolumeType.system,
     this.playWillPauseOther = true,
+    this.fullScreen = false,
     Key key,
   }) : super(key: key);
 
   @override
-  _DefaultControllerWidgetState createState() =>
-      _DefaultControllerWidgetState();
+  _DefaultIJKControllerWidgetState createState() =>
+      _DefaultIJKControllerWidgetState();
 }
 
-class _DefaultControllerWidgetState extends State<DefaultControllerWidget>
+class _DefaultIJKControllerWidgetState extends State<DefaultIJKControllerWidget>
     implements TooltipDelegate {
   IjkMediaController get controller => widget.controller;
 
@@ -157,12 +160,28 @@ class _DefaultControllerWidgetState extends State<DefaultControllerWidget>
     );
   }
 
+  Widget _buildFullScreenButton() {
+    return IconButton(
+      color: Colors.white,
+      icon: Icon(widget.fullScreen ? Icons.fullscreen_exit : Icons.fullscreen),
+      onPressed: () {
+        // todo: 这里加入控制全屏和取消全屏的代码, 还需要根据视频宽高决定是竖向全屏还是横向全屏
+        if (widget.fullScreen) {
+          Navigator.pop(context);
+        } else {
+          showFullScreenIJKPlayer(context, controller);
+        }
+      },
+    );
+  }
+
   Widget buildPortrait(VideoInfo info) {
     return PortraitController(
       controller: controller,
       info: info,
       tooltipDelegate: this,
       playWillPauseOther: widget.playWillPauseOther,
+      fullScreenWidget: _buildFullScreenButton(),
     );
   }
 
@@ -419,6 +438,7 @@ class PortraitController extends StatelessWidget {
   final VideoInfo info;
   final TooltipDelegate tooltipDelegate;
   final bool playWillPauseOther;
+  final Widget fullScreenWidget;
 
   const PortraitController({
     Key key,
@@ -426,6 +446,7 @@ class PortraitController extends StatelessWidget {
     this.info,
     this.tooltipDelegate,
     this.playWillPauseOther = true,
+    this.fullScreenWidget,
   }) : super(key: key);
 
   bool get haveTime {
@@ -455,6 +476,8 @@ class PortraitController extends StatelessWidget {
 
     var playButton = buildPlayButton(context);
 
+    var fullScreenButton = buildFullScreenButton();
+
     Widget widget = Row(
       children: <Widget>[
         playButton,
@@ -467,6 +490,7 @@ class PortraitController extends StatelessWidget {
           padding: const EdgeInsets.all(8.0),
           child: maxTime,
         ),
+        fullScreenButton,
       ],
     );
     widget = DefaultTextStyle(
@@ -565,6 +589,10 @@ class PortraitController extends StatelessWidget {
     var tooltip = tooltipDelegate?.createTooltipWidgetWrapper(text);
     tooltipDelegate?.showTooltip(tooltip);
   }
+
+  Widget buildFullScreenButton() {
+    return fullScreenWidget ?? Container();
+  }
 }
 
 abstract class TooltipDelegate {
@@ -579,3 +607,22 @@ enum VolumeType {
   system,
   media,
 }
+
+showFullScreenIJKPlayer(BuildContext context, IjkMediaController controller) {
+  showDialog(
+    context: context,
+    builder: (ctx) => IjkPlayer(
+          mediaController: controller,
+          controllerWidgetBuilder: (ctl) =>
+              _buildFullScreenMediaController(ctl, true),
+        ),
+  );
+}
+
+Widget _buildFullScreenMediaController(
+    IjkMediaController controller, bool fullScreen) {
+  return DefaultIJKControllerWidget(
+    controller: controller,
+    fullScreen: true,
+  );
+}