BarrageKit彈幕插件

BarrageKit彈幕插件


前言


現(xiàn)在直播這么火,好多直播框架,諸如IJKMediaFramework等更是方便了直播類APP的開發(fā),那我們也一起給它添磚加瓦吧。

插件介紹


插件是基于Objective-C編寫的,整體思路較為簡單,功能包括:

  1. 彈幕的滾動方向、滾動速度
  2. 彈幕的暫停與恢復(fù)、顯示與隱藏
  3. 彈幕的類型:純文字彈幕、投票類彈幕、其他等(可自定義)
  4. 彈幕的推送方式:主動獲取彈幕源、被動接收
  5. 彈幕的緩存,避免大量彈幕出現(xiàn)時內(nèi)存Boom

還有一些不完善的地方(比如彈幕的軌道現(xiàn)為隨機(jī)生成,可能會重疊)及一些新的功能歡迎issue

插件展示


  • 四個方向的彈幕滾動
四個方向的彈幕滾動
  • 彈幕的暫停與恢復(fù)


    彈幕的暫停與恢復(fù)

核心代碼介紹


BarrageManager彈幕管理者

數(shù)組介紹:

  • _cachePool為彈幕單元的緩沖數(shù)組,從屏幕上移除的BarrageScene會加入到該數(shù)組中
  • _barrageScene為當(dāng)前屏幕上正在顯示的彈幕顯示單元的數(shù)組,彈幕顯示的時候會加入到該數(shù)組中

BarrageManager 作為彈幕的管理者,流程為:

  • 初始化彈幕manager,啟動timer,主動拉取彈幕數(shù)據(jù),調(diào)用-delegate barrageManagerDataSource返回數(shù)據(jù)。
  • 調(diào)用- (void)showWithData:(id)data方法顯示彈幕,data可以為BarrageModelNSArray格式
    • 判斷緩沖池是否為空,為空則新建彈幕顯示單元BarrageScene,并加入到_barrageScene數(shù)組中。若不為空,則取出_cachePoolfirstObject進(jìn)行重用并從_cachePool中移除,添加到_barrageScene中來

核心代碼如下:

if (_cachePool.count < 1) {
                    // nil
                    BarrageScene *scene = [[BarrageScene alloc] initWithFrame:CGRectZero Model:model];
                    [_barrageScene addObject:scene];
                    [_bindingView addSubview:scene];
                    Weakself;
                    scene.animationDidStopBlock = ^(BarrageScene *scene_){
                        [weakSelf.cachePool addObject:scene_];
                        [weakSelf.barrageScene removeObject:scene_];
                        [scene_ removeFromSuperview];
                    };
                    [scene scroll];
                    
                }else {
                    //從緩沖池獲取到Scene后,將其從緩沖池中移除
//                    NSLog(@"get from cache");
                    BarrageScene *scene =  _cachePool.firstObject;
                    [_barrageScene addObject:scene];
                    [_cachePool removeObjectAtIndex:0];
                    scene.model = model;
                    
                    [_bindingView addSubview:scene];
                    [scene scroll];
                }

BarrageModel彈幕模型

message彈幕信息為NSMutableAttributedString類型,圖片、表情等都可以使用了

模型屬性:

//彈幕ID barrage's id
@property (assign, nonatomic) NSInteger numberID;

//彈幕時間 barrage;s time
@property (strong, nonatomic) NSString *time;

//彈幕類型 barrage's type
@property (assign, nonatomic) BarrageDisplayType barrageType;

//彈幕速度 barrage's speed
@property (assign, nonatomic) BarrageDisplaySpeedType speed;

//彈幕滾動方向 barrage's direction
@property (assign, nonatomic) BarrageScrollDirection direction;

//彈幕位置 barage's location
@property (assign, nonatomic) BarrageDisplayLocationType displayLocation;

//彈幕所屬的父View  barrage's superView
@property (weak, nonatomic) UIView *bindView;

//彈幕內(nèi)容 barrage's content
@property (strong, nonatomic, nonnull) NSMutableAttributedString *message;

//彈幕作者 barrage's author
@property (strong, nonatomic, nullable) id author;

//彈幕對象 goal object
@property (strong, nonatomic, nullable) id object;

