Мне трудно описать эту проблему словами, поэтому я сделал видео (45 секунд), чтобы проиллюстрировать это. Вот предварительный просмотр вопросов, пожалуйста, посмотрите на Vimeo: http://vimeo.com/epologee/perfect-crossfade
Проблема создания безупречного перекрестного затухания или растворения двух изображений или форм постоянно возникала у меня в ряде областей в течение последнего десятилетия. Сначала в редактировании видео, затем во флэш-анимации, а теперь в программировании на iOS. Когда вы начинаете гуглить, есть много обходных путей, но я действительно хочу решить это без взлома на этот раз.
Краткое описание:
Как называется техника или кривая, применяемая при смешивании двух полупрозрачных растровых изображений одного цвета, если вы хотите, чтобы полученная прозрачность соответствовала оригиналу любого из них?
Существует ли (математическая) функция для расчета необходимых значений частичной прозрачности / альфа во время затухания?
Существуют языки программирования , которые имеют эти функции в качестве предварительной настройки, сходные с ease in
, ease out
или ease in out
функции , найденные в ActionScript или какао?
Обновление: в дополнение к видео, я сделал пример проекта (требуется Xcode и iOS SDK) и разместил его на github. Он показывает ту же анимацию, что и видео, но на этот раз с квадратами: https://github.com/epologee/StackOverflow-Example-Code
Ответы:
Боюсь, это невозможно. Вот как прозрачность рассчитывается при наложении двух объектов: http://en.wikipedia.org/wiki/Alpha_compositing
Один из объектов должен иметь непрозрачность 1, если вы не хотите, чтобы область наложения была видимой.
источник
Я не знаю, какое название может быть в области редактирования видео, но я бы назвал эту кривую S-образной или сигмовидной кривой . Должно быть очень просто создать перекрестное затухание, которое вы ищете в iOS, используя функцию синхронизации kCAMediaTimingFunctionEaseInEaseOut в Core Animation . Просто анимируйте
alpha
свойство двух видов в противоположных направлениях (один 0-> 1, один 1-> 0), используя эту функцию синхронизации:Примечание. Вы должны действительно использовать методы анимации на основе блоков вместо удобных методов UIView. Я использовал методы UIView выше, потому что это очень легко понять и легко набирать из памяти. Однако использование блоков не намного сложнее.
Приложение: Если вам не нравится UIViewAnimationEaseInOut, вы можете создать свою собственную функцию синхронизации, как описано в разделах Синхронизация , Пространства времени и CAAnimation . Это немного сложнее, чем простая анимация, показанная выше, но она дает вам все необходимое управление.
источник
kCAMediaTimingFunctionEaseInEaseOut
. Могли ли вы иметь в видуUIViewAnimationCurveEaseInOut
? Однако проблема с этой кривой такая же (провал в середине), потому что в любой момент времени два альфа-значения в простом сложении будут равны1.0
, где, как и в моей кривой, отрегулированной вручную, она должна превышать,1.0
чтобы получить желаемые результаты. ,initialTransparency
значение, оно бесполезно. Вы бы не поняли, что попробовать дальше?В компьютерной графике этот вид функции называется плавным шагом . При использовании для кроссфейда он определяет глобальное альфа-значение для композиции.
Если у входных изображений есть альфа-канал, вы должны сначала убедиться, что альфа- канал предварительно умножен . Затем вы можете выполнить композицию кроссфейдера напрямую, используя сглаживание
alpha
для каждого канала [X = A*alpha + B*(1-alpha)
], и ожидать приемлемых результатов.источник
Вы можете использовать функцию экспоненциального затухания:
Ваш график больше похож на:
источник
1 - Alpha1(time)
уравнения не позаботится о провале, потому что два смешанных 0,5 альфа-изображения не приведут к составному изображению с 1,0 альфа. Пользовательские кривые, которые я нарисовал, не отражаются вертикально.