Плавные анимации в c# Windows формах - PullRequest
0 голосов
/ 11 марта 2020

Я хочу показать анимацию покадрово (картинка за картинкой) в картинке. У меня есть 42 кадра, и я хочу сделать это очень быстро. Я использовал компонент Timer, но интервал = 1 миллисекунда слишком медленный, и я хотел узнать, есть ли способ сделать быструю анимацию с большим количеством кадров в c# Windows формах (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 Ответ

1 голос
/ 11 марта 2020

Во-первых, ни один из встроенных таймеров не имеет точности 1 мс. Я не повторяю и не копирую мой более старый ответ , но вижу ссылку на высокоточный таймер. Или посмотрите полный исходный код по адресу 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...