使用Facebook开源代码FBShimmering封装进度显示的ShimmeCircleView

效果图:

静态图:

源码:

ShimmeCircleView.h 与 ShimmeCircleView.m

//
// ShimmeCircleView.h
// YouXianMingClock
//
// Created by YouXianMing on 14-10-13.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import <UIKit/UIKit.h> @interface ShimmeCircleView : UIView /**
* 时候开启闪光效果,默认是 NO
*/
@property (nonatomic, assign) BOOL shimmering; /**
* 当 shimmering 开启时,进入到闪光状态中的动画时间,默认值是 0.3.
*/
@property (nonatomic, assign) CFTimeInterval shimmeringBeginFadeDuration; /**
* 当 shimmering 结束时,从闪光动画退出到正常的时间,默认值是 0.3.
*/
@property (nonatomic, assign) CFTimeInterval shimmeringEndFadeDuration; /**
* The opacity of the content before it is shimmering. Defaults to 0.3.
*/
@property (nonatomic, assign) CGFloat shimmeringOpacity; /**
* The time interval between shimmerings in seconds. Defaults to 0.6.
*/
@property (nonatomic, assign) CFTimeInterval shimmeringPauseDuration; /**
* 圆的颜色,默认为红色
*/
@property (nonatomic, assign) UIColor *shapeColor; /**
* 圆的线宽度,默认为1
*/
@property (nonatomic, assign) CGFloat shapeLineWidth; /**
* 动画时间间隔
*/
@property (nonatomic, assign) CFTimeInterval strokeAnimationDuration; /**
* 更新shapeLayer(修改后必须更新path才能够生效)
*/
- (void)updateShapeLayer; - (void)doPOPBasicEndAnimationToValue:(CGFloat)value;
- (void)doPOPBasicStartAnimationToValue:(CGFloat)value; @end
//
// ShimmeCircleView.m
// YouXianMingClock
//
// Created by YouXianMing on 14-10-13.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import "ShimmeCircleView.h"
#import "FBShimmering.h"
#import "FBShimmeringLayer.h"
#import "FBShimmeringView.h"
#import "POP.h" /**
* 将角度转换为弧度
*
* @param d 角度
*
* @return 弧度
*/
#define DEGREES__TO__RADIANS(d) ((d) * M_PI / 180.f) @interface ShimmeCircleView () {
CAShapeLayer *_shapeLayer; // 形状的layer
FBShimmeringLayer *_showLayer; // 辉光的layer
} @end @implementation ShimmeCircleView - (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// 创建FBShimmeringLayer
if (_showLayer == nil) {
_showLayer = [FBShimmeringLayer new];
_showLayer.frame = self.bounds;
_showLayer.position = self.center;
_showLayer.shimmering = NO; // 默认设置关闭
_showLayer.shimmeringBeginFadeDuration = 0.3; // 开始进入闪光时候的时间
_showLayer.shimmeringEndFadeDuration = 0.3; // 从闪光进入没有闪光时候的时间
_showLayer.shimmeringOpacity = 0.3;
_showLayer.shimmeringPauseDuration = 0.6f;
[self.layer addSublayer:_showLayer];
} // 制造形状的layer
if (_shapeLayer == nil) {
_shapeLayer = [CAShapeLayer layer];
_shapeLayer.lineWidth = .f;
_shapeLayer.strokeEnd = .f;
_shapeLayer.strokeColor = [UIColor redColor].CGColor;
_shapeLayer.fillColor = [UIColor clearColor].CGColor; // 设置填充颜色为透明
_shapeLayer.path = [self createCirclePath].CGPath;
_showLayer.contentLayer = _shapeLayer;
}
}
return self;
} - (void)updateShapeLayer
{
if (_shapeColor) {
_shapeLayer.strokeColor = _shapeColor.CGColor;
} if (_shapeLineWidth > ) {
_shapeLayer.lineWidth = _shapeLineWidth;
_shapeLayer.path = [self createCirclePath].CGPath; // 更新path
}
} - (void)doPOPBasicEndAnimationToValue:(CGFloat)value
{
[self doStrokeEndAnimationFromValue:_shapeLayer.strokeEnd
toValue:value
shapeLayer:_shapeLayer
duration:(_strokeAnimationDuration > ? _strokeAnimationDuration : 0.4f)
timingFunctionName:nil];
} - (void)doPOPBasicStartAnimationToValue:(CGFloat)value
{
[self doStrokeStartAnimationFromValue:_shapeLayer.strokeStart
toValue:value
shapeLayer:_shapeLayer
duration:(_strokeAnimationDuration > ? _strokeAnimationDuration : 0.4f)
timingFunctionName:nil];
} /**
* 根据frame值创建圆形的贝塞尔曲线
*
* @return 圆形的贝塞尔曲线
*/
- (UIBezierPath *)createCirclePath
{
UIBezierPath *path = \
[UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.height / .f,
self.bounds.size.width / .f)
radius:self.bounds.size.height / .f - _shapeLayer.lineWidth / .f
startAngle:DEGREES__TO__RADIANS(-)
endAngle:DEGREES__TO__RADIANS()
clockwise:YES]; return path;
} #pragma mark - 重写各种setter方法
/**
* 重写shimmering的setter,getter方法
*/
@synthesize shimmering = _shimmering;
- (BOOL)shimmering {
return _shimmering;
}
- (void)setShimmering:(BOOL)shimmering {
_shimmering = shimmering;
_showLayer.shimmering = shimmering;
} /**
* 重写shimmeringBeginFadeDuration的setter,getter方法
*/
@synthesize shimmeringBeginFadeDuration = _shimmeringBeginFadeDuration;
- (CFTimeInterval)shimmeringBeginFadeDuration {
return _shimmeringBeginFadeDuration;
}
- (void)setShimmeringBeginFadeDuration:(CFTimeInterval)shimmeringBeginFadeDuration {
_shimmeringBeginFadeDuration = shimmeringBeginFadeDuration;
_showLayer.shimmeringBeginFadeDuration = shimmeringBeginFadeDuration;
} /**
* 重写shimmeringEndFadeDuration的setter,getter方法
*/
@synthesize shimmeringEndFadeDuration = _shimmeringEndFadeDuration;
- (CFTimeInterval)shimmeringEndFadeDuration {
return _shimmeringEndFadeDuration;
}
- (void)setShimmeringEndFadeDuration:(CFTimeInterval)shimmeringEndFadeDuration {
_shimmeringEndFadeDuration = shimmeringEndFadeDuration;
_showLayer.shimmeringEndFadeDuration = shimmeringEndFadeDuration;
} /**
* 重写shimmeringOpacity的setter,getter方法
*/
@synthesize shimmeringOpacity = _shimmeringOpacity;
- (CGFloat)shimmeringOpacity {
return _shimmeringOpacity;
}
- (void)setShimmeringOpacity:(CGFloat)shimmeringOpacity {
_shimmeringOpacity = shimmeringOpacity;
_showLayer.shimmeringOpacity = shimmeringOpacity;
} /**
* 重写shimmeringPauseDuration的setter,getter方法
*/
@synthesize shimmeringPauseDuration = _shimmeringPauseDuration;
- (CFTimeInterval)shimmeringPauseDuration {
return _shimmeringPauseDuration;
}
- (void)setShimmeringPauseDuration:(CFTimeInterval)shimmeringPauseDuration {
_shimmeringPauseDuration = shimmeringPauseDuration;
_showLayer.shimmeringPauseDuration = shimmeringPauseDuration;
} #pragma mark - 私有方法 /**
* StrokeEnd动画
*
* @param fromValue 初始值
* @param toValue 结束值
* @param layer 被动画的CAShapeLayer
* @param duration 动画时间
* @param name 动画时间类型,可以选择的类型如下:kCAMediaTimingFunctionLinear kCAMediaTimingFunctionEaseIn kCAMediaTimingFunctionEaseOut kCAMediaTimingFunctionEaseInEaseOut kCAMediaTimingFunctionDefault
*/
- (void)doStrokeEndAnimationFromValue:(CGFloat)fromValue
toValue:(CGFloat)toValue
shapeLayer:(CAShapeLayer *)layer
duration:(CFTimeInterval)duration
timingFunctionName:(NSString *)name
{
POPBasicAnimation *pathAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPShapeLayerStrokeEnd];
pathAnimation.duration = duration;
if (name) {
pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:name];
}
pathAnimation.fromValue = [NSNumber numberWithFloat:fromValue];
pathAnimation.toValue = [NSNumber numberWithFloat:toValue];
[layer pop_addAnimation:pathAnimation forKey:nil];
} /**
* StrokeStart动画
*
* @param fromValue 初始值
* @param toValue 结束值
* @param layer 被动画的CAShapeLayer
* @param duration 动画时间
* @param name 动画时间类型,可以选择的类型如下:kCAMediaTimingFunctionLinear kCAMediaTimingFunctionEaseIn kCAMediaTimingFunctionEaseOut kCAMediaTimingFunctionEaseInEaseOut kCAMediaTimingFunctionDefault
*/
- (void)doStrokeStartAnimationFromValue:(CGFloat)fromValue
toValue:(CGFloat)toValue
shapeLayer:(CAShapeLayer *)layer
duration:(CFTimeInterval)duration
timingFunctionName:(NSString *)name
{
POPBasicAnimation *pathAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPShapeLayerStrokeStart];
pathAnimation.duration = duration;
if (name) {
pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:name];
}
pathAnimation.fromValue = [NSNumber numberWithFloat:fromValue];
pathAnimation.toValue = [NSNumber numberWithFloat:toValue];
[layer pop_addAnimation:pathAnimation forKey:nil];
} @end

