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

关于Delphi Skia库TSkAnimatedPaintBox组件Duration属性的用途问询

TSkAnimatedPaintBox的Duration属性:作用、机制及无变化问题解析

一、Duration属性的实际作用

  • Duration是单次完整动画周期的时长(单位:毫秒),用来定义动画从起始状态到结束状态的总耗时,是Skia动画计算帧进度的核心参数。
  • 注意:这个属性不会自动让组件产生动画,必须在你的绘制逻辑里主动使用它对应的进度值才会生效。

二、工作机制

  1. 组件启动动画后,内部计时器开始累计时间
  2. 每帧绘制时,自动计算当前动画进度:Progress = 已流逝时间 / Duration
  3. 这个Progress值会传到OnDraw事件的AProgress参数里,你需要在绘制代码中用这个值来更新画面状态(比如移动元素、改变大小/透明度)
  4. 当累计时间达到Duration时,如果Loop设为True,进度重置为0继续循环;如果Loop为False,动画直接停止

三、为什么设置不同Duration值没差异?

你看不到变化的根本原因是你的绘制逻辑没用到AProgress参数。如果OnDraw里的代码是固定绘制静态内容,完全不依赖这个进度值,那不管Duration设成1000还是100000,画面都不会有任何动态变化——因为组件的动画驱动和你的绘制逻辑没关联上。

给你个能看到差异的简单示例:

procedure TForm1.SkAnimatedPaintBox1Draw(Sender: TObject; const ACanvas: ISkCanvas;
  const ADest: TRectF; const AProgress: Single);
var
  LCirclePos: TPointF;
begin
  // 根据进度计算圆形位置,实现从左到右移动的动画
  LCirclePos.X := ADest.Left + AProgress * ADest.Width;
  LCirclePos.Y := ADest.Center.Y;
  // 绘制圆形
  ACanvas.DrawCircle(LCirclePos, 50, TSkPaint.Create(TSkColors.DodgerBlue));
end;

这个例子里,Duration设为1000时,圆形1秒内从左移到右;设为100000时,移动速度会慢很多,差异一眼就能看出来。

四、额外注意事项

  • 必须把Animate属性设为True,否则动画根本不会启动
  • Loop属性控制动画是否循环,设为False的话,动画跑完一次周期就停了

内容的提问来源于stack exchange,提问作者Martin Kakhuis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:22:37