Sfoglia il codice sorgente

自定义全屏界面的逻辑和示例代码

Caijinglong 6 anni fa
parent
commit
e5b0182c80

+ 6 - 0
example/lib/const/resource.dart

@@ -0,0 +1,6 @@
+/// generate by resouce_generator library, shouldn't edit.
+class R {
+    
+  /// ![preview](file:///Users/cai/Documents/GitHub/flutter_ijkplayer/./example/assets/sample1.mp4)
+  static const String ASSETS_SAMPLE1_MP4 = "assets/sample1.mp4";
+}

+ 3 - 0
example/lib/i18n/cn.dart

@@ -71,4 +71,7 @@ class _I18nZh extends I18n {
 
   @override
   String get errorUrl => "错误的url";
+
+  @override
+  String get customFullScreenWidget => "自定义全屏界面";
 }

+ 3 - 0
example/lib/i18n/en.dart

@@ -71,4 +71,7 @@ class _I18nEn extends I18n {
 
   @override
   String get errorUrl => "Error Url";
+
+  @override
+  String get customFullScreenWidget => "Custom Full Screen Interface";
 }

+ 2 - 0
example/lib/i18n/i18n.dart

@@ -50,6 +50,8 @@ abstract class I18n {
   String get customOption;
 
   String get errorUrl;
+
+  String get customFullScreenWidget;
 }
 
 I18n get currentI18n => I18n(window.locale);

+ 54 - 0
example/lib/page/full_screen.dart

@@ -1,5 +1,6 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+import 'package:ijkplayer_example/const/resource.dart';
 import 'package:ijkplayer_example/i18n/i18n.dart';
 
 class FullScreen extends StatefulWidget {
@@ -182,3 +183,56 @@ class _FullScreen2State extends State<FullScreen2> {
     await IjkManager.unlockOrientation();
   }
 }
+
+class CustomFullControllerPage extends StatefulWidget {
+  @override
+  _CustomFullControllerPageState createState() =>
+      _CustomFullControllerPageState();
+}
+
+class _CustomFullControllerPageState extends State<CustomFullControllerPage> {
+  IjkMediaController controller;
+
+  @override
+  void initState() {
+    super.initState();
+    controller = IjkMediaController();
+    controller.setDataSource(
+      DataSource.asset(R.ASSETS_SAMPLE1_MP4),
+      autoPlay: true,
+    );
+  }
+
+  @override
+  void dispose() {
+    controller.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(),
+      body: Container(
+        height: 500,
+        child: IjkPlayer(
+          mediaController: controller,
+          controllerWidgetBuilder: (ctl) {
+            return DefaultIJKControllerWidget(
+              controller: ctl,
+              fullscreenControllerWidgetBuilder: _buildFullScrrenCtl,
+            );
+          },
+        ),
+      ),
+    );
+  }
+
+  Widget _buildFullScrrenCtl(IjkMediaController controller) {
+    return DefaultIJKControllerWidget(
+      controller: controller,
+      doubleTapPlay: true,
+      currentFullScreenState: true,
+    );
+  }
+}

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

@@ -43,6 +43,8 @@ class _IndexPageState extends State<IndexPage> {
           buildButton(currentI18n.ijkStatusTitle, IjkStatusPage()),
           buildButton(currentI18n.customOption, CustomIjkOptionPage()),
           buildButton(currentI18n.errorUrl, ErrorUrlPage()),
+          buildButton(
+              currentI18n.customFullScreenWidget, CustomFullControllerPage()),
         ],
       ),
     );

+ 49 - 5
lib/src/widget/controller_widget_builder.dart

@@ -17,8 +17,8 @@ typedef Widget IJKControllerWidgetBuilder(IjkMediaController controller);
 Widget defaultBuildIjkControllerWidget(IjkMediaController controller) {
   return DefaultIJKControllerWidget(
     controller: controller,
-//    verticalGesture: false,
-//    horizontalGesture: false,
+    fullscreenControllerWidgetBuilder: (ctl) =>
+        buildFullscreenMediaController(ctl),
   );
 }
 
