如何为 UIImageview 添加弹跳动画?
How to add bouncing animation for UIImageview?
动画对我来说不熟悉,但现在我想学习它。所以我用谷歌搜索并得到 spring 和 CAanimation,重力,碰撞之类的。
我尝试了什么:
-(void)longpress:(UILongPressGestureRecognizer *)longg
{
UIGestureRecognizerState state =[longg state];
if(state ==UIGestureRecognizerStateBegan ||state ==UIGestureRecognizerStateChanged)
{
int temptag=[longg.view tag];
UIImageView *views=(UIImageView *)arrimgstore[temptag];
NSLog(@"got it to super view %@",views);
[UIImageView animateWithDuration:0.1 delay:1 usingSpringWithDamping:2 initialSpringVelocity:2 options:UIViewAnimationOptionLayoutSubviews animations:^{
[_imgfull bringSubviewToFront:views];
} completion:nil];
}
}
当 bringsubviewtoFront 动作发生时,我想添加一些有吸引力的动画。
上面的代码有些错误,请帮助我实现这个:) 谢谢。
对于简单的弹跳动画,可以使用CAKeyFrameAnimation
:
CAMediaTimingFunction *linearTiming = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
CAMediaTimingFunction *easeOutTiming = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
CAKeyframeAnimation *fbTranslationYAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.y"];
fbTranslationYAnimation.duration = 0.700;
fbTranslationYAnimation.values = @[@(0.000), @(-35.000), @(-55.000), @(-45.000), @(-35.000), @(-39.000), @(-43.000), @(-39.000), @(-35.000), @(-37.000), @(-35.000)];
fbTranslationYAnimation.keyTimes = @[@(0.000), @(0.143), @(0.286), @(0.429), @(0.571), @(0.643), @(0.714), @(0.786), @(0.857), @(0.929), @(1.000)];
fbTranslationYAnimation.timingFunctions = @[easeOutTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming];
fbTranslationYAnimation.beginTime = CACurrentMediaTime()+delay;
fbTranslationYAnimation.fillMode = kCAFillModeBoth;
fbTranslationYAnimation.removedOnCompletion = removedOnCompletion;
[[self.imgView layer] addAnimation:fbTranslationYAnimation forKey:@"BounceAnimation_TranslationY"];
这给出了效果:
有关 CoreAnimation 时序的更多信息,请阅读 this
如果你想使用 UIKitDynamics 来做,你可以避免这么多代码。你可以这样做:
- (void)viewDidLoad
{
[super viewDidLoad];
// Initialize the animator.
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
}
然后给imageview添加重力(下落),碰撞(当它接触到其他视图时做出反应),弹性(反弹):
UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[self.imgView]];
[self.animator addBehavior:gravityBehavior];
UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.imgView]];
[collisionBehavior addBoundaryWithIdentifier:@"tabbar"
fromPoint:self.tabBarController.tabBar.frame.origin
toPoint:CGPointMake(self.tabBarController.tabBar.frame.origin.x + self.tabBarController.tabBar.frame.size.width, self.tabBarController.tabBar.frame.origin.y)];
[self.animator addBehavior:collisionBehavior];
UIDynamicItemBehavior *bounceBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[self.imgView]];
bounceBehavior.elasticity = 0.75;
[self.animator addBehavior:bounceBehavior];
动画对我来说不熟悉,但现在我想学习它。所以我用谷歌搜索并得到 spring 和 CAanimation,重力,碰撞之类的。
我尝试了什么:
-(void)longpress:(UILongPressGestureRecognizer *)longg
{
UIGestureRecognizerState state =[longg state];
if(state ==UIGestureRecognizerStateBegan ||state ==UIGestureRecognizerStateChanged)
{
int temptag=[longg.view tag];
UIImageView *views=(UIImageView *)arrimgstore[temptag];
NSLog(@"got it to super view %@",views);
[UIImageView animateWithDuration:0.1 delay:1 usingSpringWithDamping:2 initialSpringVelocity:2 options:UIViewAnimationOptionLayoutSubviews animations:^{
[_imgfull bringSubviewToFront:views];
} completion:nil];
}
}
当 bringsubviewtoFront 动作发生时,我想添加一些有吸引力的动画。
上面的代码有些错误,请帮助我实现这个:) 谢谢。
对于简单的弹跳动画,可以使用CAKeyFrameAnimation
:
CAMediaTimingFunction *linearTiming = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
CAMediaTimingFunction *easeOutTiming = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
CAKeyframeAnimation *fbTranslationYAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.y"];
fbTranslationYAnimation.duration = 0.700;
fbTranslationYAnimation.values = @[@(0.000), @(-35.000), @(-55.000), @(-45.000), @(-35.000), @(-39.000), @(-43.000), @(-39.000), @(-35.000), @(-37.000), @(-35.000)];
fbTranslationYAnimation.keyTimes = @[@(0.000), @(0.143), @(0.286), @(0.429), @(0.571), @(0.643), @(0.714), @(0.786), @(0.857), @(0.929), @(1.000)];
fbTranslationYAnimation.timingFunctions = @[easeOutTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming];
fbTranslationYAnimation.beginTime = CACurrentMediaTime()+delay;
fbTranslationYAnimation.fillMode = kCAFillModeBoth;
fbTranslationYAnimation.removedOnCompletion = removedOnCompletion;
[[self.imgView layer] addAnimation:fbTranslationYAnimation forKey:@"BounceAnimation_TranslationY"];
这给出了效果:
有关 CoreAnimation 时序的更多信息,请阅读 this
如果你想使用 UIKitDynamics 来做,你可以避免这么多代码。你可以这样做:
- (void)viewDidLoad
{
[super viewDidLoad];
// Initialize the animator.
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
}
然后给imageview添加重力(下落),碰撞(当它接触到其他视图时做出反应),弹性(反弹):
UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[self.imgView]];
[self.animator addBehavior:gravityBehavior];
UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.imgView]];
[collisionBehavior addBoundaryWithIdentifier:@"tabbar"
fromPoint:self.tabBarController.tabBar.frame.origin
toPoint:CGPointMake(self.tabBarController.tabBar.frame.origin.x + self.tabBarController.tabBar.frame.size.width, self.tabBarController.tabBar.frame.origin.y)];
[self.animator addBehavior:collisionBehavior];
UIDynamicItemBehavior *bounceBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[self.imgView]];
bounceBehavior.elasticity = 0.75;
[self.animator addBehavior:bounceBehavior];