0

最初は画面全体がマスクされる効果を作ろうとしています。ボールが画面上を移動すると、ボールがある領域のマスクが解除され、ボールがあった領域はマスクされないままになります。

次のコードがあります。

CALayer * ball = [CALayer layer];
ball.bounds = CGRectMake(0, 0, 42, 42);
ball.position = [[[alphabet controls] objectAtIndex:0] CGPointValue];
ball.contents = (id)([UIImage imageNamed:@"done.png"].CGImage);
[self.layer addSublayer:ball];

[self.layer setMask:ball];

CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
anim.path = path;
anim.repeatCount = HUGE_VALF;
anim.duration = 8.0;
[ball addAnimation:anim forKey:@"race"];

このアニメーションはビュー全体をマスクし、ボール レイヤーの背後にあるものだけを表示します。私の質問は次のとおりです。明らかにされた画面の部分をマスク解除したままにするにはどうすればよいですか?

4

1 に答える 1

0

うーん。

必要なのは、ボールの形状が通過したすべてのピクセルを含む画像です。

フレームベースのアニメーションでボールをアニメーション化する場合は、グレースケール (または 1 ビット) の画像を作成し、それをマスク レイヤーのコンテンツとしてインストールできます。次に、ボールを動かしながら、フレームごとにマスク イメージにボールを描画できます。

コア アニメーションで同じ効果を得る方法がわかりません。

マスクを CAShapeLayer にして、ボールのパス全体を記述する CGPath を作成し、それをシェイプ レイヤーのパスにすることができます。ボールが丸い場合は、シェイプ レイヤーの線の太さをボールのサイズに設定できます。それはうまくいくでしょう。ただし、ボールが不規則な形状の場合、そのアプローチは機能しません。iOS の Quartz グラフィックスには、任意の形状のブラシでパスをストロークする方法がありません。

于 2012-04-27T02:56:55.610 に答える