您的位置:首页 > 编程语言 > ASP

ios动画笔记(2)CATransform3D和CASpringAnimation 、CATransition和CAEmitterLayer、UIDynamicAnimator

2017-03-14 10:50 591 查看
用到了,经常忘记,记录一下几个例子

1、CATransform3D

主要能产生z轴翻转时的效果?记录下几个函数调用

(1)、CATransform3DIdentity 返回动画最初的状态,该矩阵没有缩放,旋转,歪斜,透视。该矩阵应用到图层上,就是设置默认值。

(2)、CATransform3D CATransform3DMakeRotation
(CGFloat angle, CGFloat x, CGFloat y, CGFloat z);//旋转

旋转效果。angle:旋转的弧度,所以要把角度转换成弧度:角度 * M_PI / 180。x:向X轴方向旋转。值范围-1
--- 1之间y:向Y轴方向旋转。值范围-1 --- 1之间z:向Z轴方向旋转。值范围-1
--- 1之间

(3)、CATransform3D CATransform3DMakeTranslation
(CGFloat tx, CGFloat ty, CGFloat tz)//位置移动

tx::x平移。  ty:y平移。  tz:z平移,tx:X轴偏移位置,往下为正数。ty:Y轴偏移位置,往右为正数。tz:Z轴偏移位置,往外为正数。

(4)、CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz);

sx:X轴缩放,代表一个缩放比例,一般都是 0 --- 1 之间的数字。sy:Y轴缩放。sz:整体比例变换时,也就是m11(sx)==
m22(sy)时,若m33(sz)>1,图形整体缩小,若0<1,图形整体放大,若m33(sz)<0,发生关于原点的对称等比变换。

(5)、CATransform3DConcat(rotateTransform, scaleTransform);
//Concat就是combine的意思

+(void)animal3D8:(UIView *)view1 view2:(UIView *)view2
{
view1.layer.transform = CATransform3DMakeRotation(M_PI/4, 0, 1, 0);

CATransform3D trans = CATransform3DIdentity;
trans.m34 = -1/100.0;
trans = CATransform3DRotate(trans, M_PI * 3 , 0, 1, 0);
// view2.layer.transform =trans;

CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
[theAnimation setAutoreverses:YES]; //原路返回的动画一遍
[theAnimation setDuration:2.0];
[theAnimation setRepeatCount:HUGE_VALF];
[theAnimation setFromValue:[NSValue valueWithCATransform3D:CATransform3DIdentity]]; //放在3D坐标系中最正的位置
[theAnimation setToValue:[NSValue valueWithCATransform3D:trans]];
[view2.layer addAnimation:theAnimation forKey:nil];

}

2、CATransition

+ (void)basceAnimal9:(UIImageView *)centerShow
{
CATransition * ani = [CATransition animation];
ani.type = kCATransitionFade;
ani.subtype = kCATransitionFromLeft;
ani.duration = 1.5;

if ([centerShow.image isEqual:[UIImage imageNamed:@"flower"]])
{
centerShow.image = [UIImage imageNamed:@"reUpload"];
}
else
{
centerShow.image = [UIImage imageNamed:@"flower"];
}
[centerShow.layer addAnimation:ani forKey:@"transitionAni"];
}

3、CASpringAnimation

弹簧效果

+ (void)basceAnimal10:(UIView *)centerShow
{
CASpringAnimation * ani = [CASpringAnimation animationWithKeyPath:@"bounds"];
ani.mass = 10.0; //质量,影响图层运动时的弹簧惯性,质量越大,弹簧拉伸和压缩的幅度越大
ani.stiffness = 5000; //刚度系数(劲度系数/弹性系数),刚度系数越大,形变产生的力就越大,运动越快
ani.damping = 100.0;//阻尼系数,阻止弹簧伸缩的系数,阻尼系数越大,停止越快
ani.initialVelocity = 5.f;//初始速率,动画视图的初始速度大小;速率为正数时,速度方向与运动方向一致,速率为负数时,速度方向与运动方向相反
ani.duration = ani.settlingDuration;
ani.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, centerShow.frame.size.width + 200, centerShow.frame.size.height + 200)];

