Me resulta difícil describir este problema en palabras, por eso hice un video (45 segundos) para ilustrarlo. Aquí hay una vista previa de las preguntas, échale un vistazo en Vimeo: http://vimeo.com/epologee/perfect-crossfade
La cuestión de crear un fundido cruzado o una disolución perfecta de dos imágenes o formas se me ha repetido en varios campos durante la última década. Primero en edición de video, luego en animación Flash y ahora en programación iOS. Cuando comienzas a buscarlo en Google, hay muchas soluciones alternativas por encontrar, pero realmente quiero resolver esto sin un truco esta vez.
El resumen:
¿Cuál es el nombre de la técnica o curva que se aplicará en dos mapas de bits semitransparentes del mismo color, si desea que la transparencia resultante coincida con el original de cualquiera de ellos?
¿Existe una función (matemática) para calcular los valores necesarios de transparencia parcial / alfa durante el desvanecimiento?
¿Existen lenguajes de programación que tengan estas funciones como un preajuste, similar al ease in
, ease out
oease in out
funciones que se encuentran en ActionScript o cacao?
Actualización: además del video, hice un proyecto de muestra (requiere Xcode y iOS SDK) y lo publiqué en github. Muestra la misma animación que el video pero esta vez con cuadrados: https://github.com/epologee/StackOverflow-Example-Code
Respuestas:
Me temo que eso no es posible. Así se calcula la transparencia cuando se superponen dos objetos: http://en.wikipedia.org/wiki/Alpha_compositing
Uno de los objetos debe tener una opacidad de 1 si no desea que se vea el área de superposición.
fuente
No sé cuál podría ser el nombre en el ámbito de la edición de video, pero llamaría a la curva una curva S o curva sigmoidea . Debería ser muy sencillo producir el fundido cruzado que está buscando en iOS utilizando la función de sincronización kCAMediaTimingFunctionEaseInEaseOut de Core Animation . Simplemente anime la
alpha
propiedad de dos vistas en direcciones opuestas (una 0-> 1, una 1-> 0) usando esa función de temporización:Nota: Realmente debería usar los métodos de animación basados en bloques en lugar de los métodos de conveniencia de UIView. Utilicé los métodos de UIView anteriores porque es muy fácil de entender y fácil de escribir desde la memoria. Sin embargo, usar bloques no es mucho más difícil.
Anexo: Si no le gusta UIViewAnimationEaseInOut, puede crear su propia función de temporización como se describe en Timing, Timespaces y CAAnimation . Eso es un poco más avanzado que la animación simple ilustrada arriba, pero te da todo el control que deseas.
fuente
kCAMediaTimingFunctionEaseInEaseOut
. ¿Podrías haber querido decirUIViewAnimationCurveEaseInOut
? Sin embargo, el problema con esa curva es el mismo (caída en el medio), porque en cualquier punto en el tiempo, los dos valores alfa en una suma simple serán iguales1.0
, donde como en mi curva ajustada manualmente, debe excederse1.0
para obtener los resultados deseados .initialTransparency
valor, no sirve de nada. ¿No tienes idea de qué probar a continuación?En gráficos de computadora, este tipo de función se llama smoothstep . Cuando se usa para fundido cruzado, determina el valor alfa global para la composición.
Si las imágenes de entrada tienen un canal alfa, primero debe asegurarse de que el alfa esté premultiplicado . Luego, puede hacer la composición de fundido cruzado directamente, utilizando el paso suave
alpha
en cada canal [X = A*alpha + B*(1-alpha)
], y esperar resultados razonables.fuente
Puede usar la función de disminución exponencial:
Su gráfico se parece más a:
fuente
1 - Alpha1(time)
ecuación no se encargará de la inmersión, ya que dos imágenes combinadas de 0.5 alfa no darán como resultado una imagen compuesta con 1.0 alfa. Las curvas personalizadas que dibujé no se reflejan verticalmente.