//彈幕字體 barrage's textfont
@property (copy, nonatomic) UIFont *font;

//彈幕字體顏色 barrage's textColor
@property (copy, nonatomic) UIColor *textColor;

BarrageScene彈幕顯示單元

  • 滾動Scroll

  • ①根據(jù)彈幕的滾動速度和滾動方向計算彈幕的滾動距離和所需要的時間

  • ②使用CABasicAnimation完成動畫,后期彈幕的暫停和回復(fù)比較方便

  • ③彈幕滾動完畢后,執(zhí)行_animationDidStopBlock,將該scene加入到managercachePool中等待被重用

  • 重用

  • 彈幕從BarrageManagercachePool中取出來,根據(jù)BarrageModel彈幕信息重新初始化frame且重新開始動畫

  • 暫停 pause

    • 暫停layer動畫即可
CFTimeInterval pausedTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
self.layer.speed = 0.0;
self.layer.timeOffset = pausedTime;
  • 恢復(fù) resume
    • 恢復(fù)layer動畫即可
CFTimeInterval pausedTime = [self.layer timeOffset];
self.layer.timeOffset = 0.0;
self.layer.beginTime = 0.0;
self.layer.speed = 1.0;
CFTimeInterval timeSincePause = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
self.layer.beginTime = timeSincePause;
  • 關(guān)閉 close
[self.layer removeAllAnimations];
[self removeFromSuperview];

插件使用

下載項目導(dǎo)入到項目中,使用時import 'BarrageKit.h'即可

_manager = [BarrageManager manager];
    
    //出現(xiàn)的View
    _manager.bindingView = self.view;
    
    //delegate
    _manager.delegate = self;
    
    //彈幕顯示位置
    _manager.displayLocation = BarrageDisplayLocationTypeDefault;
    
    //滾動方向
    _manager.scrollDirection = BarrageScrollDirectRightToLeft;
    
    //滾動速度
    _manager.scrollSpeed = 30;
    
    //收到內(nèi)存警告的處理方式
    _manager.memoryMode = BarrageMemoryWarningModeHalf;
    
    //刷新時間
    _manager.refreshInterval = 1.0;
    
    //開始滾動 manager主動獲取彈幕,另外一種方式,`[_manager showBarrageWithDataSource:m]` 退出彈幕即可
    [_manager startScroll];

Tips:

  • ①如果彈幕為投票類型的彈幕時,請重寫ViewControllertouchesBegan 方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];
    [[_manager barrageScenes] enumerateObjectsUsingBlock:^(BarrageScene * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([obj.layer.presentationLayer hitTest:touchPoint]) {
            //彈幕類型為投票類型時,為彈幕添加點擊事件,請在此處添加
            /* if barrage's type is ` BarrageDisplayTypeVote `, add your code here*/
            NSLog(@"message = %@",obj.model.message.string);
        }
    }];
}
  • ②重寫ViewControllerdealloc方法,執(zhí)行BarrageManagertoDealloc
  • ③ViewController收到內(nèi)存警告時,[_manager didReceiveMemoryWarning];將會按照memoryMode指定的方法清楚緩沖池
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    
    // 收到內(nèi)存警告時,清楚彈幕緩沖池 When you receive a memory warning,clean the barrage's cache
    [_manager didReceiveMemoryWarning];
}
  • ④如果要高度自定義彈幕顯示,可以修改BarrageScene中的初始化代碼

最后

大家查看項目后,歡迎issue,同時有其他的功能或建議歡迎提出來,簡書、github均可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,107評論 7 249
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,320評論 4 61
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實...
    香橙柚子閱讀 24,755評論 8 183
  • 五塊錢 我買了兩個石榴 它們很漂亮 我把其中一個放在電腦桌上 另一個放在餐桌上 我想,就這樣一直看著它們 今天,我...
    花間微語閱讀 265評論 6 2
  • 從昨天開始就開始被高考刷屏,比如王俊凱的日程。 回憶一下我的高考吧,恩,我高考考了兩次,第一次沒考好,于是復(fù)讀了一...
    見月醬閱讀 748評論 11 8

友情鏈接更多精彩內(nèi)容