繁体   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