Преглед изворни кода

Use a new full screen type.

Caijinglong пре 6 година
родитељ
комит
6765940fe0

+ 18 - 0
README-EN.md

@@ -351,6 +351,8 @@ await controller.dispose(); // After this method call, the current controller is
 
 Use `IJKPlayer`'s `controllerWidgetBuilder` params can customize UI, default use `defaultBuildIjkControllerWidget` method to get widget.
 
+The type def sign: `typedef Widget IJKControllerWidgetBuilder(IjkMediaController controller);`
+
 The returned widget will be overwritten on the `Texture`.
 
 ```dart
@@ -362,6 +364,22 @@ IJKPlayer(
 );
 ```
 
+The library use `DefaultIJKControllerWidget` to build the widget.
+
+This class provides some properties for customization. All properties except `controller` are optional:
+
+|               name                |            type            |         default          |                                      desc                                      |
+| :-------------------------------: | :------------------------: | :----------------------: | :----------------------------------------------------------------------------: |
+|           doubleTapPlay           |            bool            |          false           |                            doubleTap gesture switch                            |
+|          verticalGesture          |            bool            |           true           |                            vertical gesture switch                             |
+|         horizontalGesture         |            bool            |           true           |                           horizontal gesture switch                            |
+|            volumeType             |         VolumeType         |    VolumeType.system     |           vertical gesture changes the type of sound (system,media)            |
+|        playWillPauseOther         |            bool            |           true           |                     play the video will pause other medias                     |
+|      currentFullScreenState       |            bool            |          false           | **If you are customizing the full screen interface, this must be set to true** |
+|       showFullScreenButton        |            bool            |           true           |                   Whether to display the full screen button                    |
+| fullscreenControllerWidgetBuilder | IJKControllerWidgetBuilder |                          |                    Can customize the full screen interface                     |
+|          fullScreenType           |       FullScreenType       | FullScreenType.rotateBox |               Full screen type (rotate screen, or use RotateBox)               |
+
 ### Build widget from IjkStatus
 
 Build different widgets based on the current state.

+ 18 - 0
README.md

@@ -379,6 +379,8 @@ await controller.dispose(); //这个方法调用后,当前控制器理论上不
 
 使用`IJKPlayer`的`controllerWidgetBuilder`属性可以自定义控制器的 UI,默认使用`defaultBuildIjkControllerWidget`方法构建
 
+签名如下: `typedef Widget IJKControllerWidgetBuilder(IjkMediaController controller);`
+
 返回的 Widget 会被覆盖在 Texture 上
 
 ```dart
@@ -390,6 +392,22 @@ IJKPlayer(
 );
 ```
 
+内置的播放器 UI 使用的类为: `DefaultIJKControllerWidget`
+
+这个类提供了一些属性进行自定义, 除`controller`外所有属性均为可选:
+
+|               name                |            type            |      default      |                      desc                       |
+| :-------------------------------: | :------------------------: | :---------------: | :---------------------------------------------: |
+|           doubleTapPlay           |            bool            |       false       |                  双击播放暂停                   |
+|          verticalGesture          |            bool            |       true        |                    纵向手势                     |
+|         horizontalGesture         |            bool            |       true        |                    横向手势                     |
+|            volumeType             |         VolumeType         | VolumeType.system |        纵向手势改变的声音类型(系统,媒体)        |
+|        playWillPauseOther         |            bool            |       true        |            播放当前是否暂停其他媒体             |
+|      currentFullScreenState       |            bool            |       false       | **如果你是自定义全屏界面, 这个必须设置为 true** |
+|       showFullScreenButton        |            bool            |       true        |                是否显示全屏按钮                 |
+| fullscreenControllerWidgetBuilder | IJKControllerWidgetBuilder |                   |              可以自定义全屏的界面               |
+|          fullScreenType           |       FullScreenType       |                   |     全屏的类型(旋转屏幕,或是使用 RotateBox)     |
+
 ### 自定义纹理界面
 
 使用`textureBuilder`属性自定义纹理界面,在 0.1.8 和之前的版本该属性名是`playerBuilder`

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

@@ -0,0 +1,6 @@
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+
+class VideoDataSource {
+  static final springBootMenuM3u8 = DataSource.network(
+      "https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-9aede6861be944d696fe365f3a33b7b4-sd.m3u8");
+}

+ 2 - 0
example/lib/page/developing/develop_index.dart

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
 
 import 'develop_prepare_page.dart';
 import 'live_interruption_page.dart';
+import 'new_full_screen_page.dart';
 import 'src_error_page.dart';
 
 class DevelopingIndexPage extends StatefulWidget {
@@ -21,6 +22,7 @@ class DevelopingIndexPageState extends State<DevelopingIndexPage> {
           buildButton("developing preare page", ForPreparePage()),
           buildButton("直播中断", LiveInterruptionPage()),
           buildButton("视频源错误", SreErrorPage()),
+          buildButton("新的全屏", NewFullScreenPage()),
         ],
       ),
     );

+ 44 - 0
example/lib/page/developing/new_full_screen_page.dart

@@ -0,0 +1,44 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+import 'package:ijkplayer_example/const/video_datasource.dart';
+
+class NewFullScreenPage extends StatefulWidget {
+  @override
+  _NewFullScreenPageState createState() => _NewFullScreenPageState();
+}
+
+class _NewFullScreenPageState extends State<NewFullScreenPage> {
+  IjkMediaController controller;
+
+  @override
+  void initState() {
+    super.initState();
+    controller = IjkMediaController();
+    controller.setDataSource(VideoDataSource.springBootMenuM3u8);
+  }
+
+  @override
+  void dispose() {
+    controller?.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text("New full screen"),
+      ),
+      body: Column(
+        children: <Widget>[
+          AspectRatio(
+            aspectRatio: 1920 / 1080,
+            child: IjkPlayer(
+              mediaController: controller,
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 2 - 1
example/lib/page/developing/src_error_page.dart

@@ -74,7 +74,8 @@ class _SreErrorPageState extends State<SreErrorPage> {
         child: PageView.builder(
           itemBuilder: (BuildContext context, int index) {
             // return VideoWidget("http://114.55.36.48/1204/27/index$index.m3u8");
-            return VideoWidget("http://itv.100.ahct.lv1.vcache.cn/100/ott_baseline_kalaok/hd/151/CP0541903573/playlist.m3u8");
+            return VideoWidget(
+                "http://itv.100.ahct.lv1.vcache.cn/100/ott_baseline_kalaok/hd/151/CP0541903573/playlist.m3u8");
           },
         ),
       ),

+ 5 - 2
example/lib/page/network.dart

@@ -79,8 +79,11 @@ class _NetworkPageState extends State<NetworkPage> {
 
   void _playInput() async {
     var text = editingController.text;
-    await mediaController
-        .setNetworkDataSource(text, autoPlay: true, headers: <String,String>{});
+    await mediaController.setNetworkDataSource(
+      text,
+      autoPlay: true,
+      headers: <String, String>{},
+    );
   }
 }
 

+ 2 - 2
example/lib/page/paging_page.dart

@@ -51,8 +51,8 @@ class PagingPickPage extends StatelessWidget {
       context,
       MaterialPageRoute(
         builder: (_) => PagingPage(
-              dataSourceList: dataSourceList,
-            ),
+          dataSourceList: dataSourceList,
+        ),
       ),
     );
   }

+ 6 - 6
example/pubspec.lock

@@ -1,5 +1,5 @@
 # Generated by pub
-# See https://dart.dev/tools/pub/glossary#lockfile
+# See https://www.dartlang.org/tools/pub/glossary#lockfile
 packages:
   analyzer:
     dependency: transitive
@@ -21,7 +21,7 @@ packages:
       name: async
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.2.0"
+    version: "2.1.0"
   boolean_selector:
     dependency: transitive
     description:
@@ -169,7 +169,7 @@ packages:
       name: pedantic
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.7.0"
+    version: "1.5.0"
   petitparser:
     dependency: transitive
     description:
@@ -204,7 +204,7 @@ packages:
       name: quiver
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.0.3"
+    version: "2.0.2"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -251,7 +251,7 @@ packages:
       name: test_api
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.2.5"
+    version: "0.2.4"
   typed_data:
     dependency: transitive
     description:
@@ -281,5 +281,5 @@ packages:
     source: hosted
     version: "2.1.15"
 sdks:
-  dart: ">=2.2.2 <3.0.0"
+  dart: ">=2.2.0 <3.0.0"
   flutter: ">=0.3.0 <2.0.0"

+ 1 - 1
lib/flutter_ijkplayer.dart

@@ -3,7 +3,7 @@ export 'src/ijkplayer.dart';
 export 'src/entity/video_info.dart';
 export 'src/entity/options.dart';
 export 'src/widget/controller_widget_builder.dart'
-    show DefaultIJKControllerWidget, VolumeType;
+    show DefaultIJKControllerWidget, VolumeType, FullScreenType;
 export 'src/helper/config.dart';
 export 'src/widget/ijk_status_widget.dart'
     show IjkStatusWidget, StatusWidgetBuilder;

+ 16 - 64
lib/src/widget/controller_widget_builder.dart

@@ -10,6 +10,8 @@ import 'package:flutter_ijkplayer/src/helper/ui_helper.dart';
 import 'package:flutter_ijkplayer/src/route/fullscreen_route.dart';
 import 'package:flutter_ijkplayer/src/widget/progress_bar.dart';
 
+part 'full_screen.part.dart';
+
 /// Using mediaController to Construct a Controller UI
 typedef Widget IJKControllerWidgetBuilder(IjkMediaController controller);
 
@@ -50,8 +52,12 @@ class DefaultIJKControllerWidget extends StatefulWidget {
 
   final IJKControllerWidgetBuilder fullscreenControllerWidgetBuilder;
 
+  /// See [FullScreenType]
+  final FullScreenType fullScreenType;
+
   /// The UI of the controller.
   const DefaultIJKControllerWidget({
+    Key key,
     @required this.controller,
     this.doubleTapPlay = false,
     this.verticalGesture = true,
@@ -61,7 +67,7 @@ class DefaultIJKControllerWidget extends StatefulWidget {
     this.currentFullScreenState = false,
     this.showFullScreenButton = true,
     this.fullscreenControllerWidgetBuilder,
-    Key key,
+    this.fullScreenType = FullScreenType.rotateBox,
   }) : super(key: key);
 
   @override
@@ -69,6 +75,7 @@ class DefaultIJKControllerWidget extends StatefulWidget {
       _DefaultIJKControllerWidgetState();
 
   DefaultIJKControllerWidget copyWith({
+    Key key,
     IjkMediaController controller,
     bool doubleTapPlay,
     bool verticalGesture,
@@ -78,7 +85,7 @@ class DefaultIJKControllerWidget extends StatefulWidget {
     bool currentFullScreenState,
     bool showFullScreenButton,
     IJKControllerWidgetBuilder fullscreenControllerWidgetBuilder,
-    Key key,
+    FullScreenType fullScreenType,
   }) {
     return DefaultIJKControllerWidget(
       controller: controller ?? this.controller,
@@ -93,6 +100,7 @@ class DefaultIJKControllerWidget extends StatefulWidget {
       playWillPauseOther: playWillPauseOther ?? this.playWillPauseOther,
       showFullScreenButton: showFullScreenButton ?? this.showFullScreenButton,
       verticalGesture: verticalGesture ?? this.verticalGesture,
+      fullScreenType: fullScreenType ?? this.fullScreenType,
     );
   }
 }
@@ -215,8 +223,12 @@ class _DefaultIJKControllerWidgetState extends State<DefaultIJKControllerWidget>
         if (isFull) {
           Navigator.pop(context);
         } else {
-          showFullScreenIJKPlayer(context, controller,
-              fullscreenControllerWidgetBuilder: fullscreenBuilder);
+          showFullScreenIJKPlayer(
+            context,
+            controller,
+            fullscreenControllerWidgetBuilder: fullscreenBuilder,
+            fullScreenType: widget.fullScreenType,
+          );
         }
       },
     );
@@ -673,63 +685,3 @@ enum VolumeType {
   system,
   media,
 }
-
-showFullScreenIJKPlayer(
-  BuildContext context,
-  IjkMediaController controller, {
-  IJKControllerWidgetBuilder fullscreenControllerWidgetBuilder,
-}) async {
-  Navigator.push(
-    context,
-    FullScreenRoute(
-      builder: (c) {
-        return IjkPlayer(
-          mediaController: controller,
-          controllerWidgetBuilder: (ctl) =>
-              fullscreenControllerWidgetBuilder(ctl),
-        );
-      },
-    ),
-  ).then((_) {
-    IjkManager.unlockOrientation();
-    IjkManager.setCurrentOrientation(DeviceOrientation.portraitUp);
-  });
-
-  var info = await controller.getVideoInfo();
-
-  Axis axis;
-
-  if (info.width == 0 || info.height == 0) {
-    axis = Axis.horizontal;
-  } else if (info.width > info.height) {
-    if (info.degree == 90 || info.degree == 270) {
-      axis = Axis.vertical;
-    } else {
-      axis = Axis.horizontal;
-    }
-  } else {
-    if (info.degree == 90 || info.degree == 270) {
-      axis = Axis.horizontal;
-    } else {
-      axis = Axis.vertical;
-    }
-  }
-
-  if (axis == Axis.horizontal) {
-    IjkManager.setLandScape();
-  } else {
-    IjkManager.setPortrait();
-  }
-}
-
-Widget _buildFullScreenMediaController(
-    IjkMediaController controller, bool fullScreen) {
-  return DefaultIJKControllerWidget(
-    controller: controller,
-    currentFullScreenState: true,
-  );
-}
-
-Widget buildFullscreenMediaController(IjkMediaController controller) {
-  return _buildFullScreenMediaController(controller, true);
-}

+ 152 - 0
lib/src/widget/full_screen.part.dart

@@ -0,0 +1,152 @@
+part of './controller_widget_builder.dart';
+
+enum FullScreenType {
+  rotateScreen,
+  rotateBox,
+}
+
+showFullScreenIJKPlayer(
+  BuildContext context,
+  IjkMediaController controller, {
+  IJKControllerWidgetBuilder fullscreenControllerWidgetBuilder,
+  FullScreenType fullScreenType = FullScreenType.rotateBox,
+}) async {
+  if (fullScreenType == FullScreenType.rotateBox) {
+    _showFullScreenWithRotateBox(
+      context,
+      controller,
+      fullscreenControllerWidgetBuilder: fullscreenControllerWidgetBuilder,
+    );
+    return;
+  }
+
+  _showFullScreenWithRotateScreen(
+    context,
+    controller,
+    fullscreenControllerWidgetBuilder,
+  );
+}
+
+_showFullScreenWithRotateScreen(
+    BuildContext context,
+    IjkMediaController controller,
+    IJKControllerWidgetBuilder fullscreenControllerWidgetBuilder) async {
+  Navigator.push(
+    context,
+    FullScreenRoute(
+      builder: (c) {
+        return IjkPlayer(
+          mediaController: controller,
+          controllerWidgetBuilder: (ctl) =>
+              fullscreenControllerWidgetBuilder(ctl),
+        );
+      },
+    ),
+  ).then((_) {
+    IjkManager.unlockOrientation();
+    IjkManager.setCurrentOrientation(DeviceOrientation.portraitUp);
+  });
+
+  var info = await controller.getVideoInfo();
+
+  Axis axis;
+
+  if (info.width == 0 || info.height == 0) {
+    axis = Axis.horizontal;
+  } else if (info.width > info.height) {
+    if (info.degree == 90 || info.degree == 270) {
+      axis = Axis.vertical;
+    } else {
+      axis = Axis.horizontal;
+    }
+  } else {
+    if (info.degree == 90 || info.degree == 270) {
+      axis = Axis.horizontal;
+    } else {
+      axis = Axis.vertical;
+    }
+  }
+
+  if (axis == Axis.horizontal) {
+    IjkManager.setLandScape();
+  } else {
+    IjkManager.setPortrait();
+  }
+}
+
+_showFullScreenWithRotateBox(
+  BuildContext context,
+  IjkMediaController controller, {
+  IJKControllerWidgetBuilder fullscreenControllerWidgetBuilder,
+}) async {
+  var info = await controller.getVideoInfo();
+
+  Axis axis;
+
+  if (info.width == 0 || info.height == 0) {
+    axis = Axis.horizontal;
+  } else if (info.width > info.height) {
+    if (info.degree == 90 || info.degree == 270) {
+      axis = Axis.vertical;
+    } else {
+      axis = Axis.horizontal;
+    }
+  } else {
+    if (info.degree == 90 || info.degree == 270) {
+      axis = Axis.horizontal;
+    } else {
+      axis = Axis.vertical;
+    }
+  }
+
+  Navigator.push(
+    context,
+    FullScreenRoute(
+      builder: (ctx) {
+        var mediaQueryData = MediaQuery.of(ctx);
+
+        int quarterTurns;
+
+        if (axis == Axis.horizontal) {
+          if (mediaQueryData.orientation == Orientation.landscape) {
+            quarterTurns = 0;
+          } else {
+            quarterTurns = 1;
+          }
+        } else {
+          quarterTurns = 0;
+        }
+        /*else {
+          if (mediaQueryData.orientation == Orientation.portrait) {
+            quarterTurns = 0;
+          } else {
+            quarterTurns = -1;
+          }
+        }*/
+
+        return SafeArea(
+          child: RotatedBox(
+            quarterTurns: quarterTurns,
+            child: IjkPlayer(
+              mediaController: controller,
+              controllerWidgetBuilder: (ctl) =>
+                  fullscreenControllerWidgetBuilder(ctl),
+            ),
+          ),
+        );
+      },
+    ),
+  );
+}
+
+Widget _buildFullScreenMediaController(
+    IjkMediaController controller, bool fullScreen) {
+  return DefaultIJKControllerWidget(
+    controller: controller,
+    currentFullScreenState: true,
+  );
+}
+
+Widget buildFullscreenMediaController(IjkMediaController controller) {
+  return _buildFullScreenMediaController(controller, true);
+}

+ 6 - 6
pubspec.lock

@@ -1,5 +1,5 @@
 # Generated by pub
-# See https://dart.dev/tools/pub/glossary#lockfile
+# See https://www.dartlang.org/tools/pub/glossary#lockfile
 packages:
   async:
     dependency: transitive
@@ -7,7 +7,7 @@ packages:
       name: async
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.2.0"
+    version: "2.1.0"
   boolean_selector:
     dependency: transitive
     description:
@@ -66,14 +66,14 @@ packages:
       name: pedantic
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.7.0"
+    version: "1.5.0"
   quiver:
     dependency: transitive
     description:
       name: quiver
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.0.3"
+    version: "2.0.2"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -120,7 +120,7 @@ packages:
       name: test_api
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.2.5"
+    version: "0.2.4"
   typed_data:
     dependency: transitive
     description:
@@ -136,4 +136,4 @@ packages:
     source: hosted
     version: "2.0.8"
 sdks:
-  dart: ">=2.2.2 <3.0.0"
+  dart: ">=2.2.0 <3.0.0"