如何创建与C#计算器类似的按钮动画(How to create button animation s

2019-10-17 06:53发布

谁能帮关于创建像在Win7计算器一个winform动画,当你悬停鼠标按钮,目前我使用一堆图像,然后在BackgroundWorker的循环,但我认为它错了,这是我的代码:

发生这种情况时,鼠标输入,

private void bgTurnOn_DoWork(object sender, DoWorkEventArgs e)
{
    Label labelSender = (Label)e.Argument;
    int ii = labelSender.ImageIndex;
    for (int i = ii + 4; i <= 11; i++)
    {
        if (labelSender.AllowDrop)
        {
            labelSender.ImageIndex = i;
            Thread.Sleep(40);
        }
    }
}

这时候鼠标离开

private void bgTurnOff_DoWork(object sender, DoWorkEventArgs e)
{
    Label labelSender = (Label)e.Argument;
    int ii = labelSender.ImageIndex;
    for (int i = ii; i >= 0; i--)
    {
        if (!labelSender.AllowDrop)
        {
            labelSender.ImageIndex = i;
            Thread.Sleep(80);
        }
    }
}

注意:我只是用的AllowDrop所以我也懒得去申报新的变量,我有42个按钮,所以我想我需要更加高效的解决方案。

Answer 1:

看来你想要一个发光效果,所以你可以使用的下一个想法:

  • 做一个OpacityPictureBox : PictureBox支持不透明度(1-100或双0-1级)。 见这以获取更多信息。
  • 添加的两个公共const int的值MaxOpacityMinOpacityOpacityPictureBox类,从外部容易和安全的范围检查。 该值可能是0,100或0,1,或别的东西,这取决于您的实现不透明度。
  • 作出AnimatedPictureBox : UserControl ,其保持1张PictureBox命名pbNormal和1个OpacityPictureBox命名opbHover ,两个Dock = DockStyle.Fill ,和一个定时器命名timer 。 确保pbNormal低于opbHover
  • 有三个公共属性:
    • Normal类型的Image ,其代表为pbNormal.Image
    • Hover类型的Image ,其代表为opbHover.Image
    • AnimationInterval类型的int其中delgates成timer.Interval
  • 在的构造AnimatedPictureBox ,打完电话后InitializeComponents ,做opbHover.Opacity = 0; 。 你也可以做this.Cursor = Cursors.Hand; 如果你想将光标悬停在它的时候变成一只手。
  • 有一个私有成员: _animationDirection类型的int ,这将是-1或1。
  • 有开始在给定方向的动画的私有方法:

码:

private void Animate(int animationDirection)
{
    this._animationDirection = animationDirection;
    this.timer.Start();
}
  • 重写OnMouseEnterOnMouseLeave

码:

 protected override void OnMouseEnter(EventArgs e)
 {
     this.Animate(1);
     base.OnMouseEnter(e);
 }

 protected override void OnMouseLeave(EventArgs e)
 {
     this.Animate(-1);
     base.OnMouseEnter(e);
 }
  • timer.Tick事件以及与此:

码:

private void timer_Tick(object sender, EventArgs e)
{
    var hoverOpacity = this.opbHover.Opacity + this._animationDirection;

    if (hoverOpacity < OpacityPictureBox.MinOpacity ||
        hoverOpacity > OpacityPictureBox.MaxOpacity)
    {
        this.timer.Stop();
        return;
    }

    this.opbHover.Opacity = hoverOpacity;
}


文章来源: How to create button animation similar in calculator with C#