YYFrameImage 代表是一組圖片組合而成的動態(tài)圖片對象。
首先我們來看初始化方法啃炸。
YYFrameImage 有2個(gè)初始化方法分別是
- (instancetype)initWithImagePaths:(NSArray *)paths frameDurations:(NSArray *)frameDurations loopCount:(NSUInteger)loopCount
- (instancetype)initWithImageDataArray:(NSArray *)dataArray frameDurations:(NSArray *)frameDurations loopCount:(NSUInteger)loopCount
構(gòu)造簡單,用過一組的圖片的 path 或者 data 來把多個(gè)圖片封裝在一起纲刀,達(dá)在 YYAnimatedImageView 中播放的目的罐盔。
其在內(nèi)部也維護(hù)了幾個(gè)成員變量
NSUInteger _loopCount;
NSUInteger _oneFrameBytes;
NSArray *_imagePaths;
NSArray *_imageDatas;
NSArray *_frameDurations;
分別是循環(huán)次數(shù),多個(gè)圖片 path或者多個(gè)圖片 data却特,還有 每一幀播放時(shí)間的數(shù)組扶供。
為了在 YYAnimatedImageView 播放,需要實(shí)現(xiàn) YYAnimatedImage 協(xié)議裂明,我們來看下多個(gè)圖片如何組合椿浓。
首先告訴 YYAnimatedImageView 有多少幀可以播放。
- (NSUInteger)animatedImageFrameCount {
if (_imagePaths) {
return _imagePaths.count;
} else if (_imageDatas) {
return _imageDatas.count;
} else {
return 1;
}
}
之后提供循環(huán)的次數(shù)
- (NSUInteger)animatedImageLoopCount {
return _loopCount;
}
提供每一幀的的大小漾岳,為了圖片優(yōu)化
- (NSUInteger)animatedImageBytesPerFrame {
return _oneFrameBytes;
}
返回每一幀的圖片
- (UIImage *)animatedImageFrameAtIndex:(NSUInteger)index {
if (_imagePaths) {
if (index >= _imagePaths.count) return nil;
NSString *path = _imagePaths[index];
CGFloat scale = _NSStringPathScale(path);
NSData *data = [NSData dataWithContentsOfFile:path];
return [[UIImage imageWithData:data scale:scale] yy_imageByDecoded];
} else if (_imageDatas) {
if (index >= _imageDatas.count) return nil;
NSData *data = _imageDatas[index];
return [[UIImage imageWithData:data scale:[UIScreen mainScreen].scale] yy_imageByDecoded];
} else {
return index == 0 ? self : nil;
}
}
提供每一幀的顯示時(shí)間
- (NSTimeInterval)animatedImageDurationAtIndex:(NSUInteger)index {
if (index >= _frameDurations.count) return 0;
NSNumber *num = _frameDurations[index];
return [num doubleValue];
}
好了轰绵,frameImage 實(shí)現(xiàn)比較簡單,代碼也清晰易懂尼荆。更多細(xì)節(jié)可以自己去挖掘哦。