You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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组件实现同步动画,动画系统会自动处理帧同步,彻底消除抖动:

  1. 在窗体上添加TAnimator组件(命名为Animator1)
  2. 修改定时器代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 13:10:27