Flutter浮动窗口管理插件flutter_float_window的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter浮动窗口管理插件 flutter_float_window 的使用

flutter_float_window 是一个用于在 Android 和 iOS 平台上显示浮动窗口的 Flutter 插件。以下是如何使用该插件的具体步骤和示例代码。

基本用法

初始化浮动窗口

Map<String, String> params = {"videoUrl": ''};
FlutterFloatWindow.initFloatWindow(params);

显示/隐藏浮动窗口

// 显示浮动窗口
FlutterFloatWindow.showFloatWindow();

// 隐藏浮动窗口
FlutterFloatWindow.hideFloatWindow();

控制播放状态

// 播放视频
FlutterFloatWindow.play();

// 暂停视频
FlutterFloatWindow.pause();

// 停止视频
FlutterFloatWindow.stop();

检查权限并处理

if (await FlutterFloatWindow.canShowFloatWindow()) {
  FlutterFloatWindow.showFloatWindow();
} else {
  FlutterFloatWindow.openSetting();
}

设置视频 URL

Map<String, String> params = {"videoUrl": "http://example.com/video.mp4"};
FlutterFloatWindow.setVideoUrl(params);

设置背景颜色

FlutterFloatWindow.setBackgroundColor("#5c3317");

设置重力方向

FlutterFloatWindow.setGravity(FloatWindowGravity.CENTER);

设置宽高

var map = {
  "width": int.parse(width),
  "height": int.parse(height)
};
FlutterFloatWindow.setWidthAndHeight(map);

设置宽高比

FlutterFloatWindow.setAspectRatio(0.7);

监听原生事件

var channel = FlutterFloatWindow.channel;
channel.setMethodCallHandler((call) async {
  switch (call.method) {
    case "onFullScreenClick":
      debugPrint('onFullScreenClick');
      break;
    case "onCloseClick":
      debugPrint('onCloseClick');
      break;
    case "onPlayClick":
      debugPrint('onPlayClick,${call.arguments}');
      break;
  }
});

iOS 特定功能

初始化视频播放器

FlutterFloatWindow.initVideoPlayerIOS(
  url: dataSource,
  title: title,
  artist: artist,
  coverUrl: cover,
  position: 0,
  speed: 1.0,
);

FlutterVideoPlayerEngine playerEngine = FlutterVideoPlayerEngine.create();
playerEngine.setVideoPlayerEventHandler(FlutterVideoPlayerEventHandler(
  onInitialized: () {},
  onVideoProgress: (double position, double duration, double bufferedStart, double bufferedEnd) {},
  onVideoPlayPaused: () {},
  onVideoPlayEnd: () {},
  onVideoInterruptionBegan: () {},
  onVideoInterruptionEnded: () {},
  onVideoPipCloseClicked: () {},
  onVideoPipFullScreenClicked: () {},
));
FlutterFloatWindow.initVideoPlayerListener(playerEngine.mHandler!);

使用画中画模式

// 开始画中画
FlutterFloatWindow.startPipIOS();

// 结束画中画
FlutterFloatWindow.stopPipIOS();

示例 Demo

以下是一个完整的示例,展示了如何在应用中集成 flutter_float_window 插件:

import 'package:flutter/material.dart';
import 'package:flutter_float_window/flutter_float_window.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
    initFloatWindow();
  }

  Future<void> initFloatWindow() async {
    Map<String, String> params = {"videoUrl": "https://media.w3.org/2010/05/sintel/trailer.mp4"};
    await FlutterFloatWindow.initFloatWindow(params);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Float Window Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  if (await FlutterFloatWindow.canShowFloatWindow()) {
                    FlutterFloatWindow.showFloatWindow();
                  } else {
                    FlutterFloatWindow.openSetting();
                  }
                },
                child: Text('Show Float Window'),
              ),
              ElevatedButton(
                onPressed: () {
                  FlutterFloatWindow.hideFloatWindow();
                },
                child: Text('Hide Float Window'),
              ),
              ElevatedButton(
                onPressed: () {
                  FlutterFloatWindow.play();
                },
                child: Text('Play Video'),
              ),
              ElevatedButton(
                onPressed: () {
                  FlutterFloatWindow.pause();
                },
                child: Text('Pause Video'),
              ),
              ElevatedButton(
                onPressed: () {
                  FlutterFloatWindow.stop();
                },
                child: Text('Stop Video'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter浮动窗口管理插件flutter_float_window的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter浮动窗口管理插件flutter_float_window的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flutter_float_window插件来管理浮动窗口的一个示例。这个插件允许你在Android设备上创建和管理浮动窗口。请注意,iOS不支持浮动窗口功能,因此此示例仅适用于Android。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加flutter_float_window的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_float_window: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 配置Android权限

android/app/src/main/AndroidManifest.xml中添加必要的权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

    <!-- 其他配置 -->

</manifest>

3. 请求权限

在Flutter代码中请求必要的权限。由于SYSTEM_ALERT_WINDOW权限在Android 6.0及以上版本中需要在运行时请求,你可以使用以下代码:

import 'package:flutter/material.dart';
import 'package:flutter_float_window/flutter_float_window.dart';
import 'package:permission_handler/permission_handler.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool canShowOverlayWindows = false;

  @override
  void initState() {
    super.initState();
    _requestOverlayPermission();
  }

  Future<void> _requestOverlayPermission() async {
    // 请求悬浮窗权限
    var status = await Permission.overlayWindow.status;
    if (!status.isGranted) {
      var result = await Permission.overlayWindow.request();
      if (result.isGranted) {
        setState(() {
          canShowOverlayWindows = true;
        });
      }
    } else {
      setState(() {
        canShowOverlayWindows = true;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Float Window Example'),
        ),
        body: Center(
          child: canShowOverlayWindows
              ? ElevatedButton(
                  onPressed: _showFloatWindow,
                  child: Text('Show Float Window'))
              : Text('Waiting for Overlay Permission...'),
        ),
      ),
    );
  }

  void _showFloatWindow() {
    FloatWindow.createParams = (context) {
      return FloatWindowParams(
        width: 300,
        height: 400,
        x: 0,
        y: 0,
        isFullScreen: false,
        isKeepAbove: true,
        hasShadow: true,
        canFocus: true,
        canMove: true,
        canResize: true,
        isDraggable: true,
        isResizable: true,
        hasOverlayBackground: false,
        showAnimation: WindowAnimation.FADEIN,
        hideAnimation: WindowAnimation.FADEOUT,
        isShowWhenScreenLock: true,
        customParams: null,
      );
    };

    FloatWindow.createView = (context, params) {
      return Material(
        elevation: 4.0,
        child: Container(
          color: Colors.white,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('This is a floating window'),
              ElevatedButton(
                onPressed: () {
                  FloatWindow.remove();
                },
                child: Text('Close'),
              ),
            ],
          ),
        ),
      );
    };

    FloatWindow.show();
  }
}

4. 添加permission_handler依赖

为了请求权限,你需要添加permission_handler插件。在pubspec.yaml中添加:

dependencies:
  permission_handler: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

5. 运行应用

现在你可以运行你的Flutter应用,点击按钮来显示浮动窗口。

注意

  • 确保你的Android设备已开启开发者选项并允许模拟点击(如果需要)。
  • 某些设备和ROM可能对悬浮窗权限有额外的限制,确保你的设备支持此功能。
  • 由于iOS不支持浮动窗口,因此此示例在iOS设备上不会工作。

这个示例展示了如何使用flutter_float_window插件来创建和管理一个基本的浮动窗口。你可以根据需要进一步自定义浮动窗口的参数和视图。

回到顶部