以下是需要注意的地方:

以下是使用细节:

使用Facebook开源代码FBShimmering封装进度显示的ShimmeCircleView的更多相关文章

  1. bmp格式图像的读写函数(对一个开源代码的封装)

    在网上看到一段读写bmp格式图像的代码,本文对这段代码分成两个函数封装起来方便使用,一个函数是读取bmp格式的图像,一个是向指定文件写入bmp格式的图像. 前提 我们不需要知道这段代码是如何读取bmp ...

  2. 代码内存泄露检测(1) MLeaksFinder (Wechat开源) + FBRetainCycleDetector (FaceBook开源)

    每次项目编译完成之后,都被内存搞得头昏脑胀,压力甚大. 利用两周时间,稍微研究了 微信开源的 MLeaksFinder 和 facebook 开源的 FBMemoryProfiler, 这两个开源三方 ...

  3. 160多个android开源代码汇总

    第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...

  4. iOS流行的开源代码库

    本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...

  5. android开源代码

    Android开源项目--分类汇总 转自:https://github.com/Trinea/android-open-project Android开源项目第一篇——个性化控件(View)篇 包括L ...

  6. iOS 常用开源代码整理

    本文章不定期整理. 1.AFNetworking AFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务端 API 进行数据交换, 操作简单, 功 ...

  7. Facebook开源动画库 POP-POPBasicAnimation运用

    动画在APP开发过程中还是经常出现,将花几天的时间对Facebook开源动画库 POP进行简单的学习:本文主要针对的是POPBasicAnimation运用:实例源代码已经上传至gitHub,地址:h ...

  8. Facebook开源项目:我们为什么要用Fresco框架?

    (Facebook开源项目)Fresco:一个新的Android图像处理类库 在Facebook的Android客户端上快速高效的显示图片是非常重要的.然而多年来,我们遇到了很多如何高效存储图片的问题 ...

  9. 22个值得收藏的Android开源代码-UI篇

    本文介绍了android开发者中比较热门的开源代码,这些代码绝大多数可以直接应用到项目中. FileBrowserView 一个强大的文件选择控件.界面比较漂亮,使用也很简单.特点:可以自定义UI:支 ...

