Question

Donc, fondamentalement im faire un bouton personnalisé.

Comportement souhaité:

Quand un utilisateur sur souris, l'image mouseover se fanent dans.

Quand un utilisateur mouses au large de la mouseover / image pressée disparaîtra.

Exceptions:

Si un utilisateur dans mouses, ou hors, tandis qu'une animation de fondu joue, il devra:

  • arrêter instantanément l'animation en cours de lecture
  • Démarrer la décoloration dans la nouvelle animation de la position actuelle. Exemple: Disons un mouses utilisateur plus, et l'animation mouseover a joué, si elles devaient la souris hors tension, puis la souris dos rapidement tandis que l'animation de sortie du curseur était encore en cours de lecture, il ne démarre pas la souris en fondu depuis le début .. mais d'où l'animation était arrêté sortie du curseur.
Était-ce utile?

La solution

Je l'ai fait une chose semblable à cela avant, et mis en œuvre à l'aide de GDI +.

Le bouton doit faire deux choses dans c'est la méthode de tirage au sort.

  1. Dessine le bouton par défaut sans pour ce qui concerne la transparence.
  2. Dessine l'image mouseove avec un alpha donné.

Utilisez un BackgroundWorker pour vous donner une animation fluide. Donc mouseover démarrer le BackgroundWorker et le faire tourner jusqu'à ce Alpha atteint 1.0f. Lorsque la souris est retirée du bouton, le travailleur devrait réduire Alpha jusqu'à ce qu'il atteigne 0.0f. Avoir une variable appelée fadingin afin que le BackgroundWorker comprendra ce qu'il doit faire. Votre souris dans et hors événement devrait simplement définir correctement fadingin true ou false, puis lancez le BackgroundWorker (si elle est pas déjà runnung).

La méthode de BackgroundWorkers peut ressembler à ceci:

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

Le Chronomètre et la construction de la boucle ici feront le but d'animation pour une animation 60fps.

Le BackgroundWorker ProgressChanged devrait juste changer le ColorMatrix à la valeur alpha proprement dite, et se lient le ColorMatrix aux ImageAttributes, et annuler la commande en appelant Invalider. Cela doit être fait pour que le repeindre GUI est demandée à partir du thread principal, et non le fil BackgroundWorker. Si vous faites cela directement à partir DoWork vous obtiendrez une exception si vous essayez de modifier ImageAttributes pendant une opération de tirage au sort a lieu.

Espérons que cela vous aide à faire une bonne animation en douceur sur votre bouton.

Autres conseils

Vous devez choisir une image pour être sur le fond, et un est sur le dessus. Celui sur sa valeur aura besoin alpha ajusté de 0 à 255 en étapes pour créer l'animation.

MSDN discussion détaille un procédé de mélange.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top