中间的过渡值算法,很多都在使用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所支持的,还可以自己去写自定义的属性值