关于Delphi Skia库TSkAnimatedPaintBox组件Duration属性的用途问询
TSkAnimatedPaintBox的Duration属性:作用、机制及无变化问题解析
一、Duration属性的实际作用
Duration是单次完整动画周期的时长(单位:毫秒),用来定义动画从起始状态到结束状态的总耗时,是Skia动画计算帧进度的核心参数。- 注意:这个属性不会自动让组件产生动画,必须在你的绘制逻辑里主动使用它对应的进度值才会生效。
二、工作机制
- 组件启动动画后,内部计时器开始累计时间
- 每帧绘制时,自动计算当前动画进度:
Progress = 已流逝时间 / Duration - 这个
Progress值会传到OnDraw事件的AProgress参数里,你需要在绘制代码中用这个值来更新画面状态(比如移动元素、改变大小/透明度) - 当累计时间达到
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
相关产品推荐
相关产品推荐

