#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).
Комментариев нет:
Отправить комментарий