【发布时间】:2012-01-14 17:13:57
【问题描述】:
背景
我使用一些 FireMonkey 控件创建了一个 GUI。
- 一些控件是动画的,它们的外观会自动更新。
- 某些控件仅根据用户交互(滑块等)进行更新。
问题
与用户控件的交互会阻止更新动画控件,从而导致动画不连续。
上面视频中的动画控件由 TTimer 组件驱动。使用 FireMonkey 的动画组件时问题仍然存在。
调查
滑块控件在调整时调用 Repaint()。平滑调整滑块将生成密集的 Repaint() 调用流,从而阻止更新其他控件。
怎么办?
在一个控件不断更新时冻结动画不适合我的应用程序。我的第一个想法是将 Repaint() 调用换成类似于 VCL Invalidate() 方法的东西,但是 FireMonkey 没有任何可比的 AFAIK。
这个问题有没有好的解决方法?
【问题讨论】:
-
你试过用一些 TAnimation 后代替换 TTimer 吗?
-
@Torbins:是的,我尝试使用 TFloatAnimation 组件。情况再好不过了。查看 FMX 源代码,TAnimation 组件也由全局 TTimer 对象触发。
-
那么也许是一个单独的线程?但我不确定 FireMonkey 是否是线程安全的。可能不会。
-
所以剩下的唯一一件事是:等到他们在许多其他问题中解决这个问题。有些人甚至将 FireMonkey 称为“技术预览”。
-
@Torbins FireMonkey 代码不受关键部分 AFAIK 的保护,所以我怀疑它不是线程安全的。就像 VCL 一样。覆盖 RePaint 并使用您自己的基于计时器的专用方法怎么样?
标签: delphi firemonkey