Frage

Also im Grunde im eine benutzerdefinierten Schaltfläche zu machen.

Gewünschtes Verhalten:

Wenn ein Benutzer mit der Maus über, dann wird das Bild Mouseover wird verblassen in.

Wenn ein Benutzer mit der Maus aus dem Mouseover / gedrückt Bild wird ausgeblendet.

Ausnahmen:

Wenn ein Benutzer mit der Maus in oder aus, während eine Fade-Animation abgespielt wird, dann wird es müssen:

  • stoppt sofort die aktuell abgespielten Animation
  • Start Fading in die neue Animation von der aktuellen Position. Beispiel: Läßt über einen Benutzer mit der Maus sagen, und die Mouseover-Animation gespielt hat, wenn sie die Maus weg waren, und dann auf schnell Maus zurück, während die Mouse-off-Animation noch spielt, wäre es nicht die Maus in verblasst von Anfang an beginnen .. aber von wo aus der Mouse-off-Animation aufgehört hatte.
War es hilfreich?

Lösung

Ich habe eine ähnliche Sache zu diesem vor und setzte es GDI + verwendet wird.

Die Schaltfläche sollte die Zeichenmethode in es zwei Dinge tun.

  1. Zeichnen Sie die Standard-Schaltfläche ohne Bezug auf Transparenz.
  2. Zeichnen Sie die mouseove Bild mit einem gegebenen alpha.

Verwenden Sie eine Background Sie eine glatte Animation zu geben. So mit der Maus darüber die Background beginnen und machen es laufen, bis Alpha 1.0f erreicht. Wenn die Maus von Schaltfläche entfernt wird, sollte der Arbeiter reduzieren Alpha bis es 0.0f erreicht. Haben Sie eine Variable mit dem Namen fadingin, so dass der Background wird verstehen, was es tun soll. Sie mit der Maus in und out-Ereignisse sollte nur richtig Satz fadingin zu wahr oder falsch ist, dann die Background starten (wenn es nicht bereits RUNNUNG).

Die BackgroundWorkers DoWork Methode kann wie folgt aussehen:

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);
}

Die Stoppuhr und Schleifenkonstrukt hier werden die Animation Ziel für eine 60fps Animation machen.

Die Backgroundprogress sollten nur die Colormatrix auf den Wert richtigen Alpha ändern, und bindet die Colormatrix auf das Imageattributes, und die Steuerung ungültig durch Invalidate aufgerufen wird. Dies muss getan werden, damit die GUI Repaint von dem Haupt-Thread angefordert wird, und nicht den Background Faden. Wenn Sie dies aus DoWork direkt tun, werden Sie eine Ausnahme, wenn Sie versuchen Imageattributes zu ändern, während ein Ziehvorgang stattfindet.

Hope dies hilft Ihnen, eine gute glatte Animation auf dem Knopf zu machen.

Andere Tipps

Sie müssen ein Bild wählen, auf dem Boden zu sein, und eine oben sein. Die über seinen Alpha-Wert von 0 bis 255 in Schritten eingestellt muß die Animation zu erstellen.

Das MSDN Forum-Thread ein Verfahren zur Mischung Details.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top