圆形进度条定制

//
//  HYBCircleProgressBar.h
//  CircleBarProject
//
//  Created by huangyibiao on 14-8-16.
//  Copyright (c) 2014年 Uni2Uni. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

/*!
 * @brief 圆形进度条
 * @author huangyibiao
 */
@interface HYBCircleProgressBar : UIView

@property (nonatomic, strong) UILabel *percentLabel;

- (id)init;
- (id)initWithFrame:(CGRect)frame;
/*!
 * @brief 通过调用此方法来更新百分比
 * @param percent 当前要显示的值,如90,表示90%
 * @param animated 是否添加动画更新
 */
- (void)setPercent:(int)percent animated:(BOOL)animated;

@end


//
//  HYBCircleProgressBar.m
//  CircleBarProject
//
//  Created by huangyibiao on 14-8-16.
//  Copyright (c) 2014骞� Uni2Uni. All rights reserved.
//

#import "HYBCircleProgressBar.h"

#define toRadians(x) ((x) * M_PI / 180.0)
#define toDegrees(x) ((x) * 180.0 / M_PI)
#define innerRadius    62.5
#define outerRadius    70.5

@interface HYBPercentLayer : CALayer

@property (nonatomic) CGFloat percent;

@end

@implementation HYBPercentLayer

- (void)drawInContext:(CGContextRef)context {
    [self DrawRight:context];
    [self DrawLeft:context];
    return;
}

- (void)DrawRight:(CGContextRef)context {
    CGPoint center = CGPointMake(self.frame.size.width / (2), self.frame.size.height / (2));
    CGFloat delta = -toRadians(360 * self.percent);
    
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
    CGContextSetLineWidth(context, 1);
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetAllowsAntialiasing(context, YES);
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRelativeArc(path, NULL, center.x, center.y, innerRadius, -(M_PI / 2), delta);
    CGPathAddRelativeArc(path, NULL, center.x, center.y, outerRadius, delta - (M_PI / 2), -delta);
    CGPathAddLineToPoint(path, NULL, center.x, center.y - innerRadius);
    CGContextAddPath(context, path);
    CGContextFillPath(context);
    CFRelease(path);
    
    return;
}

- (void)DrawLeft:(CGContextRef)context {
    CGPoint center = CGPointMake(self.frame.size.width / (2), self.frame.size.height / (2));
    CGFloat delta = toRadians(360 * (1 - self.percent));
    
    CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 1);
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetAllowsAntialiasing(context, YES);
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRelativeArc(path, NULL, center.x, center.y, innerRadius, -(M_PI / 2), delta);
    CGPathAddRelativeArc(path, NULL, center.x, center.y, outerRadius, delta - (M_PI / 2), -delta);
    CGPathAddLineToPoint(path, NULL, center.x, center.y - innerRadius);
    CGContextAddPath(context, path);
    CGContextFillPath(context);
    CFRelease(path);
    return;
}

@end

@interface HYBCircleProgressBar () {
    UIImage         *_thumbImage;
    HYBPercentLayer *_percentLayer;
    CALayer         *_thumbLayer;
    
}

@end

@implementation HYBCircleProgressBar

