使用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. io流之转换流InputStreamReader、OutputStreamWriter

    例子程序: package io; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.File ...

  2. Bug解决方案:org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 8; 不允许有匹配 "[xX][mM][lL]" 的处理指令目标

    十月 17, 2016 10:14:30 下午 org.springframework.context.support.AbstractApplicationContext prepareRefres ...

  3. jgGrid注销表格(动态修改表头)以及前台分页

    实例代码 <!doctype html> <html lang="en"> <head> <meta charset="UTF- ...

  4. PHP之string之str_pad()函数使用

    str_pad (PHP 4 >= 4.0.1, PHP 5, PHP 7) str_pad - Pad a string to a certain length with another st ...

  5. 多线程编程(三)-CountDownLatch的使用

    CountDownLatch的介绍 类CountDownLatch是同步功能得一个辅助类,使用效果就是给定一个计数,当使用CountDownLatch类的线程判断计数不为0时,则呈wait状态,如果是 ...

  6. win7下安装centos6.5后,开机无法进入选择双系统启动界面,只能启动centos的解决办法

    1.centos6.5下打开终端,进入/boot/grub ,vim grub.conf 将default=0 改为1,重启 2.重启后,又只能进入win7了.这个好解决.下载一个easyBCD,具体 ...

  7. dll ocx cab IE 自动安装

    我们打开淘宝等网站时,IE浏览器会提示安装空间,这个控件便是用于对用户名密码进行加密的ActiveX控件.如何在我们的站点上安装如此控件,让用户可以通过简单的点击便可方便使用我们的空间呢? 下面是如何 ...

  8. 转:Java 基本数据类型

    Java 基本数据类型 转:http://www.runoob.com/java/java-basic-datatypes.html 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中 ...

  9. Golang之并发资源竞争(互斥锁)

    并发本身并不复杂,但是因为有了资源竞争的问题,就使得我们开发出好的并发程序变得复杂起来,因为会引起很多莫名其妙的问题. package main import ( "fmt" &q ...

  10. 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波

    原文:http://blog.csdn.net/xiaowei_cqu/article/details/7785365 邻域滤波(卷积)   邻域算子值利用给定像素周围像素的值决定此像素的最终输出.如 ...