隐式动画和核心动画
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了隐式动画和核心动画相关的知识,希望对你有一定的参考价值。
1.
隐式动画,只有非根层的CALayer才有隐式动画,即改变图层的属性的时候,比如大小,颜色等,会自动添加一个颜色效果,
根层:控件里面的CALayer
非根层:自己创建的CALayer,不依附控件存在的CALayer
隐式动画的使用场景不多
2. 核心动画:
Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍。也就是说,使用少量的代码就可以实现非常强大的功能。Core Animation可以用在Mac OS X和ios平台。Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程。
要注意的是,Core Animation是直接作用在CALayer上的,并非UIView。CALayer中很多属性都可以通过CAAnimation实现动画效果,包括:opacity、position、transform、bounds、contents等,通过调?用CALayer的addAnimation:forKey增加动画到层(CALayer)中,这样就能触 发动画了。
CAAnimation的继承结构如下:
注意:
这个核心动画仅仅是一个效果,动画结束之后并不保存动画结束之后的值,要想保存动画结束之后的值,两种方案
1.使用animationstop方法(CAAnimation的代理方法),设置相应属性的值为动画结束后的值(或者在动画执行完毕后的代码里面添加动画完成之后的结果的代码)
2.设置动画的属性
removedOnCompletion:动画对象是否移除,默认是移除
fillMode:确定该对象的状态在非action段的状态,比如是动画之前的,还是动画之后的
示例:
//保留动画之后的状态
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
1>CABasicAnimation
CABasicAnimation *basicamt = [CABasicAnimation animation];
//设置动画的属性,比如ToValue,fromValue,还有duration,keypath等等
//设置代理,控制器就不用再添加遵循CAAnimationDelegate的代码了,系统默认添加过了
basicamt.delegate = self;
//keypath表示动画效果是改变的layer的哪个属性
basicamt.keyPath = @"bounds";
//fromValue,toValue分别表示keyPath属性从哪个值开始到哪个值结束,参数是oc对象,所以要将CGRect数据包装成oc对象
basicamt.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 300, 200)];
basicamt.removedOnCompletion = NO;
basicamt.fillMode = kCAFillModeForwards;
//添加到layer
[self.imageview.layer addAnimation:basicamt forKey:nil];
2>CAKeyframeAnimation
//帧动画使用示例
CAKeyframeAnimation *keyframeanimation = [CAKeyframeAnimation animation];
//设置values数组,由几个点构成,这里构造四个位置点,作为动画的运动路径
/*
运动的路径,是layer的中心点沿着路径做运动,所以起始点应该是中心点
*/
NSValue *value1 =[NSValue valueWithCGPoint:CGPointMake(50, 50)];
NSValue *value2 =[NSValue valueWithCGPoint:CGPointMake(300, 50)];
NSValue *value3 =[NSValue valueWithCGPoint:CGPointMake(300, 300)];
NSValue *value4 =[NSValue valueWithCGPoint:CGPointMake(50, 300)];
//数组里面只能放oc对象,所以要把CGPoint值封装成NSValue对象
keyframeanimation.values = @[value1,value2,value3,value4,value1];
//设置动画时间
keyframeanimation.duration = 5;
//设置运动的 方式属性 timingFunction,动画的运动方式
//是CAMediaTimingFunction类的,并不是枚举类型
/*
kCAMediaTimingFunctionLinear 匀速
kCAMediaTimingFunctionEaseIn 先慢后快
kCAMediaTimingFunctionEaseOut 先快后慢
kCAMediaTimingFunctionEaseInEaseOut 两头慢,中间快
kCAMediaTimingFunctionDefault 默认
*/
keyframeanimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
//还有一种方法通过path设置路径
//创建path
CGMutablePathRef path = CGPathCreateMutable();
//在路径上添加一个圆
CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
CGPathAddEllipseInRect(path, NULL, CGRectMake(0, 0, screenW, screenW));
//设置动画的path属性
keyframeanimation.path = path;
//c 语言资源create,copy,new等创建的对象要手动销毁
CFRelease(path);
[self.imageview.layer addAnimation:keyframeanimation forKey:nil];
/*
在帧动画内部属性,path的优先级要高于values的优先级
*/
3>CATransition
//实现转场动画 **CATransition**
CATransition *animation = [CATransition animation];
//CATransition有两个常用属性,一个是type,另一个是subtype,表示转场动画的样式。
/*
`fromLeft‘, `fromRight‘, `fromTop‘ and
* `fromBottom‘
*/
animation.type = @"fromLeft";
//添加到控件图层
[self.imageview.layer addAnimation:animation forKey:nil];
4>CAAnimationGroup
//创建组动画
CAAnimationGroup *group = [CAAnimationGroup animation];
//创建基本动画对象,实现平移效果
CABasicAnimation *basic = [CABasicAnimation animation];
//属性
basic.keyPath = @"position";
basic.byValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
//创建基本动画对象,实现旋转效果
CABasicAnimation *basic2 = [CABasicAnimation animation];
//属性
basic2.keyPath = @"transform.rotation";
//rotation属性如果不指定绕哪个轴,可以直接设置角度,默认是z轴。
//scale属性不指定具体的轴的话,默认是都放大或者缩小
basic2.byValue = @(M_PI_2);
//创建基本动画,实现放大缩小效果
CABasicAnimation *basic3 = [CABasicAnimation animation];
//属性
basic3.keyPath = @"transform.scale";
basic3.byValue = @1.5;
//添加到组动画
group.animations = @[basic,basic2,basic3];
//组动画属性
group.duration = 3;
group.removedOnCompletion = NO;
group.fillMode = kCAFillModeForwards;
//将组动画添加到图层
[self.imageniew.layer addAnimation:group forKey:nil];
以上有错误的地方还请大神们多多指教。谢谢
以上是关于隐式动画和核心动画的主要内容,如果未能解决你的问题,请参考以下文章