我目前正在创建一个需要在C#项目中处理动画的自定义控件。它基本上是一个列表框,其中包含可移动的固定数量的元素。元素(具有背景图像的另一个用户控件和一些生成的标签)可以向上,向下移动或从列表中取出。
我想创建动画移动,因为元素在容器自定义控件中移动,但在我看来,使用诸如
之类的行移动控件myCustomControl.left -= m_iSpeed;
在定时器事件中触发的是flickery并且具有可怕的渲染,即使打开了双缓冲也是如此。
所以这里有一个问题:实现无闪烁动画C#控件的最佳方法是什么?我应该不创建自定义控件并处理面板背景图像中的所有绘图生成?有没有我没有发现的超级动画方法? :)
谢谢!
答案 0 :(得分:3)
无闪烁动画的最佳选择是自己绘画(使用Paint事件处理程序中的Graphics对象)并使用双缓冲。在自定义控件中,您将需要在构造函数中使用以下代码:
this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor,
true);
答案 1 :(得分:1)
今天上午就这个问题进行了类似的讨论。 visual c# form update results in flickering.所以我会懒惰并给出我在那里给出的答案:
您可以尝试在开始移动之前调用 this.SuspendLayout(); ,并在完成所有控件的移动后尝试 this.ResumeLayout(false); 。通过这种方式,所有控件都应该立即绘制,并且您应该减少闪烁。
在旁注中,我试图在工作中重现这一点,但似乎失败了。你能提供一些我可以修复的示例代码吗?
答案 2 :(得分:1)
答案 3 :(得分:0)
获得无闪烁动画的正常方法是实现双缓冲。看看这个Code Project文章
http://www.codeproject.com/KB/GDI-plus/flickerFreeDrawing.aspx
在你准备好之前尽量减少画画的召唤也是一个好主意。