簡體   English   中英

使用移動框架為 CAShapeLayer 設置動畫

[英]Animating CAShapeLayer with moving frame

使用核心 animation 層,我一直在嘗試實現以下功能。 在包含超層中,有兩個錨層,以及連接兩者的另一個層。 下圖應該可以清楚地說明情況。 在左側,兩個橙色錨點分別標記為“A”和“B”,綠線將它們連接起來。 封閉層框架使用虛線顯示。 在右側,顯示了我當前實現的層層次結構,其中錨點和連接都是封閉超層的子層。連接的核心動畫層方案

現在,我要做的是讓錨點四處移動,並使連接保持連接狀態。 我目前正在利用連接層的-setFrame:方法更新其框架和路徑屬性,使用如下所示的代碼:

- (void)setFrame:(CGRect)frame {

 CGSize size = frame.size; CGPoint startPoint = CGPointZero; if (size.height < 0.0) startPoint.y -= size.height; CGPathRef oldPath = self.path; CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path, NULL, startPoint.x, startPoint.y); CGPathAddLineToPoint(path, NULL, startPoint.x + size.width, startPoint.y + size.height); CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"path"]; animation.duration = [CATransaction animationDuration]; animation.timingFunction = [CATransaction animationTimingFunction]; animation.fromValue = (id)oldPath; animation.toValue = (id)path; [self addAnimation:animation forKey:@"pathAnimation"]; self.path = path; CGPathRelease(path); [super setFrame:frame];

}

現在,這種工作,但問題是框架(或 position + 邊界)animation 不與路徑 animation 同步運行(和一些其他小問題,最終會導致一些小的連接斷開) ,大概是由相同的核心問題引起的)。

我一直在玩弄這個問題,但只是為了適度的成功。 在某一時刻,我將連接的框架設置為與封閉的超層的框架相同,這確實產生了預期的效果(因為現在框架不再需要動畫了)。 但是,我擔心此解決方案在具有多個連接的上下文中的性能 - 即。 多個不透明的大尺寸重疊層看起來很糟糕?

有人會有更好、更優雅的解決方案嗎? 謝謝!

由於您只是真正拉伸(縮放)和旋轉連接層,您是否考慮過對其應用轉換而不是手動修改框架?

您應該能夠根據錨層的位置使用一些基本的三角函數來計算旋轉角度和比例因子。

由於您正在為路徑而不是圖層或路徑的框架設置動畫,因此您將在大約 10 分鍾后遇到性能問題。 50 個同步動畫。 由於 gpu 加速,只有在操作圖層隱式可動畫屬性時才能獲得高性能,因此是其框架而不是其內容(例如路徑)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM