Как нарисовать анимированный текст в C#

Обратите внимание, что результат в исполняемом файле лучше, чем результат, предоставляемый GIF справа. GIF немного отрывистый, потому что он использует только 20 кадров вместо 200, используемых программой.

В этом примере показано, как нарисовать анимированный текст, чтобы буквы в слове двигались медленно, эффект, иногда используемый в фильмах. Программа рисует текст в PictureBox. Когда он запускается, программа использует следующий код для записи некоторой информации о текущих и конечных размерах элементов управления PictureBox.

// Текущий размер PictureBox.
private float StartWidth;
private int StartHeight;
private float EndWidth = 260;
private float Dx, CurrentWidth;
private int TicksToGo, TotalTicks;

// Информация о строке для рисования.
private const string LabelText = "C# Programming";
private Font TextFont;
private float[] CharacterWidths;
private float TotalCharacterWidth;

private void Form1_Load(object sender, EventArgs e)
{
    // Установите начальный размер.
    StartWidth = picTitle2.Size.Width;
    StartHeight = picTitle2.Size.Height;
    CurrentWidth = StartWidth;

    // Протянем на 2 секунды.
    TotalTicks = 2 * 1000 / tmrResizePictureBox.Interval;
    Dx = (EndWidth - StartWidth) / TotalTicks;

    // Создаем шрифт и измеряем символы.
    CharacterWidths = new float[LabelText.Length];
    TextFont = new Font("Times New Roman", 16);
    using (Graphics gr = this.CreateGraphics())
    {
        for (int i = 0; i < LabelText.Length; i++)
        {
            SizeF ch_size = gr.MeasureString(
                LabelText.Substring(i, 1), TextFont);
            CharacterWidths[i] = ch_size.Width;
        }
    }
    TotalCharacterWidth = CharacterWidths.Sum();
}

Код сохраняет начальную высоту элемента управления PictureBox и ширину начала и окончания.

Затем он подсчитывает количество срабатываний tm> tmrResizePictureBox Timer элемента управления Tick в течение 2 секунд. Он использует это число для вычисления суммы Dx, с помощью которой программа должна увеличивать PictureBox во время каждого события Tick, чтобы контролировать конечную ширину элемента управления .

Обработчик события Load формы заканчивается с помощью метода MeasureString класса Graphics для измерения каждого из символов в строке, которую программа будет дисплей.

Когда вы нажимаете кнопку Анимация, программа использует следующий код для запуска перемещения анимированного текста.

// Изменение размера PictureBox.
private void btnAnimate_Click(object sender, EventArgs e)
{
    btnAnimate.Enabled = false;
    CurrentWidth = StartWidth;
    picTitle2.Size =
        new Size((int)StartWidth, picTitle2.Size.Height);
    picTitle2.Refresh();
    TicksToGo = TotalTicks;

    tmrResizePictureBox.Enabled = true;
}

Этот код отключает кнопку и сбрасывает ширину элемента управления PictureBox до его начального значения. Он устанавливает TicksToGo = TotalTicks, чтобы отслеживать количество раз, когда выполняется обработчик событий Tick.

В следующем коде показан обработчик события Tick таймера, который заставляет анимированный текст перемещаться.

// Изменение размера PictureBox.
private void tmrResizePictureBox_Tick(object sender, EventArgs e)
{
    CurrentWidth += Dx;
    picTitle2.Size = new Size((int)CurrentWidth, StartHeight);
    picTitle2.Refresh();

    // Если мы закончили движение, отключите Таймер.
    if (--TicksToGo <= 0)
    {
        tmrResizePictureBox.Enabled = false;
        btnAnimate.Enabled = true;
    }
}

Этот код добавляет Dx к ширине элемента управления PictureBox и соответственно изменяет размер PictureBox. Затем он уменьшает TicksToGo, и если новое значение равно 0, оно отключает таймер и включает кнопку Animate.

Программа рисует анимированный текст в обработчике событий PictureBox управления Paint. В следующем коде показан обработчик события и метод SpaceTextToFit, который он вызывает.

// Нарисуем текст в элементе управления.
private void picTitle2_Paint(object sender, PaintEventArgs e)
{
    // Используйте AntiAlias ​​для получения наилучшего результата.
    e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
    e.Graphics.Clear(picTitle2.BackColor);

    SpaceTextToFit(e.Graphics, picTitle2.ClientRectangle,
        TextFont, Brushes.Red, LabelText);
}

// Вставка текста, вставляющего пробел между символами
// чтобы заполнить указанную ширину.
private void SpaceTextToFit(Graphics gr,
    Rectangle rect, Font font, Brush brush, string text)
{
    using (StringFormat string_format = new StringFormat())
    {
        string_format.Alignment = StringAlignment.Near;
        string_format.LineAlignment = StringAlignment.Near;

        // Вычислить интервал.
        float space = (rect.Width - TotalCharacterWidth) /
            (text.Length - 1);

        // Рисуем символы.
        PointF point = new PointF(rect.X, rect.Y);
        for (int i = 0; i < text.Length; i++)
        {
            gr.DrawString(text[i].ToString(), font, brush, point);
            point.X += CharacterWidths[i] + space;
        }
    }
}

Обработчик событий Paint просто вызывает метод SpaceTextToFit, чтобы выполнить всю интересную работу. Единственный трюк - установить свойство TextRenderHint объекта Graphics объекта AntiAlias. Значения «grid fit» (один из них используется по умолчанию) обычно дают лучшую производительность, но беспорядок выравнивания символов в этом примере дает результат резкий внешний вид.

Метод SpaceTextToFit рисует текст, добавляя дополнительное пространство между символами для заполнения требуемой ширины. Это не делает ничего необычного с высотой текста.

Код вычитает полную ширину символов из ширины целевой области и делит ее на части для вставки между символами.

Источник: http://csharphelper.com/blog/2016/04/draw-animated-text-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Adblock
detector