使用Flet自主创新实现的圆形水波涌动进度条自定义模板

传奇开心果编程
优质创作者: python技术领域
2024-10-27 17:05:40

img

一、示例代码


import flet as ft

def main(page: ft.Page):
    page.title = "圆形波浪进度条"
    page.vertical_alignment = ft.MainAxisAlignment.CENTER

    wave_color = ft.colors.LIGHT_BLUE

    large_wave = ft.Container(
        width=200,  # 调整为与容器相同的宽度
        height=200,  # 调整为与容器相同的高度
        bgcolor=wave_color,
        border_radius=100,  # 调整为与容器相同的半径
        offset=ft.Offset(-0.20, 0.95),  # 初始位置
        animate_offset=ft.Animation(500, "easeInOut"),
    )

    small_wave = ft.Container(
        width=3040,  # 保持增大的宽度
        height=3040,  # 保持增大的高度
        bgcolor=wave_color,
        border_radius=1520,  # 保持增大的半径
        offset=ft.Offset(0.30, 1.05),  # 初始位置
        animate_offset=ft.Animation(500, "easeInOut"),
    )

    text = ft.Text(
        "0%",
        size=30,
        weight=ft.FontWeight.BOLD,
        color=ft.colors.WHITE,
    )

    container = ft.Container(
        width=200,  # 保持不变
        height=200,  # 保持不变
        border_radius=100,  # 保持不变
        bgcolor=ft.colors.GREY_200,
        border=ft.Border(
            left=ft.BorderSide(5, wave_color),
            top=ft.BorderSide(5, wave_color),
            right=ft.BorderSide(5, wave_color),
            bottom=ft.BorderSide(5, wave_color),
        ),
        alignment=ft.alignment.center,
        clip_behavior=ft.ClipBehavior.HARD_EDGE,  # 限制波浪在圆圈内
        content=ft.Stack(
            [
                large_wave,
                small_wave,
                ft.Container(
                    content=text,
                    alignment=ft.alignment.center
                ),
            ]
        ),
    )

    def update_wave(value):
        # 更新波浪位置
        x_offset_adjustment = 0.2 * (value / 100)  # 100%时右移200个单位
        y_offset_adjustment = 0.050 * (value / 100)  # 100%时下移5.0个单位
        large_wave.offset = ft.Offset(-0.20 + x_offset_adjustment, 0.95 - value / 100 + y_offset_adjustment)
        small_wave.offset = ft.Offset(0.30 + x_offset_adjustment, 1.05 - value / 100 * 1.2 + y_offset_adjustment)
        text.value = f"{int(value)}%"
        page.update()

    slider = ft.Slider(
        min=0,
        max=100,
        value=0,
        on_change=lambda e: update_wave(e.control.value),
    )

    page.add(container, slider)

ft.app(target=main)

二、特色说明

该示例展示了如何使用 Flet 库创建一个带有动态波浪效果的圆形进度条。以下是该示例的一些特色说明:

  1. 动态波浪效果

    • 使用两个 ft.Container 组件来模拟波浪效果,分别为 large_wavesmall_wave
    • 通过调整 offset 属性来实现波浪的移动效果,animate_offset 属性用于平滑动画。
  2. 进度条更新

    • 使用 ft.Slider 组件来控制进度条的值。
    • update_wave 函数根据滑块的值动态更新波浪的位置和文本显示的百分比。
  3. 自定义样式

    • 进度条的背景颜色、边框颜色和波浪颜色均可自定义。
    • 使用 ft.Borderft.BorderSide 来设置进度条的边框样式。
  4. 动画效果

    • ft.Animation 用于控制波浪移动的动画效果,设置了动画的持续时间和缓动函数。
  5. 布局和对齐

    • 使用 ft.Stack 组件将波浪和文本叠加在一起,实现层叠效果。
    • ft.Containeralignment 属性用于控制内容的对齐方式。
  6. 响应式设计

    • 通过调整 offsetborder_radius 等属性,确保波浪在不同进度下都能正确显示在圆形进度条内。

这个示例展示了如何结合 Flet 的组件和动画功能,创建一个具有视觉吸引力的动态进度条。

