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

Другие вопросы по тегам