Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Плавная анимация WinForms / C#

#c_sharp #winforms


День добрый. Подскажите, как на WinForms сделать плавную анимацию, желательно с управлением
ее скорости.
Код, который я использую для анимации:

animBW.DoWork += delegate(object sender, DoWorkEventArgs e) {
    while (true) {
        int width = panel1.Width;
        //Random r = new Random();

        if (width < this.Width) {
            int newwidth = width++;
            setWidth(newwidth);
            Thread.Sleep(1);
        } else {
            break;
        }
    }
};


Но при Thread.Sleep(1) анимация слишком медленная, да и зависит от размера объекта.
(больше объект => больше ждать, это понятно)

При отсутствии паузы анимация вовсе не видна.

Подскажите, как сделать анимацию независимой от размера блока и более быстрой?
    


Ответы

Ответ 1



Я советую использовать класс System.Windows.Forms.Timer для таких целей. Создайте таймер, задайте интервал в миллисекундах через который будет генерироваться событие Tick. Событию присвойте обработчик, в котором накапливайте число шагов (например в статическую переменную). Если оно превысило нужное вам, то останавливайте таймер. Пример кода вам в помощь. private void mainForm_Click(object sender, EventArgs e) { Timer timer = new Timer(); timer.Interval = 30; // каждые 30 миллисекунд int count = 0; int max = 10; Graphics g = this.CreateGraphics(); g.Clear(Color.White); int x = 10; int y = 10; g.DrawEllipse(Pens.Black, x, y, 10, 10); timer.Tick += new EventHandler((o, ev) => { x += 5; y += 5; g.Clear(Color.White); g.DrawEllipse(Pens.Black, x, y, 10, 10); count++; if (count == max) { Timer t = o as Timer; // можно тут просто воспользоваться timer t.Stop(); } }); timer.Start(); // запустили, а остановится он сам } Этот код по клику двигает кружок на пустой форме. Если вы хотите, например, всегда за 1 секунду рисовать анимацию, то соответсвенно берите всегда интервал, скажем, 10 миллисекунд и 100 шагов, а параметры изображения меняйте на 1/100 от общего изменения (разность между началом и концом анимации) за каждый шаг. Можно еще снижать частоту перерисовки для маленьких объектов, но это уже на ваше усмотрение.

Ответ 2



От мерцания защитит Double Buffering, для плавности используют Multimedia Timers(Windows API).

Комментариев нет:

Отправить комментарий