@@ -48,6 +48,8 @@ class DefaultIJKControllerWidget extends StatefulWidget {
   /// The current full-screen button style should not be changed by users.
   final bool currentFullScreenState;
 
+  final IJKControllerWidgetBuilder fullscreenControllerWidgetBuilder;
+
   /// The UI of the controller.
   const DefaultIJKControllerWidget({
     @required this.controller,
@@ -58,12 +60,41 @@ class DefaultIJKControllerWidget extends StatefulWidget {
     this.playWillPauseOther = true,
     this.currentFullScreenState = false,
     this.showFullScreenButton = true,
+    this.fullscreenControllerWidgetBuilder,
     Key key,
   }) : super(key: key);
 
   @override
   _DefaultIJKControllerWidgetState createState() =>
       _DefaultIJKControllerWidgetState();
+
+  DefaultIJKControllerWidget copyWith({
+    IjkMediaController controller,
+    bool doubleTapPlay,
+    bool verticalGesture,
+    bool horizontalGesture,
+    VolumeType volumeType,
+    bool playWillPauseOther,
+    bool currentFullScreenState,
+    bool showFullScreenButton,
+    IJKControllerWidgetBuilder fullscreenControllerWidgetBuilder,
+    Key key,
+  }) {
+    return DefaultIJKControllerWidget(
+      controller: controller ?? this.controller,
+      doubleTapPlay: doubleTapPlay ?? this.doubleTapPlay,
+      fullscreenControllerWidgetBuilder: fullscreenControllerWidgetBuilder ??
+          this.fullscreenControllerWidgetBuilder,
+      horizontalGesture: horizontalGesture ?? this.horizontalGesture,
+      currentFullScreenState:
+          currentFullScreenState ?? this.currentFullScreenState,
+      key: key,
+      volumeType: volumeType ?? this.volumeType,
+      playWillPauseOther: playWillPauseOther ?? this.playWillPauseOther,
+      showFullScreenButton: showFullScreenButton ?? this.showFullScreenButton,
+      verticalGesture: verticalGesture ?? this.verticalGesture,
+    );
+  }
 }
 
 class _DefaultIJKControllerWidgetState extends State<DefaultIJKControllerWidget>
@@ -172,6 +203,11 @@ class _DefaultIJKControllerWidgetState extends State<DefaultIJKControllerWidget>
       return Container();
     }
     var isFull = widget.currentFullScreenState;
+
+    IJKControllerWidgetBuilder fullscreenBuilder =
+        widget.fullscreenControllerWidgetBuilder ??
+            (ctx) => widget.copyWith(currentFullScreenState: true);
+
     return IconButton(
       color: Colors.white,
       icon: Icon(isFull ? Icons.fullscreen_exit : Icons.fullscreen),
@@ -179,7 +215,8 @@ class _DefaultIJKControllerWidgetState extends State<DefaultIJKControllerWidget>
         if (isFull) {
           Navigator.pop(context);
         } else {
-          showFullScreenIJKPlayer(context, controller);
+          showFullScreenIJKPlayer(context, controller,
+              fullscreenControllerWidgetBuilder: fullscreenBuilder);
         }
       },
     );
@@ -635,7 +672,10 @@ enum VolumeType {
 }
 
 showFullScreenIJKPlayer(
-    BuildContext context, IjkMediaController controller) async {
+  BuildContext context,
+  IjkMediaController controller, {
+  IJKControllerWidgetBuilder fullscreenControllerWidgetBuilder,
+}) async {
   Navigator.push(
     context,
     FullScreenRoute(
@@ -643,7 +683,7 @@ showFullScreenIJKPlayer(
         return IjkPlayer(
           mediaController: controller,
           controllerWidgetBuilder: (ctl) =>
-              _buildFullScreenMediaController(ctl, true),
+              fullscreenControllerWidgetBuilder(ctl),
         );
       },
     ),
@@ -686,3 +726,7 @@ Widget _buildFullScreenMediaController(
     currentFullScreenState: true,
   );
 }
+
+Widget buildFullscreenMediaController(IjkMediaController controller) {
+  return _buildFullScreenMediaController(controller, true);
+}