代码之家  ›  专栏  ›  技术社区  ›  caesay

从一张图片到另一张图片的高级褪色

  •  2
  • caesay  · 技术社区  · 14 年前

    所以基本上我做了一个自定义按钮。

    期望的行为:

    当用户鼠标移过时,鼠标移过的图片将淡入。

    当用户鼠标移离鼠标时,覆盖/按下的图片将淡出。

    例外情况:

    • 立即停止当前播放的动画
    2 回复  |  直到 14 年前
        1
  •  2
  •   Øyvind Bråthen    14 年前

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

    这个按钮在它的draw方法中应该做两件事。

    1. 绘制默认按钮而不考虑透明度。
    2. 用给定的alpha绘制鼠标移动图像。

    使用BackgroundWorker给你一个平滑的动画。因此,在mouseover上启动BackgroundWorker并使其运行直到Alpha达到1.0f。当鼠标从按钮中移除时,工作人员应减少Alpha直到它达到0.0f。有一个名为fadingin的变量,以便BackgroundWorker了解它应该做什么。你的mouse-in-and-out事件应该正确地将fadingin设置为true或false,然后启动BackgroundWorker(如果它还没有运行)。

    BackgroundWorkers dowwork方法可以如下所示:

    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使控件无效。必须这样做,以便从主线程而不是BackgroundWorker线程请求GUI重绘。如果直接从DoWork执行此操作,则在进行绘制操作时尝试修改ImageAttributes时会出现异常。

    希望这能帮助你在你的按钮上制作一个好的平滑动画。

        2
  •  0
  •   Mark Ransom    14 年前

    你需要选择一张图片在底部,一张在顶部。在上面的一个将需要它的alpha值从0调整到255的步骤来创建动画。

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

    推荐文章