c# - c# Windows 窗体中的平滑动画
问题描述
我想在图片框中逐帧(逐张)显示动画。我有 42 帧,我想让它变得非常快。我使用了 Timer 组件,但间隔 = 1 毫秒太慢了,我想知道是否有任何方法可以在 c# Windows Forms (Visual Studio) 中制作具有大量帧的快速动画。这就是我现在正在使用的
Bitmap[] FelixBanner = new Bitmap[50];
public Form1()
{
InitializeComponent();
for(int i = 1; i <= 42; i++)
FelixBanner[i] = new Bitmap(@"Photos\Felix\" + i + "FB.bmp");
}
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
int k = 1;
private void timer1_Tick(object sender, EventArgs e)
{
if (k == 41)
timer1.Enabled = false;
Felix.Image = FelixBanner[k];
k++;
}
解决方案
首先,没有一个内置定时器具有 1 ms 的精度。我不会重复或复制粘贴我的旧答案,但请参阅高精度计时器的链接。或者在GitHub 上查看完整的源代码。
其次,使用PictureBox
控件进行自定义渲染是一种矫枉过正的做法。除非您使用缩放/拉伸功能,或为其分配动画 GIF,否则您根本不需要它。例如Panel
,使用事件以简单的方式渲染动画会更有效。Paint
您可以这样做:
private void timer1_Tick(object sender, EventArgs e)
{
if (k == 41)
timer1.Enabled = false;
//Felix.Image = FelixBanner[k];
k++;
panelAnimation.Invalidate();
}
void panelAnimation_Paint(object sender, PaintEventArgs e)
{
// make sure "k" is a valid index even after playing the animation because the
// Paint event might be called whenever your form is resized or has to be repaint
var image = FelixBanner[k];
e.Graphics.DrawImage(image, 0, 0, image.Width, image.Height);
}
推荐阅读
- python-3.x - 如何在 python 中使用套接字建立 TCP/IP 连接。我不希望它是本地的,但可以从任何网络上的任何计算机(客户端)访问
- gtk - 如何使用 Vala 从字符串生成 QRCode 图像?
- javascript - Cytoscape.js 复合子节点 addClass 不显示样式
- java - Spring Boot ActiveMQ AWS 部署问题
- java - Java:找不到符号变量
- ios - 有没有办法以编程方式停止 Airplay 并将其重置回 iPhone?
- python - 如何在编辑器中显示或打印大型 python 列表的所有元素
- kubernetes - 无法使用 Traefik 的 IngressRoute CRD 访问 DigitalOcean K8s 上的 Traefik Dashboard 或 K8s 服务
- r - 重新编码多个多变量变量
- java - 为什么 th:field 在 Spring View 中不起作用