
前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载导读VideoSpacer是 Flet 官方视频扩展包flet-video提供的按钮栏布局工具用于在视频播放器的**主按钮栏primary button bar、顶部按钮栏top button bar和底部按钮栏bottom button bar**中插入可伸缩的空白间隔从而精确控制按钮之间的对齐与留白。本文将从源码定义、Flutter 端渲染原理、内置默认布局到真实示例代码完整讲解如何使用VideoSpacer定制 Flet 视频播放器的控制栏。VideoSpacer 是什么VideoSpacer定义于flet-video包的 types.py其官方文档位于 videospacer.md。它继承自按钮栏项基类VideoBarItem是一类占位型内置控件ft.value class VideoSpacer(VideoBarItem): A built-in spacer item for video controls button bars. _type: str field(defaultspacer, initFalse, reprFalse) Identifies this item as a built-in spacer. flex: int 1 The flex factor to use for the spacer. 从源码结构可以推断VideoSpacer本身不渲染任何可见的按钮或图标它的职责是在按钮栏中占据一块按比例分配的弹性空白区域起到分隔和对齐其他按钮项的作用。整个VideoBarItem家族播放/暂停、上一曲、下一曲、全屏、音量、进度指示器等都通过_type字段标识自己在 Flutter 端的渲染类型VideoSpacer的_type固定为spacer。flet-video包的公开导出见init.py使用时通过import flet_video as ftv即可访问ftv.VideoSpacer。flex 参数控制弹性空间的权重VideoSpacer只有一个对外可配置的参数flex参数类型默认值说明flexint1间隔占据的弹性因子flex factorflex决定该间隔在按钮栏剩余空间中分配到的比例。按钮栏使用 Flutter 的弹性布局模型栏内所有设置了flex的弹性项包括VideoSpacer会按 flex 数值比例瓜分未被固定尺寸内容占用的剩余宽度。数值越大该间隔占据的空间越大flex0或负值则不会参与弹性分配从实现上对应 FlutterSpacer的规则。典型用法ftv.VideoSpacer() # flex1普通弹性间隔 ftv.VideoSpacer(flex2) # flex2占据两倍于普通间隔的空间Flutter 端渲染原理映射为 Spacerflet-video是纯 Python 包底层通过 Flet 协议将控件描述发送给 Flutter 客户端渲染。VideoSpacer的 Flutter 端实现位于 video.dartcase spacer: return Spacer(flex: parseInt(value[flex], 1)!);当 Flutter 端解析按钮栏项时遇到_type spacer的分支会把 Python 侧传来的flex值解析为整数缺省为1并直接构造一个 Flutter 的Spacerwidget。也就是说VideoSpacer在渲染层就是标准的弹性空白组件其行为与 FlutterRow/Column中的Spacer完全一致。同时可以看到parseVideoControlsBarItem会先尝试把该项当作普通 Flet 控件解析只有当它不是自定义控件、且_type命中内置类型时才会走spacer分支——这意味着你也可以在按钮栏中混用内置项与任意自定义 Flet 控件如ft.Text、ft.Icon。内置默认按钮栏中的 VideoSpacerflet-video的两套内置控件MaterialVideoControls与MaterialDesktopVideoControls的默认按钮栏布局中都大量使用了VideoSpacer理解默认布局是自定义的前提。MaterialVideoControls 主按钮栏默认值定义于 types.py。当primary_button_barNone时原生默认布局为[ ftv.VideoSpacer(flex2), ftv.VideoSkipPreviousButton(), ftv.VideoSpacer(), ftv.VideoPlayOrPauseButton(icon_size48.0), ftv.VideoSpacer(), ftv.VideoSkipNextButton(), ftv.VideoSpacer(flex2), ]可以看到播放/暂停按钮icon_size48.0的大按钮被三个普通VideoSpacer夹在中间而两侧用flex2的加宽间隔将整组按钮推入按钮栏中央实现按钮组水平居中、四周留白均匀的效果。MaterialVideoControls 底部按钮栏默认值定义于 types.py[ ftv.VideoPositionIndicator(), ftv.VideoSpacer(), ftv.VideoFullscreenButton(), ]这里VideoSpacer()位于进度指示器与全屏按钮之间把全屏按钮推到按钮栏最右侧。MaterialDesktopVideoControls 底部按钮栏默认值定义于 types.py[ ftv.VideoSkipPreviousButton(), ftv.VideoPlayOrPauseButton(), ftv.VideoSkipNextButton(), ftv.VideoSpacer(), ftv.VideoPositionIndicator(), ftv.VideoFullscreenButton(), ftv.VideoVolumeButton(), ]桌面端默认将传输控制上一曲/播放暂停/下一曲放在左侧VideoSpacer负责把进度指示器与右侧的全屏、音量按钮推向右端形成左控制、右辅助的经典桌面播放器布局。实战用 VideoSpacer 定制按钮栏基础示例分隔自定义文本与按钮仓库官方示例 controls_mode/main.py 演示了在不同全屏模式下用VideoSpacer分隔普通 Flet 控件与内置按钮import flet as ft import flet_video as ftv def main(page: ft.Page): page.add( ft.SafeArea( expandTrue, contentftv.Video( expandTrue, playlist[ ftv.VideoMedia( https://user-images.githubusercontent.com/28951144/229373720-14d69157-1a56-4a78-a2f4-d7a134d7c3e9.mp4 ), ], controls{ ftv.VideoControlsMode.NORMAL: ftv.MaterialDesktopVideoControls( visible_on_mountTrue, bottom_button_bar[ ftv.VideoPlayOrPauseButton(), ftv.VideoSpacer(), ft.Text(NORMAL Mode, weightft.FontWeight.BOLD), ftv.VideoFullscreenButton(), ], ), ftv.VideoControlsMode.FULLSCREEN: ftv.MaterialDesktopVideoControls( visible_on_mountTrue, bottom_button_bar[ ftv.VideoFullscreenButton(), ftv.VideoSpacer(), ft.Text(FULLSCREEN Mode, weightft.FontWeight.BOLD), ftv.VideoPlayOrPauseButton(), ], ), }, ), ) ) if __name__ __main__: ft.run(main)关键点controls属性可接收以VideoControlsMode为键的字典为普通模式与全屏模式分别配置按钮栏ft.Text(...)是普通 Flet 控件可以与VideoSpacer、VideoPlayOrPauseButton等内置项混排这里的VideoSpacer()让中间的ft.Text与左右按钮保持等距留白文本天然居中。进阶示例三个按钮栏的完整定制仓库官方示例 button_bars/main.py 同时定制了主、顶部、底部三个按钮栏是VideoSpacer最完整的用法参考import flet as ft import flet_video as ftv def main(page: ft.Page): label_style ft.TextStyle( size12, colorft.Colors.WHITE, weightft.FontWeight.BOLD, ) page.add( ft.SafeArea( expandTrue, contentftv.Video( expandTrue, playlist[ ftv.VideoMedia(video-sample.mp4), ], controlsftv.MaterialDesktopVideoControls( visible_on_mountTrue, primary_button_bar[ ftv.VideoSkipPreviousButton(icon_colorft.Colors.CYAN), ftv.VideoPlayOrPauseButton( icon_size40, icon_colorft.Colors.CYAN, ), ftv.VideoSkipNextButton( iconft.Icon(ft.Icons.FAST_FORWARD), icon_colorft.Colors.CYAN, ), ], top_button_bar[ ft.Text(Top button bar, stylelabel_style), ftv.VideoSpacer(), ftv.VideoFullscreenButton(icon_colorft.Colors.AMBER), ], bottom_button_bar[ ft.Text(Bottom button bar, stylelabel_style), ftv.VideoSpacer(), ftv.VideoPositionIndicator( text_styleft.TextStyle( size13, colorft.Colors.WHITE, ) ), ftv.VideoVolumeButton( slider_width96, icon_colorft.Colors.AMBER, ), ], ), ), ) ) if __name__ __main__: ft.run(main)示例要点未设置primary_button_bar时使用原生默认布局其中包含VideoSpacertop_button_bar中VideoSpacer()将ft.Text(Top button bar)与全屏按钮分离使全屏按钮右对齐bottom_button_bar中VideoSpacer()在文本标签与进度指示器之间撑开空白避免两者紧贴。使用建议与注意事项对称布局用flex配比需要让按钮组水平居中时仿照默认主按钮栏的做法左右各放一个VideoSpacer(flex2)中间放普通间隔即可获得对称留白。弹性项会共享剩余空间VideoSpacer不占据固定宽度多个VideoSpacer会按flex比例共同分配剩余空间若按钮栏空间紧张间隔会被压缩因此不要把需要固定留白的区域寄托在flex上可改用自定义ft.Container设置固定width。flex建议使用正整数源码类型标注为intFlutter 端解析时若缺失会回退到默认值1见 video.dart使用非正数可能导致间隔不参与分配行为与 FlutterSpacer一致。与自定义 Flet 控件混用三个按钮栏属性primary_button_bar、top_button_bar、bottom_button_bar的类型均为list[Union[ft.Control, VideoBarItem]]因此VideoSpacer既可以与内置按钮项搭配也可以与任意ft.Control如ft.Text、ft.Icon混合布局。用空列表隐藏按钮栏将对应按钮栏属性设为[]可隐藏该栏设为None则使用上述内置默认布局默认布局本身包含VideoSpacer。总结VideoSpacer是flet-video按钮栏布局中不可或缺的弹性空白工具通过单一flex参数即可控制间隔在剩余空间中的分配权重。它在 Python 端由 types.py 定义、在 Flutter 端映射为原生Spacerwidget并已内置于MaterialVideoControls与MaterialDesktopVideoControls的多套默认按钮栏中。掌握了VideoSpacer的用法你就能像仓库示例 button_bars/main.py 那样自由拼装出左中右对齐、留白均匀的自定义视频控制栏。赞分享前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载相关推荐Flet AppBar 控件实战指南从工具栏布局到主题定制Flet AppBar 控件实战指南从工具栏布局到主题定制 AppBar应用栏是 Flet 中基于 Material Design 的核心导航控件负责承前端跨平台桌面应用移动开发Flet flet-video 的 VideoBarItem 详解内置视频控制条按钮项的定制与布局实战Flet flet video 的 VideoBarItem 详解内置视频控制条按钮项的定制与布局实战 导读 VideoBarItem 是 Flet flet前端跨平台桌面应用移动开发Flet 布局核心控件 Column 完全指南垂直布局、对齐、间距与滚动Flet 布局核心控件 Column 完全指南垂直布局、对齐、间距与滚动 Column 是 Flet 中最基础的布局控件之一它把子控件沿垂直方向依次排列并前端跨平台桌面应用移动开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考