前言
去年, 2016年, 一大波直播平臺(tái)在移動(dòng)端涌出, 直播慢慢步入了人們的視角. 網(wǎng)上如今能夠看到各式各樣的直播, 如秀場(chǎng)直播检激、游戲直播、體育直播齿穗、娛樂直播等等.
在各種類型的直播中, 彈幕在PC饺律、移動(dòng)端都幾乎成為了標(biāo)配, 今天在這里主要介紹一下個(gè)人開源的iOS彈幕, 以及提前為實(shí)現(xiàn)一款彈幕庫(kù)涉及的相關(guān)技術(shù)分享
的相關(guān)篇章占坑, 雖不細(xì)至于手把手教如何實(shí)現(xiàn), 但關(guān)鍵點(diǎn)都會(huì)有所涉及且不僅限于實(shí)現(xiàn)彈幕, 如iOS中用pthread實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型复濒、響應(yīng)正在執(zhí)行動(dòng)畫對(duì)象的點(diǎn)擊事件、實(shí)現(xiàn)某類對(duì)象復(fù)用的ReuseQueue畦木、使用GCD封裝實(shí)現(xiàn)可取消未執(zhí)行代碼塊的OperationQueue等等, 對(duì)這些更感興趣的朋友麻煩直接滑至最后一段.
歡迎各位大神指點(diǎn)一二.
廣告
統(tǒng)計(jì)了各渠道的一周瀏覽記錄, 以及github瀏覽次數(shù)砸泛、評(píng)論留言數(shù), 感覺彈幕估計(jì)是有點(diǎn)過(guò)時(shí)了..感興趣的朋友比較少, 所以彈幕相關(guān)技術(shù)分享打算暫時(shí)一緩. 準(zhǔn)備開源并分享一下可能更多人感興趣的序列幀動(dòng)畫引擎, Demo會(huì)通過(guò)分別Core Animation以及個(gè)人FXAnimationEngine來(lái)實(shí)現(xiàn)花椒禮物動(dòng)畫的效果(資源花椒ipa中提取), 比較內(nèi)存占用, 動(dòng)畫被系統(tǒng)打斷情況下的表現(xiàn), 圖片解碼相關(guān)知識(shí)等. 此外, 還會(huì)分享一下禮物資源熱更的方案.
Github
Talk is cheap, I'll show you the code.
請(qǐng)大力點(diǎn)擊上方超鏈接?????????? (git clone 9mb+)
若翻墻下載速度不佳, 可至百度網(wǎng)盤地址下載 1.0.2 Release版 (400kb+, 無(wú)git信息)
特性
- 除了UI操作, 其他操作都以代碼塊交給異步隊(duì)列處理了.(使用GCD提交的代碼塊, 最終會(huì)由XNU kernel根據(jù)CPU使用情況創(chuàng)建新的線程去執(zhí)行或分配給其他線程執(zhí)行)
- 遵循 生產(chǎn)者消費(fèi)者模式, 通過(guò)pthread去阻塞隊(duì)列而非使用timer或異步隊(duì)列開啟runloop空轉(zhuǎn)
- 定義了包含 彈幕塊點(diǎn)擊勾栗、將出現(xiàn)盏筐、已消失事件的delegate
- 提供 注冊(cè)復(fù)用 自定義彈幕塊 的方法
- 各種自定義參數(shù), 如彈幕塊移速, 彈幕庫(kù)插入方向(從上, 從下, 隨機(jī)), 彈幕庫(kù)移動(dòng)方向(左到右, 右到左), 重置彈道位移百分比系數(shù)(防前后彈幕塊碰撞)、彈幕隊(duì)列容量控制
- 簡(jiǎn)單易用, 控制方法就三個(gè) start(同時(shí)也是恢復(fù)), pause, stop. 另外大部分方法都是線程安全的
- 輕易適配設(shè)備方向旋轉(zhuǎn)
- 設(shè)置單行配置即可作為 跑馬燈楷拳、直播間公告 使用
預(yù)覽圖
示例
彈幕設(shè)置
// Configuration
FXDanmakuConfiguration *config = [FXDanmakuConfiguration defaultConfiguration];
config.rowHeight = [DemoDanmakuItem itemHeight];
config.dataQueueCapacity = 500;
config.itemMinVelocity = 80; // set random velocity between 80 and 120 pt/s
config.itemMaxVelocity = 120;
self.danmaku.configuration = config;
// Delegate
self.danmaku.delegate = self;
// Reuse
[self.danmaku registerNib:[UINib nibWithNibName:NSStringFromClass([DemoDanmakuItem class]) bundle:nil]
forItemReuseIdentifier:[DemoDanmakuItem reuseIdentifier]];
[self.danmaku registerClass:[DemoBulletinItem class]
forItemReuseIdentifier:[DemoBulletinItem reuseIdentifier]];
數(shù)據(jù)添加
// add data for danmaku view to present
DemoDanmakuItemData *data = [DemoDanmakuItemData data];
[self.danmaku addData:data];
// start running
if (!self.danmaku.isRunning) {
[self.danmaku start];
}
代理事件
- (void)danmaku:(FXDanmaku *)danmaku didClickItem:(FXDanmakuItem *)item withData:(DemoDanmakuItemData *)data {
// 此處 處理點(diǎn)擊
}
- (void)danmaku:(FXDanmaku *)danmaku willDisplayItem:(FXDanmakuItem *)item withData:(FXDanmakuItemData *)data {
// 此處 處理彈幕塊將要出現(xiàn)/展示
}
- (void)danmaku:(FXDanmaku *)danmaku didEndDisplayingItem:(FXDanmakuItem *)item withData:(FXDanmakuItemData *)data {
// 此處 處理彈幕塊完全離開視線,結(jié)束展示
}
更多詳情 麻煩參照 Gitbub Demo project FXDanmakuDemo.xcworkspace
.
有關(guān)彈幕庫(kù)使用問(wèn)題答疑
1. rowHeight她混、estimatedRowSpace and rowSpace 三者之間的關(guān)系
2. 如何使用nib創(chuàng)建自定義彈幕塊
3. 如何適配設(shè)備屏幕旋轉(zhuǎn)
如果你的彈幕View 在橫豎屏狀態(tài)下 高度不一樣, 比如豎屏高200pt, 橫屏約束卻是100pt, 那么需要在對(duì)應(yīng)的controller.m文件中加入以下代碼(否則 當(dāng)你的彈幕塊使用AutoLayout進(jìn)行布局時(shí), 橫豎屏切換后, 由于視圖的frame會(huì)變化多次坤按,導(dǎo)致正在展示的彈幕塊 出現(xiàn)布局約束沖突的報(bào)錯(cuò))
iOS8+
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[self.danmaku pause];
[self.danmaku cleanScreen];
[coordinator animateAlongsideTransition:nil
completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
// resume danmaku after orientation did change
[self.danmaku start];
}];
}
系統(tǒng)版本小于iOS8
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.danmaku pause];
[self.danmaku cleanScreen];
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[self.danmaku start];
}
安裝
Cocoapods(iOS7+)
- Podfile中 視情況對(duì)應(yīng)添加以下內(nèi)容
platform :ios, 'xxx' target 'xxx' do pod 'FXDanmaku' end
pod install
Manually(iOS7+)
直接拖動(dòng) FXDanmaku
文件夾 到你的項(xiàng)目 對(duì)應(yīng)結(jié)構(gòu)下
介紹結(jié)尾
歡迎各位 提出寶貴的issues, 更多功能建議, 或者改進(jìn)之處等等. 同時(shí)若各位想要了解彈幕庫(kù)具體實(shí)現(xiàn)的其他相關(guān)點(diǎn), 也可在評(píng)論區(qū)留言.
實(shí)現(xiàn)一款彈幕庫(kù)涉及的相關(guān)技術(shù)分享(占坑)
以下篇章還未開寫, 僅提前占坑..未完待續(xù)..
iOS中用pthread實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型
響應(yīng)正在執(zhí)行動(dòng)畫對(duì)象的點(diǎn)擊事件
實(shí)現(xiàn)某類對(duì)象復(fù)用的ReuseQueue
使用GCD封裝實(shí)現(xiàn)可取消未執(zhí)行代碼塊的OperationQueue