融云提供一个直播聊天室弹幕功能的实现,开发者可以直接使用或者在此基础上进行修改,最后附上源码
特性:
支持的弹幕动画方式:从右往左(默认)、中间靠上,中间靠下,特殊位置;开发者可以根据需求来设置弹幕动画方式
支持两种弹幕的加载方式:过量加载和缓存加载,支持两种状态热切换(通过修改RCDDanmakuManager的isAllowOverLoad的值)
过量加载:该方式没有做弹幕的碰撞检测,所有的弹幕立即发送,如果聊天室消息过多那么就会出现弹幕铺天盖地的效果
缓存加载:该方式做了碰撞检测,页面同一时间只会出现特定个数的弹幕,如果聊天室中消息过多,那么弹幕就会被缓存下来,等到前面的弹幕播放完毕之后才会播放缓存的弹幕
不支持按照时间点播放弹幕
额外功能:
调用UIVIew+RCDDanmaku的sendDanmaku方法,弹幕即开始发送,支持弹幕暂停、恢复、停止等操作
弹幕功能模块包含以下4个类:
RCDDanmaku:弹幕类,包含弹幕内容和弹幕动画类型
RCDDanmakuInfo:弹幕信息类,包含一个弹幕,该弹幕的剩余动画时间,该弹幕所处的弹道(开发者不需要直接操作该类)
RCDDanmakuManager:弹幕管理类,设置弹幕间的间距,弹幕的动画时间,弹幕的缓存等数据(可以直接在.m中修改)
UIVIew+RCDDanmaku:UIview的类扩展,可以使用这个类扩展直接给视频直播的view发送弹幕,在直播聊天页面直接导入该类即可
开发者需要做的是:
1、设置RCDDanmakuManager里面弹幕的各种配置(源码里面有默认配置,如果有不同的需求,可以直接更改)
2、当收到弹幕消息的时候手动创建一个RCDDanmaku对象
3、调用UIVIew+RCDDanmaku的sendDanmaku方法发送弹幕
注:
1、可调用UIVIew+RCDDanmaku的方法对弹幕进行暂停、恢复等功能
2、每次退出页面,必须调用UIVIew+RCDDanmaku的stopDanmaku方法停止弹幕,否则会影响下次弹幕的播放
代码实现:
直播页面导入UIVIew+RCDDanmaku,使用视频所在的view来调用下面的方法,下面的代码可以在demo中找到
1、发送弹幕:
发送一个普通的纯文本弹幕可以参考下面的代码
//弹幕文本
NSString *str = @“这波很强势!”;
//弹幕label
UILabel *label = [[UILabel alloc]init];
label.attributedText = [[NSAttributedString alloc]initWithString:str attributes:@{NSForegroundColorAttributeName : [UIColor redColor]}];
[label sizeToFit];//确定弹幕label的尺寸
label.backgroundColor = [UIColor clearColor];//清空背景色
//创建一个弹幕对象
RCDDanmaku *danmaku = [[RCDDanmaku alloc]init];
//将弹幕的动画view赋值
danmaku.playView = label;
//设置弹幕为居中靠上的动画方法(不设置默认为从右往左动画)
danmaku.position = RCDDanmakuPositionCenterTop;
//发送弹幕
[self.view sendDanmaku:danmaku];
发送一个比较复杂的弹幕,比说说有文本有图片,可以参考下面代码
//创建一个自定义弹幕view(RCDGiftDanmakuView可以参考demo的实现)
UIView *backView = [RCDGiftDanmakuView giftDanmakuViewWithText:@“壕送出了一个” withImageName:@“clap”];
//创建一个弹幕对象
RCDDanmaku *danmaku = [[RCDDanmaku alloc]init];
//将弹幕的动画view赋值,默认从右往左的动画
danmaku.playView = backView;
//发送中心点在(200,200)的弹幕,持续时间有RCDDanmakuManager的specialDuration控制
[self.view sendDanmaku:danmaku atCenterPoint:CGPointMake(200, 200)];
2、暂停弹幕:
[self.view pauseDanmaku];
3、恢复弹幕:
[self.view resumeDanmaku];
4、停止弹幕:(每次退出直播页面都必须调用这个方法)
[self.view stopDanmaku];
5、切换弹幕加载方法:(可以随时调用该方法切换弹幕加载方式,调用之后,之前设置的弹幕还会以旧方式加载,后续的弹幕会改变加载方式)
RCDanmakuManager.isAllowOverLoad = YES;
最后附上demo