最简单的直播礼物连刷特效制作(带源码)
2018-01-26 11:40
507 查看
直播礼物连刷能有效的提升主播与用户的交互,从而提升用户刷礼物的数量,那现在咱们来做一个简单的直播礼物连刷教程吧。
先贴出效果图:
1. 首先从简单的开始,文字描边+连击效果,这个比较简单,只要重写 UILabel 的
- (void)drawTextInRect:(CGRect)rect
就可以达到文字描边的效果;然后开定时器,让数字增加,动画效果用关键帧动画控制。
2. 然后仿照映客的 UI 自定义 View ,控制动画,从屏幕外面进入,然后显示连击效果,最后隐藏,恢复到初始位置。
3. 上面的动画效果只要稍微有点动画基础,很容易就搞定了。做到这里我冷静下来,不再往下面做了,因为事情远远没有想象的那么简单。首先考虑的是,在收到礼物消息的回调时去赋值数据源,运行动画,但是这个回调是是一个字典数组,里面包含了一段时间内多条消息,他们是有顺序的,这是其一;其二,这个回调调用次数会很频繁,短时间内就会收到更多的消息数组。所以需要把这些消息处理成队列,然后播放动画效果,一个动画效果播放完成后,再从消息队列中取下一个消息,继续播放下一个动画,这样才能保证动画的播放顺序不回乱。
说到队列的话就想到了多线程,NSOperation ,我们可以重写它,然后在 start 方法中添加动画,但是注意我们只是需要让这些消息排队,更新 UI 还是要在主线程操作;我们还要手动触发 NSOperation 的 KVO,告诉这个操作什么时候开始,什么时候算是结束,我们想在一个动画播放完毕后再执行下一个动画,于是我这里定义了一个 block ,在动画结束时,传递给 NSOperation ,告诉它动画结束了。
@synthesize finished = _finished;
@synthesize executing = _executing;
- (instancetype)init
{
self = [super init];
if (self) {
_executing = NO;
_finished = NO;
}
return self;
}
- (void)start {
if ([self isCancelled]) {
self.finished = YES;
return;
}
self.executing = YES;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
_presentView = [[PresentView alloc] init];
_presentView.model = _model;
// i % 2 控制最多允许出现几行
_presentView.frame = CGRectMake(-self.listView.frame.size.width / 2, 300 - (_index % 2) * 70, self.listView.frame.size.width / 2, 40);
_presentView.originFrame = _presentView.frame;
[self.listView addSubview:_presentView];
[self.presentView animateWithCompleteBlock:^(BOOL finished) {
self.finished = finished;
}];
}];
}
#pragma mark - 手动触发 KVO
- (void)setExecuting:(BOOL)executing
{
[self willChangeValueForKey:@"isExecuting"];
_executing = executing;
[self didChangeValueForKey:@"isExecuting"];
}
- (void)setFinished:(BOOL)finished
{
[self willChangeValueForKey:@"isFinished"];
_finished = finished;
[self didChangeValueForKey:@"isFinished"];
}
注意这里 :
_presentView.frame = CGRectMake(-self.listView.frame.size.width / 2, 300 - (_index % 2) * 70, self.listView.frame.size.width / 2, 40);// i % 2 控制最多允许出现几行
queue.maxConcurrentOperationCount = 2; // 队列分发
当时其实只是实现了一个队列,按顺序一个一个播放,如何实现 N 列并发呢?其实把这些并发的动画队列想象成图片的多并发异步下载就好了,下意识地就加了上面两句控制并发列数的代码。能这么顺利做出来,是因为最近仔细研究了 SDWebImage 的源码,不觉得重写 NSOperation 那个方式很熟悉么~哈哈。最近工作忙,动画的细节和封装性没有再完善,不过易用性我感觉还是很好的,祝大家玩得开心~
github源码:https://github.com/aiyaapp/AiyaEffectsIOS
先贴出效果图:
1. 首先从简单的开始,文字描边+连击效果,这个比较简单,只要重写 UILabel 的
- (void)drawTextInRect:(CGRect)rect
就可以达到文字描边的效果;然后开定时器,让数字增加,动画效果用关键帧动画控制。
2. 然后仿照映客的 UI 自定义 View ,控制动画,从屏幕外面进入,然后显示连击效果,最后隐藏,恢复到初始位置。
3. 上面的动画效果只要稍微有点动画基础,很容易就搞定了。做到这里我冷静下来,不再往下面做了,因为事情远远没有想象的那么简单。首先考虑的是,在收到礼物消息的回调时去赋值数据源,运行动画,但是这个回调是是一个字典数组,里面包含了一段时间内多条消息,他们是有顺序的,这是其一;其二,这个回调调用次数会很频繁,短时间内就会收到更多的消息数组。所以需要把这些消息处理成队列,然后播放动画效果,一个动画效果播放完成后,再从消息队列中取下一个消息,继续播放下一个动画,这样才能保证动画的播放顺序不回乱。
说到队列的话就想到了多线程,NSOperation ,我们可以重写它,然后在 start 方法中添加动画,但是注意我们只是需要让这些消息排队,更新 UI 还是要在主线程操作;我们还要手动触发 NSOperation 的 KVO,告诉这个操作什么时候开始,什么时候算是结束,我们想在一个动画播放完毕后再执行下一个动画,于是我这里定义了一个 block ,在动画结束时,传递给 NSOperation ,告诉它动画结束了。
@synthesize finished = _finished;
@synthesize executing = _executing;
- (instancetype)init
{
self = [super init];
if (self) {
_executing = NO;
_finished = NO;
}
return self;
}
- (void)start {
if ([self isCancelled]) {
self.finished = YES;
return;
}
self.executing = YES;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
_presentView = [[PresentView alloc] init];
_presentView.model = _model;
// i % 2 控制最多允许出现几行
_presentView.frame = CGRectMake(-self.listView.frame.size.width / 2, 300 - (_index % 2) * 70, self.listView.frame.size.width / 2, 40);
_presentView.originFrame = _presentView.frame;
[self.listView addSubview:_presentView];
[self.presentView animateWithCompleteBlock:^(BOOL finished) {
self.finished = finished;
}];
}];
}
#pragma mark - 手动触发 KVO
- (void)setExecuting:(BOOL)executing
{
[self willChangeValueForKey:@"isExecuting"];
_executing = executing;
[self didChangeValueForKey:@"isExecuting"];
}
- (void)setFinished:(BOOL)finished
{
[self willChangeValueForKey:@"isFinished"];
_finished = finished;
[self didChangeValueForKey:@"isFinished"];
}
注意这里 :
_presentView.frame = CGRectMake(-self.listView.frame.size.width / 2, 300 - (_index % 2) * 70, self.listView.frame.size.width / 2, 40);// i % 2 控制最多允许出现几行
queue.maxConcurrentOperationCount = 2; // 队列分发
当时其实只是实现了一个队列,按顺序一个一个播放,如何实现 N 列并发呢?其实把这些并发的动画队列想象成图片的多并发异步下载就好了,下意识地就加了上面两句控制并发列数的代码。能这么顺利做出来,是因为最近仔细研究了 SDWebImage 的源码,不觉得重写 NSOperation 那个方式很熟悉么~哈哈。最近工作忙,动画的细节和封装性没有再完善,不过易用性我感觉还是很好的,祝大家玩得开心~
github源码:https://github.com/aiyaapp/AiyaEffectsIOS
相关文章推荐
- 仿映客直播礼物特效制作流程
- 基于replaceChild制作简单的吞噬特效
- canvas制作的简单时钟特效
- Android仿直播特效之刷礼物
- anddroid制作直播中的礼物的动画
- HTML5 canvas制作简单的黑板特效
- PS简单制作逼真的下雪特效
- Photoshop轻松制作简单老电影画面特效
- android开发技巧——直播礼物面板制作
- 使用源码文件简单制作RPM包
- Jquery效果大全之制作电脑健康体检得分特效附源码下载
- 使用CSS3打造的精美特效盘点,部分有中文制作教程及源码
- 使用Spine软件为骨骼动画制作简单特效
- WPF制作一个简单的倒计时器实例附源码
- Vs2010 MFC 简单制作过程中的问题
- EasyNVR+EasyDSS实现简单套路的RTMP、微信直播、录像、回放方案
- html5 简单的弹弹球制作
- PHP源码编译安装的简单整理
- 使用HTML5/CSS3快速制作便签贴特效