熟悉API方法调用-熟能生巧
复杂动画的拆分经验
每个像素点的处理都是一次计算,因为GPU上有很多计算单元,可以独立的计算,而CPU需要不断的切换,没法专注一个计算,所以像素点的计算是通过GPU来计算的
一、core animation
Core Animation是对图形处理的封装,方便开发者进行调用的一套API
- 简单易用的高性能混合编程模型
- 用类似于视图一样,使用图层来创建复杂的编程接口
- 轻量化的数据结构,它可以同时显示让上百个图层产生动画效果
- 一套非常简单的动画接口,能让动画运行在独立的线程中,并可以独立于主线程之外
- 一旦动画配置完成并启动,核心动画就能独立并完全控制相应的动画帧
- 提高应用性能,应用程序只有当发生改变的时候才会重绘内容,使用Core Animation可以不使用其他的图形api,例如OpenGL来获取高效的动画性能
- 灵活的布局管理模型,允许图层相对同级图层的关系来设置属性的位置和大小
2015年后Core Animation底层变成了Metal,以前是OpenGL ES
image.png二、Core Animation分类
image.png三、CALayer
单一职责,UIView和CALayer职责是不一样的
-
UIView管理交互,Mac OS和iOS交互方式不一样,所以要分开
-
CALayer管理渲染,mac OS和iOS通用
图层树:
渲染树:每次渲染都是单独的线程
CAAnimationGroup:动画组
CABasicAnimation:可以设置动画的起点和结束点
- keyPath:不同的参数对应不同的值,例如"postition.y"代表修改Y的值
- toValue:目标值
- removedOnCompletion:动画结束后会不会回到原来位置,默认是YES
- fillMode:kCAFillModeForwards,设置下才能在动画结束后不回到原来位置
- kCAFillModeForwards:动画结束后layer保持动画最后的状态
- kCAFillModeBackwards:在动画开始前,只要将动画加入一个layer,layer便立即进入动画的初始状态并等待动画开始,有一个准备动作
- kCAFillModeBoth:上面两个结合,一般采用第一中
- kCAFillModeRemoved:默认值,动画结束后回到原来样子,实现方式是先把原始图层隐藏,然后复制一个图层去执行动画,动画结束后会把复制的图层kill掉,然后将原始图层再显示出来
隐式动画:没指定任何动画,但是core animation会自己去添加一个动画,隐式动画时间是0.25秒,通过runloop去执行的
CAKeyframeAnimation:指定动画路径
CATransition:苹果封装好的动画,没有属性,都是类方法,只能通过压栈方式
//begin a new transaction
[CATransaction begin];
//set the animation duration to 1 second
[CATransaction setAnimationDuration:2.0];
_layer.backgroundColor = [UIColor orangeColor].CGColor;
//动画结束的操作
[CATransaction setCompletionBlock:^{
//rotate the layer 90 degrees
CGAffineTransform transform = self.layer.affineTransform;
transform = CGAffineTransformRotate(transform, M_PI_2);
self.layer.affineTransform = transform;
}];
//commit the transaction
[CATransaction commit];
网友评论