前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >创建简单动画(一) --- 常规hud

创建简单动画(一) --- 常规hud

作者头像
周希
发布于 2019-10-15 03:41:57
发布于 2019-10-15 03:41:57
62200
代码可运行
举报
文章被收录于专栏:APP自动化测试APP自动化测试
运行总次数:0
代码可运行

先说下当前我为处理动画的思路: (新手上路, 老司机轻喷,如果有更好的实现方法请大神指教 感恩戴德)

#1. 分析动画构成

#2. 如果是位移动画则考虑使用BasicAnimation或者KeyframeAnimation实现, 需要的话再搭配缓动函数

#3. 比较复杂的动画则考虑是否用UIBezierpath一帧帧来画

今天我们模仿做一个场景切换加载等待动画, 比如这样的

我们分析下这张图的构成

#1. 一个灰色的背景

#2. 一个白色的圆环

#3. 一个闭合的圆弧(白色部分)

看起来不是简单的位移动画了, 我们用UIBezierPath加CADisplayLink一帧一帧来画试试看

灰色的背景,

这个比较简单, 我们直接创建一个UIView子类, 背景颜色设置为灰色

白色的圆环,

可以用UIBezierPath直接画一个圆,注意调整线的宽度 So easy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    //添加外圆
    UIBezierPath *apath = [UIBezierPath bezierPath];
    apath.lineWidth = 5;
    [apath addArcWithCenter:CGPointMake(50, 50) radius:40 startAngle:0 endAngle:2 * M_PI clockwise:YES];

    [apath stroke];

闭合的圆弧,

一样用UIBezierPath, 先设置圆心 画一个圆弧然后闭合路径, _count是设置的一个变量, 有Controller中的计时器控制以达到动画的效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//先画内圆
    
    //设置线条
    path.lineWidth     = 5;
    path.lineCapStyle  = kCGLineCapRound;
    path.lineJoinStyle = kCGLineJoinRound;
    
    //设置圆心
    [path moveToPoint:CGPointMake(_myWidth / 2, _myHeight / 2)];
    
    //设置内切圆弧
    [path addArcWithCenter:CGPointMake(_myWidth / 2, _myHeight / 2) radius:38 startAngle: M_PI * 3 / 2 endAngle:M_PI * 3 / 2 + 2 * M_PI / 300 * _count clockwise:YES];
    
    //线路闭合
    [path closePath];
    
    [path fill];

要注意调整外圆和内闭合弧的线宽

然后在Controller中创建计时器, 改变_count的值达到动画的效果

上代码:

先创建一个UIView子类,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import <UIKit/UIKit.h>

@interface MyView : UIView

@property (nonatomic, assign) CGFloat   myWidth;
@property (nonatomic, assign) CGFloat   myHeight;
@property (nonatomic, assign) NSInteger count;

@end

在drawRect中添加图案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import "MyView.h"

@implementation MyView

- (id)initWithFrame:(CGRect)frame {
    
    CGRect myFrame = CGRectMake(frame.origin.x, 0, frame.size.width, frame.size.height);
    
    self = [super initWithFrame:myFrame];
    if (self) {
        
        self.myWidth  = frame.size.width;
        self.myHeight = frame.size.height;

    }
    
    return self;
}

- (void)drawRect:(CGRect)rect {
    // Drawing code
    
    //设置线条颜色
    UIColor *color = [UIColor whiteColor];
    [color set];
    
    
    //画内圆
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    //设置线条
    path.lineWidth     = 5;
    path.lineCapStyle  = kCGLineCapRound;
    path.lineJoinStyle = kCGLineJoinRound;
    
    //设置圆心
    [path moveToPoint:CGPointMake(_myWidth / 2, _myHeight / 2)];
    
    //设置内切圆弧
    [path addArcWithCenter:CGPointMake(_myWidth / 2, _myHeight / 2)
                    radius:38 startAngle: M_PI * 3 / 2
                  endAngle:M_PI * 3 / 2 + 2 * M_PI / 300 * _count
                 clockwise:YES];
    
    //线路闭合
    [path closePath];
    
    [path fill];
    
    //添加外圆
    UIBezierPath *apath = [UIBezierPath bezierPath];
    apath.lineWidth     = 5;
    [apath addArcWithCenter:CGPointMake(50, 50)
                     radius:40
                 startAngle:0
                   endAngle:2 * M_PI
                  clockwise:YES];

    [apath stroke];
    
}


@end

在Controller中调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import "ViewController.h"
#import "MyView.h"

@interface ViewController ()

@property (nonatomic, strong) MyView        *myView;
@property (nonatomic, strong) CADisplayLink *displayLink;
@property (nonatomic, assign) NSInteger      count;

