update:UI部分完成

This commit is contained in:
2025-07-03 21:32:44 +08:00
parent 4b15f0fe70
commit 39e29689ec
16 changed files with 361 additions and 88 deletions

View File

@@ -1,72 +1,167 @@
from PySide6.QtCore import (QPropertyAnimation, QSequentialAnimationGroup,
QParallelAnimationGroup, QPoint, QEasingCurve)
from PySide6.QtCore import (QPropertyAnimation, QParallelAnimationGroup,
QPoint, QEasingCurve, QTimer)
from PySide6.QtWidgets import QGraphicsOpacityEffect
class LogoAnimations:
class MultiStageAnimations:
def __init__(self, ui):
self.ui = ui
self.logos = [
ui.vol1bg, ui.vol2bg, ui.vol3bg,
ui.vol4bg, ui.afterbg
# 获取画布尺寸
self.canvas_width = ui.centralwidget.width()
self.canvas_height = ui.centralwidget.height()
# 动画时序配置
self.animation_config = {
"logo": {
"delay_after": 800 # Logo动画完成后等待300ms
},
"mainbg": {
"delay_after": 200 # 主背景淡入完成后等待200ms
}
}
# 第一阶段Logo动画配置
self.logo_widgets = [
{"widget": ui.vol1bg, "delay": 0, "duration": 500, "end_pos": QPoint(0, 120)},
{"widget": ui.vol2bg, "delay": 80, "duration": 500, "end_pos": QPoint(0, 180)},
{"widget": ui.vol3bg, "delay": 160, "duration": 500, "end_pos": QPoint(0, 240)},
{"widget": ui.vol4bg, "delay": 240, "duration": 500, "end_pos": QPoint(0, 300)},
{"widget": ui.afterbg, "delay": 320, "duration": 500, "end_pos": QPoint(0, 360)}
]
self.animation_group = None
# 第二阶段:菜单元素
self.menu_widgets = [
{"widget": ui.menubg, "end_pos": QPoint(710, 0), "duration": 600},
{"widget": ui.pushButton, "end_pos": QPoint(780, 250), "duration": 600},
{"widget": ui.pushButton_2, "end_pos": QPoint(780, 340), "duration": 600}
]
self.animations = []
self.timers = []
def initialize(self):
"""初始化所有logo的状态透明且位于屏幕外"""
for logo in self.logos:
# 保存原始位置
logo.original_pos = logo.pos()
# 设置透明度效果
opacity_effect = QGraphicsOpacityEffect(logo)
logo.setGraphicsEffect(opacity_effect)
opacity_effect.setOpacity(0)
# 移动到屏幕左侧外
logo.move(-logo.width(), logo.y())
"""初始化所有组件状态"""
# 设置Mainbg初始状态
effect = QGraphicsOpacityEffect(self.ui.Mainbg)
effect.setOpacity(0)
self.ui.Mainbg.setGraphicsEffect(effect)
# 初始化Logo位置移到左侧外
for item in self.logo_widgets:
widget = item["widget"]
effect = QGraphicsOpacityEffect(widget)
effect.setOpacity(0)
widget.setGraphicsEffect(effect)
widget.move(-widget.width(), item["end_pos"].y())
widget.show()
# 初始化菜单元素(底部外)
for item in self.menu_widgets:
widget = item["widget"]
effect = QGraphicsOpacityEffect(widget)
effect.setOpacity(0)
widget.setGraphicsEffect(effect)
widget.move(widget.x(), self.canvas_height + 100)
widget.show()
def create_animation_sequence(self):
"""创建顺序动画序列"""
self.animation_group = QSequentialAnimationGroup()
def start_logo_animations(self):
"""启动Logo动画序列"""
for item in self.logo_widgets:
timer = QTimer()
timer.setSingleShot(True)
timer.timeout.connect(
lambda w=item["widget"], d=item["duration"], pos=item["end_pos"]:
self.animate_logo(w, pos, d)
)
timer.start(item["delay"])
self.timers.append(timer)
def animate_logo(self, widget, end_pos, duration):
"""执行单个Logo动画"""
anim_group = QParallelAnimationGroup()
# 为每个logo创建动画延迟递增
delays = [0, 50, 100, 150, 200] # 每个动画的延迟时间(ms)
# 位置动画
pos_anim = QPropertyAnimation(widget, b"pos")
pos_anim.setDuration(duration)
pos_anim.setStartValue(QPoint(-widget.width(), end_pos.y()))
pos_anim.setEndValue(end_pos)
pos_anim.setEasingCurve(QEasingCurve.OutBack)
for i, logo in enumerate(self.logos):
# 创建并行动画组(位置+透明度)
parallel_group = QParallelAnimationGroup()
# 透明度动画
opacity_anim = QPropertyAnimation(widget.graphicsEffect(), b"opacity")
opacity_anim.setDuration(duration)
opacity_anim.setStartValue(0)
opacity_anim.setEndValue(1)
anim_group.addAnimation(pos_anim)
anim_group.addAnimation(opacity_anim)
# 最后一个Logo动画完成后添加延迟
if widget == self.logo_widgets[-1]["widget"]:
anim_group.finished.connect(
lambda: QTimer.singleShot(
self.animation_config["logo"]["delay_after"],
self.start_mainbg_animation
)
)
anim_group.start()
self.animations.append(anim_group)
def start_mainbg_animation(self):
"""启动主背景淡入动画"""
main_anim = QPropertyAnimation(self.ui.Mainbg.graphicsEffect(), b"opacity")
main_anim.setDuration(800)
main_anim.setStartValue(0)
main_anim.setEndValue(1)
main_anim.finished.connect(self.start_menu_animations)
main_anim.start()
self.animations.append(main_anim)
def start_mainbg_animation(self):
"""启动主背景淡入动画(带延迟)"""
main_anim = QPropertyAnimation(self.ui.Mainbg.graphicsEffect(), b"opacity")
main_anim.setDuration(800)
main_anim.setStartValue(0)
main_anim.setEndValue(1)
main_anim.finished.connect(
lambda: QTimer.singleShot(
self.animation_config["mainbg"]["delay_after"],
self.start_menu_animations
)
)
main_anim.start()
self.animations.append(main_anim)
def start_menu_animations(self):
"""启动菜单动画(从下往上)"""
for item in self.menu_widgets:
anim_group = QParallelAnimationGroup()
# 位置动画(从左侧滑入
pos_anim = QPropertyAnimation(logo, b"pos")
pos_anim.setDuration(800)
pos_anim.setStartValue(QPoint(-logo.width(), logo.y()))
pos_anim.setEndValue(logo.original_pos)
# 位置动画(从下往上
pos_anim = QPropertyAnimation(item["widget"], b"pos")
pos_anim.setDuration(item["duration"])
pos_anim.setStartValue(QPoint(item["end_pos"].x(), self.canvas_height + 100))
pos_anim.setEndValue(item["end_pos"])
pos_anim.setEasingCurve(QEasingCurve.OutBack)
# 透明度动画(淡入)
opacity_anim = QPropertyAnimation(logo.graphicsEffect(), b"opacity")
opacity_anim.setDuration(800)
# 透明度动画
opacity_anim = QPropertyAnimation(item["widget"].graphicsEffect(), b"opacity")
opacity_anim.setDuration(item["duration"])
opacity_anim.setStartValue(0)
opacity_anim.setEndValue(1)
parallel_group.addAnimation(pos_anim)
parallel_group.addAnimation(opacity_anim)
# 添加延迟(使动画按顺序触发)
if delays[i] > 0:
delay_anim = QPropertyAnimation(logo, b"pos")
delay_anim.setDuration(delays[i])
self.animation_group.addAnimation(delay_anim)
self.animation_group.addAnimation(parallel_group)
return self.animation_group
anim_group.addAnimation(pos_anim)
anim_group.addAnimation(opacity_anim)
anim_group.start()
self.animations.append(anim_group)
def start_animations(self):
"""启动完整动画序列"""
self.clear_animations()
self.start_logo_animations()
def start_animation(self):
"""启动动画序列"""
self.initialize()
self.create_animation_sequence()
self.animation_group.start()
def stop_animation(self):
"""停止动画"""
if self.animation_group:
self.animation_group.stop()
def clear_animations(self):
"""清理所有动画资源"""
for timer in self.timers:
timer.stop()
for anim in self.animations:
anim.stop()
self.timers.clear()
self.animations.clear()