XPQGifView
2016-04-10 11:57
274 查看
XPQGifView
gitHub地址:https://github.com/xiepanqi/XPQGifView实现目的
现在显示gif动态图大部分都是把所有帧加载到UIImageView的
animationImages里面或者使用
UIWebView显示。这两种方法使用
UIImageView的
animationImages会占用大量内存,而使用
UIWebView不但内存占用更多,还要占用CPU资源,相比使用
UIImage得不偿失。为了解决gif显示资源的占用问题特地写了这个gif显示view。
性能对比
在Dome里面的GIF图分辨率是400*225/81帧。(5S真机测试,模拟器性能会有不同)使用
UIImageView把所有帧都加载到
animationImages内存会暴涨到35+M以上。
使用
UIWebView占用的内存更多,而且还要占用一定CPU资源。
使用
XPQGifView需要同时占用CPU和内存,占用比可以调节,可以更具使用环境来确定。下图是内存占用率最低的状态。
实现原理
实现原理其实很简单,就是不把解析出来的图片保存到内存中,而是事实解析,所以内存占用率很低,但会占用一定的CPU。虽然性能分析上CPU占用率高达8%,但其实这8%的很大部分时间是用在sleep上,如果同时显示多个gif图CPU占用率并不会有多大的提升。CPU占用率调节则是把一定的帧图像保存到内存中,这样CPU的占用率就会降低,不过内存占用率会增加。
使用
该视图继承自UIImageView。很多父属性都是可用的。
初始化
禁用了UIImageView的
initWithImage:和
initWithImage:highlightedImage:两个初始化方法。
另外增加了
initWithGifData:和
initWithGifData:andLoopCount:两个初始化方法。
使用时先把gif图加载成
NSData类型,再初始化
XPQGifView,也可以使用
UIImageView的其他方法初始化,然后修改
gifData和
loopCount属性。
属性
isPlay只读,是否在播发。
loopCount重复播发次数。可以在播发过程中修改,但修改后前面播发的次数还算。
gifDatagif数据源。可以在播发过程中修改。修改后从第一帧开始播发,并且前面播发的次数还算。
sleep播发速度。越大播发速度越慢,越小越快。实际播发速度=原播发速度*sleep。默认1.0。
frameCacheInterval内存占比。默认NSUIntegerMax。该值表示隔多少帧保存一次缓存,为0表示全部保存,大于frameCount全部不保存。 值越小占用内存越大,消耗CPU越小。修改此值必须要动画下次启动才生效。此值根据实际使用情况来设置。
方法
- (void)start;
启动无限播发GIF,如果gifData为nil则不做任何操作。
- (void)startLoopCount:(NSUInteger)loopCount;
指定次数播发GIF,如果gifData为nil则不做任何操作。
loopCount为重复播发次数
- (void)suspend;
暂停播发GIF,再次使用start时从暂停的帧开始播发。
- (void)stop;
停止播发GIF,再次使用start时从第一帧开始播发。
类方法
有4个类方法,分别是获取帧的图像和显示时长。+ (NSTimeInterval)delayTimeWithGifData:(NSData *)gifData andIndex:(size_t)index;
+ (NSArray<NSNumber*> *)delayArrayWithGifData:(NSData *)gifData;
+ (UIImage *)imageWithGifData:(NSData *)gifData andIndex:(size_t)index;
+ (NSArray<UIImage*> *)imageArrayWithGifData:(NSData *)gifData;
相关文章推荐
- tomcat多域名配置
- Java中super的几种用法并与this的区别
- NKOI 1036 回文词
- 八皇后问题
- u-boot第一阶段
- 八皇后问题
- Linux下的压缩zip,解压缩unzip命令详解及实例
- 迭代器是什么?
- 团队项目——班级派发布视频
- 第七章读书笔记《深入理解计算机系统》
- CentOS 7 中 hostnamectl 的使用
- Codeforces--658C--Bear and Forgotten Tree 3(模拟&&技巧)(好题)
- 局部变量和static的千丝万缕
- Xcode侧栏无法拖动以及无法选择模拟器的解决办法
- json
- hibernate中的many-to-many 和one-to-many还有many-to-one分别是什么意思
- 史上最详细Android集成QQ,微信,微博分享(不用第三方)持续更新中
- 简单脱壳教程笔记(8)---手脱EZIP壳
- 批量在EXCEL中为字符串添加标点符号 双引号
- iOS开发数据库篇—SQL代码应用示例