Анимация: элементы управления Sliding & Fading на форме С# (winforms)
Я пытаюсь реализовать способ анимации (переводить, выцветать) элементы управления (более одного в одно и то же время) изящно. Например, скажем, у меня была фотография в верхнем левом углу и текстовое поле в правом нижнем углу, я бы хотел, чтобы они плавно скользили по окну и переключали места. Я работал некоторое время, но не придумал ничего, что позволяет это плавно или легко.
Ответы
Ответ 1
Просмотрите 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();
Ответ 2
Я рекомендую вам переключиться на WPF; это значительно облегчило бы.
Полностью невозможно вытеснить элементы управления в WinForms; Элементы управления Windows не могут иметь непрозрачность.
Самое близкое, что вы можете получить, это отобразить элемент управления и его область в форме на пару растровых изображений, а затем перечеркнуть растровые изображения в PictureBox с помощью ColorMatrix.
Чтобы скопировать элементы управления в WinForms, вы можете использовать таймер, чтобы постепенно изменять свойства элементов управления Top
и/или Left
и перемещать их по форме. Тем не менее, вы получите раздражающее мерцание, которое (AFAIK) невозможно удалить.
Ответ 3
Вы можете сделать это в WinForms с огромными усилиями, поэтому мне придется поразмыслить над рекомендациями по использованию WPF (который по существу построен именно для такого рода вещей).
Основным препятствием для этого в WinForms является тот факт, что местоположение элемента управления задано целым числом, что означает, что вы не можете установить свойство управления Left
на 45.3425
, например. Это в основном делает плавную анимацию элементов управления (при условии, что вы хотите, чтобы движение, которое меняло скорости и направления), было абсолютно невозможно - вы получите неизбежную рывок движения таким образом (я пробовал, так что знаю).
Как предложил SLaks, единственный способ сделать это в WinForms - это "подделка" его, взяв "моментальные снимки" каждого элемента управления. В принципе, вы начнете с невидимого растрового изображения размером вашей формы, нарисованным с помощью формы BackColor. Затем вы создавали "моментальные снимки", вызывая DrawToBitmap() для каждого элемента управления, который вы хотите оживить, и создаете эффект движения путем рисования снимков на холсте (System.Drawing
может рисовать изображения с координатами с плавающей запятой, избегая подергивания целые местоположения).
Это слишком большая работа. Просто используйте WPF.:)
Изменить: Я должен упомянуть, что на самом деле легко сделать что-то подобное в WinForms, если вы не против, чтобы он выглядел ужасно и рывком и дилетантским. Мои приведенные выше комментарии касаются трудностей, связанных с этим.
Ответ 4
Сохраните копию каждого из значений х и у элементов в качестве поплавка.
Используйте таймер, и при каждом тике добавьте значение в верхний левый элемент x и y. Вычитайте одно и то же значение из нижнего правого элемента x и y.
Убедитесь, что вы используете значения кэшированных значений float, иначе вы можете получить ошибки округления, когда элемент перемещается в форме.
Если вы рисуете на любой поверхности, которую используете для изображений/элементов управления, недействительны для каждого тика.
Должно быть легкомысленным.
Edit:
Для прозрачных элементов управления ознакомьтесь с советами и советами Боба Пауэлла:
http://www.bobpowell.net/transcontrols.htm
И вот его собственный ответ о том, как сделать полупрозрачные элементы управления:
http://www.mofeel.net/67-microsoft-public-dotnet-framework-windowsforms-controls/4860.aspx
Ответ 5
Я считаю, что этот ответ использования встроенного AnimateWindow для этой цели намного лучше:
Как добавить движущиеся эффекты к моим элементам управления на С#?