最近在研究直播的相关知识,在网上看到了不少优秀的开源项目,但都没有看到映客那个刷礼物的效果,于是手痒痒,决定自己做一个。

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 那个方式很熟悉么~哈哈。最近工作忙,动画的细节和封装性没有再完善,不过易用性我感觉还是很好的,最后附上 demo 地址和使用方法,祝大家玩得开心~

映客都是互刷礼物吗_iOS 动画队列—仿映客刷礼物效果相关推荐

  1. 映客都是互刷礼物吗_一姐负气出走花椒,映客正在发生一场大规模主播内讧事件.........

    有人的地方就有江湖,更何况是最热闹的移动直播平台. 小红近日发现大新闻,映客粉丝数第一的主播"二姐Alice",竟然转战到了花椒直播平台,已在花椒直播了几场,每次都登上花椒榜单前列 ...

  2. 映客都是互刷礼物吗_今日网红

    有人的地方就有江湖,更何况是最热闹的移动直播平台. 小红近日发现大新闻,映客粉丝数第一的主播"二姐Alice",竟然转战到了花椒直播平台,已在花椒直播了几场,每次都登上花椒榜单前列 ...

  3. 映客都是互刷礼物吗_仿映客刷礼物效果 代码优化

    上一篇文章<仿映客刷礼物效果---基本逻辑实现>中,分析了刷礼物效果的基本流程与具体实现代码.但还有一些BUG和一些可优化的地方没有处理,现在我们就来分析下这些遗留的问题.当然个人的能力是 ...

  4. 映客都是互刷礼物吗_仿映客刷礼物效果---代码优化

    上一篇文章<仿映客刷礼物效果---基本逻辑实现>中,分析了刷礼物效果的基本流程与具体实现代码.但还有一些BUG和一些可优化的地方没有处理,现在我们就来分析下这些遗留的问题.当然个人的能力是 ...

  5. 映客都是互刷礼物吗_仿映客刷礼物效果—基本逻辑实现

    项目介绍: 最近做了个直播项目,需要用到弹幕和刷礼物.在网上找了许多开源代码,发现都不是很适合自己的项目需求,于是利用空余时间将两个功能都实现下,这里分享出来,供大家一起学习.(关于弹幕的实现,大家可 ...

  6. 映客都是互刷礼物吗_iOS 基于 IM 实现仿映客刷礼物连击效果

    这里实现了以下功能:随着收到 IM 礼物消息,实时累加礼物数量 如果超出连击时间,比如 3s ,则重新开始计数,从 1 开始 如果在连击时间内,则在原先基础上累加 下面把改造思路跟大家分享下: 问题一 ...

  7. 映客都是互刷礼物吗_映客互刷礼物有什么用_映客守护有什么用

    一起直播.互刷礼物.改ID发性感照,赵本山女 375x332 - 122KB - PNG 一起直播.互刷礼物.改ID发性感照,赵本山女 600x893 - 247KB - JPEG 一起直播.互刷礼物 ...

  8. 【云豹直播系统】专业制作仿映客手机直播app、视频直播系统

    从去年开始,视频直播软件已在大众的娱乐生活中悄然走红,由PC端过渡到手机端的视频直播甚是火爆.在APP上,主播们可以通过手机摄像头,即时与粉丝聊天互动,让网友见识到移动直播的魅力.火爆远不止如此,国内 ...

  9. android动画送礼物,Android开发仿映客送礼物效果

    这里写链接内容仿映客送小礼物的特效,顺便复习一下属性动画,话不多说先看效果图. 需求分析 可以看到整个动画有几部分组成,那我们就把每个部分拆分出来各个击破. 1.要显示那些内容以及内容间的位置关系? ...

最新文章

  1. 【组队学习】【26期】动手学数据分析
  2. mysql 存储过程out,in,inout分别表示什么
  3. 【决策】Waymo无人出租车年底发射,现已进入定价环节 | 公交部门竟成友军?...
  4. 套接字没有连接并且没有提供地址_网络是怎样连接的 -- web服务器接到请求后将会做什么...
  5. java 异常 过滤器_在过滤器Filter中抛出一个全局异常可以捕获的异常
  6. OpenSSL库概述
  7. python比较文件每行长度_读取文件并查找所有行的长度是否相同
  8. 使用sklearn PCA主成分分析对图像特征进行降维
  9. android左右滑动fragment,Android基于ViewPager+Fragment实现左右滑屏效果的方法
  10. PaddlePaddle(1)——让人拍案叫绝的创意都是如何诞生的
  11. 深度学习一(PyTorch物体检测实战)
  12. 个人博客前后台整站开发——模板免费下载
  13. Shiro记住我(RememberMe)
  14. 从招聘网站分析大数据相关职位现状
  15. 假期读好书——力荐《八位大学校长》
  16. Unhandled promise rejection错误解决
  17. 网易收购《底特律》《暴雨》开发商继续走向全球化
  18. 3D目标检测-BEVFormer、BEVDepth
  19. 小米路由器忘记管理密码后重置密码
  20. python通过手机拍摄的视频图片进行人脸头像采集

热门文章

  1. matlab求矩阵行最简形,计算矩阵行最简行的命令
  2. C++实现行最简型矩阵
  3. fiddler抓取iOS微信小程序HTTPS包方法
  4. 如何实现设为首页,加入收藏的功能
  5. 数据压缩(二)——PNG文件结构分析
  6. (三)Rxjava2+Retrofit之文件上传与下载
  7. 认识几种三坐标测量机的结构形式
  8. android 8省电,智能手机怎么省电?Android手机省电攻略
  9. 讲故事的人写的谈判手册——Leo锦书64
  10. [Java Path Finder][JPF学习笔记][4]将JPF源码导入Eclipse