美文网首页
核心动画(5)之抖音专辑音符实现

核心动画(5)之抖音专辑音符实现

作者: 清风烈酒2157 | 来源:发表于2020-12-24 18:24 被阅读0次

前言

利用核心动画实现抖音专辑音符播放功能

image.png

实现

设计思路

  1. 黑色专辑背景图
  2. 头像
  3. 三个不同的音符旋转

专辑背景容器视图

以下实现在initWithFrame

  1. 初始化layer数据,方便删除情况动画和layer
 self.noteLayers = [NSMutableArray array];
  1. 专辑背景容器视图
self.albumContainer =[[UIView alloc]initWithFrame:self.bounds];
[self addSubview:self.albumContainer];
  1. 添加唱片的背景图
CALayer *backgroudLayer = [CALayer layer];
        backgroudLayer.frame = self.bounds;
        backgroudLayer.contents = (id)[UIImage imageNamed:@"music_cover"].CGImage;
        [self.albumContainer.layer addSublayer:backgroudLayer];
  1. 放在唱片的内部图片

图片要切圆角

CGFloat w = CGRectGetWidth(frame) / 2.0f;
        CGFloat h = CGRectGetHeight(frame) / 2.0f;
        CGRect albumFrame = CGRectMake(w / 2.0f, h / 2.0f, w, h);
        self.album = [[UIImageView alloc]initWithFrame:albumFrame];
        self.album.contentMode = UIViewContentModeScaleAspectFill;
        [self.albumContainer addSubview:self.album];
        
        self.album.layer.cornerRadius = h / 2.0f;
        self.album.layer.masksToBounds = YES;

开始动画startAnimation

  1. 清除所有layer的动画
[self.noteLayers enumerateObjectsUsingBlock:^(CALayer * noteLayer, NSUInteger idx, BOOL *stop) {
        [noteLayer removeFromSuperlayer];
    }];
    [self.layer removeAllAnimations];
  1. 音符动画
 [self addNotoAnimation:@"icon_home_musicnote1" delayTime:0.0f rate:rate];
    [self addNotoAnimation:@"icon_home_musicnote2" delayTime:1.0f rate:rate];
    [self addNotoAnimation:@"icon_home_musicnote1" delayTime:2.0f rate:rate];
  1. 专辑动画,头像
CABasicAnimation* rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0];
    rotationAnimation.duration = 6.0f;
    rotationAnimation.cumulative = YES;
    rotationAnimation.repeatCount = MAXFLOAT;
    [self.albumContainer.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];

addNotoAnimation

  1. 创建一个动画组 设置一些基本参数
CAAnimationGroup *animationGroup = [[CAAnimationGroup alloc]init];
    animationGroup.duration = rate/4.0f;
    animationGroup.beginTime = CACurrentMediaTime() + delayTime;
    animationGroup.repeatCount = MAXFLOAT;
    animationGroup.removedOnCompletion = NO;
    animationGroup.fillMode = kCAFillModeForwards;
    animationGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    
  1. 创建音符的贝塞尔路径
//X轴左右侧偏移量(可修改,目的调整与背景图直接的间隙)
    CGFloat sideXLength = 40.0f;
    //Y轴上下偏移量(可修改,目的调整与背景图直接的间隙)
    CGFloat sideYLength = 100.0f;
    
    //贝赛尔曲线开始点
    //beginPoint 开始点: 当前视图X坐标中心 向 左偏移 5dp (X轴是左右) Y的坐标是当前视图高度 就是最下面.
    CGPoint beginPoint = CGPointMake(CGRectGetMidX(self.bounds) - 5, CGRectGetMaxY(self.bounds));
    
    //贝塞尔曲线结束点
    //endPoint 结束点: 开始点的X 减去 40左侧偏移(就是距离左侧更远) Y也是 减去偏移之后 到了 视图的外部 左上方.
    CGPoint endPoint = CGPointMake(beginPoint.x - sideXLength, beginPoint.y - sideYLength);
    
    //贝塞尔曲线控制点长度
    NSInteger controlLength = 60;
    //贝塞尔曲线控制点
    //controlPoint 控制点: 开始点 比如 X是 30 - 60/2.0 - 60 = -60,显然已经跑到最左边了 超出了视图范围, Y 后面是+ controlLength 说明是加大 Y坐标.
    CGPoint controlPoint = CGPointMake(beginPoint.x - sideXLength/2.0f - controlLength, beginPoint.y - sideYLength/2.0f + controlLength);
    
    //创建贝塞尔轨迹
    UIBezierPath *customPath = [UIBezierPath bezierPath];
    [customPath moveToPoint:beginPoint];
    //核心代码 二次曲线方程式 可以google查一下
    [customPath addQuadCurveToPoint:endPoint controlPoint:controlPoint];
  1. 添加贝塞尔路径帧动画

