Анимация: элементы управления 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