Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a fade out label

This might seem like a simple question...

I'm looking for the Label.Opacity property in C# Winforms.

What I wish to do is have a method that fade's out a label gradually. By means of a timer perhaps?

Since there is not Opacity I'm trying to set it's transperency to higher numbers untill it's high enough that the item should be invisible. But I can't seem to make this work.

Currently I have:

public FadeLabel()
{
    MyTimer timer = new MyTimer();
    this.TextChanged += (s, ea) =>
    {
        if (timer.IsActive)
        {
            timer.Reset();
        }
        else
        {
            timer.WaitTime.Miliseconds = 500;
            timer.Start();
            timer.Completed += (a) =>
            {
                int i = 0;
                Timer tm = new Timer();
                tm.Interval = 1;
                tm.Tick += (sa, aea) =>
                {
                    i++;
                    this.ForeColor = Color.FromArgb(i, Color.Black);
                    this.BackColor = Color.FromArgb(i, Color.White);
                    this.Invalidate();
                    if (i == 255)
                    {
                        tm.Stop();
                    }
                };
                tm.Start();
            };
        }
    };
}
like image 229
Theun Arbeider Avatar asked Mar 29 '11 10:03

Theun Arbeider


3 Answers

This is what I'm using to fade out labels:

    label1.Text = "I'm fading out now";
    label1.ForeColor = Color.Black;
    timer1.Start();

    private void timer1_Tick(object sender, EventArgs e)
    {
        int fadingSpeed = 3;
        label1.ForeColor = Color.FromArgb(label1.ForeColor.R + fadingSpeed, label1.ForeColor.G + fadingSpeed, label1.ForeColor.B + fadingSpeed);

        if (label1.ForeColor.R >= this.BackColor.R)
        {
            timer1.Stop();
            label1.ForeColor = this.BackColor;
        }
    }

Maybe not the best solution but I'm still a beginner so this is what I can contribute with. I put timer1.Interval at minimum and played with fadingSpeed until it looked good.

like image 149
Zerato Avatar answered Sep 19 '22 13:09

Zerato


One way that I've found to create a smooth fade is to adjust the ForeColor RGB variables using a timer. This gives you control over the duration and allows you to finesse the transition from current ForeColor values to the target values.

private void timer1_Tick(object sender, EventArgs e)
    {
        // timer interval set to 10 to ensure smooth fading
        // declared int: r = 0, g = 215 and b = 180
        // target values are r = 32, g = 32 and b = 32 to match BackColor
        fade++;
        if (fade >= 500) // arbitrary duration set prior to initiating fade
        {
            if (r < 32) r++; // increase r value with each tick
            if (g > 32) g--; // decrease g value with each tick
            if (b > 32) b--; // decrease b value with each tick
            label1.ForeColor = Color.FromArgb(255, r, g, b);
            if (r == 32 && g == 32 && b == 32) // arrived at target values
            {
                // fade is complete - reset variables for next fade operation
                label1.ForeColor = Color.FromArgb(255, 0, 215, 180);
                label1.Text = "";
                fade = 0;
                r = 0;
                g = 215;
                b = 180;
                timer1.Enabled = false;
            }
        }
    }
like image 44
BJS3D Avatar answered Sep 19 '22 13:09

BJS3D


Does your timer block the UI thread? If so, you won't see anything until after it elapses. A quick way to fix things will be to call Application.DoEvents instead of this.Invalidate();.

like image 33
Anton Gogolev Avatar answered Sep 23 '22 13:09

Anton Gogolev