3

放射状グラデーションをアニメーション化して、脈動しているかのように、内側の半径を縮小および拡大したいと考えています。

現在、CGGradient でグラデーションをレンダリングしていますが、アニメーション化する方法がわかりません。このトピック見ました

iPhone で Quartz を使用してグラデーションをアニメーション化できますか?

これは、CAGradientLayer を使用して線形グラデーションをアニメーション化する方法を説明していますが、放射状グラデーションを描画するようには見えません。

CGGradient をアニメーション化する簡単な方法、または放射状グラデーション CAGradientLayer を作成する方法はありますか?

どんな考えでも大歓迎です。

4

1 に答える 1

2

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];

残念ながら、これはパルスよりも拡大と縮小のように見えると思います(試したことはありませんが)。

この時点でグラデーションで真のパルスが必要な場合は、おそらく独自のタイマーを使用してアニメーションを手動で行う必要があると思います。定期的に再描画して、内側の半径の値を変更してください。うーん。それが唯一の方法であるとは絶対に確信していませんが、あなたが望んでいるようなグラデーションを備えた魅力的なパルスアニメーションを電話でまだ見たことがありません.

ある時点で試してみたいアイデアがもう 1 つあります。Core Animation で、任意のプロパティ/値をアニメーション化できるようになりました。理論的には、名前を付けた任意のキーパス (たとえば、innerRadius など) を使用してアニメーションを設定し、-drawLayerInContext デリゲート メソッドをオーバーライドすることができます。次に、飛行中にpresentationLayerから現在の値を取得し、代わりにグラデーションを再描画できます。これはまだ試していないのであくまで理論上の話ですが、検討する価値はありそうです。

よろしくお願いします。

于 2010-06-11T18:32:32.977 に答える