فهرست منبع

控制器的进度条和文字

Caijinglong 6 سال پیش
والد
کامیت
d1e630c406
6فایلهای تغییر یافته به همراه103 افزوده شده و 35 حذف شده
  1. 5 16
      README.md
  2. 1 1
      lib/flutter_ijkplayer.dart
  3. 1 1
      lib/src/controller.dart
  4. 1 1
      lib/src/controller_builder.dart
  5. 2 0
      lib/src/video_info.dart
  6. 93 16
      lib/src/widget/controller.dart

+ 5 - 16
README.md

@@ -2,22 +2,11 @@
 
 ijkplayer,通过纹理的方式接入 bilibili/ijkplayer
 
-## 目前进度
+## TodoList
 
-- [ ] 参考 video_player 设计 api,以保证 video_player 无缝切换到 ijkplayer
+- [X] 控制器逻辑
 
-### dart
+- [ ] 默认控制器UI
 
-- [ ] 重构代码,参考 video_player
-
-### android
-
-- [x] 重新编译 ijkplayer,支持 https
-- [ ] 重构 android 代码,参照 video_player
-
-### ios
-
-- [x] 重新编译 ijkplayer,支持 https
-- [x] 使用 pod 依赖而不是直接将库放入仓库内
-- [ ] 使用静态库以支持 swift
-- [ ] 重构代码,参考 video_player
+  - [ ] 纵向
+  - [ ] 横向

+ 1 - 1
lib/flutter_ijkplayer.dart

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

+ 1 - 1
lib/src/controller.dart

@@ -144,7 +144,7 @@ class IjkMediaController {
   Future<void> refreshVideoInfo() async {
     var info = await getVideoInfo();
     isPlaying = info.isPlaying;
-    _videoInfoController.add(info);
+    if (info.hasData) _videoInfoController.add(info);
   }
 
   void _autoPlay(bool autoPlay) {

+ 1 - 1
lib/src/controller_builder.dart

@@ -3,5 +3,5 @@ import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
 import 'package:flutter_ijkplayer/src/widget/controller.dart';
 
 Widget defaultBuildIjkControllerWidget(IjkMediaController controller) {
-  return DefaultControllerWidget(controller);
+  return DefaultControllerWidget(controller: controller);
 }

+ 2 - 0
lib/src/video_info.dart

@@ -13,6 +13,8 @@ class VideoInfo {
 
   double get progress => (currentPosition ?? 0) / (duration ?? 1);
 
+  bool get hasData => _map != null;
+
   VideoInfo.fromMap(Map<String, dynamic> map) {
     if (map == null) {
       return;

+ 93 - 16
lib/src/widget/controller.dart

@@ -6,8 +6,12 @@ import 'package:flutter_ijkplayer/src/widget/progress_bar.dart';
 
 class DefaultControllerWidget extends StatefulWidget {
   final IjkMediaController controller;
+  final bool doubleTapPlay;
 
-  const DefaultControllerWidget(this.controller);
+  const DefaultControllerWidget({
+    this.controller,
+    this.doubleTapPlay = false,
+  });
 
   @override
   _DefaultControllerWidgetState createState() =>
@@ -60,10 +64,13 @@ class _DefaultControllerWidgetState extends State<DefaultControllerWidget> {
     return GestureDetector(
       behavior: HitTestBehavior.opaque,
       child: buildContent(),
-      onDoubleTap: () {
-        print("ondouble tap");
-        controller.playOrPause();
-      },
+      onDoubleTap: widget.doubleTapPlay
+          ? () {
+              print("ondouble tap");
+              controller.playOrPause();
+            }
+          : null,
+      onTap: () => isShow = !isShow,
     );
   }
 
@@ -74,23 +81,93 @@ class _DefaultControllerWidgetState extends State<DefaultControllerWidget> {
     return StreamBuilder<VideoInfo>(
       stream: controller.videoInfoStream,
       builder: (context, snapshot) {
-        if (!snapshot.hasData) {
+        var info = snapshot.data;
+        if (info == null || !info.hasData) {
           return Container();
         }
-        var info = snapshot.data;
-        return Column(
-          children: <Widget>[
-            Expanded(
-              child: Container(),
-            ),
-            buildProgress(info),
-          ],
-        );
+        return buildPortrait(info);
       },
     );
   }
 
-  Container buildProgress(VideoInfo info) {
+  Widget buildPortrait(VideoInfo info) {
+    return PortraitController(
+      controller: controller,
+      info: info,
+    );
+  }
+}
+
+String _getTimeText(double durationSecond) {
+  var duration = Duration(milliseconds: ((durationSecond ?? 0) * 1000).toInt());
+  var minute = (duration.inMinutes % 60).toString().padLeft(2, "0");
+  var second = (duration.inSeconds % 60).toString().padLeft(2, "0");
+  var text = "$minute:$second";
+//  print("$durationSecond = $text");
+  return text;
+}
+
+class PortraitController extends StatelessWidget {
+  final IjkMediaController controller;
+  final VideoInfo info;
+
+  const PortraitController({
+    Key key,
+    this.controller,
+    this.info,
+  }) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    if (!info.hasData) {
+      return Container();
+    }
+    Widget bottomBar = buildBottomBar();
+    return Column(
+      children: <Widget>[
+        Expanded(
+          child: Container(),
+        ),
+        bottomBar,
+      ],
+    );
+  }
+
+  Widget buildBottomBar() {
+    var currentTime = Text(
+      _getTimeText(info.currentPosition),
+    );
+    var maxTime = Text(
+      _getTimeText(info.duration),
+    );
+    var progress = buildProgress(info);
+    Widget widget = Row(
+      children: <Widget>[
+        Padding(
+          padding: const EdgeInsets.all(8.0),
+          child: currentTime,
+        ),
+        Expanded(child: progress),
+        Padding(
+          padding: const EdgeInsets.all(8.0),
+          child: maxTime,
+        ),
+      ],
+    );
+    widget = DefaultTextStyle(
+      style: const TextStyle(
+        color: Colors.white,
+      ),
+      child: widget,
+    );
+    widget = Container(
+      color: Colors.black.withOpacity(0.12),
+      child: widget,
+    );
+    return widget;
+  }
+
+  Widget buildProgress(VideoInfo info) {
     return Container(
       height: 5,
       child: ProgressBar(