`
LiYunpeng
  • 浏览: 938669 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

IOS缓动动画Easing算法使用分析

    博客分类:
  • IOS
阅读更多
对于一个区间内的缓动动画来说

中间的过渡值算法,很多都在使用Easing这种,无论是ActionScript、JavaScript还是刚刚才研究的Objective-C

具体思路如下

首先是计算出这个区间内的各个阶段

比如这个过程是分60帧的动画,那么在这60帧中的每一帧,计算出这一帧所得的值,放到一个数组里面,然后通过CAKeyframeAnimation来对这一组数值分别进行更换
而这组数值就是通过Easing的各种不同算法算出来的

具体代码如下
+ (id)animationWithKeyPath:(NSString *)path function:(AHEasingFunction)function fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint keyframeCount:(size_t)keyframeCount
{
	NSMutableArray *values = [NSMutableArray arrayWithCapacity:keyframeCount];
	
	CGFloat t = 0.0;
	CGFloat dt = 1.0 / (keyframeCount - 1);
	for(size_t frame = 0; frame < keyframeCount; ++frame, t += dt)
	{
		CGFloat x = fromPoint.x + function(t) * (toPoint.x - fromPoint.x);
		CGFloat y = fromPoint.y + function(t) * (toPoint.y - fromPoint.y);
		[values addObject:[NSValue valueWithCGPoint:CGPointMake(x, y)]];
	}
	
	CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:path];
	[animation setValues:values];
	return animation;
}

定义一个数组,用来存放每一帧的预期值
定义一个时间t,其实是0.0
定义一个每帧平分的比例,dt
然后for循环,计算中间平分每一帧的预期值,如x
预期值=起始值+Easing的变换方程带入(当前帧占总帧的百分比)*起始到预期之间的差距值
这样每帧就会按照Easing不同方程的规律得出相应的变化值了

关于animationWithKeyPath方法的参数,可以是如下
transform.scale = 比例轉換
transform.scale.x = 闊的比例轉換
transform.scale.y = 高的比例轉換
transform.rotation.z = 平面圖的旋轉
opacity = 透明度
margin
zPosition
backgroundColor
cornerRadius
borderWidth
bounds
contents
contentsRect
cornerRadius
frame
hidden
mask
masksToBounds
opacity
position
shadowColor
shadowOffset
shadowOpacity
shadowRadius

当然,这些事CAKeyframeAnimation所支持的,还可以自己去写自定义的属性值
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics