2

だから基本的にカスタムボタンを作っています。

望ましい動作:

ユーザーがマウスオーバーすると、マウスオーバーの画像がフェードインします。

ユーザーがマウスオーバー/押された画像からマウスを離すと、フェードアウトします。

例外:

フェード アニメーションの再生中にユーザーがマウス インまたはマウス オフした場合は、次のことを行う必要があります。

  • 現在再生中のアニメーションを即座に停止
  • 現在の位置から新しいアニメーションへのフェードを開始します。例: ユーザーがマウス オーバーし、マウス オーバー アニメーションが再生された場合、マウス オフ アニメーションがまだ再生されている間にマウス オフし、すぐにマウスを再びオンにすると、最初からフェード イン マウスが開始されません。しかし、マウスオフアニメーションが停止した場所から。
4

2 に答える 2

2

以前にこれと同様のことを行い、GDI+ を使用して実装しました。

ボタンは、描画メソッドで 2 つのことを行う必要があります。

  1. 透明度を考慮せずにデフォルトのボタンを描画します。
  2. 指定されたアルファでマウスオーバー画像を描画します。

BackgroundWorker を使用して、スムーズなアニメーションを実現します。したがって、マウスオーバーで BackgroundWorker を開始し、Alpha が 1.0f に達するまで実行します。マウスがボタンから離されると、ワーカーはアルファが 0.0f に達するまで減らす必要があります。BackgroundWorker が何をすべきかを理解できるように、fadingin という変数を用意します。マウス インおよびマウス アウト イベントは、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 を適切なアルファ値に変更し、ColorMatrix を ImageAttributes にバインドし、Invalidate を呼び出してコントロールを無効にする必要があります。これは、GUI の再描画が BackgroundWorker スレッドではなくメイン スレッドから要求されるようにするために実行する必要があります。これを DoWork から直接行うと、描画操作の実行中に ImageAttributes を変更しようとすると例外が発生します。

これが、ボタンでスムーズなアニメーションを作成するのに役立つことを願っています。

于 2010-09-11T05:16:19.673 に答える
0

1 枚の写真を下に、もう 1 枚を一番上に選択する必要があります。一番上のものは、アニメーションを作成するためにアルファ値を 0 から 255 まで段階的に調整する必要があります。

このMSDN フォーラム スレッドでは、ブレンディングの方法について詳しく説明しています。

于 2010-09-11T03:17:55.153 に答える