CAKeyframeAnimation * pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
 pathAnimation.path = customPath.CGPath;
  1. 音符自身旋转动画
CAKeyframeAnimation * rotationAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"];
    //这里实际上是控制动画开始弧度和结束弧度 M_PI(180°) 就是半圆 * 0.10 或者 * -0.10j是为了关键点上下偏移的18°的间隙
    [rotationAnimation setValues:@[
                                   [NSNumber numberWithFloat:0],
                                   [NSNumber numberWithFloat:M_PI * 0.10],
                                   [NSNumber numberWithFloat:M_PI * -0.10]]];
  1. 音符自身透明度帧动画
CAKeyframeAnimation * opacityAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
    [opacityAnimation setValues:@[
                                  [NSNumber numberWithFloat:0],
                                  [NSNumber numberWithFloat:0.2f],
                                  [NSNumber numberWithFloat:0.7f],
                                  [NSNumber numberWithFloat:0.2f],
                                  [NSNumber numberWithFloat:0]]];
  1. 音符自身缩放动画
CABasicAnimation *scaleAnimation = [CABasicAnimation animation];
    scaleAnimation.keyPath = @"transform.scale";
    scaleAnimation.fromValue = @(1.0f);
    scaleAnimation.toValue = @(2.0f);
  1. 动画加入动画组
[animationGroup setAnimations:@[pathAnimation, scaleAnimation,  rotationAnimation,opacityAnimation]];
  1. 增加音符layer,并设置图片
CAShapeLayer *layer = [CAShapeLayer layer];
    layer.opacity = 0.0f;
    layer.contents = (__bridge id _Nullable)([UIImage imageNamed:imageName].CGImage);
    layer.frame = CGRectMake(beginPoint.x, beginPoint.y, 10, 10);
   
    [self.layer addSublayer:layer];
  1. 开始执行动画
   [self.noteLayers addObject:layer];
    [layer addAnimation:animationGroup forKey:nil];

相关文章

  • 核心动画(5)之抖音专辑音符实现

    前言 利用核心动画实现抖音专辑音符播放功能 实现 设计思路 黑色专辑背景图 头像 三个不同的音符旋转 专辑背景容器...

  • iOS抖音右下角专辑动画

    前两天分享了 抖音 上下滑切换 ,今天给和大家分享的是抖音右小角底部的专辑动画 上图看下 再看下抖音的 具体实现思...

  • iOS 抖音专辑动画

    今天给和大家分享的是抖音右小角底部的专辑动画 上图看下: 再看下抖音的: 具体实现思路,首先需要3张素材 Cont...

  • 仿抖音-音符动画

  • 仿抖音的音乐旋转

    这次是实现一个仿抖音的音乐旋转自定义View,先看一下效果 实现这个效果主要是采用的拼凑的方法,即先实现音符动画再...

  • 转场动画-仿AppStore跳转及抖音评论

    转场动画-仿AppStore跳转及抖音评论 转场动画-仿AppStore跳转及抖音评论

  • 2019-05-31

    做好抖音定位就能赚钱?如何玩赚抖音热门?5个方法让你实现抖音新飞跃! 抖音2019年最火爆APP,没有之一。现在大...

  • 错过了官博官微,“官抖”了解一下?

    不管你玩不玩抖音,一定被抖音神曲洗脑过,各大音乐app的排行榜里都被抖音神曲霸占,甚至还有抖音专辑。 截至2018...

  • 抖音滚动字幕—iOS

    转载:原文地址 前言 今天给大家带来的是抖音得滚动字幕,也就是音乐专辑的专辑名称 废话不多说上图 抖音如下 系统的...

  • iOS抖音滚动字幕

    今天给大家带来的是抖音得滚动字幕,也就是音乐专辑的专辑名称 废话不多说上图 抖音如下 系统的滚动字幕如下 本篇完成...

网友评论

      本文标题:核心动画(5)之抖音专辑音符实现

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