最简单的直播礼物连刷特效制作(带源码)
直播礼物连刷能有效的提升主播与⽤户的交互,从⽽提升⽤户刷礼物的数量,那现在咱们来做⼀个简单的直播礼物连刷教程吧。
图片下载站源码
先贴出效果图:
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;
}
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
_presentView = [[PresentView alloc] init];
_del = _model;
// i % 2 控制最多允许出现⼏⾏
_presentView.frame = CGRectMake(-self.listView.frame.size.width / 2, 300 - (_index % 2) * 70,
self.listView.frame.size.width / 2, 40);
_iginFrame = _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 那个⽅式很熟悉么~哈哈。最近⼯作忙,动画的细节和封装性没有再完善,不过易⽤性我感觉还是很好的,祝⼤家玩得开⼼~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。