ani.removedOnCompletion = NO;
ani.fillMode = kCAFillModeForwards;
ani.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[centerShow.layer addAnimation:ani forKey:@"boundsAni"];
}

4.CAEmitterLayer

粒子发射

-(CAEmitterLayer *)emitter
{
if (!_emitter)
{
_emitter = [CAEmitterLayer layer];
//给定尺寸
// _emitter.frame = CGRectMake(100, 100, 100, 100);
// //显示边框
// _emitter.borderWidth = 0.f;
//发射点
_emitter.emitterPosition = CGPointMake(-20, mScreenHeight - 400);
//发射模式
_emitter.emitterMode = kCAEmitterLayerSurface;
//发射形状
_emitter.emitterShape = kCAEmitterLayerLine;

[self.view.layer addSublayer:_emitter];

CAEmitterCell *cell = [CAEmitterCell emitterCell];
//粒子产生率
cell.birthRate = 30.f;
//粒子生命周期
cell.lifetime = 1.f;
cell.lifetimeRange=1;
// cell.speed = 5.f;
//速度值
// cell.velocity = 10;
//速度值的微调值
// cell.velocityRange = 20;
//y轴加速度
// cell.yAcceleration = -500.f;

cell.scale = 0.5;
cell.scaleRange = 0.5;
// cell.xAcceleration = 2.f;
//发射角度
cell.emissionRange = 0.5 * M_PI;
//设置粒子颜色
// cell.color = [UIColor blueColor].CGColor;

cell.contents = (__bridge id _Nullable)([UIImage imageNamed:@"snow"].CGImage);

//粒子的速度
cell.velocity = 80;
//粒子速度的容差
cell.velocityRange=45;
cell.emissionLatitude = -M_PI_2;
// cell.emissionLongitude = -M_PI_2*0.5;
cell.emissionRange = 0.5 * M_PI_2;
//让CAEmitterCell与CAEmitterLayer产生关系
_emitter.emitterCells = @[cell];
}
return _emitter;
}

static int i = 0;

-(void)emitterSnow
{
i = i + 5;
if (i > mScreenWidth)
{
i = -20;
// [self.snowTimer invalidate];
// self.snowTimer = nil;
}
NSLog(@"--->>%d",i);
self.emitter.emitterPosition = CGPointMake(i, mScreenHeight - 400);
}

5、UIDynamicAnimator

重力、碰撞属性等

-(void)initSelfData
{
// attachmentBehavior = [[UIAttachmentBehavior alloc] initWithItem:bgView1
// offsetFromCenter:self.view.center
// attachedToAnchor:location];

// animator= [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
// [animator addBehavior:self.attachmentBehavior];

UIDynamicAnimator* animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

UICollisionBehavior* collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[bgView1]];
// UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc]init];
//碰撞类型为元素和边界
collisionBehavior.collisionMode = UICollisionBehaviorModeEverything;
// CGFloat Y = self.view.frame.size.height - 40;
// CGFloat X = self.view.frame.size.width;
// CGFloat height = self.view.frame.size.height;

//设置红色的View为底边界,左边框跟右边框作为边界
// [collisionBehavior addBoundaryWithIdentifier:@"collision1" fromPoint:CGPointMake(0,Y) toPoint:CGPointMake(X, Y)];
// [collisionBehavior addBoundaryWithIdentifier:@"collision2" fromPoint:CGPointMake(0, 0) toPoint:CGPointMake(0, height)];
// [collisionBehavior addBoundaryWithIdentifier:@"collision3" fromPoint:CGPointMake(X,0) toPoint:CGPointMake(X, height)];

// [collisionBehavior addItem:bgView1];
[collisionBehavior addItem:bgView2];
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
[animator addBehavior:collisionBehavior];

UIGravityBehavior *g = [[UIGravityBehavior alloc] initWithItems:@[bgView1]];
[animator addBehavior:g];

self.animator = animator;

// [self animal1];

}

9fe9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息