Flutter:基于video_player实现视频相关手势控制、全屏播放

} else if (widget.type == VideoPlayerType.asset) {
_controller = VideoPlayerController.asset(widget.url);
} else {
_controller = VideoPlayerController.network(widget.url);
}

/// 加载资源完成时,监听播放进度,并且标记_videoInit=true加载完成
_controller.addListener(_videoListener);
await _controller.initialize();
setState(() {
_videoInit = true;
_videoError = false;
_controller.play();
});
}

这里有一个需要注意的点:_controller.addListener(_videoListener);我们添加监听一定要在初始化之前添加,不然后续的加载状态无法响应。在监听函数中我们这里使用了GlobalKey去调用组件方法,刷新子组件时间显示的页面显示

void _videoListener() async {
if (_controller.value.hasError) {
setState(() {
_videoError = true;
});
} else {
Duration res = await _controller.position;
if (res >= _controller.value.duration) {
await _controller.seekTo(Duration(seconds: 0));
await _controller.pause();
}
if (_controller.value.isPlaying && _key.currentState != null) {
/// 减少build次数
_key.currentState.setPosition(
position: res,
totalDuration: _controller.value.duration,
);
}
}
}

4.2.2. 改变视频源

在传入的url发生改变的时候,重新初始化视频,这里我们就需要用到didUpdateWidget这个生命周期:

@override
void didUpdateWidget(VideoPlayerUI oldWidget) {
if (oldWidget.url != widget.url) {
_urlChange(); // url变化时重新执行一次url加载
}
super.didUpdateWidget(oldWidget);
}

4.3. 完整代码

VideoPlayerUI完整代码

5. 视频控制按键VideoPlayerControl

5.1 轻触显示界面

该组件主要的功能就是,轻触屏幕会弹出操作按钮,过两秒后按钮会消失,这里我们就需要一个Timer定时器,

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A:以下是一个简单的 Flutter video_player 视频播放器模板供参考: ```dart import 'package:flutter/material.dart'; import 'package:video_player/video_player.dart'; void main() => runApp(MyApp()); class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { VideoPlayerController _controller; @override void initState() { super.initState(); _controller = VideoPlayerController.asset('videos/sample.mp4') ..initialize().then((_) { setState(() {}); }); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Video Player'), ), body: Center( child: _controller.value.initialized ? AspectRatio( aspectRatio: _controller.value.aspectRatio, child: VideoPlayer(_controller), ) : Container(), ), floatingActionButton: FloatingActionButton( onPressed: () { setState(() { _controller.value.isPlaying ? _controller.pause() : _controller.play(); }); }, child: Icon( _controller.value.isPlaying ? Icons.pause : Icons.play_arrow, ), ), ), ); } @override void dispose() { super.dispose(); _controller.dispose(); } } ``` 在本例中,我们使用 asset 目录下的示例视频文件来初始化 VideoPlayerController。在 initState() 生命周期中,我们调用 initialize() 方法来初始化该控制器,并在该过程完成后(即视频准备就绪后)调用 setState() 来更新 UI。在 build() 方法中,我们检查视频控制器的 initialized 属性,如果视频已经准备就绪,则使用 AspectRatio 和 VideoPlayer视频呈现为全屏可见的占位符。我们还在右下方添加了一个 FloatingActionButton,允许用户播放或暂停视频。最后,我们在 dispose() 生命周期中释放了视频控制器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值