QtPropertyAnimation仅修改缩放问题:椭圆动画时伴随位移
解决Animator类椭圆缩放动画的意外平移问题
嘿,我一眼就看出问题出在哪了——你这是缩放动画的时候没锚定椭圆的中心点导致的!默认情况下很多绘图库的缩放是基于元素的左上角(或者原点)计算的,当你把椭圆放大到两倍时,它的位置会跟着“跑”到原坐标的两倍处,缩回去的时候自然就会移回原位,看起来就像同时做了平移。
核心问题原因
当你只修改缩放比例但没固定中心点时,元素的左上角坐标会随着缩放比例同步变化:比如原椭圆左上角在(x,y),缩放2倍后,左上角会变成(2x,2y),这就导致了视觉上的平移。我们要做的是让缩放始终围绕椭圆的中心点进行,同时完全固定中心点的位置。
具体修改方案
根据你提供的Animator类代码片段,我给你两种可行的修改思路:
思路1:手动计算左上角坐标,固定中心点
在Animator初始化时先记录椭圆的原始中心点和尺寸,动画过程中只调整缩放比例,再通过中心点反推左上角坐标,保证中心点不动:
class Animator: def __init__(self, animation_config, num_rows, num_cols, background_colour, parent, user_idx = 0, resolution=None): # 假设这里已经初始化了椭圆的原始属性:original_x/y是左上角坐标,w/h是宽高 self.original_center_x = original_x + original_width / 2 self.original_center_y = original_y + original_height / 2 self.original_width = original_width self.original_height = original_height # 初始状态是双倍大小 self.current_scale = 2.0 def update_animation(self, progress): # progress是0到1的进度值:0对应初始双倍大小,1对应正常大小 self.current_scale = 2.0 - (1.0 * progress) # 根据中心点和当前缩放,计算新的左上角坐标,保证中心点不变 self.ellipse.x = self.original_center_x - (self.original_width * self.current_scale) / 2 self.ellipse.y = self.original_center_y - (self.original_height * self.current_scale) / 2 # 只修改缩放比例,不要碰坐标的其他设置 self.ellipse.scale_x = self.current_scale self.ellipse.scale_y = self.current_scale
思路2:利用绘图库的锚点功能(如果支持)
如果你的绘图库(比如Pygame、Tkinter Canvas)支持设置缩放/变换的锚点,直接把锚点设为椭圆的中心点就行,这样缩放时元素会自动围绕中心点变化,不用手动计算坐标:
# 以Tkinter Canvas为例,假设你用create_oval创建了椭圆 def update_animation(self, progress): current_scale = 2.0 - (1.0 * progress) # 找到椭圆的ID,用scale方法把锚点设为中心点 self.canvas.scale(self.ellipse_id, self.original_center_x, self.original_center_y, current_scale, current_scale) # 注意:如果是逐帧更新,可能需要先重置缩放再应用新值,避免累积错误
关键注意事项
- 动画过程中绝对不要修改椭圆的中心点坐标,所有位置调整都要围绕固定的中心点来做
- 确保只修改
scale_x和scale_y(或者对应的缩放参数),不要触碰位置坐标的直接赋值(除非是为了计算中心点锚定的左上角)
内容的提问来源于stack exchange,提问作者pvnda
相关产品推荐
相关产品推荐

