创建淡出标签

时间:2011-03-29 10:17:26

标签: c# winforms label opacity fadeout

这似乎是一个简单的问题......

我正在寻找C#Winforms中的Label.Opacity属性。

我希望做的是逐渐淡化标签的方法。通过计时器或许?

由于没有Opacity,我试图将它的transperency设置为更高的数字,直到它足够高以至于该项目应该是不可见的。但我似乎无法做到这一点。

目前我有:

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();
            };
        }
    };
}

5 个答案:

答案 0 :(得分:8)

这就是我用来淡出标签的原因:

    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;
        }
    }

也许不是最好的解决方案,但我仍然是初学者,所以这是我可以贡献的。我将timer1.Interval置于最低限度并与fadingSpeed一起玩,直至看起来不错。

答案 1 :(得分:4)

我发现创建平滑淡入淡出的一种方法是使用计时器调整ForeColor RGB变量。这使您可以控制持续时间,并允许您精细化从当前ForeColor值到目标值的转换。

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;
            }
        }
    }

答案 2 :(得分:2)

您的计时器是否阻止了UI线程?如果是这样,在它过去之后你将看不到任何东西。解决问题的快捷方法是拨打Application.DoEvents而不是this.Invalidate();

答案 3 :(得分:1)

这是一个更完整和更优雅的解决方案:

// Aufruf der Methode aus dem Worker-Thread
private void OnFadeTimerEvent(object sender, ElapsedEventArgs e)
{
    this.Invoke(new Action(() => FadeOutLabel()));
}

private void FadeOutLabel()
{
    if (labelStartHelp.ForeColor.GetBrightness() <= 0.01)
    {
        FadeTimer.Enabled = false;
        labelStartHelp.Visible = false;
        return;
    }
    HslColor hsl = new HslColor(labelStartHelp.ForeColor);
    hsl.L -= 0.002; // Brightness is here lightness
    labelStartHelp.ForeColor = (System.Drawing.Color)hsl.ToRgbColor();
}

使用APCyotek HslColor类:http://cyotek.com/downloads/view/Cyotek.Windows.Forms.ColorPicker.zip/Cyotek.Windows.Forms.ColorPicker/Cyotek.Windows.Forms.ColorPicker/HslColor.cs

但是,不知道许可证。希望你喜欢它!

答案 4 :(得分:1)

这就是我写的。它还可以处理不同颜色(例如绿色,红色)的标签

实例该类,可随时将其粘贴到标签上。设置消息和初始前景色后,请调用setColorSteps以及所需的步骤。

要运行渐变时,请调用doFade()

为OP提供计时器循环事件,这是我在编写此解决方案时使用的,该解决方案可以满足我的需要。

/// <summary>
/// Fade a label - Derek Piper 2019
/// </summary>
public class LabelFader
{
    Label label;
    List<ColorStep> colorSteps = new List<ColorStep>();

    public void attachToControl(Label useLabel)
    {
        this.label = useLabel;
    }

    public void setColorSteps(int numSteps)
    {
        if (this.label != null)
        {
            ColorStep start = new ColorStep(this.label.ForeColor);
            ColorStep end = new ColorStep(this.label.BackColor);
            int redIncrement = ((end.R - start.R) / numSteps);
            int greenIncrement = ((end.G - start.G) / numSteps);
            int blueIncrement = ((end.B - start.B) / numSteps);
            this.colorSteps = new List<ColorStep>();
            for (int i = 0; i <= numSteps; i++)
            {
                ColorStep newStep = new ColorStep();
                if (redIncrement > 0)
                {
                    newStep.R = start.R + (i * redIncrement);
                }
                else
                {
                    newStep.R = start.R - (i * redIncrement);
                }
                if (greenIncrement > 0)
                {
                    newStep.G = start.G + (i * greenIncrement);
                }
                else
                {
                    newStep.G = start.G - (i * greenIncrement);
                }
                if (blueIncrement > 0)
                {
                    newStep.B = start.B + (i * blueIncrement);
                }
                else
                {
                    newStep.B = start.B - (i * blueIncrement);
                }
                this.colorSteps.Add(newStep);
            }
        }
    }

    public void doFade(int speedMs = 40)
    {
        Timer tm = new Timer();
        tm.Interval = speedMs;
        int step = 0;
        int end = this.colorSteps.Count;
        if (this.colorSteps.Count > 0)
        {
            tm.Tick += (sa, aea) =>
            {
                ColorStep thisStep = this.colorSteps[step];
                this.label.ForeColor = Color.FromArgb(thisStep.R, thisStep.G, thisStep.B);
                step++;
                if (step >= end)
                {
                    tm.Stop();
                    this.label.Visible = false;
                }
            };
            tm.Start();
        }
    }
}

class ColorStep
{
    public int R = 0;
    public int G = 0;
    public int B = 0;

    public ColorStep()
    {
    }

    public ColorStep(Color from)
    {
        this.setFromColor(from);
    }

    public void setFromColor(Color from)
    {
        this.R = from.R;
        this.G = from.G;
        this.B = from.B;
    }

    public Color getColor()
    {
        return Color.FromArgb(this.R, this.G, this.B);
    }
}