因此,基本上是我制作一个自定义按钮。

期望的行为:

当用户慕斯过来时,鼠标图将逐渐消失。

当用户从鼠标上熔断/按下的图片将逐渐消失。

例外:

如果用户在播放淡出动画时将用户放入或关闭,则需要:

  • 立即停止当前播放动画
  • 从当前位置开始淡入新动画。示例:可以说,用户慕斯已经结束了,如果鼠标动画要鼠标关闭,则鼠标动画已经播放,然后在鼠标off动画仍在播放时迅速恢复鼠标,从一开始就不会逐渐淡出鼠标。但是鼠标动画停止了。
有帮助吗?

解决方案

我以前做过类似的事情,并使用GDI+实施了它。

该按钮应在其绘制方法中执行两件事。

  1. 绘制默认按钮,而无需任何透明度。
  2. 用给定的alpha绘制MouseOve图像。

使用背景工作者为您提供平滑的动画。因此,在鼠标上启动背景工作者,并使它运行到alpha达到1.0f。当鼠标从按钮中删除时,工人应减少α取消,直到达到0.0F。拥有一个称为fadingin的变量,以便背景工作者了解应该做什么。您的鼠标内外事件应仅适当地将Fadingin设置为True或False,然后启动背景工作人员(如果尚未符合Runnung)。

背景工作者陶•方法看起来像这样:

void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
  long ticks1 = 0;
  long ticks2 = 0;
  double interval = (double)Stopwatch.Frequency / 60;
  while (true) {
    ticks2 = Stopwatch.GetTimestamp();
    if (ticks2 >= ticks1 + interval) {
      ticks1 = Stopwatch.GetTimestamp();

      if(_fadeIn){
        _fadeAlpha += 0.1f;
        if(_fadeAlpha > 1f){
          _fadeAlpha = 1f;
          break;
        }
      }else{
        _fadeAlpha -= 0.1f;
        if(_fadeAlpha < 0f){
          _fadeAlpha = 0f;
          break;
        }
      }
      backgroundWorker.ReportProgress(0);
    }
    Thread.Sleep(1);
  }
  backgroundWorker.ReportProgress(0);
}

秒表和循环构造在这里将使动画目标用于60fps动画。

背景工作者的进度应将其更改为适当的alpha值,并将colormatrix绑定到ImageAttributes,并通过调用无效的控制使控件无效。必须这样做,以便从主线程中请求GUI重新粉刷,而不是背景工作人员线程。如果您直接从Dowork进行此操作,则如果您在进行抽奖操作时尝试修改成像量,则将获得异常。

希望这可以帮助您在按钮上制作一个良好的平滑动画。

其他提示

您需要选择一张图片才能在底部,而在顶部。顶部的一个将需要以步骤从0调整到255的alpha值来创建动画。

MSDN论坛线程 详细说明混合的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top