@end

@implementation ViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    //创建计时器
    _displayLink        = [CADisplayLink displayLinkWithTarget:self selector:@selector(countOn)];
    _displayLink.paused = YES;
    
    [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
    
    //创建自定义View实例
    _myView                 = [[MyView alloc] initWithFrame:CGRectMake(150, 0, 100, 100)];
    _myView.backgroundColor = [UIColor grayColor];
    _myView.count           = 1;

    [self.view addSubview:_myView];
    
    //在这里可以添加额外动画, 设置hud出现的方式
    [UIView animateWithDuration:0.5 animations:^{
        
        _myView.frame = CGRectMake(150, 150, 100, 100);
        _displayLink.paused = NO;
    }];
        
}

//计时器事件, 修改动画参数
- (void)countOn {
    
    _count++;
    _myView.count = _count;
    
    if (_count > 290) {
        
        [_displayLink invalidate];
        [_myView removeFromSuperview];
    }
    
    //重绘
    [_myView setNeedsDisplay];
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-01-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用CAShapeLayer绘图
之前讲过使用UIBezierPath在UIView的drawRect中绘图, 今天我们讲下另外一种方式: CAShaperLayer
周希
2019/10/15
1.2K0
使用CAShapeLayer绘图
CALayer之mask属性-遮罩
它类似于一个子图层,相对于父图层(即拥有该属性的图层)布局,但是它却不是一个普通的子图层。
周希
2019/10/15
2.2K0
苹果安装动画制作
使用方法 使图层覆盖在应用图标上方,大小为app图标的bounds -(ICSectorProgressView *)sectorView { if (!_sectorView) { _sectorView = [[ICSectorProgressView alloc] initWithFrame:self.appImageView.bounds]; _sectorView.borderWidth = 20; // 默认为20 [_sectorVi
程序员不务正业
2018/06/14
1.1K0
iOS CALayer 简单介绍
总结:能看到的都是uiview,uiview能显示在屏幕上是因为它内部的一个层calyer层。
用户1219438
2018/08/06
6590
iOS CALayer 简单介绍
iOS_运用CAShapeLayer和UIBezierPath实现的环形进度条
主要代码如下: #import "MOAnnularProgressView.h" @implementation MOAnnularProgressView { CAShapeLayer *backgroundLayer; // 背景图层 CAShapeLayer *frontFillLayer; // 填充图层 UIBezierPath *backgroundPath; // 背景贝赛尔曲线 UIBezierPath *frontFillPath; // 填充贝赛尔
mikimo
2022/07/20
5930
iOS_运用CAShapeLayer和UIBezierPath实现的环形进度条
想要漂亮的蒙版指引吗?跟着我手把手的教你写出来
既然接到了这个需求,那么就需要做出来,第一眼看上去确实有点难。当时安卓已经找到了对应的库,十分容易的做这个需求了。
君赏
2018/09/07
1.5K0
绘图-几个较复杂统计图案例的实现分析
我们可以看到上图的动图是一组组合动画,共有四部分组成:坐标横竖虚线的动画、曲线的动态绘制、小圆点的动画、渐变区域的动画。下面逐个分析
進无尽
2018/09/12
1.5K0
绘图-几个较复杂统计图案例的实现分析
iOS 动画笔记 (一)
你也肯定喜欢炫酷的动画! 在APP中,动画就是一个点睛之笔!可以给用户增加一些独特的体验感,估计也有许多的和我一样的,看着那些觉得不错的动画,也就只能流口水的孩子,毕竟可能不知道从哪里下手去写!动画学习的过程我会总结一个系列的出来,总结一下iOS中动画的一个学习的过程,以及当中出现的一些问题也会和大家分享。现总结几点在学习动画之前的知道的一些点,这些能帮助我们写好学好动画。 一:从这里 Quartz2D 开始 在我的学习过程中,我是先从 Quartz2D 开始学习的,它里面的贝塞尔曲线在我们
Mr.RisingSun
2018/01/12
8290
iOS 动画笔记 (一)
iOS 画图对号
CGPoint pathCenter = CGPointMake(_logoView.frame.size.width/2, _logoView.frame.size.height/2 - 50);
星宇大前端
2019/01/15
1.1K0
使用UIBezierPath绘制图形
我们可以设置stroked path的属性lineWidth和lineJoinStyle。也可以设置filled path的属性usesEvenOddFillRule
周希
2019/10/15
1.1K0
使用UIBezierPath绘制图形
画个Shape留意到的东西
这个方法是用来画圆的,这个方法就引出第一个知识点 startAngle 和 endAngle ,按照通俗的方法就是画的圆的起点的角度和结束点的角度。也就是我们的 0 - 2π ,最后一个参数是 是否顺时针。
Mr.RisingSun
2020/06/19
3400
带动画渐进效果与颜色渐变的圆弧进度控件设计 原
     今天帮朋友写了一个小巧的圆弧进度控件,控件十分简单,主要设计思路采用CAShapeLayer来创建控件圆弧形状,使用CAGradientLayer来进行颜色渐变的渲染,两者结合来创建出颜色渐变的圆弧进度条控件,关于进度动画采用CoreAnimation动画处理。控件进行了简洁的封装,提供了面向使用的接口,需要的朋友可以自取,Demo地址如下:
珲少
2018/08/15
1.2K0
带动画渐进效果与颜色渐变的圆弧进度控件设计
                                                                            原
iOS实践:根据进度绘制进度条、进度扇形、进度球1. 效果展示及思维导图2. 项目准备工作3. 进度条的实现4. 扇形进度指示器5. 球形指示器
在这浓浓的鞭炮声中,迎来了这个系列的最后一篇。哈哈~这是多么有纪念意义的春节呀。 今天我们来写一个小小的Demo,来演练一下通过OC绘图,根据进度自己绘制出来一个进度条,或者进度扇形、进度球形。
stanbai
2018/06/28
2.8K0
绘图-UIBezierPath
UIBezierPath是在 UIKit 中的一个类,继承于NSObject,可以创建基于矢量的路径.此类是Core Graphics框架关于path的一个OC封装。 所以 UIBezierPath 是基于 Core Graphics 实现的一项绘图技术。
進无尽
2018/09/12
1.3K0
绘图-UIBezierPath
iOS动画专题·UIView二维形变动画与CAAnimation核心动画(transform动画,基础,关键帧,组动画,路径动画,贝塞尔曲线)
总的来说,从涉及类的形式来看,iOS动画有:基于UIView的仿射形变动画,基于CAAnimation及其子类的动画,基于CG的动画。这篇文章着重总结前两种动画。
陈满iOS
2018/09/10
3.4K0
iOS动画专题·UIView二维形变动画与CAAnimation核心动画(transform动画,基础,关键帧,组动画,路径动画,贝塞尔曲线)
OC绘制基本图形1. UIKit中封装了一些最常用的绘图方法2. 贝塞尔路径常用方法列表(BezierPath)3. 保存屏幕截图,并存储至相册
好了,在之前的两篇文章里面写了Quartz2D的一些基本知识。从这篇开始写一下OC绘制基本图形的方法。 1. UIKit中封装了一些最常用的绘图方法 1.1 矩形 填充 UIRectFill(rect) 画线 UIRectFrame(rect) 1.2 字符串 绘制 [str drawInRect:rect withAttributes:attr]; 1.3 图像 拉伸 [image drawInRect:rect] 绘制 [image drawAtPoint:CGPointZero]; 平铺 [
stanbai
2018/06/28
1.6K0
Quartz2D知识点聚合案例
Quartz2D知识点聚合 基本 //画图片 UIImage *image = [UIImage imageNamed:@"阿狸头像"]; [image drawInRect:rect]; //字体 NSString *title = @"标题"; NSMutableDictionary *atr = [NSMutableDictionary dictionary]; atr[NSFontAttributeName] = [UIFont syste
用户1941540
2018/05/11
5790
Quartz2D复习(一)--- 基础知识 / 绘制线段圆弧 / 图片水印 / 截图
1、Quartz 2D是一个二维绘图引擎,同时支持ios和Mac系统; Quart2D的API是纯C语言的,API来自于Core  Graphics框架:
tandaxia
2018/09/27
2.6K0
Quartz2D复习(一)---  基础知识 / 绘制线段圆弧 / 图片水印 / 截图
iOS 仿系统指南针
高仿系统指南针,方向数据是地磁航向数据,有定位地理位置信息和地磁方向信息,可以和系统的指南针对比看一看。 一、运行效果 总效果.gif 效果.png 二、实现过程 1.继承于UIView创建一个带
且行且珍惜_iOS
2018/05/22
1.1K0
绘图-几种基本统计图的实现分析
在开发中我们会遇到各种统计图,或者各种绘图,本文通过对基本三大统计图:折线图、柱状图、扇形图的实现来掌握基本统计图的绘制,在下一篇文中会带来复杂一些的绘图案例分析,循序渐进达、触类旁通达到绘制各式各样图表的能力。
進无尽
2018/09/12
1.5K0
绘图-几种基本统计图的实现分析
推荐阅读
相关推荐
使用CAShapeLayer绘图
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文