Browse Source

Update some icon.
clean up status builder code.

Caijinglong 6 years ago
parent
commit
6469496949

+ 6 - 0
CHANGELOG.md

@@ -1,3 +1,9 @@
+## 0.2.0
+
+Add `StatusWidgetBuilder` params.
+
+Update volume and brightness icon
+
 ## 0.1.9
 
 add screen shot method.

+ 33 - 0
README-EN.md

@@ -33,6 +33,7 @@ Before using library, you can star and download the code to try the example.
       - [IjkStatus](#ijkstatus)
       - [release resource](#release-resource)
     - [Use self controller UI](#use-self-controller-ui)
+    - [Build widget from IjkStatus](#build-widget-from-ijkstatus)
     - [Use Texture widget](#use-texture-widget)
   - [LICENSE](#license)
 
@@ -292,6 +293,38 @@ IJKPlayer(
 );
 ```
 
+### Build widget from IjkStatus
+
+Build different widgets based on the current state.
+
+```dart
+
+Widget buildIjkPlayer() {
+  return IjkPlayer(
+    mediaController: mediaController,
+    stateWidgetBuilder: _buildStatusWidget,
+  );
+}
+
+Widget _buildStatusWidget(
+  BuildContext context,
+  IjkMediaController controller,
+  IjkStatus status,
+) {
+  if (status == IjkStatus.noDatasource) {
+    return Center(
+      child: Text(
+        "no data",
+        style: TextStyle(color: Colors.white),
+      ),
+    );
+  }
+
+  // you can custom your self status widget
+  return IjkStatusWidget.buildStatusWidget(context, controller, status);
+}
+```
+
 ### Use Texture widget
 
 Use `textureBuilder` params to customize `Texture` widget, use `playerBuilder` in before 0.1.8 version.

+ 33 - 0
README.md

@@ -39,6 +39,7 @@ android 模拟器 mac android sdk 自带的 emulator(API28 android9)可用,其
       - [释放资源](#%E9%87%8A%E6%94%BE%E8%B5%84%E6%BA%90)
     - [自定义控制器 UI](#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E5%88%B6%E5%99%A8-ui)
     - [自定义纹理界面](#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BA%B9%E7%90%86%E7%95%8C%E9%9D%A2)
+    - [根据当前状态构建一个 widget](#%E6%A0%B9%E6%8D%AE%E5%BD%93%E5%89%8D%E7%8A%B6%E6%80%81%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA-widget)
   - [进度](#%E8%BF%9B%E5%BA%A6)
   - [LICENSE](#license)
 
@@ -331,6 +332,38 @@ IJKPlayer(
 );
 ```
 
+### 根据当前状态构建一个 widget
+
+根据 Controller 当时 IjkStatus 的值构建 Widget,这个 Widget 会根据当前 status 变化而呈现出不同的界面
+
+```dart
+
+Widget buildIjkPlayer() {
+  return IjkPlayer(
+    mediaController: mediaController,
+    stateWidgetBuilder: _buildStatusWidget,
+  );
+}
+
+Widget _buildStatusWidget(
+  BuildContext context,
+  IjkMediaController controller,
+  IjkStatus status,
+) {
+  if (status == IjkStatus.noDatasource) {
+    return Center(
+      child: Text(
+        "no data",
+        style: TextStyle(color: Colors.white),
+      ),
+    );
+  }
+
+  // you can custom your self status widget
+  return IjkStatusWidget.buildStatusWidget(context, controller, status);
+}
+```
+
 ## 进度
 
 目前正处于初始开发阶段,可能有各种问题,欢迎提出,但不一定会实现,也不一定会修改 😌

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

@@ -62,4 +62,7 @@ class _I18nZh extends I18n {
 
   @override
   String get overlayPageTitle => "悬浮窗中显示";
+
+  @override
+  String get ijkStatusTitle => "IjkStatus的使用";
 }

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

@@ -61,4 +61,7 @@ class _I18nEn extends I18n {
 
   @override
   String get overlayPageTitle => "In overlay";
+
+  @override
+  String get ijkStatusTitle => "Usage of IjkStatus";
 }

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

@@ -44,6 +44,8 @@ abstract class I18n {
   String get screenshotTitle;
 
   String get overlayPageTitle;
+
+  String get ijkStatusTitle;
 }
 
 I18n get currentI18n => I18n(window.locale);

+ 87 - 0
example/lib/page/ijk_status_page.dart

@@ -0,0 +1,87 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+import 'package:ijkplayer_example/i18n/i18n.dart';
+
+class IjkStatusPage extends StatefulWidget {
+  @override
+  _IjkStatusPageState createState() => _IjkStatusPageState();
+}
+
+class _IjkStatusPageState extends State<IjkStatusPage> {
+  TextEditingController editingController = TextEditingController();
+  IjkMediaController mediaController = IjkMediaController();
+
+  @override
+  void initState() {
+    super.initState();
+    editingController.text =
+        "http://img.ksbbs.com/asset/Mon_1703/05cacb4e02f9d9e.mp4";
+  }
+
+  @override
+  void dispose() {
+    editingController.dispose();
+    mediaController.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text(currentI18n.ijkStatusTitle),
+      ),
+      body: ListView(
+        children: <Widget>[
+          Row(
+            children: <Widget>[
+              Expanded(
+                child: TextField(
+                  controller: editingController,
+                ),
+              ),
+              FlatButton(
+                child: Text(currentI18n.play),
+                onPressed: _playInput,
+              ),
+            ],
+          ),
+          AspectRatio(
+            aspectRatio: 12 / 7,
+            child: buildIjkPlayer(),
+          ),
+        ],
+      ),
+    );
+  }
+
+  void _playInput() async {
+    var text = editingController.text;
+    await mediaController.setNetworkDataSource(text, autoPlay: true);
+  }
+
+  Widget buildIjkPlayer() {
+    return IjkPlayer(
+      mediaController: mediaController,
+      statusWidgetBuilder: _buildStatusWidget,
+    );
+  }
+
+  Widget _buildStatusWidget(
+    BuildContext context,
+    IjkMediaController controller,
+    IjkStatus status,
+  ) {
+    if (status == IjkStatus.noDatasource) {
+      return Center(
+        child: Text(
+          "no data",
+          style: TextStyle(color: Colors.white),
+        ),
+      );
+    }
+
+    // you can custom your self status widget
+    return IjkStatusWidget.buildStatusWidget(context, controller, status);
+  }
+}

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

@@ -5,6 +5,7 @@ import 'package:ijkplayer_example/page/controller_stream_use.dart';
 import 'package:ijkplayer_example/page/dialog_video_page.dart';
 import 'package:ijkplayer_example/page/full_screen.dart';
 import 'package:ijkplayer_example/page/gallery_page.dart';
+import 'package:ijkplayer_example/page/ijk_status_page.dart';
 import 'package:ijkplayer_example/page/in_overlay_page.dart';
 import 'package:ijkplayer_example/page/network.dart';
 import 'package:ijkplayer_example/page/paging_page.dart';
@@ -36,6 +37,7 @@ class _IndexPageState extends State<IndexPage> {
           buildButton(currentI18n.useStreamUsage, ControllerStreamUsagePage()),
           buildButton(currentI18n.screenshotTitle, ScreenShotPage()),
           buildButton(currentI18n.overlayPageTitle, InOverlayPage()),
+          buildButton(currentI18n.ijkStatusTitle, IjkStatusPage()),
         ],
       ),
     );

+ 1 - 1
example/pubspec.lock

@@ -82,7 +82,7 @@ packages:
       path: ".."
       relative: true
     source: path
-    version: "0.1.9"
+    version: "0.2.0"
   flutter_localizations:
     dependency: "direct main"
     description: flutter

+ 11 - 7
lib/src/ijkplayer.dart

@@ -19,8 +19,6 @@ part 'controller/enums.dart';
 part 'controller/ijk_event_channel.dart';
 part 'engine/manager.dart';
 
-typedef Widget IjkStateWidgetBuilder(IjkMediaController controller);
-
 /// Main Classes of Library
 class IjkPlayer extends StatefulWidget {
   final IjkMediaController mediaController;
@@ -31,7 +29,7 @@ class IjkPlayer extends StatefulWidget {
   /// See [buildDefaultIjkPlayer]
   final IJKTextureBuilder textureBuilder;
 
-  final IjkStateWidgetBuilder stateWidgetBuilder;
+  final StatusWidgetBuilder statusWidgetBuilder;
 
   /// Main Classes of Library
   const IjkPlayer({
@@ -39,7 +37,7 @@ class IjkPlayer extends StatefulWidget {
     @required this.mediaController,
     this.controllerWidgetBuilder = defaultBuildIjkControllerWidget,
     this.textureBuilder = buildDefaultIjkPlayer,
-    this.stateWidgetBuilder = IjkStatusWidget.defaultBuildStateWidget,
+    this.statusWidgetBuilder = IjkStatusWidget.buildStatusWidget,
   }) : super(key: key);
 
   @override
@@ -52,8 +50,6 @@ class IjkPlayerState extends State<IjkPlayer> {
   IjkMediaController controller;
   GlobalKey _wrapperKey = GlobalKey();
 
-  IjkStateWidgetBuilder get _ijkStateBuilder => widget.stateWidgetBuilder;
-
   @override
   void initState() {
     super.initState();
@@ -133,7 +129,15 @@ class IjkPlayerState extends State<IjkPlayer> {
   }
 
   Widget buildIjkStateWidget() {
-    return _ijkStateBuilder?.call(controller) ?? Container();
+    return StreamBuilder<IjkStatus>(
+      initialData: controller.ijkStatus,
+      stream: controller.ijkStatusStream,
+      builder: (BuildContext context, snapshot) {
+        return widget.statusWidgetBuilder
+                ?.call(context, controller, snapshot.data) ??
+            Container();
+      },
+    );
   }
 }
 

+ 19 - 3
lib/src/widget/controller_widget_builder.dart

@@ -324,14 +324,23 @@ class _DefaultIJKControllerWidgetState extends State<DefaultIJKControllerWidget>
       }
 
       var currentVolume = await getVolume();
+
+      if (currentVolume <= 0) {
+        iconData = Icons.volume_mute;
+      } else if (currentVolume < 50) {
+        iconData = Icons.volume_down;
+      } else {
+        iconData = Icons.volume_up;
+      }
+
       text = currentVolume.toString();
     } else if (leftVerticalDrag == true) {
       var currentBright = await IjkManager.getSystemBrightness();
       double target;
       if (details.delta.dy > 0) {
-        target = currentBright - 0.05;
+        target = currentBright - 0.03;
       } else {
-        target = currentBright + 0.05;
+        target = currentBright + 0.03;
       }
 
       if (target > 1) {
@@ -342,7 +351,14 @@ class _DefaultIJKControllerWidgetState extends State<DefaultIJKControllerWidget>
 
       await IjkManager.setSystemBrightness(target);
 
-      iconData = Icons.brightness_high;
+      if (target >= 0.66) {
+        iconData = Icons.brightness_high;
+      } else if (target < 0.66 && target > 0.33) {
+        iconData = Icons.brightness_medium;
+      } else {
+        iconData = Icons.brightness_low;
+      }
+
       text = (target * 100).toStringAsFixed(0);
     } else {
       return;

+ 3 - 7
lib/src/widget/ijk_status_widget.dart

@@ -21,21 +21,17 @@ class IjkStatusWidget extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
+    var statusBuilder =
+        this.statusWidgetBuilder ?? IjkStatusWidget.buildStatusWidget;
     return StreamBuilder<IjkStatus>(
       initialData: controller.ijkStatus,
       stream: controller.ijkStatusStream,
       builder: (BuildContext context, snapshot) {
-        return buildStatusWidget(context, controller, snapshot.data);
+        return statusBuilder.call(context, controller, snapshot.data);
       },
     );
   }
 
-  static Widget defaultBuildStateWidget(IjkMediaController controller) {
-    return IjkStatusWidget(
-      controller: controller,
-    );
-  }
-
   static Widget buildStatusWidget(
     BuildContext context,
     IjkMediaController controller,

+ 1 - 1
pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_ijkplayer
 description: Flutter version of bilibilibili ijkplayer, supports common playback protocols, easy to use.
-version: 0.1.9
+version: 0.2.0
 author: caijinglong<cjl_spy@163.com>
 homepage: https://github.com/CaiJingLong/flutter_ijkplayer