Caijinglong 6 yıl önce
ebeveyn
işleme
319fe32f58

+ 2 - 2
example/lib/main.dart

@@ -73,10 +73,10 @@ class HomePageState extends State<HomePage> {
         child: Icon(Icons.play_arrow),
         onPressed: () async {
           await controller.setNetworkDataSource(
-              // 'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4',
+              'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4',
               // 'rtmp://172.16.100.245/live1',
               // 'https://www.sample-videos.com/video123/flv/720/big_buck_bunny_720p_10mb.flv',
-              "https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4",
+//              "https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4",
               // 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/playlist.m3u8',
               // "file:///sdcard/Download/Sample1.mp4",
               autoPlay: true);

+ 2 - 2
lib/flutter_ijkplayer.dart

@@ -1,4 +1,4 @@
-export 'src/ijkplayer.dart';
 export 'src/error.dart';
+export 'src/ijkplayer.dart';
 export 'src/video_info.dart';
-export 'src/controller_builder.dart' show DefaultControllerWidget;
+export 'src/widget/controller.dart';

+ 1 - 82
lib/src/controller_builder.dart

@@ -1,88 +1,7 @@
-import 'dart:async';
-
 import 'package:flutter/material.dart';
 import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+import 'package:flutter_ijkplayer/src/widget/controller.dart';
 
 Widget defaultBuildIjkControllerWidget(IjkMediaController controller) {
   return DefaultControllerWidget(controller);
 }
-
-class DefaultControllerWidget extends StatefulWidget {
-  final IjkMediaController controller;
-
-  const DefaultControllerWidget(this.controller);
-
-  @override
-  _DefaultControllerWidgetState createState() =>
-      _DefaultControllerWidgetState();
-}
-
-class _DefaultControllerWidgetState extends State<DefaultControllerWidget> {
-  IjkMediaController get controller => widget.controller;
-
-  bool _isShow = true;
-
-  set isShow(bool value) {
-    _isShow = value;
-    print("call show");
-    setState(() {});
-    if (value == true) {
-      controller.refreshVideoInfo();
-    }
-  }
-
-  bool get isShow => _isShow;
-
-  Timer progressTimer;
-
-  @override
-  void initState() {
-    super.initState();
-    startTimer();
-  }
-
-  @override
-  void dispose() {
-    stopTimer();
-    super.dispose();
-  }
-
-  void startTimer() {
-    progressTimer = Timer.periodic(Duration(milliseconds: 400), (timer) {
-      controller.refreshVideoInfo();
-    });
-  }
-
-  void stopTimer() {
-    progressTimer?.cancel();
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    return GestureDetector(
-      behavior: HitTestBehavior.translucent,
-      child: buildContent(),
-      onDoubleTap: () {
-        print("ondouble tap");
-        controller.playOrPause();
-      },
-      onTap: () => isShow = !isShow,
-    );
-  }
-
-  Widget buildContent() {
-    if (!isShow) {
-      return Container();
-    }
-    return StreamBuilder<VideoInfo>(
-      stream: controller.videoInfoStream,
-      builder: (context, snapshot) {
-        if (!snapshot.hasData) {
-          return Container();
-        }
-        var info = snapshot.data;
-        return Container();
-      },
-    );
-  }
-}

+ 1 - 1
lib/src/ijkplayer.dart

@@ -57,7 +57,7 @@ class IjkPlayerState extends State<IjkPlayer> {
     var controllerWidget = widget.controllerWidgetBuilder?.call(controller);
     return Stack(
       children: <Widget>[
-        video,
+        IgnorePointer(child: video),
         controllerWidget,
       ],
     );

+ 102 - 0
lib/src/widget/controller.dart

@@ -0,0 +1,102 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+import 'package:flutter_ijkplayer/src/widget/progress_bar.dart';
+
+class DefaultControllerWidget extends StatefulWidget {
+  final IjkMediaController controller;
+
+  const DefaultControllerWidget(this.controller);
+
+  @override
+  _DefaultControllerWidgetState createState() =>
+      _DefaultControllerWidgetState();
+}
+
+class _DefaultControllerWidgetState extends State<DefaultControllerWidget> {
+  IjkMediaController get controller => widget.controller;
+
+  bool _isShow = true;
+
+  set isShow(bool value) {
+    _isShow = value;
+    print("call show");
+    setState(() {});
+    if (value == true) {
+      controller.refreshVideoInfo();
+    }
+  }
+
+  bool get isShow => _isShow;
+
+  Timer progressTimer;
+
+  @override
+  void initState() {
+    super.initState();
+    startTimer();
+  }
+
+  @override
+  void dispose() {
+    stopTimer();
+    super.dispose();
+  }
+
+  void startTimer() {
+    progressTimer?.cancel();
+    progressTimer = Timer.periodic(Duration(milliseconds: 400), (timer) {
+      controller.refreshVideoInfo();
+    });
+  }
+
+  void stopTimer() {
+    progressTimer?.cancel();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return GestureDetector(
+      behavior: HitTestBehavior.opaque,
+      child: buildContent(),
+      onDoubleTap: () {
+        print("ondouble tap");
+        controller.playOrPause();
+      },
+    );
+  }
+
+  Widget buildContent() {
+    if (!isShow) {
+      return Container();
+    }
+    return StreamBuilder<VideoInfo>(
+      stream: controller.videoInfoStream,
+      builder: (context, snapshot) {
+        if (!snapshot.hasData) {
+          return Container();
+        }
+        var info = snapshot.data;
+        return Column(
+          children: <Widget>[
+            Expanded(
+              child: Container(),
+            ),
+            buildProgress(info),
+          ],
+        );
+      },
+    );
+  }
+
+  Container buildProgress(VideoInfo info) {
+    return Container(
+      height: 5,
+      child: ProgressBar(
+        current: info.currentPosition,
+        max: info.duration,
+      ),
+    );
+  }
+}

+ 59 - 0
lib/src/widget/progress_bar.dart

@@ -0,0 +1,59 @@
+import 'package:flutter/material.dart';
+
+class ProgressBar extends StatelessWidget {
+  final double max;
+  final double current;
+  final double buffered;
+  final Color backgroundColor;
+  final Color bufferColor;
+  final Color playedColor;
+
+  const ProgressBar({
+    Key key,
+    @required this.max,
+    @required this.current,
+    this.buffered,
+    this.backgroundColor = const Color(0xFF616161),
+    this.bufferColor = Colors.grey,
+    this.playedColor = Colors.white,
+  }) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    if (max == null || current == null) return _buildEmpty();
+
+    var left = current / max;
+    var mid = (buffered ?? 0) / max - left;
+    if (mid < 0) {
+      mid = 0;
+    }
+
+    var right = 1 - left - mid;
+
+    var progress = buildProgress(left, mid, right);
+    return progress;
+  }
+
+  _buildEmpty() {
+    return Container();
+  }
+
+  Widget buildProgress(double left, double mid, double right) {
+    return Row(
+      children: <Widget>[
+        buildColorWidget(playedColor, left),
+        buildColorWidget(bufferColor, mid),
+        buildColorWidget(backgroundColor, right),
+      ],
+    );
+  }
+
+  Widget buildColorWidget(Color color, double flex) {
+    return Expanded(
+      flex: (flex * 1000).toInt(),
+      child: Container(
+        color: color,
+      ),
+    );
+  }
+}