- (id)init {
    return [self initWithFrame:CGRectZero];
}

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor clearColor];
        self.clipsToBounds = NO;
        
        self.percentLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 125, 125)];
        [self.percentLabel setFont:[UIFont systemFontOfSize:60]];
        [self.percentLabel setTextColor:[UIColor colorWithRed:89 / 255.0
                                                        green:89 / 255.0
                                                         blue:89 / 255.0
                                                        alpha:1.0]];
        [self.percentLabel setTextAlignment:NSTextAlignmentCenter];
        [self.percentLabel setBackgroundColor:[UIColor clearColor]];
        self.percentLabel.adjustsFontSizeToFitWidth = YES;
        [self addSubview:self.percentLabel];
        
        _thumbLayer = [CALayer layer];
        _thumbLayer.contentsScale = [UIScreen mainScreen].scale;
        _thumbLayer.contents = (id)_thumbImage.CGImage;
        _thumbLayer.frame = CGRectMake(self.frame.size.width / 2 - _thumbImage.size.width / 2,
                                       0, _thumbImage.size.width, _thumbImage.size.height);
        _thumbLayer.hidden = YES;
        
        
        _percentLayer = [HYBPercentLayer layer];
        _percentLayer.contentsScale = [UIScreen mainScreen].scale;
        _percentLayer.percent = 0;
        _percentLayer.frame = self.bounds;
        _percentLayer.masksToBounds = NO;
        [_percentLayer setNeedsDisplay];
        
        [self.layer addSublayer:_percentLayer];
        [self.layer addSublayer:_thumbLayer];
    }
    return self;
}

- (void)layoutSubviews {
    [super layoutSubviews];
    
    CGRect frame = self.frame;
    int percent = _percentLayer.percent * 100;
    [self.percentLabel setText:[NSString stringWithFormat:@"%i%%", percent]];
    
    CGRect labelFrame = _percentLabel.frame;
    labelFrame.origin.x = frame.size.width / 2 - _percentLabel.frame.size.width / 2;
    labelFrame.origin.y = frame.size.height / 2 - _percentLabel.frame.size.height / 2;
    _percentLabel.frame = labelFrame;
    return;
}

#pragma mark - Touch Events
- (void)moveThumbToPosition:(CGFloat)angle {
    CGRect rect = _thumbLayer.frame;
    CGPoint center = CGPointMake(self.bounds.size.width / 2.0f, self.bounds.size.height/2.0f);
    angle -= (M_PI/2);

    rect.origin.x = center.x + 75 * cosf(angle) - (rect.size.width/2);
    rect.origin.y = center.y + 75 * sinf(angle) - (rect.size.height/2);
    
    [CATransaction begin];
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
    _thumbLayer.frame = rect;
    [CATransaction commit];
    return;
}

#pragma mark - Custom Getters/Setters
- (void)setPercent:(int)percent animated:(BOOL)animated {
    CGFloat floatPercent = percent / 100.0;
    floatPercent = MIN(1, MAX(0, floatPercent));
    
    _percentLayer.percent = floatPercent;
    [self setNeedsLayout];
    [_percentLayer setNeedsDisplay];
    
    [self moveThumbToPosition:floatPercent * (2 * M_PI) - (M_PI / 2)];
    return;
}

@end


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
在UniApp中创建一个圆形进度条可以通过以下步骤实现: 1. 在JS文件中,使用Math.PI表示180度,所以360度一圈则是Math.PI*2。如果假设定义number为50,则每个刻度所对应的角度为Math.PI*2/number。从第一个刻度开始,每增加一个,其角度则为索引乘以角度的平均值。 2. 在CircleBox类的构造函数中,初始化必须的变量。包括直径、四周内填充、圆环宽度、圆环颜色、当前百分比、进度条颜色、字体大小和字体颜色等。 3. 在chart.js文件中,定义绘图函数,通过使用canvas绘制出圆形进度条,并根据当前百分比和进度条颜色来显示进度。 4. 另外,还需要计算刻度线条开始位置和结束位置点的坐标。刻度线条的长度可以通过线宽来表示,开始位置为radius(画布总宽度)-padding(四周内填充) * 2,结束位置为radius(画布总宽度)-padding(四周内填充) * 2 - lineWidth(线宽,即刻度长度)。 通过以上步骤,你可以在UniApp中创建一个圆形进度条,并根据需要进行定制和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [uni-app中自定义图表(canvas实现chart图表)开发篇(3)-带针表刻度的圆环进度条](https://blog.csdn.net/jiciqiang/article/details/124891443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [uni-app中自定义图表(canvas实现chart图表)开发篇(1)-圆环带进度条](https://blog.csdn.net/jiciqiang/article/details/124842052)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值