...全文
493 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
1. **动态波浪效果**: - 使用两个 `ft.Container` 组件来模拟波浪效果,分别为 `large_wave` 和 `small_wave`。 - 通过调整 `offset` 属性来实现波浪的移动效果,`animate_offset` 属性用于平滑动画。 2. **进度条更新**: - 使用 `ft.Slider` 组件来控制进度条的值。 - `update_wave` 函数根据滑块的值动态更新波浪的位置和文本显示的百分比。 3. **自定义样式**: - 进度条的背景颜色、边框颜色和波浪颜色均可自定义。 - 使用 `ft.Border` 和 `ft.BorderSide` 来设置进度条的边框样式。 4. **动画效果**: - `ft.Animation` 用于控制波浪移动的动画效果,设置了动画的持续时间和缓动函数。 5. **布局和对齐**: - 使用 `ft.Stack` 组件将波浪和文本叠加在一起,实现层叠效果。 - `ft.Container` 的 `alignment` 属性用于控制内容的对齐方式。 **视觉原理:** 1. **圆形裁剪**:只显示圆形区域内的波浪部分 2. **波浪叠加**:两个不同大小的圆形叠加产生波浪边缘 3. **相对运动**:两个波浪以不同速度移动产生动态效果 关键技术要点总结 1. **相对定位系统**:使用 `ft.Offset` 的相对坐标系统 2. **圆形裁剪**:`clip_behavior` 确保 6. **响应式设计**: - 通过调整 `offset` 和 `border_radius` 等属性,确保波浪在不同进度下都能正确显示在圆形进度条内。 这个示例展示了如何结合 Flet 的组件和动画功能,创建一个具有视觉吸引力的动态进度条
## 项目特色 ### 视觉效果 - **双层波浪设计**:大浪花和小浪花叠加,创造丰富的视觉层次 - **动态颜色搭配**:深色波浪在上层,浅色波浪在下层,形成自然的视觉深度 - **流畅动画效果**:波浪随着进度值动态上升,100%时完全覆盖圆圈 - **交互式浮动动画**:大浪花和小浪花以相反方向浮动,增强动态感 ### 技术特点 - **精确的动画控制**:在0%和100%时自动禁用浮动动画,保持稳定状态 - **自适应布局**:使用Flet的布局系统实现响应式设计 - **圆形容器裁剪**:通过clip_behavior确保波浪效果严格限制在圆形区域内 - **实时进度反馈**:通过滑块实时控制进度值,直观展示进度变化 ### 动画逻辑 - **进度驱动**:波浪高度随进度值线性增长,从底部逐渐填充到顶部 - **智能浮动**:中间进度时波浪以相反方向浮动,边界状态(0%和100%)时保持静止 - **层次分明**:大浪花浮动幅度较大(0.08),小浪花浮动幅度较小(0.02) ## 应用场景 - 数据加载进度指示器 - 仪表盘数据可视化 - 用户界面进度反馈 - 游戏血量/能量条显示 - 文件上传/下载进度展示 ## 波浪动画特性 - **早期入场**:波浪在1%进度时就开始进入圆圈,提供即时视觉反馈 - **循序渐进**:波浪随进度值线性上升,从底部逐渐填充到顶部 - **完全覆盖**:在100%进度时波浪完全充满圆圈内部 - **智能浮动**:中间进度时波浪以相反方向浮动,边界状态(0%和100%)时保持静止 **视觉原理:** 1. **圆形裁剪**:只显示圆形区域内的波浪部分 2. **波浪叠加**:两个不同大小的圆形叠加产生波浪边缘 3. **相对运动**:两个波浪以不同速度移动产生动态效果 用Flet框架构建的具有动态波浪效果的圆进度球
### 应用场景介绍 该代码示例使用了 Flet 框架来创建一个带有圆形头像和自适应徽章全局字体设置的用户界面。具体应用场景可以是社交平台、即时通讯工具、用户管理系统等需要展示用户头像和状态的地方。通过这个模板,开发者可以快速实现一个美观且功能丰富的用户头像显示组件。 ### 特色说明 1. **全局字体设置**: - 使用 `ft.Theme(font_family="仿宋")` 设置了页面的全局字体为“仿宋”,确保整个页面的文字风格一致。 2. **圆形头像**: - 通过 `ft.Container` 和 `ft.Image` 组件创建了一个圆形头像。 - 设置了 `border_radius=50` 来实现圆形效果,并使用 `fit=ft.ImageFit.COVER` 确保图像完全覆盖容器。 3. **自适应徽章**: - 徽章是一个小型的矩形容器,放置在头像的右上角,用于显示用户的在线状态或其他信息。 - 使用 `ft.Stack` 将头像和徽章组合在一起,通过 `offset` 参数调整徽章的位置,使其精确地定位在头像的指定位置。 - 徽章的大小和内容可以根据实际需求进行调整,例如显示不同的状态文本(如“离线”、“忙碌”等)。 4. **居中对齐**: - 页面的垂直和水平对齐方式都设置为中心 (`page.vertical_alignment = ft.MainAxisAlignment.CENTER` 和 `page.horizontal_alignment = ft.CrossAxisAlignment.CENTER`),确保头像和徽章在页面中央显示。 5. **简洁易扩展**: - 代码结构清晰,易于扩展和修改。例如,可以轻松添加更多的样式或交互功能,如点击头像弹出用户详情等。

19

社区成员

发帖
与我相关
我的任务
社区描述
近期,感兴趣Ant Design Mobile of React、Vant of Vue 、MUI of h5App、WeUI 原生微信小程序和beeware移动应用开发,发布原创博文创建专栏发布动态
androidios微信小程序 个人社区 甘肃省·酒泉市
社区管理员
  • 传奇开心果编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