固いところでバウンドするアニメーション
ruby>>
inline CAAnimation*
BounceAnimationElement( CGPoint pFrom, CGPoint pTo, double pBeginTime, double pDuration, CAMediaTimingFunction* pMTF )
{ CABasicAnimation* v = [ CABasicAnimation animationWithKeyPath:@"position" ];
v.fromValue = [ NSValue valueWithCGPoint:pFrom ];
v.toValue = [ NSValue valueWithCGPoint:pTo ];
v.beginTime = pBeginTime;
v.duration = pDuration;
v.timingFunction = pMTF;
return v;
}
inline CAAnimation*
BounceAnimation( CALayer* pL, CGPoint pDest, double pInitialDuration = 1, double pK = .3, size_t pRepeat = 10 )
{ CAMediaTimingFunction* wMTF_D = [ CAMediaTimingFunction functionWithControlPoints:1./3. :0 :2./3. :1./3. ];
CAMediaTimingFunction* wMTF_U = [ CAMediaTimingFunction functionWithControlPoints:1./3. :2./3. :2./3. :1 ];
CGPoint wOrigin = pL.position;
NSMutableArray* wAnimationArray = NSMutableArray.array;
[ wAnimationArray addObject:BounceAnimationElement( pL.position, pDest, 0, pInitialDuration, wMTF_D ) ];
double wBeginTime = pInitialDuration;
double wK = 1;
while ( pRepeat-- )
{ wK *= pK;
CGPoint wPoint = CGPointMake
( wOrigin.x * wK + pDest.x * ( 1 - wK )
, wOrigin.y * wK + pDest.y * ( 1 - wK )
);
double wDuration = pInitialDuration * wK * ( 1 / sqrt( wK ) );
[ wAnimationArray addObject:BounceAnimationElement( pDest, wPoint, wBeginTime, wDuration, wMTF_U ) ];
wBeginTime += wDuration;
[ wAnimationArray addObject:BounceAnimationElement( wPoint, pDest, wBeginTime, wDuration, wMTF_D ) ];
wBeginTime += wDuration;
}
pL.position = pDest;
CAAnimationGroup* v = CAAnimationGroup.animation;
v.duration = wBeginTime;
v.animations = wAnimationArray;
return v;
}
- (IBAction)
Group
{ [ mL addAnimation:BounceAnimation( mL, CGPointMake( 160, 240 ) ) forKey:nil ];
}
<<--