周末不想在家 2024-03-14 17:28 采纳率: 8%
浏览 6

flutter video_player 播放一边占满另一边剪切

flutter video_player 播放器播放视频不拉伸不压缩,视频一边占满另一边进行剪切,固定播放器尺寸
如何实现?

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-14 17:29
    关注

    引自免费微信小程序:皆我百晓生

    在 Flutter 中使用 video_player 插件实现一边占满,另一边剪切的效果,你需要自定义一个 Container 并通过 BoxFit 设置视频的填充模式。这里我们选择 BoxFit.cover 模式来确保视频始终铺满容器的一边,并剪切掉超出部分。

    以下是一个基本示例:

    import 'package:flutter/material.dart';
    import 'package:video_player/video_player.dart';
    
    class VideoPlayerScreen extends StatefulWidget {
      final String videoUrl; // 视频文件URL
    
      const VideoPlayerScreen({Key? key, required this.videoUrl}) : super(key: key);
    
      @override
      _VideoPlayerScreenState createState() => _VideoPlayerScreenState();
    }
    
    class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
      late VideoPlayerController _controller;
    
      @override
      void initState() {
        super.initState();
        _controller = VideoPlayerController.network(widget.videoUrl)
          ..initialize().then((_) {
            setState(() {});
          })
          ..play()
          ..setLooping(true);
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Container(
            width: MediaQuery.of(context).size.width, // 宽度充满屏幕
            height: 200.0, // 自定义固定高度,根据需求调整
            child: AspectRatio(
              aspectRatio: _controller.value.aspectRatio,
              child: VideoPlayer(_controller),
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              setState(() {
                if (_controller.value.isPlaying) {
                  _controller.pause();
                } else {
                  _controller.play();
                }
              });
            },
            child: Icon(
              _controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
            ),
          ),
        );
      }
    
      @override
      void dispose() {
        super.dispose();
        _controller.dispose();
      }
    }
    

    上述代码中,关键在于 AspectRatio 组件的应用。它会根据视频自身的宽高比自动调整大小,而外部的 Container 则设置了固定的宽度和高度,因此视频会按照 BoxFit.cover 的默认行为进行填充展示,即始终保持某一边铺满并裁剪另一尺寸过大的边。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月14日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效