关于UIBezierPath后面会再单独 然后我们说下动画组, CAAnimation是可以几个动画合并在一起的 上代码: //2.2 创建CABasicAnimation动画 CABasicAnimation
时间属性的综合应用.png 三、CAAnimation基类 CAAnimation作为所有动画类型父类,是一个抽象类;我们不能直接使用CAAnimation类,而是使用它的子类;关于它的定义如下: @interface CAAnimation : NSObject<NSSecureCoding, NSCopying, CAMediaTiming, CAAction> @property(nullable, strong 比如KCAMediaTimingFuncationLinear选项创建的是一个线性的计时函数,这也是CAAnimation的timingFunction属性为空时候的默认函数。 . */ @protocol CAAnimationDelegate <NSObject> @optional //动画开始时调用 - (void)animationDidStart:(CAAnimation 九、委托模式下的动画区分 对于CAAnimation而言,使用委托模式而不是一个完成块会带来一个问题,那就是设置多个动画时,无法在回调方法中区分。
使用步骤: 1、创建一个CAAnimation对象 2、设置一些动画的相关属性 3、给CALayer添加动画(addAnimation:forKey: 方法) 4、停止CALayer动画(removeAnimationForKey CAAnimation继承结构 ---- 一、 CAAnimation CAAnimation类是所有动画对象的父类,负责控制动画的持续时间和速度等,是个抽象类,不能直接使用,应该使用它具体的子类 delegate:动画代理,一般设置隐式代理,该代理是NSObject的分类,不需要遵守协议 anim.delegate = self; (1)- (void)animationDidStart:(CAAnimation *)anim;核心动画开始时执行 (2)- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;核心动画执行结束后调用 -- -- 二、 CAPropertyAnimation 是CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使用它的两个子类:CABasicAnimation和CAKeyframeAnimation
老司机带你走进Core Animation 之CAAnimation 系列文章: 老司机带你走进Core Animation 之CAAnimation 老司机带你走进Core Animation 之CADisplayLink 说一下CAAnimation相关的吧,因为最近也刚好在研究这些东西。不过看到末尾之前,请你相信我今天讲CAAnimation绝对是有阴谋的。 ---- CAAnimation CAAnimation是什么呢? CAAnimation is an abstract animation class. -(void)animationDidStart:(CAAnimation *)anim; -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL 我们点进去可以看到,animations是装有CAAnimation对象一个的数组。
少量的代码可以实现非常强大的功能 2)、Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程 3)、Core Animation是直接操作在CALayer上的,并非UIView 4)、CAAnimation 5)、CAAnimation 是所有动画对象的父类,负责控制动画的持续时间和速度,是个抽象类,不能直接使用,只能使用它具体的子类。 *)anim finished:(BOOL)flag; 9)、CAPropertyAnimation CAPropertyAnimation是CAAnimation的子类,也是个抽象类,要想创建动画对象 如果没有设置keyTimes,各个关键帧的时间是平分的 12)、CAAnimationGroup --- 动画组 动画组,是CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup 默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间 13)、转场动画 --- CATransition CATransition是CAAnimation
https://github.com/gongxiaokai/CAAnimationDemo
###思路 1.把模型导入 2.从dea文件中取出动画 装在字典里 3.点击3D模型的时候就在rootNode添加动画或删除动画 4.用时间控制动画--CAAnimation 里的 timeOffset \* animation1 = [self.sceneSource entryWithIdentifier:@"twist\_danceFixed-1" withClass:[CAAnimation \* animation2 = [self.sceneSource entryWithIdentifier:@"twist\_danceFixed-1" withClass:[CAAnimation \* animation3 = [self.sceneSource entryWithIdentifier:@"twist\_danceFixed-1" withClass:[CAAnimation ###CAAnimation 的属性 ###fadeInDuration 对于附加到SceneKit对象的动画,在开始时转换为动画效果的持续时间。 使用此属性在多个动画的效果之间创建平滑过渡。
二、CAAnimation动画体系的介绍 CAAnimation是CoreAnimation框架中执行动画对象的基类,下面有一张图,是我手画的,不太美观,但是可以将与CAAnimation 从上图中可以看到,从CAAnimation中继承出三个子类,分别是用于创建属性动画的CAPropertyAnimation,创建转场动画的CATransition和创建组合动画的CAAnimationGroup 1.CAAnimation属性和方法 CAAnimation作为动画对象的基类,其中封装了动画的基础属性,如下: //通过类方法创建一个CAAnimation对象 + (instancetype)animation 的代理方法入如下几个: //动画开始时执行的回调 - (void)animationDidStart:(CAAnimation *)anim; //动画结束后执行的回调 - (void)animationDidStop :(CAAnimation *)anim finished:(BOOL)flag; 2.CAPropertyAnimation属性与方法 CAPropertyAnimation是继承于CAAnimation
老司机带你走进Core Animation 之几种动画的简单应用 系列文章: 老司机带你走进Core Animation 之CAAnimation 老司机带你走进Core Animation 之CADisplayLink CAAnimation固然灵活,但要是使用方法不当的话,也会事倍功半。所以呢,今天老司机就针对以下几种情况来介绍截个动画的实现方式。 这个时候,我们是否可以换个思路,记得CAAnimation中可以指定每种状态时间的那个动画叫什么么还?对了,CAKeyframeAnimation。不记得了回头看看这里的内容。 其实有了上面的铺垫你应该会马上反映出两种思路:CAAnimation动画或者一帧一帧绘制。 这里老司机说一句,本质上,如果补间动画能完成效果的话,尽量使用CAAnimation,不用一帧帧绘制,代码量少了,cpu压力也小点。但是一般情况写复杂的补间动画都画不出来,比如说这个。
我们可以通过CATransiton来自定义一些漂亮的转场动画, CATransition继承自CAAnimation, 所以用法跟CAAnimation差不多 先直接上一个代码: #import "ViewController.h addAnimation:animation forKey:@"ropple"]; self.imageView.image = [UIImage imageNamed:@"2"]; } 创建专场动画跟创建CAAnimation
:(Class)entryClass; 作用: 获取场景中包含的某一类对象的标识(数组),可以获取的类型有 SCNMaterial, SCNScene, SCNGeometry, SCNNode, CAAnimation .获取场景中的某种对象的标识数组 // 我们获取动画类的数组 NSArray *animationIDs = [sceneSource identifiersOfEntriesWithClass:[CAAnimation *animation = [sceneSource entryWithIdentifier:animationIDs[index] withClass:[CAAnimation class]]; identifiersOfEntries(withClass: CAAnimation.self) var animationArray:[CAAnimation] = [] for id entryWithIdentifier(id, withClass: CAAnimation.self) animationArray.append(animation!)
来来来,今天咱们通过实现一个类似Twitter的启动动画来看看CAKeyFrame Animation和CAAnimation Group怎么玩。 所以今天咱们的重点到了第七章,CAKeyFrame Animation和CAAnimation Group。 最后的那个启动动画完全是为了实践一下看看CAKeyFrame Animation和CAAnimation Group怎么使用。 有读者私下说更新速度太慢了。 CAKeyFrame Animation和CAAnimation Group.png 下面展示一下写完之后的成果: ? ani.gif 源代码可以在这里下载,里面有OC和Swift两版。 是CAAnimation的子类 可以保存一组动画对象,将CAAnimationGroup对象加入图层后,组中所有动画对象可以同时并发运行.
很幸运,苹果在 iOS15提供了一个 CAAnimation 的 api,即-[CAAnimation preferredFrameRateRange],它接受3个参数分别指定minimum 帧率,maximum 帧率,以及 preferred 帧率,基于这个api我们可以对于 CAAnimation 动画设置帧率。 CAAnimation 的 preferredFrameRateRange,以方便调节帧率,达到在高刷机上能进一步降低功耗的目的。 通过调试分析,我们大概清楚了 iOS15引入的 CAAnimation 的 preferredFrameRateRange 工作机制,如下图所示。 如图所示: 那我们是否可以 hook CAAnimation 然后寻找时机设置它的 preferredFrameRateRange 以达到降帧的目的?
= 5.0 23 24 imageView.layer.add(animation, forKey:“Move”) 25 } 26 func animationDidStart(_ anim:CAAnimation ) { 27 print(“The animation starts”) 28 } 29 30 func animationDidStop(_ anim:CAAnimation, finished
delegate 代理,两个动画代理方法:- (void)animationDidStart:(CAAnimation *)anim; 和- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag; - (void)addAnimation:(CAAnimation *)anim forKey:(nullable NSString *)key timingFunctions 也是CAKeyframeAnimation的属性,对应每个动画段的动画过渡情况;而timingFunction是CAAnimation的属性。 3.CAAnimationGroup CAAnimationGroup的用法与其他动画类一样,都是添加到layer上,比CAAnimation多了一个animations属性。 接上面示例之后的动画,实现视图继续绕Y轴旋转90°,下落回原处: - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
1. iOS动画 总的来说,从涉及类的形式来看,iOS动画有:基于UIView的仿射形变动画,基于CAAnimation及其子类的动画,基于CG的动画。这篇文章着重总结前两种动画。 2. 这种动画,不需要 调用核心动画CAAnimation里面的专用类和API。 CAAnimation核心动画 CAAnimation——所有动画对象的父类 3.1 设置动画的一种语法形式 addAnimation /** * 抖动效果 */ -(void)shakeAnimation 继承结构 CAAnimation{ CAPropertyAnimation{ CABasicAnimation{ CASpringAnimation 如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwards fillMode属性值 CAAnimation——控制恢复到动画执行前
CAAnimation是核心动画的基类,不能直接使用,主要负责动画的时间、速度等,本身实现了CAMediaTiming协议。 @interface CAAnimation : NSObject <NSSecureCoding, NSCopying, CAMediaTiming, CAAction> { @private void *_attr; uint32_t _flags; } CAAnimation属性 说明 timingFunction CAMediaTimingFunction速度控制函数,控制动画运行的节奏 的子类,默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的时间 CATransition属性 说明 animations CAAnimation,动画组 将委托分配给CAAnimation对象并实现animationDidStart:和animationDidStop:finished:委托方法。
rootNode.clone() var animations:[CAAnimation] = [] let animationIds = skeletonNode?. identifiersOfEntries(withClass: CAAnimation.self) var maxDuration:CFTimeInterval = 0 for id in entryWithIdentifier(id, withClass: CAAnimation.self) { animations.append(animation)
翻阅文档,发现begintime、speed等属性是CAMediaTiming这协议的属性,并且CALayer、CAAnimation都遵守了CAMediaTiming协议。 这个协议被CAAnimation及CALayer遵守,每一个遵守协议的的object对应一个time space。根据object之间的关系,不同的time space有层级关系。 比如CALayer、CAAnimation(及其子类CAAnimationGroup)都可以作为层级时间系统的一部分。 比如当前层级是一个动画(CAAnimation遵守CAMediaTiming协议),duration是1s,经过第一次转换之后的active local time是5.5s。
CAAnimation是所有动画对象的父类,实现CAMediaTiming协议,负责控制动画的时间、速度和时间曲线等等,是一个抽象类,不能直接使用。 CAPropertyAnimation :是CAAnimation的子类,它支持动画地显示图层的keyPath,一般不直接使用。 CAAnmation是抽象类,所以一般要使用自具体子类,就是上面说的五类 设置CAAnmation的属性,不同的动画类别属性参数不一样的 调用CALayer的addAnimation:forKey:将CAAnimation 一个线性的计时函数,同样也是CAAnimation的timingFunction属性为空时候的默认函数。线性步调对于那些立即加速并且保持匀速到达终点的场景会有意义(例如射出枪膛的子弹)。 那么你会疑惑为什么这不是默认的选择,实际上当使用UIView的动画方法时,他的确是默认的,但当创建CAAnimation的时候,就需要手动设置它了。