Acho difícil descrever esse problema em palavras, e foi por isso que fiz um vídeo (45 segundos) para ilustrá-lo. Aqui está uma prévia das perguntas, dê uma olhada no Vimeo: http://vimeo.com/epologee/perfect-crossfade
A questão de criar um crossfade ou dissolução impecável de duas imagens ou formas foi recorrente para mim em vários campos na última década. Primeiro na edição de vídeo, depois na animação em Flash e agora na programação para iOS. Quando você começa a pesquisar no Google, há muitas soluções alternativas a serem encontradas, mas eu realmente quero resolver isso sem hack neste momento.
O resumo:
qual é o nome da técnica ou curva a ser aplicada no crossfading de dois bitmaps da mesma cor e semitransparentes, se você desejar que a transparência resultante corresponda ao original de qualquer um?
Existe uma função (matemática) para calcular os valores alfa / transparência parciais necessários durante o desbotamento?
Existem linguagens de programação que têm estas funções como uma predefinição, semelhante ao ease in
, ease out
ou ease in out
funções encontradas em ActionScript ou cacau?
Atualização: além do vídeo, fiz um projeto de amostra (requer Xcode e iOS SDK) e o publiquei no github. Ele mostra a mesma animação do vídeo, mas desta vez com quadrados: https://github.com/epologee/StackOverflow-Example-Code
Respostas:
Receio que isso não seja possível. É assim que a transparência é calculada quando dois objetos se sobrepõem: http://en.wikipedia.org/wiki/Alpha_compositing
Um dos objetos deve ter uma opacidade de 1 se você não quiser que a área de sobreposição seja vista.
fonte
Não sei qual pode ser o nome no campo da edição de vídeo, mas eu chamaria a curva de curva S ou curva sigmóide . Deve ser muito simples produzir o cross-fade que você está procurando no iOS usando a função de tempo kCAMediaTimingFunctionEaseInEaseOut da Core Animation . Apenas anime a
alpha
propriedade de duas visualizações em direções opostas (uma 0-> 1, uma 1-> 0) usando essa função de tempo:Nota: Você realmente deve usar os métodos de animação baseados em blocos em vez dos métodos de conveniência do UIView. Eu usei os métodos do UIView acima porque é muito fácil de entender e fácil de digitar a partir da memória. Usar blocos não é muito mais difícil, no entanto.
Adendo: Se você não gostar do UIViewAnimationEaseInOut, poderá criar sua própria função de tempo, conforme descrito em Tempo, Espaços de tempo e CAAnimation . Isso é um pouco mais avançado do que a animação simples ilustrada acima, mas oferece todo o controle que você deseja.
fonte
kCAMediaTimingFunctionEaseInEaseOut
. Você poderia ter significadoUIViewAnimationCurveEaseInOut
? O problema com essa curva é o mesmo (mergulho no meio), porque a qualquer momento os dois valores alfa em uma adição simples serão iguais1.0
, onde, como na minha curva ajustada manualmente, é necessário exceder1.0
para obter os resultados desejados .initialTransparency
valor, não adianta. Você não teria idéia do que tentar em seguida?Na computação gráfica, esse tipo de função é chamada de passo suave . Quando usado para crossfade, determina o valor global do alfa para a composição.
Se as imagens de entrada tiverem um canal alfa, primeiro verifique se o alfa é pré - multiplicado . Em seguida, você pode fazer a composição do crossfade diretamente, usando o passo suave
alpha
em cada canal [X = A*alpha + B*(1-alpha)
] e esperar resultados razoáveis.fonte
Você pode usar a função de decaimento exponencial:
Seu gráfico se parece mais com:
fonte
1 - Alpha1(time)
equação não resolverá o problema, porque duas imagens combinadas de 0,5 alfa não resultarão em uma imagem composta com 1,0 alfa. As curvas personalizadas que desenhei não são espelhadas verticalmente.