DanmuManager 一個簡單的彈幕工具

項目首頁: DanmuManager Github Repositorygit

使用方法 Usage

DanmuManagerVideoDanmuManager 有不一樣的應用場景,後者用於視頻彈幕。github

你能夠運行項目中的測試,來了解兩者的使用方法。dom



DanmuManager

  1. 建立 DanmuManageride

    let dm = DanmuManager(with: self.view)

    初始化 init 方法容許自定義:學習

    • topbottom彈幕顯示在 view 中的上下位置範圍;測試

    • speed 彈幕的速度;字體

    • customFont 彈幕字體(UIFont, 包括字體家族和大小,默認爲系統字體,字號 20)。spa

  2. 添加一條彈幕設計

    dm.add(with: 「Wow so cool!!!」, at: 4)

    添加彈幕 add 方法有兩個必傳參數,text(彈幕文字) 和 line(彈幕所在行);可選參數 hasBorder 用於設置該條彈幕是否有邊框(默認 borderColor = UIColor.black.cgColor,borderWidth = 1),默認值爲 false;可選參數 isAdvance 用於設置該條彈幕是否開啓高級功能(目前支持修改 文字顏色 和 背景顏色),默認值爲 false。rest

    若是須要彈幕出如今隨機行,可使用

    func addRandom(with text: String = "This is a test Danmu.", at line: Int = 0, hasBorder: Bool = false, isAdvanced: Bool = false)`。
  3. 暫停/繼續 彈幕

    dm.pause()
    dm.resume()

    你也可使用 dm.toggle() 來快捷切換 暫停/繼續。

VideoDanmuManager

  1. 建立 VideoDanmuManager

    let vdm = VideoDanmuManager(view: self.view,
                                videoLength: 10,
                                danmuData: [
                                    (3.4, "3.4 Wowowowowowow!"),
                                    (3.4, "3.4 SOOOO COOOOOOOOOOL!"),
                                    (3.4, "3.4 Amazing!!!!"),
                                    (3.4, "3.4 I love you~"),
                                    (3.4, "3.4 MY BABY!!!!"),
                                    (1.1, "1.1 This is a test Danmu!!!"),
                                    (2.0, "2.0 Another test Danmu."),
                                    (4.1, "4.1 Amazing!!!!"),
                                    (6.1, "6.1 Test!!!!"),
                                    (8.1, "8.1 Test!!!!"),
                                    (9.1, "9.1 Test!!!!"),
                                    (10, "10 Test!!!!"),
            ],
                                isSorted: false
        )

    VideoDanmuManager 的建立有三個必選參數,view(顯示彈幕的視圖),videoLength(視頻時長,精確到 0.1 秒)和 danmuData(已經存在的彈幕列表)。

    可選參數 videoCurrent 默認爲 0,即開始時刻;你能夠經過傳入不一樣的時間值來設置顯示彈幕的初始時間(好比在視頻從 1 分 15 秒開始播放,則應設置 videoCurrent 爲 75)。
    可選參數 isSorted 默認爲 true,即默認數據集已經按照彈幕顯示時間從先到後排序;如傳入 false,則將自動調用 func sort() 對數據進行排序。

    可選參數 topbottomDanmuManager

  2. 開啓彈幕

    vdm.start()

    你須要在視頻開始播放的同時,手動開啓彈幕。

  3. 暫停/繼續 彈幕

    vdm.pause()
    vdm.resume()

    你也可使用 vdm.toggle() 來快捷切換 暫停/繼續。

  4. 停止彈幕

    vdm.stop()
  5. 從新開始彈幕

    vdm.restart()

    你也能夠在指定時間點從新開始彈幕:

    vdm.restart(at: 75)

設計思路

DanmuManager 經過設置的字體大小計算文本顯示高度 lineHeight,經過 numberOfLines = Int(floor((bottom - top) / lineHeight)) 獲得能夠顯示的彈幕行數;使用 inUsingLinesenteringTimerswaitingQueues 來分別記錄 正在使用的行(有尾部尚未徹底進入視圖的彈幕的行),正在進入視圖的彈幕的計時器 和 正在等待進入的彈幕隊列。

爲了防止彈幕重疊,只有當 當前行中前一條彈幕尾部進入視圖 時(以後),下一條彈幕才能夠發射。

enteringTimers 中每個 Timer 都對應一條正在進入視圖的彈幕,當計時器結束時,經過 NotificationCenter 發通知將該彈幕所在的行的狀態更改成 false。

由於彈幕存在暫停狀態,若是彈幕對應的 Timer 不一樣時暫停,將致使 彈幕所在行狀態 提早更改成 false。爲了解決這個問題,我參考他人的想法並改進後建立了 PauseableTimer,並在本項目中使用上了。個人另一篇博客更詳細地介紹了 [PauseableTimer]()。

爲了不手動發射彈幕和自動發射隊列中的彈幕出現衝突(彈幕重疊),全部彈幕經過 taskTimer 定時任務統一調度。

下一步 Next Step

如今流行的彈幕功能愈來愈複雜、高級,DanmuManager 只是完成了最基礎的滾動文字彈幕功能。將來可能會學習常見的彈幕,添加一些更高級的功能,好比 對滾動彈幕的操做,居中彈幕 等。

相關文章
相關標籤/搜索