2010-07-24 99 views
0

我有一個CALayer,其最終大小繪製了一個圓。我想讓這個圈子動起來,以1%的比例開始,並以100%結束。現在動畫不是很平滑,因爲邊緣在縮放時閃爍。在最終尺寸的圓圈看起來是正確的。我想知道是否有一種方法可以在動畫本身中進行消除鋸齒。在CALayer上動畫「轉換」屬性時進行抗鋸齒?

CATransform3D fromTransform = CATransform3DMakeScale(0.01, 0.01, 1.0); 
CATransform3D toTransform = CATransform3DMakeScale(1.0, 1.0, 1.0); 

CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
theAnimation.duration = 1.5; 
theAnimation.fromValue = [NSValue valueWithCATransform3D:fromTransform]; 
theAnimation.toValue = [NSValue valueWithCATransform3D:toTransform]; 

[myLayer addAnimation:theAnimation forKey:@"animateScale"]; 

回答

2

我不認爲有一種方法可以改變圖層的縮放方式。但是,通過將多個分辨率的圓圈渲染到不同大小的圖層中,並同時對它們進行動畫處理,您可能能夠獲得更好的效果 - 逐漸縮放和逐漸變大的圖層,直到達到最終的全尺寸圖層。

您也可以嘗試直接逐幀繪製圓,而不是動畫製作圖層大小 - 如果繪圖速度足夠快,您將保持良好的幀率,並且不會出現任何縮放僞影。如果選擇此路徑,通常最好在專用於此動畫的單獨線程上執行此操作,而不是使用主線程。

在類似的情況下,我通常最終會軟化我的繪圖上的邊緣 - 精心挑選的陰影或花朵確實可以減少混疊僞像,並且比其他任何解決方案都要簡單得多。 (還要注意圓的筆觸寬度與圖層成比例:如果在黑色背景上使用全寬爲1像素的線條寬度繪製白色圓圈,則在1%處線條寬度將僅爲0.01像素!)

+0

謝謝您的輸入。我有這樣的感覺。我在iPhone上這樣做,所以過濾器不可用。我會嘗試一幀一幀的方法。有關使用線程的好建議! – anna 2010-07-24 20:14:58

0

方法:採用layer.shouldRasterize

  1. 創建superlayer/superview這是在所有4個方向1個像素大
  2. 執行變換的superlayer/superview
  3. 原始layerlayer.shouldRasterize啓用/ view

方法:繪製到UIImage

  • 畫出你的內容,以一個UIImage
  • 請確保您有1個像素的透明邊框環繞內容
  • 顯示圖片

參考:http://darknoon.com/2012/05/18/the-transparent-border-trick/