随机推荐

  1. SymbolTable

    在ClassReader中有两个重要的属性,如下定义: /** A hashtable containing the encountered top-level and member classes, ...

  2. java多线程---------java.util.concurrent并发包----------等待多线程完成

    一.等待多线程完成的join的使用.CoundownLantch.CyclicBarrier .

  3. 13 Timer和TimerTask 示例

    定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行.在Java中,可以通过Timer和TimerTask类来实现定义调度的功能 1 Timerjava.lang.Objec ...

  4. Wahrscheinlichkeitstheorie und mathematische Statistik

    Übliches Wort 正态分布:Die Normalverteilung 条件概率:Die Bedingte Wahrscheinlichkeit 排列:Die Permutation 组合:D ...

  5. 如何让自己的网站也能实现HTTPS访问 阿里云 转

    转 自  http://jingyan.baidu.com/article/90895e0fd9903164ec6b0bf7.html?qq-pf-to=pcqq.group 最近搞微信小程序,服务器 ...

  6. sdfsdfsdf

    i- i- i-1i- i- i- i- i- i-

  7. [转]深入Java单例模式

       文章从 https://blog.51cto.com/devbean/203501 转载 问题 : doble-check 实现的单例模式有什么缺点 线程安全的单例写法应该是怎么样的 概述 在G ...

  8. golang命令和VSCode配置

    Go是一门全新的静态类型开发语言,具有自动垃圾回收.丰富的内置类型.函数多返回值.错误处理.匿名函数.并发编程.反射等特性 golang常用命令: go env #查看go的环境 echo %GORO ...

  9. 【13】MD5编码、Zlib压缩解压缩

    1.MD5加密 /// <summary> /// 使用MD5加密算法 /// </summary> /// <param name="md5MessageSt ...

  10. 用JavaScript将数字转换为大写金额(收藏)

    (非原创, 来自网络,仅作收藏) var digitUppercase = function(n) { var fraction = ['角', '分']; var digit = [ '零', '壹 ...