介绍
记录、总结直播间源码开发遇到一些问题,大家一起交流学习。 这次带来,对直播间源码的常用动画总结。
效果展示
下面是一个很多直播间源码都有的入门豪华礼物动画——烟花。 一个复杂的礼物动画,首先是美术给出gif实现草图和素材,技术进行动画剖析和图片压缩,在程序中加载图片和实现动画,其中要注意内存和CPU占用。
烟花
图片压缩、加载与裁剪
1、图片压缩
美术给出的图片,即使是压缩过,仍存在较大的压缩空间,可以用这里或者更好的大小优化。
2、图片加载
主要有-imageNamed:
和 -imageWithContentsOfFile:
两种方式。 AnimationImageCache
类是一个动画图片加载类,用单例实现且内部用NSCache持有引用。
注意,当收到内存不足警告时,NSCache会自动释放内存。所以每次访问NSCache,即使上一次已经加载过,也需要判断返回值是否为空。
3、图片裁剪
为了减少图片资源的大小,有时候会把多个帧动画做成连续的一张图。这时需要直播间源码加载一整张资源图,并在相应的位置进行裁剪。
UIImage* sourceImage = [UIImage imageNamed:@"image/animation/gift_boat"];
CGSize sourceSize = sourceImage.size;
CGImageRef cgimage = CGImageCreateWithImageInRect(sourceImage.CGImage,
CGRectMake(0, 0, const_position_boat_x, sourceSize.height));
gWaveFrameImage = [UIImage imageWithCGImage:cgimage];
CGImageRelease(cgimage);
cgimage = CGImageCreateWithImageInRect(sourceImage.CGImage,
CGRectMake(const_position_boat_x, 0, const_position_boat_width, sourceSize.height));
gBoatFrameImage = [UIImage imageWithCGImage:cgimage];
CGImageRelease(cgimage);
cgimage = CGImageCreateWithImageInRect(sourceImage.CGImage,
CGRectMake(const_position_boat_x + const_position_boat_width, 0, sourceSize.width - const_position_boat_x - const_position_boat_width, sourceSize.height));
gShadowFrameImage = [UIImage imageWithCGImage:cgimage];
CGImageRelease(cgimage);
动画剖析与时间轴
下面这个是一个全屏类型的“天使”礼物动画,我们来剖析下这个动画的构成。
- 1、背景变暗,出现星空;
- 2、流星划过、月亮出现、云彩飘动;
- 3、两侧浮空岛震动,中间浮空岛出现;
- 4、背光出现,天使落下,翅膀扇动;
- 5、星星闪烁、凤凰出现;
- 6、渐隐消失;
天使
时间轴实现
为了让动画按照时间顺序一一执行,可以把动画按时间和对象分成多个方法,通过GCD在指定的时间调用。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self playMeteorAnimation];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self playLandAnimation];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self playLightAnimation];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(7.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self playStarAnimation];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(TOTAL_TIME * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
@weakify(self);
[UIView animateWithDuration:0.5 animations:^{
self.alpha = 0;
} completion:^(BOOL finished) {
@strongify(self);
[self removeFromSuperview];
[self callBackManager];
}];
});
声明:本文由云豹科技转发自落影博客,如有侵权请联系作者删除