CoreAnimation框架时基于OpenGL与CoreGraphics图像处理框架的一个跨平台的动画框架.简单来说,它帮组我们将图像读取成位图,通过硬件处理,实现动画效果.
在CoreAnimation中,大部分动画都是通过Layer层来实现的,通过CALayer,我们可以组织复杂的层级结构。
在CoreAnimation中,大多数的动画效果是添加在图层属性的变化上的。例如改变图层的位置、大小、颜色、圆角半径等等。Layer层并不决定视图的展现,它只是存储了视图的几何属性状态。
1、Layer的锚点
锚点决定了图层的绘制位置以及在动画展示时其参照的点 ,锚点的取值范围为0~1,锚点有两个地方在应用中会有很大点影响。
1.1、Layer层的position参照点始终和锚点重合
通过position决定了Layer所在的位置,在Layer中,虽然也有frame这样的属性,但我们很少用,一般我们会使用bounds和position确定Layer层的大小和位置。
1.2、锚点决定进行动作的参照点
例如一个选择动作,锚点决定了层旋转的中心点,对于放大或缩小动作,锚点决定了放大或缩小参照的中心点。
image.png
上面两个矩形的frame和bounds都是一样的,第一个矩形的锚点位置为(0.5,0.5),第二个为(0,0),因此两个矩形的position点是不一样的,第一个是(100,100),第二个是(40,60)。锚点对视图动作的影响如下图:
image.png
锚点的不同直接影响了动作产生的参照点。通过CALayer的如下属性,我们可以设置锚点。注意x,y的取值范围都是0~1,代表所占宽度和高度的比例:
@property CGPoint anchorPoint;
2、深入理解CALayer
在每个UIView的对象中都有一个Layer属性,来负责View中有关图形绘制的相关操作。
2.1、CAGradientLayer
CAGradientLayer是用于色彩梯度展示的Layer图层,我们可以通过它很轻松的创建出有过度效果的色彩图。
- (void)creatGradientLayer {
CAGradientLayer *layer = [CAGradientLayer layer];
//颜色数组,设置我们需要的过渡颜色,必须是CGColor对象
layer.colors = @[(id)UIColor.redColor.CGColor,(id)UIColor.blueColor.CGColor,(id)UIColor.yellowColor.CGColor,(id)UIColor.greenColor.CGColor];
//过渡颜色过渡的位置
layer.locations = @[@0.1,@0.5,@0.8,@1];
layer.bounds = CGRectMake(0, 0, 200, 200);
layer.position = CGPointMake(200, 300);
//渲染颜色的起点和终点,取值为0~1,默认起点为(0.5,0),终点为(0.5,1),颜色的过渡范围就是沿y轴从上向下
layer.startPoint = CGPointMake(0, 0);
layer.endPoint = CGPointMake(1, 1);
[self.view.layer addSublayer:layer];
}
效果图如下:
image.png
2.2、CAReplocatorLayer
CAReplocatorLayer是拷贝视图容器,我们可以通过它对其中的子Layer进行拷贝,并进行一些差异化处理。
- (void)creatCAReplocatorLayer {
// 1.创建一个复制图层对象,设置复制层的属性
CAReplicatorLayer *replicatorLayer = [CAReplicatorLayer layer];
// 1.1.设置复制图层中子层总数:这里包含原始层
replicatorLayer.instanceCount = 8;
// 1.2.设置复制子层偏移量,不包含原始层,这里是相对于原始层的x轴的偏移量
replicatorLayer.instanceTransform = CATransform3DMakeTranslation(45, 0, 0);
// 1.3.设置复制层的动画延迟事件
replicatorLayer.instanceDelay = 0.1;
// 1.4.设置复制层的背景色,如果原始层设置了背景色,这里设置就失去效果
replicatorLayer.instanceColor = [UIColor greenColor].CGColor;
// 1.5.设置复制层颜色的偏移量
replicatorLayer.instanceGreenOffset = -0.1;
// 2.创建一个图层对象 单条柱形 (原始层)
CALayer *layer = [CALayer layer];
// 2.1.设置layer对象的位置
layer.position = CGPointMake(15, self.view.bounds.size.height);
// 2.2.设置layer对象的锚点
layer.anchorPoint = CGPointMake(0, 1);
// 2.3.设置layer对象的位置大小
layer.bounds = CGRectMake(0, 0, 30, 150);
// 2.5.设置layer对象的颜色
layer.backgroundColor = [UIColor whiteColor].CGColor;
// 3.创建一个基本动画
CABasicAnimation *basicAnimation = [CABasicAnimation animation];
// 3.1.设置动画的属性
basicAnimation.keyPath = @"transform.scale.y";
// 3.2.设置动画的属性值
basicAnimation.toValue = @0.1;
// 3.3.设置动画的重复次数
basicAnimation.repeatCount = MAXFLOAT;
// 3.4.设置动画的执行时间
basicAnimation.duration = 0.5;
// 3.5.设置动画反转
basicAnimation.autoreverses = YES;
// 4.将动画添加到layer层上
[layer addAnimation:basicAnimation forKey:nil];
// 5.将layer层添加到复制层上
[replicatorLayer addSublayer:layer];
// 6.将复制层添加到view视图层上
[self.view.layer addSublayer:replicatorLayer];
}
这样一个简单的音乐波动控件就ok了,效果如下图:
image.png
2.3、CAShapeLayer
CAShapeLayer是图形的Layer层,我们可以自定义这个层的形状。
- (void)creatCAShapeLayer {
//创建个Layer的图形层
CAShapeLayer *layer = [CAShapeLayer layer];
layer.position = CGPointMake(0, 0);
//创建一个边界路径(绘制个三角形)
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, 0, 100, 100);
CGPathAddLineToPoint(path, 0, 300, 100);
CGPathAddLineToPoint(path, 0, 200, 200);
CGPathAddLineToPoint(path, 0, 100, 100);
layer.path = path;
//填充颜色
layer.fillColor = UIColor.redColor.CGColor;
//填充规则 NonZeor-非零填充,EvenOdd-奇偶填充,
layer.fillRule = kCAFillRuleEvenOdd;
//设置线条颜色
layer.strokeColor = UIColor.blueColor.CGColor;
//设置线条的起点和终点在0~1间
layer.strokeStart = 0;
layer.strokeEnd = 0.8;
layer.lineWidth = 5;
//设置两条线段相交时锐角斜面的长度
layer.miterLimit = 1;
//设置线条的收尾外观 Butt-五星壮,Round-圆形,square-方形
layer.lineCap = kCALineCapRound;
//设置线条的连接方式 Miter-棱角,Round-平滑,Bevel-折线
layer.lineJoin = kCALineJoinRound;
[self.view.layer addSublayer:layer];
}
效果图如下:
image.png
2.4、CATextLayer
CATextLayer可以用来进行文本的绘制,方法比较简单这里就不在详细介绍了
网友评论