Estou animando um CALayer
along a CGPath
(QuadCurve) muito bem no iOS. Mas eu gostaria de usar uma função de atenuação mais interessante do que as poucas fornecidas pela Apple (EaseIn / EaseOut etc). Por exemplo, um salto ou função elástica.
Essas coisas são possíveis de fazer com MediaTimingFunction (bezier):
Mas eu gostaria de criar funções de temporização mais complexas. O problema é que o sincronismo da mídia parece exigir um Bezier cúbico que não é poderoso o suficiente para criar estes efeitos:
(fonte: sparrow-framework.org )
O código para criar o código acima é simples o suficiente em outras estruturas, o que torna isso muito frustrante. Observe que as curvas estão mapeando o tempo de entrada para o tempo de saída (curva Tt) e não as curvas de posição de tempo. Por exemplo, facilidadeOutBounce (T) = t retorna um novo t . Então esse t é usado para plotar o movimento (ou qualquer propriedade que devemos animar).
Então, eu gostaria de criar um personalizado complexo, CAMediaTimingFunction
mas não tenho ideia de como fazer isso, ou se é possível? Existem alternativas?
EDITAR:
Aqui está um exemplo concreto em etapas. Muito educacional :)
Quero animar um objeto ao longo de uma linha do ponto a ao b , mas quero que ele "salte" seu movimento ao longo da linha usando a curva facilidadeOutBounce acima. Isso significa que ele seguirá a linha exata de a até b , mas irá acelerar e desacelerar de uma forma mais complexa do que seria possível usando o CAMediaTimingFunction atual baseado em bezier.
Vamos fazer dessa linha qualquer movimento de curva arbitrário especificado com CGPath. Ele ainda deve se mover ao longo dessa curva, mas deve acelerar e desacelerar da mesma forma que no exemplo da linha.
Em teoria, acho que deveria funcionar assim:
Vamos descrever a curva de movimento como um movimento de animação de quadro-chave (t) = p , onde t é o tempo [0..1], p é a posição calculada no tempo t . Assim movimento (0) retorna a posição no início da curva, movimento (0,5), o meio exacto e movimento (1) na extremidade. Usar uma função de tempo (T) = t para fornecer os valores de t para mover deve me dar o que eu quero. Para um efeito de salto, a função de tempo deve retornar os mesmos valores t para tempo (0,8) e tempo (0,8)(apenas um exemplo). Basta substituir a função de tempo para obter um efeito diferente.
(Sim, é possível fazer salto de linha criando e juntando quatro segmentos de linha que vão e voltam, mas isso não deve ser necessário. Afinal, é apenas uma função linear simples que mapeia valores de tempo para posições.)
Espero estar fazendo sentido aqui.