Flutter自定义PIP窗口大小插件pip_view_custom_size的使用

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

Flutter自定义PIP窗口大小插件pip_view_custom_size的使用

插件简介

这是一个从 pip_view 分支出来的插件,允许自定义浮动小部件的大小。

插件功能

该插件提供了一个可以展示在浮动小部件下方的视图,并支持将浮动小部件移动到角落。

示例GIF

使用方法

创建一个 PIPView 小部件,builder 属性将是请求时浮动显示的视图。要在一个浮动视图下方展示一个视图,请使用 PIPView.of(context).presentBelow(MyWidget(), initialWidgetSize: Size(280, 320))initialWidgetSize 是可选的。通过添加它,您可以设置浮动视图/小部件的初始大小。如果未设置 initialWidgetSize,浮动视图/小部件将占用整个屏幕。

属性说明:
  • avoidKeyboard: 浮动视图是否应避免键盘;
  • builder: 构建浮动小部件的构造器,第二个参数表示视图是否浮动;
  • floatingWidget: 一个特定的小部件用于浮动,这是可选的。当设置此属性时,构建器内的父级小部件将被忽略;
  • initialCorner: 浮动视图最初粘贴的角落
    • 可能的值有:PIPViewCorner.topLeft, PIPViewCorner.topRight, PIPViewCorner.bottomLeft, PIPViewCorner.bottomRight
  • floatingHeight: 浮动前景视图的高度。如果没有设置,则根据 floatingWidth 计算以保持屏幕的纵横比;
  • floatingWidth: 浮动前景视图的宽度。如果没有设置且 floatingHeight 已设置,则根据 floatingHeight 的值计算以保持屏幕的纵横比。如果没有设置且 floatingHeight 也没有设置,默认为 100.0

示例代码

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

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

class ExampleApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  final contKey = GlobalKey();

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 定义浮动视图
    final floatingView = Container(
      key: contKey,
      width: 200,
      height: 200,
      color: Colors.red,
      child: Center(
        child: Text('这是浮动的小部件!'),
      ),
    );

    return PIPView(
      builder: (context, isFloating) {
        return Scaffold(
          resizeToAvoidBottomInset: !isFloating, // 是否调整底部插入位置以避免键盘
          body: SafeArea(
            child: Padding(
              padding: const EdgeInsets.all(16),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  floatingView,
                  Text('这个页面不会浮动!'),
                  MaterialButton(
                    color: Theme.of(context).primaryColor,
                    child: Text('开始浮动!'),
                    onPressed: () {
                      // 获取浮动容器的当前大小
                      final floatingContSize = contKey.currentContext?.size;
                      PIPView.of(context)!.presentBelow(
                        BackgroundScreen(),
                        initialWidgetSize: floatingContSize,
                      );
                    },
                  ),
                ],
              ),
            ),
          ),
        );
      },
    );
  }
}

class BackgroundScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.all(16),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: <Widget>[
              Text('这是背景页面!'),
              Text('如果您点击浮动屏幕,它将停止浮动。'),
              Text('导航如预期工作。'),
              MaterialButton(
                color: Theme.of(context).primaryColor,
                child: Text('导航到新页面'),
                onPressed: () {
                  Navigator.of(context).push(
                    MaterialPageRoute(
                      builder: (_) => NavigatedScreen(),
                    ),
                  );
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class NavigatedScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('导航页面'),
      ),
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.all(16),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: <Widget>[
              Text('这是您导航到的页面。'),
              Text('看它如何停留在浮动页面下面?'),
              Text('太棒了!'),
              Spacer(),
              Text('它还避免了键盘!'),
              TextField(),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter自定义PIP窗口大小插件pip_view_custom_size的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义PIP窗口大小插件pip_view_custom_size的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用pip_view_custom_size插件来自定义PIP(Picture-in-Picture)窗口大小的示例代码。请注意,这个插件可能需要一些自定义的本地代码来实现,因此以下示例将包括Flutter Dart代码和可能的原生Android或iOS代码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  pip_view_custom_size: ^最新版本号  # 请替换为实际最新版本号

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

2. Flutter Dart 代码

在Flutter的Dart代码中,你需要初始化插件并设置PIP窗口的大小。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter PIP Custom Size Example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('PIP Custom Size Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _enterPipMode,
            child: Text('Enter PIP Mode'),
          ),
        ),
      ),
    );
  }

  void _enterPipMode() async {
    // 假设你有一个视频播放器或者需要进入PIP模式的Widget
    // 这里为了示例,我们创建一个简单的蓝色容器
    final pipView = PipViewCustomSize(
      child: Container(
        color: Colors.blue,
        width: 300, // 自定义宽度
        height: 200, // 自定义高度
      ),
      // 可以根据需要设置其他参数,比如初始位置等
    );

    // 显示PIP窗口
    await PipViewCustomSize.enterPipMode(
      context,
      pipView: pipView,
      // 可以添加其他配置,比如是否全屏等
    );
  }
}

3. 原生代码配置(可能需要)

对于某些功能,特别是涉及到系统级特性如PIP,你可能需要在原生Android或iOS代码中进行配置。以下是一些可能的配置步骤:

Android

AndroidManifest.xml中,确保你的Activity支持PIP模式:

<activity
    android:name=".MainActivity"
    android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
    android:supportsPictureInPicture="true"
    ... >
    ...
</activity>

iOS

对于iOS,你需要在Info.plist中添加支持PIP模式的声明,并在App Delegate中进行一些配置(这部分通常不需要为Flutter插件额外添加,除非有特殊需求)。

注意事项

  1. 插件版本:确保你使用的pip_view_custom_size插件版本是最新的,并且支持自定义PIP窗口大小。
  2. 平台限制:不同平台对PIP的支持可能有差异,确保在目标平台上进行测试。
  3. 权限:确保你的应用有适当的权限来使用PIP模式(通常不需要额外权限,但最好检查)。

由于pip_view_custom_size插件的具体实现和API可能会随着版本更新而变化,请参考该插件的官方文档和示例代码以获取最新和最准确的信息。如果插件本身不支持自定义大小,你可能需要寻找其他替代方案或自己实现该功能。

回到顶部