2012-05-20 14 views
7

Estoy tratando de dar a los usuarios de mi biblioteca GUI una personalización sin restricciones de los efectos de transición de entrada/salida manteniendo la simplicidad/evitando el uso indebido (cuando un Control ingresa o sale de la vista)Uso correcto/incorrecto de delegados para lograr la extensibilidad

Para hacerlo, agregué un delegado a la clase Control, que tomaría una referencia de control y un porcentaje de finalización de transición, para que el usuario pudiera traducir fácilmente la posición/opacidad de control de la forma que quisiera , basado en el porcentaje dado. Todo lo que tendría que hacer es suscribirse a una función de transición antes de la entrada/salida de control.

Sin embargo, me di cuenta de que sería imposible hacer una transición/animación de los controles utilizando solo el porcentaje de finalización actual, porque también tendría que almacenar y comparar la posición inicial del control.
Para que este requisito de almacenamiento sea aparente, ¿debo forzar el uso de un delegado-functor?

En caso afirmativo, ¿cómo podría hacer eso de forma minimalista/limpia?


Siéntase libre de sugerir otra manera de permitir a los usuarios aplicar animaciones de transición de encargo!

+0

¿Podría pegar parte del código que está utilizando? – 3aw5TZetdf

+0

@MatthewRz Realmente no ayudaría con la comprensión = | Es exactamente como lo describí. Puedo decirte que es XNA y estoy modificando la biblioteca Nuclex Graphics/GUI. – Griffin

Respuesta

1

Si te entendí correctamente, tu Control invoca el delegado de Animación (cálculo) (de vez en cuando, probablemente en cada fotograma) y pasa el porcentaje de Conversión de transición. El delegado de Animación luego calcula y devuelve/aplica la traducción y la posición al Control. ¿Es esto correcto?

Suponiendo que es correcta hay varias soluciones:

  1. Al animar única posición y opacidad:

    Junto a la competencia por ciento, también debe enviar el estado inicial de la posición de control y la opacidad al llamar delegado . El estado inicial debe recordarse en el inicio de la transición y enviarse al delegado en cada llamada.

  2. Cuando la animación de forma arbitraria propiedades en general:

    Junto a la competencia por ciento, también se proporcionan los bienes del Estado (tipo de objeto o incluso mejor diccionario). Esta propiedad de estado está completamente controlada por el delegado y su lógica de animación.

    Para su control, la propiedad del estado no tendría ninguna semántica o significado. Su control solo DEBE retener el valor de la propiedad del estado entre las llamadas subsiguientes para delegar.

    Poniéndolo todo junto, el Delegado llena el estado con los valores iniciales en la primera llamada, utiliza estos valores en las llamadas siguientes: hace lo que quiera. El delegado también aplica valores calculados a Control. Tenga en cuenta que todas las propiedades que se pueden usar en el delegado deben ser públicas.

0

Creo que se necesita para pasar por lo menos en los siguientes parámetros para el delegado: -

  • el propio control
  • el recipiente que contiene el control (por ejemplo, un panel.)
  • el porcentaje de finalización

Al pasar el control en sí, el usuario tendrá toda su información de estado inicial (tales como posición). Además, si el usuario necesita establecer alguna propiedad del control, definitivamente necesitará la referencia al control en sí mismo.

El usuario puede necesitar el contenedor si necesita su información de tamaño/posición, o si necesita hacer algo especial para el control.

1

IMO no tiene que proporcionar al usuario del control la posición inicial del control ya que puede colocarlo relativamente a la posición inicial: los números negativos son para la izquierda y la parte superior, y los números positivos son para la derecha y abajo.

El código siguiente es una función para una transición rápida:

Point FastTranDiagonial(float Percentage){ 
    Thread.Sleep(10); 
    int pixelsDist = (1 - Percentage)* 300;//300 is the maximum distance 
    return new Point(-pixelsDist ,pixelsDist); 
} 

Cuando se invoca el delegado tiene que añadir el punto a la posición inicial del control. Debe tener en cuenta que el delegado contiene un Thread.Sleep (X), este debe estar en control del usuario, ya que podría querer hacer una transacción rápida o lenta.

Es posible que también desee considerar la adición de transiciones secuenciales como jQuery para que una transición comience después de la finalización de otra.

buena suerte

Cuestiones relacionadas