美文网首页
按钮切换弹簧动画

按钮切换弹簧动画

作者: 离离乱惑 | 来源:发表于2017-05-24 15:55 被阅读39次

CocoaChina上有一篇视错觉结合UI:从一个看似简单的自定义控件说起,实现了一个比较有趣的的控件,尝试用mask实现了类似的效果。
先看效果图:

效果图

思路

有两层view 后面一个放着五个黑色标题的按钮,上面一个view放着五个白色标题的按钮,给上层的view添加mask,mask大小就是选中的button的大小。
mask的简单理解:比如imageLayer有一个maskLayer作为mask, 如果maskLayer比imageLayer要小,那默认的maskLayer之外的地方都是透明的,都不会渲染。


tuceng.png

关键代码

1.创建的时候添加mask

    self.maskLayer = [CALayer layer];
    self.maskLayer.frame = CGRectMake(0, 0, width / titles.count, height);
    self.maskLayer.backgroundColor = [UIColor whiteColor].CGColor;
    self.maskLayer.cornerRadius = height * 0.25;
    self.showView.layer.mask = self.maskLayer;

2.mask的动画,position和bounds的变化

CGPoint position = CGPointMake(_lastButton.frame.origin.x + _lastButton.frame.size.width * 0.5, _lastButton.frame.origin.y + _lastButton.frame.size.height * 0.5);
    NSInteger num = fabs(sender.frame.origin.x - _lastButton.frame.origin.x) / sender.frame.size.width + 1;
    CGFloat x = MIN(sender.frame.origin.x, _lastButton.frame.origin.x);
    CGPoint fromPosition = CGPointMake(x + sender.frame.size.width * num * 0.5, position.y);
    CGPoint toPosition = CGPointMake(sender.frame.origin.x + sender.frame.size.width * 0.5, sender.frame.origin.y + sender.frame.size.height * 0.5);
    
    CAKeyframeAnimation *aniPos = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    aniPos.values = @[[NSValue valueWithCGPoint:CGPointMake(_lastButton.frame.origin.x + _lastButton.frame.size.width * 0.5, _lastButton.frame.origin.y + _lastButton.frame.size.height * 0.5)],[NSValue valueWithCGPoint:fromPosition],[NSValue valueWithCGPoint:toPosition]];
    
    CAKeyframeAnimation *aniBou = [CAKeyframeAnimation animationWithKeyPath:@"bounds"];
    aniBou.values = @[[NSValue valueWithCGRect:CGRectMake(0, 0, CGRectGetWidth(_lastButton.frame), CGRectGetHeight(_lastButton.frame))],[NSValue valueWithCGRect:CGRectMake(0, 0, CGRectGetWidth(sender.frame) * num, CGRectGetHeight(sender.frame))],[NSValue valueWithCGRect:CGRectMake(0, 0, CGRectGetWidth(sender.frame), CGRectGetHeight(sender.frame))]];
    
    CAAnimationGroup *anis = [CAAnimationGroup animation];
    anis.animations = @[aniBou,aniPos];
    anis.duration = 0.35;
    anis.removedOnCompletion = NO;
    anis.fillMode = kCAFillModeForwards;
    anis.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    [self.maskLayer addAnimation:anis forKey:nil];

完整demo:demo

相关文章

  • 按钮切换弹簧动画

    CocoaChina上有一篇视错觉结合UI:从一个看似简单的自定义控件说起,实现了一个比较有趣的的控件,尝试用ma...

  • 弹簧效果切换按钮

    利用facebook的弹簧库 附上github地址:https://github.com/xiaobinbin75...

  • 按钮切换动画

    效果图:

  • Vue学习整理(三)

    Vue 中的动画 需求:屏幕上有Hello World 文字,还有一个切换按钮,点击切换按钮,文字渐渐消失,再次点...

  • iOS 动画效果小结

    跳转动画 CA翻转动画 执行动画 动画1 CA弹簧动画 mass:质量,影响图层运动时的弹簧惯性,质量越大,弹簧拉...

  • 【cocos creator】skeleton切换动画BUG

    【现象】一个按钮中需要交替播放动画A和B,调用代码setAnimation()发现动画切换有问题,部分图片显示不出...

  • SpringAnimator实现联动效果

    使用SpringAnimation实现弹簧联动 简介 弹簧效果动画SpringAnimation与甩动效果动画Fl...

  • iOS 动画框架pop使用方法

    pop支持4种动画类型:弹簧动画效果、衰减动画效果、基本动画效果和自定义动画效果。 弹簧动画效果 1.效果图如下:...

  • Tabbar按钮切换的动画效果

    首先继承UITabBarController创建自己的Controller实现代理UITabBarControll...

  • Tabbar隐藏动画

    和Tabbar按钮切换动画一样(上一篇)首先继承UITabBarController创建自己的Controller...

网友评论

      本文标题:按钮切换弹簧动画

      本文链接:https://www.haomeiwen.com/subject/pchoxxtx.html