Delphi 11 FMX中同时修改Left和Width时如何避免窗体抖动?
解决Delphi 11 FMX窗体同时调整Left和Width时的抖动问题
在FMX中直接修改Left和Width属性会触发两次独立的窗口更新,导致视觉上的抖动。以下是几种可行的解决方法:
方法1:临时禁用绘制+SetBounds
通过禁用窗体绘制,一次性完成尺寸和位置的修改,再恢复绘制并强制重绘,避免中间状态的显示:
procedure TForm1.tmr1Timer(Sender: TObject); begin if Left < 50 then begin tmr1.Enabled := False; Exit; end; DisableDrawing(Self); try SetBounds(Left - 10, Top, Width + 10, Height); finally EnableDrawing(Self); Repaint; end; end;
方法2:锁定窗体更新
使用FMX控件的Lock/Unlock方法阻止中间布局更新,确保属性修改完成后再统一刷新:
procedure TForm1.tmr1Timer(Sender: TObject); begin if Left < 50 then begin tmr1.Enabled := False; Exit; end; Lock; try Left := Left - 10; Width := Width + 10; finally Unlock; UpdateLayout; end; end;
方法3:使用FMX自带动画组件(最优解)
既然目标是平滑缩放,直接利用FMX的TAnimator组件实现同步动画,动画系统会自动处理帧同步,彻底消除抖动:
- 在窗体上添加
TAnimator组件(命名为Animator1) - 修改定时器代码:
procedure TForm1.tmr1Timer(Sender: TObject); begin if Left <= 50 then begin tmr1.Enabled := False; Exit; end; Animator1.AnimateFloat(Self, 'Left', Left - 10, 0.05); Animator1.AnimateFloat(Self, 'Width', Width + 10, 0.05); end;
这里的0.05是动画时长(单位:秒),可以根据需求调整,确保位置和尺寸变化完全同步。
内容的提问来源于stack exchange,提问作者Domus
相关产品推荐
相关产品推荐

