Pregunta

Así que, básicamente im haciendo un botón personalizado.

comportamiento deseado:

Cuando un mouses usuario a través de, a continuación, la imagen mouseover se desvanecerá en.

Cuando se coloca el ratón fuera del mouseover / imagen presionado se desvanecerán.

Excepciones:

Si se coloca el ratón en, o fuera, mientras que una animación de fundido está jugando, entonces tendrán que:

  • detener la animación de forma instantánea
  • que se está reproduciendo
  • Inicio desvaneciéndose en la nueva animación a partir de la posición actual. Ejemplo: Digamos que un usuario se desplaza sobre, y la animación al pasar el ratón ha jugado, si se tratara de ratón fuera, y luego de vuelta del ratón en forma rápida, mientras que la animación mouseoff todavía estaba jugando, no comenzaría el ratón en desvanecen desde el principio .. pero desde donde la animación mouseoff se había detenido.
¿Fue útil?

Solución

Hice algo similar a esto antes, y ejecutado utilizando GDI +.

El botón debe hacer dos cosas en ella de método draw.

  1. Dibujar el botón predeterminado sin ningún tipo respecto de la transparencia.
  2. dibujar la imagen mouseove con un alfa dado.

Utilice un BackgroundWorker para darle una animación suave. Así que en mouseover iniciar el BackgroundWorker y hacer que se ejecute hasta el Alfa llega a 1.0f. Cuando el ratón se retira del botón, el trabajador debe reducir Alfa untill que llegue 0.0f. Tener una variable llamada fadingin para que el BackgroundWorker va a entender lo que debe hacer. El puntero del ratón dentro y fuera caso sólo debe adecuadamente conjunto fadingin a verdadero o falso, a continuación, iniciar el BackgroundWorker (si no está ya Runnung).

Los BackgroundWorkers DoWork método puede ser algo como esto:

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

El Cronómetro y construcción de lazo aquí harán que el objetivo de animación para una animación de 60 fotogramas por segundo.

El BackgroundWorker ProgressChanged solo debe cambiar el ColorMatrix para el valor alfa apropiada, y se unen a la ColorMatrix los ImageAttributes, e invalidar el control llamando Invalidar. Esto tiene que ser hecho de manera que se solicita el repintado interfaz gráfica de usuario desde el hilo principal, y no el hilo BackgroundWorker. Si lo hace directamente desde DoWork obtendrá una excepción si intenta modificar ImageAttributes mientras una operación de delineado se está llevando a cabo.

Espero que esto le ayuda a hacer una buena animación suave en su botón.

Otros consejos

Usted tiene que elegir una imagen a estar en la parte inferior, y uno a estar en la cima. El uno en la parte superior tendrá su valor alfa ajustado de 0 a 255 en pasos para crear la animación.

de MSDN hilo del foro detalla un método para la mezcla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top