使用Facebook开源代码FBShimmering封装进度显示的ShimmeCircleView
使用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的更多相关文章
- bmp格式图像的读写函数(对一个开源代码的封装)
在网上看到一段读写bmp格式图像的代码,本文对这段代码分成两个函数封装起来方便使用,一个函数是读取bmp格式的图像,一个是向指定文件写入bmp格式的图像. 前提 我们不需要知道这段代码是如何读取bmp ...
- 代码内存泄露检测(1) MLeaksFinder (Wechat开源) + FBRetainCycleDetector (FaceBook开源)
每次项目编译完成之后,都被内存搞得头昏脑胀,压力甚大. 利用两周时间,稍微研究了 微信开源的 MLeaksFinder 和 facebook 开源的 FBMemoryProfiler, 这两个开源三方 ...
- 160多个android开源代码汇总
第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...
- iOS流行的开源代码库
本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...
- android开源代码
Android开源项目--分类汇总 转自:https://github.com/Trinea/android-open-project Android开源项目第一篇——个性化控件(View)篇 包括L ...
- iOS 常用开源代码整理
本文章不定期整理. 1.AFNetworking AFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务端 API 进行数据交换, 操作简单, 功 ...
- Facebook开源动画库 POP-POPBasicAnimation运用
动画在APP开发过程中还是经常出现,将花几天的时间对Facebook开源动画库 POP进行简单的学习:本文主要针对的是POPBasicAnimation运用:实例源代码已经上传至gitHub,地址:h ...
- Facebook开源项目:我们为什么要用Fresco框架?
(Facebook开源项目)Fresco:一个新的Android图像处理类库 在Facebook的Android客户端上快速高效的显示图片是非常重要的.然而多年来,我们遇到了很多如何高效存储图片的问题 ...
- 22个值得收藏的Android开源代码-UI篇
本文介绍了android开发者中比较热门的开源代码,这些代码绝大多数可以直接应用到项目中. FileBrowserView 一个强大的文件选择控件.界面比较漂亮,使用也很简单.特点:可以自定义UI:支 ...
随机推荐
- Couchbase进阶-集群与版本升级
最近在负责公司Couchbase版本升级工作,之前只有一台Cache服务器,使用Couchbase Enterprise Edition 1.8,为避免单点故障现在需要新增加一台Cache服务器做负载 ...
- 爱奇艺视频显示列表CSS实现
css: body{margin:0;font-size: 12px;font-family: "宋体":} ul{margin:0;padding:0;list-style: n ...
- [中英对照]Device Drivers in User Space: A Case for Network Device Driver | 用户态设备驱动: 以网卡驱动为例
前文初步介绍了Linux用户态设备驱动,本文将介绍一个典型的案例.Again, 如对Linux用户态设备驱动程序开发感兴趣,请阅读本文,否则请飘过. Device Drivers in User Sp ...
- (转载)GRASP职责分配原则
GRASP (职责分配原则) 要学习设计模式,有些基础知识是我们必须要先知道的,设计模式是关于类和对象的一种高效.灵活的使用方式,也就是说,必须先有类和对象,才能有设计模式的用武之地,否则一切都是空谈 ...
- msyql int(x) 中的x
先看一个mysql表结构 Sql代码 CREATE TABLE `test` ( `TYPEID` int (2) ) ENGINE=MyISAM CHARSET=latin1; Sql代码 ...
- Http协议之Content-Length
前言 http协议是互联网中最重要的协议之一,虽然看上去很简单,但是实际中经常遇到问题,我们就已经遇到好几次了.有长连接相关的,有报文解析相关的.对http协议不能一知半解,必须透彻理解才行.所以就写 ...
- Java 动态代理机制分析及扩展--转
http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/#icomments http://www.ibm.com/developerworks/c ...
- Ruby(1):入门
安装: 一般来说linux会自动装ruby,可以通过: ruby -v 来查看ruby版本 直接使用ruby命令的话,是用来执行ruby文件的.如果要打开交互式ruby解释器.只需要在控制台输入:ir ...
- Paypal如何实现循环扣款(订阅)?
起因 业务需求要集成Paypal,实现循环扣款功能,然而百度和GOOGLE了一圈,除官网外,没找到相关开发教程,只好在Paypal上看,花了两天后集成成功,这里对如何使用Paypal的支付接口做下总结 ...
- [转]log4net 发布到生产环境不写日志的解决方法--使用 NLog日志
本文转自:http://www.cnblogs.com/weiweictgu/p/5848805.html 1.升级到log4net的最新版 PM下执行 Install-Package log4net ...