19
社区成员




import flet as ft
import math
import asyncio
# 定义8字舞路径的函数
def figure_eight_path(t, radius):
"""计算8字形舞路径的坐标"""
x = radius * math.sin(t * 2 * math.pi) # X 坐标变化
y = radius * math.sin(t * 4 * math.pi) / 2 # Y 坐标变化
return x, y
async def main(page: ft.Page):
# 创建蝴蝶的图片控件
butterfly_image = ft.Image(
src="hudie.png", # 确保路径正确
width=100,
height=100,
)
# 创建用于显示蝴蝶的容器
container = ft.Container(
content=butterfly_image,
alignment=ft.alignment.center,
width=100,
height=100,
)
# 创建堆栈以绝对定位容器
stack = ft.Stack(
controls=[container],
width=400,
height=400,
)
page.add(stack)
duration = 5000 # 动画持续时间
steps = 300 # 动画步数
radius = 100 # 8字舞的半径
# 运行动画
while True:
await animate_butterfly(page, container, steps, duration, radius)
async def animate_butterfly(page, container, steps, duration, radius):
for t in range(steps + 1):
progress = t / steps
x, y = figure_eight_path(progress, radius)
# 更新蝴蝶的位置
container.left = x + 150 # 加上偏移量
container.top = y + 150 # 加上偏移量
# 更新不透明度
opacity = 1 - (t / steps) ** 2
container.opacity = opacity
page.update()
await asyncio.sleep(duration / (steps * 1000)) # 控制帧率
# 运行应用
ft.app(main)
下面是对蝴蝶8字舞路径动画的特色和应用场景的解说:
动态路径:
蝴蝶沿着8字形路径移动,利用数学函数(正弦函数)生成平滑的运动轨迹。这种动态效果使得动画看起来生动而自然。
渐变不透明度:
蝴蝶的透明度随着时间的推移而变化,采用了平方函数的渐变方式,使得蝴蝶在动画开始时逐渐显现,结束时逐渐消失。这种效果增加了视觉的层次感和美感。
简单易用的实现:
使用 Flet 库,代码结构清晰,易于理解和修改。即使是初学者也能快速上手,进行二次开发或功能扩展。
可定制性:
动画的持续时间、步数和路径半径都可以轻松调整,允许开发者根据需求进行个性化设置。
教育和学习:
该动画可以用于教育场景,帮助学生理解数学中的周期性函数和图形运动。通过可视化的方式,学生能够更好地掌握相关概念。
游戏开发:
在游戏中,类似的动画可以用于角色的移动效果,增加游戏的趣味性和互动性。蝴蝶的动画可以作为游戏中的特效,吸引玩家的注意。
艺术展示:
该动画可以用于艺术作品的展示,作为数字艺术的一部分。通过动态效果,增强观众的视觉体验。
用户界面设计:
在应用程序或网站中,使用类似的动画可以提升用户体验,使界面更加生动和吸引人。蝴蝶的动画可以作为加载动画或欢迎动画,增加用户的参与感。
活动宣传:
在活动宣传中,使用动态效果可以吸引观众的注意力。蝴蝶的动画可以用于宣传海报或视频中,传达轻松愉快的氛围。
这段代码展示了如何使用 Flet 库创建简单而富有表现力的动画效果。通过动态路径和渐变不透明度的结合,动画不仅具有视觉吸引力,还能在多种场景中找到应用。无论是教育、游戏、艺术还是用户界面设计,这种动画都能为用户带来愉悦的体验。
主要功能模块代码解析
路径计算:
def figure_eight_path(t, radius):
"""计算8字形舞路径的坐标"""
x = radius * math.sin(t * 2 * math.pi) # X 坐标变化
y = radius * math.sin(t * 4 * math.pi) / 2 # Y 坐标变化
return x, y
该函数根据给定的时间 t
和半径 radius
计算8字形路径的坐标。x
和 y
坐标通过正弦函数生成,形成8字形的轨迹。
主函数:
async def main(page: ft.Page):
# 创建蝴蝶的图片控件
butterfly_image = ft.Image(
src="hudie.png", # 确保路径正确
width=100,
height=100,
)
在主函数中,创建了一个蝴蝶图像控件,并将其放入一个容器中。容器使用 Stack
控件以支持绝对定位。
动画实现:
async def animate_butterfly(page, container, steps, duration, radius):
for t in range(steps + 1):
progress = t / steps
x, y = figure_eight_path(progress, radius)
# 更新蝴蝶的位置
container.left = x + 150 # 加上偏移量
container.top = y + 150 # 加上偏移量
# 更新不透明度
opacity = 1 - (t / steps) ** 2
container.opacity = opacity
page.update()
await asyncio.sleep(duration / (steps * 1000)) # 控制帧率
该函数负责控制蝴蝶的移动和不透明度变化。通过循环逐步更新蝴蝶的位置和透明度,形成动画效果。
应用运行:
ft.app(main)
最后,调用 ft.app(main)
启动应用程序,显示界面并开始动画。