В настоящее время я создаю настраиваемый элемент управления, который должен обрабатывать анимацию в проекте C#. По сути, это список, содержащий фиксированное количество элементов, которые могут быть перемещены. Элемент (другой пользовательский элемент управления с фоновым изображением и парой сгенерированных меток) может перемещаться вверх, вниз или быть удаленным из списка.
Я хотел бы создать анимированное движение, когда элементы перемещаются внутри настраиваемого элемента управления контейнера, но мне кажется, что перемещение элементов управления с помощью таких строк, как
myCustomControl.left -= m_iSpeed;срабатывает в событии таймера, мерцает и имеет ужасный рендеринг, даже при включенной двойной буферизации.
Итак, вот вопрос: Как лучше всего создать анимированный элемент управления C# без мерцания? Должен ли я просто не создавать настраиваемые элементы управления и обрабатывать весь рисунок в фоновом изображении панели, которое я генерирую? Есть ли метод супер-анимации, который я не обнаружил? :)
Спасибо!
Он упоминает C#, поэтому я думаю, что мы, скорее всего, говорим о .Net Windows Forms. Я думаю, что DoubleBuffering - это ответ, но сейчас я не вспоминаю подробностей.
Правильно, я использую стандартные формы Windows .net.





Аналогичное обсуждение этого вопроса состоялось сегодня утром. Визуальное обновление формы C# приводит к мерцанию., так что я буду ленив и дам тот же ответ, что и там:
Вы можете попытаться вызвать this.SuspendLayout (); перед тем, как начать движение, и this.ResumeLayout (ложь);, когда вы закончите перемещение всех элементов управления. Таким образом, все элементы управления должны отображаться одновременно, и мерцание должно быть меньше.
Кстати, я пытался воспроизвести это здесь на работе, но, похоже, у меня ничего не вышло. Не могли бы вы привести еще несколько примеров кода, которые я могу исправить?
Обычный способ получить анимацию без мерцания - реализовать двойную буферизацию. Взгляните на эту статью Code Project
http://www.codeproject.com/KB/GDI-plus/flickerFreeDrawing.aspx
Сведение к минимуму вызовов рисования до тех пор, пока вы не будете готовы, также является хорошей идеей.
Лучше всего для анимации без мерцания рисовать самостоятельно (использовать объект Graphics в обработчике событий Paint) и использовать двойную буферизацию. В вашем настраиваемом элементе управления вам понадобится такой код в конструкторе:
this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor,
true);
Какой набор инструментов GUI вы используете?