Forráskód Böngészése

update full screen button
use in overlay

Caijinglong 6 éve
szülő
commit
3847aa8a7e

+ 117 - 8
example/lib/page/in_overlay_page.dart

@@ -58,21 +58,130 @@ class _InOverlayPageState extends State<InOverlayPage> {
     );
   }
 
-  void showInOverlay() {
-    entry = OverlayEntry(builder: (BuildContext context) {
-      return Align(
-        alignment: Alignment.bottomCenter,
+  void showInOverlay() async {
+    var info = await controller.getVideoInfo();
+    OverlayEntry _entry;
+    _entry = OverlayEntry(
+      builder: (BuildContext context) {
+        return OverlayWidget(
+          controller: controller,
+          initVideoInfo: info,
+          onTapClose: () {
+            _entry?.remove();
+          },
+        );
+      },
+    );
+    Overlay.of(context).insert(_entry);
+  }
+}
+
+class OverlayWidget extends StatefulWidget {
+  final VideoInfo initVideoInfo;
+  final IjkMediaController controller;
+  final Function onTapClose;
+
+  const OverlayWidget({
+    Key key,
+    this.initVideoInfo,
+    this.controller,
+    this.onTapClose,
+  }) : super(key: key);
+
+  @override
+  _OverlayWidgetState createState() => _OverlayWidgetState();
+}
+
+class _OverlayWidgetState extends State<OverlayWidget> {
+  double dx = 0;
+  double dy = 0;
+
+  @override
+  Widget build(BuildContext context) {
+    var size = Size(200, 200 * widget.initVideoInfo.ratio);
+    return NotificationListener<OffsetNotication>(
+      onNotification: (n) {
+        dx += n.offset.dx;
+        dy += n.offset.dy;
+        setState(() {});
+        return true;
+      },
+      child: Align(
+        alignment: FractionalOffset.fromOffsetAndSize(Offset(dx, dy), size),
         child: Container(
           width: 200,
           child: AspectRatio(
-            aspectRatio: 1,
+            aspectRatio: widget.initVideoInfo.ratio,
             child: IjkPlayer(
-              mediaController: controller,
+              mediaController: widget.controller,
+              controllerWidgetBuilder: (ctl) {
+                return OverlayControllerWidget(
+                  controller: ctl,
+                  onTapClose: widget.onTapClose,
+                );
+              },
+            ),
+          ),
+        ),
+      ),
+    );
+  }
+}
+
+class OverlayControllerWidget extends StatefulWidget {
+  final IjkMediaController controller;
+  final Function onTapClose;
+
+  const OverlayControllerWidget({
+    Key key,
+    this.controller,
+    this.onTapClose,
+  }) : super(key: key);
+
+  @override
+  _OverlayControllerWidgetState createState() =>
+      _OverlayControllerWidgetState();
+}
+
+class _OverlayControllerWidgetState extends State<OverlayControllerWidget> {
+  bool showController = false;
+
+  @override
+  Widget build(BuildContext context) {
+    Widget child;
+    if (!showController) {
+      child = Container();
+    } else {
+      child = Container(
+        color: Colors.black.withOpacity(0.6),
+        child: Align(
+          alignment: Alignment.topRight,
+          child: Container(
+            child: IconButton(
+              color: Colors.white,
+              icon: Icon(Icons.close),
+              onPressed: widget.onTapClose,
             ),
           ),
         ),
       );
-    });
-    Overlay.of(context).insert(entry);
+    }
+    return GestureDetector(
+      child: child,
+      behavior: HitTestBehavior.opaque,
+      onTap: () => setState(() => showController = !showController),
+      // onLongPressMoveUpdate: (detail) {
+      //   print("onLongPressMoveUpdate detail = ${detail.offsetFromOrigin}");
+      // },
+      onPanUpdate: (detail) {
+        print("onPanUpdate detail = ${detail.delta}");
+        var notification = OffsetNotication()..offset = detail.delta;
+        notification.dispatch(context);
+      },
+    );
   }
 }
+
+class OffsetNotication extends Notification {
+  Offset offset;
+}

+ 2 - 2
lib/src/engine/manager.dart

@@ -55,13 +55,13 @@ class IjkManager {
 
   static setLandScape() async {
     if (Platform.isAndroid) {
-      SystemChrome.setPreferredOrientations(
+      await SystemChrome.setEnabledSystemUIOverlays([]);
+      await SystemChrome.setPreferredOrientations(
         [
           DeviceOrientation.landscapeLeft,
           DeviceOrientation.landscapeRight,
         ],
       );
-      SystemChrome.setEnabledSystemUIOverlays([]);
     } else if (Platform.isIOS) {
       await setSupportOrientation([
         DeviceOrientation.landscapeLeft,

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

@@ -4,8 +4,8 @@ import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
-import 'package:flutter_ijkplayer/src/helper/time_helper.dart';
 import 'package:flutter_ijkplayer/src/helper/logutil.dart';
+import 'package:flutter_ijkplayer/src/helper/time_helper.dart';
 import 'package:flutter_ijkplayer/src/helper/ui_helper.dart';
 import 'package:flutter_ijkplayer/src/widget/progress_bar.dart';
 
@@ -619,17 +619,23 @@ enum VolumeType {
 
 showFullScreenIJKPlayer(
     BuildContext context, IjkMediaController controller) async {
-  showDialog(
-    context: context,
-    builder: (ctx) => IjkPlayer(
+  Navigator.push(
+    context,
+    MaterialPageRoute(
+      builder: (c) {
+        return IjkPlayer(
           mediaController: controller,
           controllerWidgetBuilder: (ctl) =>
               _buildFullScreenMediaController(ctl, true),
-        ),
+        );
+      },
+      fullscreenDialog: true,
+    ),
   ).then((_) {
     IjkManager.unlockOrientation();
     IjkManager.setCurrentOrientation(DeviceOrientation.portraitUp);
   });
+
   var info = await controller.getVideoInfo();
 
   Axis axis;