2015-08-07 3 views
2

Я создаю анимацию, которая раскрывает основное изображение. Существует виртуальная форма (например, звезда), движущаяся хаотично и обнаруживающая разные части изображения.Masking performance

Так что было два растровых изображений до сих пор:

  • маску (след формы движущегося here'n'there)
  • изображение (образ), лежащий в основе

До сих пор в каждом drawRect() Я был:

  1. создание растрового изображения newMask путем копирования текущей маски
  2. рисунок штампа на newMask
  3. создания результирующего растрового изображения (применить newMask на изображение)
  4. рисунок в результате растрового изображения на экране Context

я борюсь с исполнением в этом подходе. Есть идеи, как улучшить его?

В частности:

  • Можно пропустить шаг 1. & 2. и рисовать на маске напрямую (а не клонировать его).
  • Должен ли я начать экспериментировать с CALayer подходом (если такого рода маскировка вообще возможно есть)
  • Должен ли я использовать OpenGL
  • Есть ли другой подход к решению этого?

ответ

1

Нет, вы не должны манипулировать растровыми изображениями. Это, вероятно, будет очень интенсивным, так же как и резким (не гладкая анимация).

Вместо этого вы должны использовать CAShapeLayer в качестве маски и Core Animation.

С слоем формы вы можете установить путь (CGPath, который можно легко создать из UIBezierPath) в слой. Затем вы создаете CABasicAnimation, который переключает путь к новому пути. Хитрость заключается в том, чтобы всегда сохранять одинаковое количество и тип контрольных точек на пусковых и конечных путях анимации. (Если количество и/или тип контрольных точек в двух путях различны, вы получаете очень и очень странные результаты. Обратите внимание, что вызовы пути, которые создают дуги окружностей, фактически генерируют разное количество контрольных точек, исходя из того, дуговые покрытия, поэтому для дуги окружности требуется специальная обработка.)

У меня есть пример проекта на Github, который демонстрирует различные технологии анимации Core, включая демонстрацию анимации «прожектора часов», которая показывает/скрывает и просматривает изображение так же, как вы описываете ,

https://github.com/DuncanMC/iOS-CAAnimation-group-demo

анимация выглядит следующим образом:

enter image description here

Обратите внимание, что прерывистый характер этого образа, потому что это GIF. Фактическая анимация на устройстве является маслянисто-гладкой.Кроме того, можно создавать очень сложные гладкие анимации, как это:

enter image description here

(. Это не маска анимации, но это может быть)

+0

Спасибо, проблема у меня в том, что формы, например звезда клонируется - представьте себе 100 звезд, помещенных на линию с расстоянием 1px, каждая звезда перекрывается соседом. Так что это невозможно сделать с описанным вами подходом. Если я пойму. Форма на самом деле не является началом, но более похожа на это: https://lh3.googleusercontent.com/-G1PLzaN4rOs/TYrq7Pxg9UI/AAAAAAAACpE/_wuvaUoxF-E/s1600/brush.png с альфа-каналом – Kasztan