码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Flutter 中视频的播放


    前言:在 flutter 中播放视频,并且可以控制视频的播放!(或者是预览)

     

    视频播放插件:video_player ,但是没有视频控制 UI,这边想实现的效果有点类似 微信里面观看视频的效果; 本来是有个插件的 chewie,但是用了下 感觉过于繁琐;下面手写一个 视频 播放控件主要功能有:

    • 视频播放 /视频暂停
    • 视频进度条, 可以随意跳到指定位置

     

    参考:Flutter自定义视频播放器(播放、暂停、倍速、拖动视频进度)_就是三木啊的博客-CSDN博客_flutter播放器Flutter自定义视频播放器在pubspec.yaml 添加video_player、dropdown_button2添加完成后在需要视频的dart文件引入import 'package:video_player/video_player.dart';import 'package:dropdown_button2/dropdown_button2.dart';具体代码//定义一个VideoPlayerControllervar _videoPlayerController;//监听视https://blog.csdn.net/weixin_43783419/article/details/124661562?spm=1001.2101.3001.6650.16&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-16-124661562-blog-123168999.pc_relevant_sortByAnswer&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-16-124661562-blog-123168999.pc_relevant_sortByAnswer&utm_relevant_index=21

     效果如下:

    pubspec.yaml

    添加配置:主要用于视频的播放

    video_player: 2.3.0

     

    page_preview_video.dart 

    界面显示 布局: 

    1. import 'package:examine/utils/app_navigation.dart';
    2. import 'package:examine/utils/app_screen.dart';
    3. import 'package:examine/wrap/extension/extension.dart';
    4. import 'package:flutter/material.dart';
    5. import 'package:video_player/video_player.dart';
    6. class PagePreviewVideo extends StatefulWidget {
    7. final String url;
    8. const PagePreviewVideo({Key? key, required this.url}) : super(key: key);
    9. @override
    10. _PagePreviewVideoState createState() => _PagePreviewVideoState();
    11. }
    12. class _PagePreviewVideoState extends State {
    13. VideoPlayerController? _videoPlayerController;
    14. bool _isPlaying = false;
    15. @override
    16. void initState() {
    17. // TODO: implement initState
    18. super.initState();
    19. _videoPlayerController = VideoPlayerController.network(widget.url)
    20. ..initialize().then((_) {
    21. _videoPlayerController!.play();
    22. setState(() {});
    23. });
    24. _videoPlayerController!.addListener(() {
    25. setState(() {
    26. _isPlaying = _videoPlayerController!.value.isPlaying;
    27. });
    28. });
    29. }
    30. @override
    31. void dispose() {
    32. _videoPlayerController?.dispose();
    33. // TODO: implement dispose
    34. super.dispose();
    35. }
    36. @override
    37. Widget build(BuildContext context) {
    38. return Scaffold(
    39. backgroundColor: Colors.black,
    40. body: Stack(
    41. children: [
    42. _videoPlayerController!.value.isInitialized
    43. ? Column(
    44. mainAxisAlignment: MainAxisAlignment.center,
    45. children: [
    46. InkWell(
    47. onTap: () {
    48. if (_isPlaying) {
    49. _videoPlayerController!.pause();
    50. }
    51. },
    52. child: Container(
    53. constraints:
    54. BoxConstraints(maxWidth: 0.85 * AppScreen.height),
    55. child: AspectRatio(
    56. aspectRatio:
    57. _videoPlayerController!.value.aspectRatio,
    58. child: VideoPlayer(_videoPlayerController!),
    59. ),
    60. ),
    61. ),
    62. SliderTheme(
    63. data: SliderTheme.of(context).copyWith(
    64. activeTrackColor:
    65. Colors.white.withOpacity(0.5), //进度条滑块左边颜色
    66. inactiveTrackColor:
    67. Colors.white.withOpacity(0.2), //进度条滑块右边颜色
    68. thumbColor: Colors.transparent, //滑块颜色
    69. overlayColor: Colors.transparent, //滑块拖拽时外圈的颜色
    70. trackHeight: 4.cale, //进度条宽度
    71. // trackShape: RoundSliderTrackShape(
    72. // radius: 10), //进度条形状,这边自定义两头显示圆角
    73. ),
    74. child: Slider(
    75. max: _videoPlayerController!
    76. .value.duration.inMilliseconds
    77. .truncateToDouble(),
    78. value: _videoPlayerController!
    79. .value.position.inMilliseconds
    80. .truncateToDouble(),
    81. // activeColor: Colors.white.withOpacity(0.5),
    82. // inactiveColor: Colors.black.withOpacity(0.5),
    83. onChanged: (double value) {
    84. _videoPlayerController!.seekTo(
    85. Duration(
    86. milliseconds: value.truncate(),
    87. ),
    88. );
    89. },
    90. ),
    91. ),
    92. ],
    93. )
    94. : Center(
    95. child: CircularProgressIndicator(
    96. valueColor:
    97. AlwaysStoppedAnimation(Colors.white.withOpacity(0.7)),
    98. backgroundColor: Colors.white.withOpacity(0.4),
    99. ),
    100. ),
    101. Positioned(
    102. left: 30.cale,
    103. top: 100.cale,
    104. child: InkWell(
    105. onTap: () {
    106. AppNavigator().navigateBack();
    107. },
    108. child: Icon(
    109. Icons.cancel,
    110. color: Colors.white,
    111. size: 55.cale,
    112. ),
    113. ),
    114. ),
    115. if (_videoPlayerController!.value.isInitialized && !_isPlaying)
    116. Center(
    117. child: GestureDetector(
    118. onTap: () {
    119. _videoPlayerController!.play();
    120. },
    121. child: Center(
    122. child: Icon(
    123. Icons.play_circle_fill_outlined,
    124. color: Colors.white,
    125. size: 120.cale,
    126. ),
    127. ),
    128. ),
    129. )
    130. ],
    131. ),
    132. );
    133. }
    134. }

    调用:

    1. AppNavigator().navigateTo(
    2. PagePreviewVideo(url: _videoPreview()[index]));

  • 相关阅读:
    【Java 进阶篇】MySQL启动与关闭、目录结构以及 SQL 相关概念
    C/C++ 实现Windows注册表操作
    概念解析 | 神经网络中的位置编码(Positional Encoding)
    野火霸天虎 STM32F407 学习笔记_1 stm32介绍;调试方法介绍
    云原生|kubernetes|etcd集群详细介绍+安装部署+调优
    Python基础语法
    ThinkPHP 3.2 常用内置函数
    【Kurbernetes资源管理】声明式资源管理+配置清单文件详解(附实例)
    Java基础面试题汇总(不定期更新)
    2022华数杯建模B题思路解析
  • 原文地址:https://blog.csdn.net/nicepainkiller/article/details/126143843
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号