zoukankan      html  css  js  c++  java
  • CAShapeLayer实现音量大小动态改变

    我是效果图

           实现如图这效果一般会直接通过多张图进行切换进行完成。但这样的处理,会浪费App的资源存储空间,而且效率也不高。那么今天我们用CAShapeLayer实现以下吧。

     拆分:

    1.一个椭圆
    2.一个矩形, 控制高度实现动画效果
    3.一个圆弧
    4.横线和竖线
    

    添加图层和视图

    CAShapeLayer *_shapeLayer2; // 矩形图层
    UIView *_dynamicView; // 放置椭圆外框的视图
    

    实现代码

    - (void)voiceAnimation
    {
    UIView *backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 145)];
    backView.backgroundColor = [UIColor grayColor];
    backView.center = self.view.center;
    [self.view addSubview:backView];
    
    // 外部轮廓View
    _dynamicView = [[UIView alloc] initWithFrame:CGRectMake(85, 30, 30, 60)];
    _dynamicView.layer.cornerRadius = 15;
    _dynamicView.layer.masksToBounds = YES;
    _dynamicView.clipsToBounds = YES;
    [backView addSubview:_dynamicView];
    
    // 添加椭圆
    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:_dynamicView.bounds cornerRadius:15];
    shapeLayer.path = path.CGPath;
    shapeLayer.strokeColor = [UIColor whiteColor].CGColor;
    shapeLayer.fillColor = [UIColor clearColor].CGColor;
    shapeLayer.lineWidth = 3.0f;
    [_dynamicView.layer addSublayer:shapeLayer];
    
    // 添加矩形
    CGFloat height = 30;
    _shapeLayer2 = [CAShapeLayer layer];
    UIBezierPath *path2 = [UIBezierPath bezierPathWithRect:CGRectMake(0, 60 - height, 30, height)];
    _shapeLayer2.path = path2.CGPath;
    _shapeLayer2.fillColor = [UIColor whiteColor].CGColor;
    [_dynamicView.layer addSublayer:_shapeLayer2];
    
    // 添加圆弧
    CAShapeLayer *shapeLayer3 = [CAShapeLayer layer];
    shapeLayer3.frame = backView.bounds;
    UIBezierPath *path3 = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(70, 35, 60, 65)];
    shapeLayer3.path = path3.CGPath;
    shapeLayer3.strokeStart = 0.00f;
    shapeLayer3.strokeEnd = 0.50f;
    shapeLayer3.fillColor = [UIColor clearColor].CGColor;
    shapeLayer3.lineWidth = 5.0f;
    shapeLayer3.strokeColor = [UIColor whiteColor].CGColor;
    [backView.layer addSublayer:shapeLayer3];
    
    // 添加竖线
    CAShapeLayer *shapeLayer4 = [CAShapeLayer layer];
    shapeLayer4.frame = backView.bounds;
    UIBezierPath *path4 = [UIBezierPath bezierPath];
    [path4 moveToPoint:CGPointMake(100, 100)];
    [path4 addLineToPoint:CGPointMake(100, 115)];
    shapeLayer4.path = path4.CGPath;
    shapeLayer4.lineWidth = 5.0f;
    shapeLayer4.strokeColor = [UIColor whiteColor].CGColor;
    [backView.layer addSublayer:shapeLayer4];
    
    // 画横线
    CAShapeLayer *shapeLayer5 = [CAShapeLayer layer];
    shapeLayer5.frame = backView.bounds;
    UIBezierPath *path5 = [UIBezierPath bezierPath];
    [path5 moveToPoint:CGPointMake(85, 115)];
    [path5 addLineToPoint:CGPointMake(115, 115)];
    shapeLayer5.path = path5.CGPath;
    shapeLayer5.lineWidth = 5.0f;
    shapeLayer5.strokeColor = [UIColor whiteColor].CGColor;
    [backView.layer addSublayer:shapeLayer5];
    }
    

    改变大小的代码

    - (void)refreshUIWithVoicePower:(CGFloat)voicePower
    {
    NSLog(@"%f", voicePower);
    [_shapeLayer2 removeFromSuperlayer];
    _shapeLayer2 = nil;
    // 添加矩形
    CGFloat height = 60 * voicePower;
    _shapeLayer2 = [CAShapeLayer layer];
    UIBezierPath *path2 = [UIBezierPath bezierPathWithRect:CGRectMake(0, 60 - height, 30, height)];
    _shapeLayer2.path = path2.CGPath;
    _shapeLayer2.fillColor = [UIColor whiteColor].CGColor;
    [_dynamicView.layer addSublayer:_shapeLayer2];
    }
    
  • 相关阅读:
    c++类的大小
    c++面向对象的程序设计
    c++拷贝控制
    vsftpd出现“Response: 500 OOPS: cannot change directory”解决方法(转载)
    CentOS 安装 MRTG 软件完成后的 403 Forbidden(转载)
    Linux服务器 /var/spool/clientmqueue 目录下产生大量文件的删除办法
    mysql修改端口经验
    yum install mysql(转载)
    yum install tomcat
    yun install java
  • 原文地址:https://www.cnblogs.com/Milo-CTO/p/7890725.html
Copyright © 2011-2022 走看看