简单的按钮动画(Simple button animations)

2019-07-18 07:42发布

我想学习.NET编程。 作为我学习的一部分,我试图让上的按钮有一定的影响。 它的工作...但并不像我想象的那样顺利! 有没有更好的方式来做到这一点? 先感谢您!

我的需要:

有3个按钮。 当你将鼠标悬停在其中的一个,它扩展,当你鼠标移出从该按钮,返回到其初始大小。

private void button1_MouseHover(object sender, EventArgs e)
    {
        button1.BackColor = Color.White;
        button1.Width = 130;
        button1.BringToFront();            
    }

    private void button1_MouseLeave(object sender, EventArgs e)
    {
        button1.BackColor = Color.Red;
        button1.Width = 75;         
    }

    private void button2_MouseHover(object sender, EventArgs e)
    {
        button2.BackColor = Color.Gray;
        button2.Width = 130;
        button2.BringToFront();            
    }

    private void Form1_MouseLeave(object sender, EventArgs e)
    {
        button2.BackColor = Color.Red;
        button2.Width = 75;

    }

    private void button3_MouseHover(object sender, EventArgs e)
    {
        button3.BackColor = Color.DimGray;
        button3.Width = 130;
        button3.BringToFront();
    }

    private void button3_MouseLeave(object sender, EventArgs e)
    {
        button3.BackColor = Color.Red;
        button3.Width = 75;

    }

Answer 1:

所以第一关,你不想做的事是完全相同的3倍。 创建一个单一的方法来添加适当的处理程序按钮,然后只写一次代码来处理任何给定的按钮。

请注意,您可以进入扩张/收缩蜱处理程序和使用percentComplete值来设置高度为好,根据频谱移动颜色(这将涉及的颜色却有些数学做虽然)或改变的任何其他方面按钮。 如果你真的动机概括它,你可以添加参数的方法Action<double>文件做一些事来基于给定的百分比进度的对象。

public void AddAnimation(Button button)
{
    var expandTimer = new System.Windows.Forms.Timer();
    var contractTimer = new System.Windows.Forms.Timer();

    expandTimer.Interval = 10;//can adjust to determine the refresh rate
    contractTimer.Interval = 10;

    DateTime animationStarted = DateTime.Now;

    //TODO update as appropriate or make it a parameter
    TimeSpan animationDuration = TimeSpan.FromMilliseconds(250);
    int initialWidth = 75;
    int endWidth = 130;

    button.MouseHover += (_, args) =>
    {
        contractTimer.Stop();
        expandTimer.Start();
        animationStarted = DateTime.Now;
        button.BackColor = Color.DimGray;
    };

    button.MouseLeave += (_, args) =>
    {
        expandTimer.Stop();
        contractTimer.Start();
        animationStarted = DateTime.Now;
        button.BackColor = Color.Red;
    };

    expandTimer.Tick += (_, args) =>
    {
        double percentComplete = (DateTime.Now - animationStarted).Ticks
            / (double)animationDuration.Ticks;

        if (percentComplete >= 1)
        {
            expandTimer.Stop();
        }
        else
        {
            button.Width = (int)(initialWidth +
                (endWidth - initialWidth) * percentComplete);
        }
    };

    contractTimer.Tick += (_, args) =>
    {
        double percentComplete = (DateTime.Now - animationStarted).Ticks
            / (double)animationDuration.Ticks;

        if (percentComplete >= 1)
        {
            contractTimer.Stop();
        }
        else
        {
            button.Width = (int)(endWidth -
                (endWidth - initialWidth) * percentComplete);
        }
    };
}


Answer 2:

如果您使用的WinForms,动画将是相当痛苦的,你将不得不通过自己处理他们Timer对象。

如果你正在为.NET和想和animatons和造型看起来很酷的应用,我强烈建议你在WPF看看吧。 它可以做的动画非常容易,虽然C#XAML。

虽然它仍然有可能在的WinForms,它会在那里为这些功能被内置到WPF已经(和优化)远远更多的开发时间。



Answer 3:

当您修改控件的属性,它生效瞬间。 你的愿望是什么,通常被称为某种类型的褪色或渐变的。 有可能是图书馆在那里要做到这一点,但如果你想这样写自己的乐趣,你可以使用一个Timer对象,并在每个tick更新的颜色。

你会怎样做的是设置一种颜色作为TargetColor地方(这是一个变量或属性你补),然后启动蜱可能每10毫秒的定时器。 在每一跳,你看的开始时间,从那以后多长时间已经过去了。 如果你希望动画发生一整秒的,然后就是1000毫秒。 所以,每个刻度时,你看看那已经过去了,也许200毫秒的时间量,然后除以200/1000得到的,你已经进入了动画时间的分数。 然后,你看看启动和目标色之间的差异,乘以分数这种差异,并将结果添加到起始色。 换句话说,200毫秒到动画持续1000毫秒,意味着你有20%到动画。 因此,你要设置的颜色是什么颜色是接近尾声的颜色开始颜色20%。

有很多,你可以做些什么来改进这一点。 也许有一个封装了计时器,并公开功能/性能跟踪开始/结束的颜色,动画过渡时间等子类Button控件最有动感的UI功能,这样让你指定的动画应该持续多长时间,然后把它插在其间指出,因为它过渡。 这是长期渐变的来源,因为它来自通过inbetweening从一种状态过渡到另一种



文章来源: Simple button animations