Сведения о вопросе

LARVION

09:43, 23rd August, 2020

Теги

.net   winforms   animation    

Простая анимация в WinForms

Просмотров: 554   Ответов: 3

Представьте, что вы хотите анимировать какой-то объект на WinForm. Вы настраиваете таймер для обновления состояния или модели и переопределения события рисования формы. Но с этого момента, каков лучший способ постоянно перекрашивать форму для анимации?

  • Аннулировать форму, как только вы закончите рисовать?
  • Установить второй таймер и аннулировать форму на регулярной основе?
  • Может быть, в этом деле есть какая-то общая закономерность?
  • Есть ли какие-нибудь полезные классы .NET, чтобы помочь?

Каждый раз, когда мне нужно это сделать, я обнаруживаю новый метод с новым недостатком. Каковы опыт и рекомендации сообщества SO?



  Сведения об ответе

ЯЯ__4

09:36, 8th August, 2020

Я создал библиотеку, которая может помочь в этом. Это называется переходы, и их можно найти здесь: http://code.google.com/p/dot-net-transitions/

Он использует таймеры, работающие в фоновом потоке, чтобы анимировать объекты. Библиотека с открытым исходным кодом, так что если она вам пригодится, вы можете посмотреть на код, чтобы увидеть, что он делает.


  Сведения об ответе

prince

13:13, 28th August, 2020

В некоторых ситуациях быстрее и удобнее не рисовать с помощью события paint, а получать графический объект из элемента управления / формы и рисовать "on". Это может дать некоторые проблемы с непрозрачностью / сглаживанием / текстом и т. д., Но может стоить проблем с точки зрения отсутствия необходимости перекрашивать весь шабанг. Что-то в этом роде ... :

private void AnimationTimer_Tick(object sender, EventArgs args)
{
    // First paint background, like Clear(Control.Background), or by
    // painting an image you have previously buffered that was the background.
    animationControl.CreateGraphics().DrawImage(0, 0, animationImages[animationTick++])); 
}

Я сам использую это в некоторых элементах управления и буферизую изображения для "clear" фона, когда объект интереса перемещается или должен быть удален.


  Сведения об ответе

ASER

04:00, 1st August, 2020

То, что вы делаете, - это единственное решение, которое я когда-либо использовал в WinForms (таймер с постоянными перерисовками). Существует множество методов, которые можно использовать, чтобы сделать работу пользователя с ним более плавной (например, двойная буферизация).

Возможно, вы захотите попробовать WPF. Есть встроенные средства для выполнения анимации в WPF, и они гораздо более гладкие (и требуют меньше кода и никакой синхронизации с вашей стороны), чем решение на основе таймера.

Обратите внимание, что вам не нужно использовать WPF во всем вашем приложении для этого решения; можно упаковать эту функциональность в элемент управления WPF и встроить элемент управления в приложение WinForms (или неуправляемое приложение, если на то пошло):

http://www.codeproject.com/KB/WPF/WPF_UserControls.aspx


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться