如何以不同的速度平滑地动画窗口窗体位置?我一直在尝试平滑地为一些窗口窗体位置设置动画,但是如果我希望速度可变,我会遇到一些问题。换句话说,如果我希望用户为动画选择首选速度。我发现以下文章帮助我为我的表单执行我正在寻找的动画。在各方面看起来都比我过去尝试过的BackgroundWorker或Threads方法更好:http://www.vcskicks.com/animated-windows-form.html我现在唯一的问题是如果我想让动画有不同的速度,保持流畅的动画。我的代码中有两个重要的值FPS和PX。FPS表示每秒帧数(除其他外),PX表示移动形式的像素。问题1)对于最流畅的动画,我只想一次移动1px,但我认为我不能随心所欲地移动表格。将FPS值增加到非常高的值似乎没有任何效果,就像有一个限制,超过这个限制,不会有明显的差异。我相信对此有一个很好的解释。我的问题是:你对这个问题有什么好的解决方案,或者唯一的解决方案是更改PX值并将表格移动超过1px,如果我想要更快的移动?问题2)如果上述问题的解决方案是相应地更改PX值,我发现(通过测试不同的值)等于300的FPS值足以满足我的需求,我可以尽快移动表格我需要它。然后,如果我想要10种速度,将桌子移动1、2、3、4、5、6、7、8、9和10个像素,就会像我想要的那样提供缓慢和快速的平滑动画。如果我想要5种速度,我可以使用2、4、6、8、10等。我的问题是:对FPS使用300这样的值有什么问题吗?这样的值会产生不良后果吗?这是我当前的代码:publicpartialclassForm1:Form{booldir=true;publicForm1(){InitializeComponent();位置=新点(1280/2-宽度,800/2-高度/2);}privatevoidbutton1_Click(objectsender,EventArgse){doubleFPS=300;intPX=1;长lastTicks=0;长currentTicks=0;双间隔=(double)Stopwatch.Frequency/FPS;while(dir?Left=1280/2-Width){Application.DoEvents();currentTicks=Stopwatch.GetTimestamp();if(currentTicks>=lastTicks+interval){lastTicks=Stopwatch.GetTimestamp();this.Location=newPoint(dir?Left+PX:Left-PX,Top);这个。无效();//刷新表单}Thread.Sleep(1);//释放CPU}dir=!dir;注意:这只是示例代码,用于测试目的,不是真正的代码,但如果你想指出一些非常重要的事情,在将它移植到实际应用程序时应该考虑,请成为我的访客。试试我之前建议的这个实现(不考虑FPS):publicpartialclassForm1:Form{privateboolgo;私人intdx=1;publicForm1(){InitializeComponent();}protectedoverridevoidOnPaint(PaintEventArgse){base.OnPaint(e);if(go){this.Location=newPoint(this.Location.X+dx,this.Location.Y);如果(Location.X1200){go=false;dx=-dx;}else{this.Invalidate();}}}privatevoidbutton1_Click(objectsender,EventArgse){go=true;这个。无效();我认为您可能需要超越winforms以获得更高的FPS。我认为Windows会限制重绘率,所以如果您将FPS提高到疯狂的值,那没关系;如果你想看到更高的帧率,你可能需要像XNA/DirectX动画这样的东西。您可以使用计时器,并编写一个经过的事件处理程序,该处理程序将移动表单并使表单无效。为此,您不必执行Thread.Sleep或使用最后一次报价和间隔计算进行簿记,这将以常规节奏完成。此外,您可以在想要更改方向时取反PX值,而不是围绕“dir”布尔值的条件代码(并且只做加法而不是dir上的三元运算符);这是可能的,因为减法与加法相同负数相同。这应该可以更轻松地扩展您的动画来做其他事情。为了好玩,您还可以创建一个垂直移动的PY。不管怎样,我希望你玩得开心。?如果你用300的FPS值得到你想要的结果,那么我会坚持下去。WinForms对每秒帧数的概念与图形密集型视频游戏不同,因此高值不会成为问题。这里的FPS值只是调整代码执行的频率。超级矫枉过正解决方案摘要:动画移动窗口,然后播放它(可能是全屏)详细信息:假设您的窗口是100x100,并且是@0,0屏幕截图,屏幕显示:(0,0)-(200,200)。使用描述将窗口从0,0移动到100,100的屏幕截图创建一个剪辑,然后创建一个无边界窗口(0,0)-(200,200)并在其上放置一个视频播放器并重播窗口移动到其中的动画。不用说,您的窗口将是静态的。但是你可以获得最好的动画。您甚至可以为移动窗口添加一些效果,例如矩阵中的子弹或Necromunga飞船。以上就是C#学习教程:如何以不同的速度平滑地动画化WindowsForms的位置?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
