Можно ли анимировать радиальный градиент в iPhone? - PullRequest
3 голосов
/ 11 июня 2010

Я хотел бы анимировать радиальный градиент, чтобы уменьшить и увеличить внутренний радиус, как если бы он был пульсирующим.

Сейчас я отрисовываю градиент с помощью CGGradient, но я не уверен, как его анимировать. Я видел эту тему

Можете ли вы анимировать градиенты с помощью кварца в iPhone?

Что объясняет, как анимировать линейный градиент с помощью CAGradientLayer, но не похоже, что это нарисует радиальный градиент.

Есть ли простой способ анимировать CGGradient или какой-нибудь способ создать радиальный градиент CAGradientLayer?

Любые мысли приветствуются.

1 Ответ

2 голосов
/ 11 июня 2010

Если бы на телефоне был только Core Image, это было бы тривиально.Анимационный фильтр - это то, что вам нужно.; -)

CAGradientLayer позволяет анимировать свои свойства, однако в настоящее время он поддерживает только линейные градиенты.

Единственное, о чем я могу подумать, если вы хотите анимировать с помощью Core Animationанимировать трансформацию вида, в который вы рисуете свой градиент.

Вы можете анимировать преобразование любого вида довольно просто.Просто нарисуйте свой градиент в виде, как вы, вероятно, уже делаете, а затем анимируйте преобразование, используя масштабирование.Используя явную анимацию, это было бы что-то вроде:

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
[anim setFromValue:[NSValue valueWithCATransform3D:CATransform3DIdentity]];
// Scale x and y up
[anim setToValue:[NSValue valueWithCATransform3D:
                CATransform3DMakeScale (1.0f, 1.0f,0.0f)]];
[anim setAutoreverses:YES];
[anim setRepeatCount:HUGE_VALF];

[[gradientView layer] addAnimation:anim];

К сожалению, это выглядело бы как расширение и сжатие больше, чем пульсация, я думаю (хотя я не пробовал).

Я думаю, что если вы хотите, чтобы в этом месте был настоящий пульс с вашим градиентом, вам, вероятно, придется выполнять анимацию вручную, используя собственный таймер.Просто перерисуйте периодически изменяя значение вашего внутреннего радиуса, как вы идете.Тьфу.Я не совсем уверен, что это единственный способ, но мне еще предстоит увидеть убедительную импульсную анимацию на телефоне с градиентом, как вам нужно.

Есть еще одна идея, которую я хотел бы попробоватькакой-то момент.Базовая анимация теперь позволяет анимировать произвольные свойства / значения.Теоретически вы можете настроить анимацию, используя какой-либо произвольный путь, который вы называете (например, innerRadius), и переопределить метод -drawLayerInContext.Затем вы можете получить текущее значение из presentationLayer, пока он находится в середине полета, и вместо этого заново нарисовать свой градиент.Это просто теоретически, так как я не пробовал, но, похоже, стоит посмотреть.

С уважением.

...