Анимации: элементы управления Sliding & Fading в форме C# (winforms)
Я пытаюсь реализовать способ элегантно анимировать (переводить, затухать) элементы управления (возможно, более одного одновременно). Например, предположим, что у меня была картинка в верхнем левом углу и текстовое поле в нижнем правом углу, я бы хотел, чтобы они плавно скользили по окну и менялись местами. Я работал некоторое время, но не придумал ничего, что могло бы достичь этого гладко или легко.
5 ответов
Ознакомьтесь с проектом http://code.google.com/p/dot-net-transitions/ в Google Code. Теперь на Github есть клон . Это также доступно на nuget как dot-net-transitions
, Он поддерживает различные линейные / нелинейные переходы, включая составные переходы, которые можно использовать для более сложных эффектов, таких как пульсации.
Вот рабочий пример, демонстрирующий желаемое поведение:
var pictureBox = new PictureBox
{
ImageLocation = "http://icons2.iconarchive.com/icons/klukeart/summer/128/hamburger-icon.png",
SizeMode = PictureBoxSizeMode.AutoSize
};
var textBox = new TextBox
{
Text = "Hello World",
Location = new Point(140, 140)
};
var form = new Form
{
Controls =
{
textBox,
pictureBox
}
};
form.Click += (sender, e) =>
{
// swap the Left and Top properties using a transition
var t = new Transition(new TransitionType_EaseInEaseOut(1000));
t.add(pictureBox, "Left", textBox.Left);
t.add(pictureBox, "Top", textBox.Top);
t.add(textBox, "Left", pictureBox.Left);
t.add(textBox, "Top", pictureBox.Top);
t.run();
};
form.ShowDialog();
Я рекомендую вам перейти на WPF; это сделало бы это намного легче.
Абсолютно невозможно исчезнуть элементы управления в WinForms; Элементы управления Windows не могут иметь прозрачность.
Самое близкое, что вы можете получить, - визуализировать элемент управления и его область в форме с парой растровых изображений, а затем перекрасить растровые изображения в PictureBox с помощью ColorMatrix.
Для перемещения элементов управления в WinForms вы можете использовать таймер для постепенного изменения Top
и / или Left
Свойства элементов управления и переместить их по форме. Тем не менее, вы получите раздражающее мерцание, которое (AFAIK) невозможно удалить.
Вы могли бы сделать это в WinForms, приложив немало усилий, поэтому мне пришлось бы поддержать рекомендации по использованию WPF (который, по сути, создан именно для такого рода вещей).
Ваше главное препятствие для этого в WinForms заключается в том, что местоположение элемента управления задается целым числом, что означает, что вы не можете установить элемент управления Left
собственность на 45.3425
, например. Это в основном делает плавную анимацию элементов управления (при условии, что вы хотите движение, изменяющее скорости и направления) совершенно невозможной - вы получите неизбежный рывок движения таким образом (я пробовал, насколько я знаю).
Как предложил SLaks, единственный способ сделать это в WinForms - это "подделать" его, сделав "снимки" каждого элемента управления. По сути, вы бы начали с невидимого растрового изображения размером с форму, нарисованного с помощью BackColor формы. Затем вы должны создать "снимки", вызывая DrawToBitmap() для каждого элемента управления, который хотите анимировать, и создать эффект движения, рисуя снимки на холсте (System.Drawing
может рисовать изображения с координатами с плавающей точкой, избегая резких изменений целочисленных местоположений).
Хотя это слишком много, черт побери. Просто используйте WPF.:)
Изменить: я должен отметить, что на самом деле легко сделать что-то подобное в WinForms, если вы не возражаете, что это выглядит ужасно, вяло и любительски. Мои комментарии выше касаются трудностей, связанных с этим.
Я считаю, что этот ответ об использовании встроенного AnimateWindow намного лучше для этой цели: как я могу добавить движущиеся эффекты к своим элементам управления в C#?
Сохраните копию каждого из значений x и y элементов в виде числа с плавающей запятой.
Используйте таймер, и при каждом тике добавляйте значение в верхнюю левую позицию элемента x и y. Вычтите то же значение из нижнего правого элемента х и у.
Убедитесь, что вы используете здесь кэшированные значения с плавающей точкой, в противном случае вы можете получить ошибки округления при перемещении элемента в форме.
Если вы рисуете на любой поверхности, которую используете для изображений / элементов управления, аннулируйте ее для каждого тика.
Должно быть легко-peasy.
Редактировать:
Для прозрачных элементов управления, ознакомьтесь с советами и рекомендациями Боба Пауэлла:
http://www.bobpowell.net/transcontrols.htm
А вот его собственный ответ о том, как сделать полупрозрачные элементы управления:
http://www.mofeel.net/67-microsoft-public-dotnet-framework-windowsforms-controls/4860.aspx