美文网首页
Flutter:视频全屏切换

Flutter:视频全屏切换

作者: 爱抖腿的飞飞 | 来源:发表于2021-11-13 18:05 被阅读0次

我会分享一些在网上找不到,或者遇到问题并解决的事情。

最近在调研Flutter视频播放,在横屏切换到竖屏的时候遇到了点问题。代码如下:

class PortraitPage extends StatefulWidget {
  const PortraitPage({Key? key}) : super(key: key);

  @override
  _PortraitPageState createState() => _PortraitPageState();
}

class _PortraitPageState extends State<PortraitPage> {
  VideoPlayerController? controller;

  @override
  void initState() {
    super.initState();
    controller = VideoPlayerController.network(
        "https://cdn-resource.ekwing.com/acpf/data/upload/expand/2017/08/29/59a53da773e00.mp4")
      ..setLooping(true)
      ..initialize().then((_) {
        controller!.play();
      });
  }

  @override
  void dispose() {
    controller!.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(
          children: [
            AspectRatio(
              aspectRatio: controller!.value.aspectRatio,
              child: VideoPlayer(controller!),
            ),
            MaterialButton(
                onPressed: () {
                  Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => VideoFullPage(controller: controller!)));
                },
                child: Text("切换全屏"))
          ],
        ),
      ),
    );
  }
}

class VideoFullPage extends StatefulWidget {
  final VideoPlayerController controller;

  const VideoFullPage({Key? key, required this.controller}) : super(key: key);

  @override
  _VideoFullPageState createState() => _VideoFullPageState();
}

class _VideoFullPageState extends State<VideoFullPage> {

  @override
  void initState() {
    super.initState();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeLeft,
    ]);
  }

  @override
  void dispose() {
  ///页面退出时,切换为竖屏
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
    ]);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
          home: Scaffold(
            backgroundColor: Colors.black,
            body: Stack(
              children: [
                Center(
                  child: AspectRatio(
                    aspectRatio: widget.controller.value.aspectRatio,
                    child: VideoPlayer(widget.controller),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.only(top: 25, right: 20),
                  child: IconButton(
                    icon: const Icon(Icons.arrow_back_ios),
                    color: Colors.white,
                    onPressed: () {
                    ///点击返回,先切换竖屏,然后退出页面
                      SystemChrome.setPreferredOrientations([
                        DeviceOrientation.portraitUp,
                      ]);
                      Navigator.pop(context);
                    },
                  ),
                )
              ],
            ),
          ),
        );
  }
}

从竖屏切换到全屏没有问题,点击物理按键:Back,会出现先退出了页面,然后再切换到竖屏。体验效果不是很好,所以修改方案:

  1. 拦截返回按键。
  2. 先切换为竖屏,然后Navigator.pop(context)。
class _VideoFullPageState extends State<VideoFullPage> {
  @override
  void initState() {
    super.initState();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeLeft,
    ]);
  }

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
        child: MaterialApp(
          home: Scaffold(
            backgroundColor: Colors.black,
            body: Stack(
              children: [
                Center(
                  child: Hero(
                    tag: "player",
                    child: AspectRatio(
                      aspectRatio: widget.controller.value.aspectRatio,
                      child: VideoPlayer(widget.controller),
                    ),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.only(top: 25, right: 20),
                  child: IconButton(
                    icon: const Icon(Icons.arrow_back_ios),
                    color: Colors.white,
                    onPressed: () {
                      SystemChrome.setPreferredOrientations([
                        DeviceOrientation.portraitUp,
                      ]);
                      Navigator.pop(context);
                    },
                  ),
                )
              ],
            ),
          ),
        ),
        onWillPop: () async {
          SystemChrome.setPreferredOrientations([
            DeviceOrientation.portraitUp,
          ]);
          Navigator.pop(context);
          return false;
        });
  }
}

完整代码见GitHub

相关文章

  • Flutter:视频全屏切换

    我会分享一些在网上找不到,或者遇到问题并解决的事情。 最近在调研Flutter视频播放,在横屏切换到竖屏的时候遇到...

  • QZIJKPlayer 基于 IJK的简易直播/视频播放器 Sw

    QZIJKPlayer 基于 IJK的简易视频播放器,支持切换多个播放源、全屏、跟随屏幕旋转全屏,使用 Swift...

  • jQuery插件封装方法

    资料来源 慕课网全屏切换效果 概述 最近在慕课网上学习奇舞团课程系列--全屏切换效果的视频课程,在学到如何实现jQ...

  • iOS开发-WKWebView禁用HTML5的video标签默认

    问题描述: 在Android中,视频可以正常在H5页面局部播放。iOS中则自动切换至全屏模式,需要禁止视频自动全屏...

  • 基于jQuery的全屏切换插件封装

    学习资料 慕课网全屏切换效果 概述 最近在慕课网上学习奇舞团课程系列--全屏切换效果的视频课程,将学习到的知识点整...

  • iOS APP 中H5视频默认全屏播放

    问题描述:在Android中,视频可以正常在H5页面局部播放,iOS中则自动切换至全屏模式,需要禁止视频自动全屏播...

  • Android_全屏切换;沉侵式和全屏切换

    1. 首先是全屏与非全屏的切换 Window方式 view方式 2. 沉侵式和全屏的切换 沉侵式设置 全屏代码设置

  • Android监听横竖屏切换

    偶然在项目中用到播放视频时,需要横屏将视频全屏播放,所以需要监听屏幕的横竖屏切换事件。 横竖屏切换监听效果: Co...

  • iOS中的界面旋转

    最近所接触的项目中有几处视频播放的需求,在该项目中视频播放器可以全屏/竖屏手动切换,也可以自动切换,但是其他界面都...

  • JS 全屏和退出全屏

    进入全屏 退出全屏 获取当前全屏的节点 判断当前是否全屏 判断当前文档是否能切换到全屏 全屏事件 注:1.docu...

网友评论

      本文标题:Flutter:视频全屏切换

      本文链接:https://www.haomeiwen.com/subject/qzjzzltx.html