一张图片高级淡入另一张图片

时间:2010-09-11 03:11:33

标签: c# image fading

所以基本上我正在制作一个自定义按钮。

期望的行为:

当用户将鼠标悬停时,鼠标悬停图片将会淡入。

当用户鼠标移开时,鼠标悬停/按下的图片将淡出。

例外:

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

  • 立即停止当前播放的动画
  • 从当前位置开始淡入新动画。示例:假设用户将鼠标悬停,并且鼠标悬停动画已播放,如果它们是鼠标关闭,然后在鼠标移动动画仍在播放时快速鼠标重新开启,则它不会从开始淡入淡出鼠标。但是鼠标移动动画停止了。

2 个答案:

答案 0 :(得分:2)

之前我做了类似的事情,并使用GDI +实现了它。

按钮应该在它的绘制方法中做两件事。

  1. 绘制默认按钮,不考虑透明度。
  2. 使用给定的alpha绘制mouseove图像。
  3. 使用BackgroundWorker为您提供流畅的动画。因此,在mouseover上启动BackgroundWorker并使其运行直到Alpha达到1.0f。当鼠标从按钮中移除时,工作人员应该减少Alpha,直到它达到0.0f。有一个名为fadingin的变量,以便BackgroundWorker了解它应该做什么。你的鼠标进出事件应该正确设置fadingin为true或false,然后启动BackgroundWorker(如果它还没有运行)。

    BackgroundWorkers DoWork方法看起来像这样:

    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动画。

    backgroundWorker ProgressChanged应该只将ColorMatrix更改为正确的alpha值,并将ColorMatrix绑定到ImageAttributes,并通过调用Invalidate使控件无效。必须这样做,以便从主线程请求GUI重绘,而不是BackgroundWorker线程。如果直接从DoWork执行此操作,如果在绘制操作过程中尝试修改ImageAttributes,则会出现异常。

    希望这可以帮助您在按钮上制作出流畅的动画。

答案 1 :(得分:0)

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

MSDN forum thread详细说明了混合的方法。