摘要:本文將介紹筆者仿寫(xiě)QQ音樂(lè)播放器的主體思路.筆者在該項(xiàng)目中實(shí)現(xiàn)的主要功能有:橫豎屏適配,本地音頻播放,lrc類型歌詞解析.展示及播放時(shí)變色處理,上下曲切換,后臺(tái)運(yùn)行模式設(shè)置,鎖屏視圖設(shè)置,播放打斷處理等基本功能.接下來(lái),也將在以上幾個(gè)板塊中選擇一些音頻開(kāi)發(fā)中實(shí)用性強(qiáng)的功能做簡(jiǎn)要介紹.
一.播放功能的效果展示
二.本地音頻播放的主體實(shí)現(xiàn)思路(思維導(dǎo)圖展示)
三.歌詞解析及展示
? ? ? 筆者用到的歌詞文件類型為lrc(github上托管的項(xiàng)目中sources文件下,github托管地址:https://github.com/moonCai/SimpleMusicPlayer),將每句歌詞作為一個(gè)模型(CYLyricModel),并將整首歌的歌詞解析為模型數(shù)組.
? ? ? ? 第一張效果圖和第二張效果圖中每一句歌詞的展示控件都是label,為了實(shí)現(xiàn)歌詞的變色效果,自定義了UIColorLabel這個(gè)類,繼承自UILabel.它的實(shí)現(xiàn)原理非常簡(jiǎn)單:設(shè)置一個(gè)progress屬性,根據(jù)progress的值來(lái)設(shè)定填充區(qū)域.設(shè)定一個(gè)填充色(即當(dāng)前正播放的歌詞中已經(jīng)播放過(guò)的部分的顏色),在指定的填充區(qū)域采用混合模式渲染.并在progress的setter方法中進(jìn)行重繪,就能達(dá)到動(dòng)態(tài)渲染的效果.代碼如下:
- (void)drawRect:(CGRect)rect {
? ? [super drawRect:rect];
? ? ?//設(shè)置填充色
? ? ?[[UIColor colorWithRed:45/255.0 green:185/255.0 blue:105/255.0 alpha:1.0] setFill];
? ? ?//設(shè)置填充區(qū)域
? ? ?rect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width * self.progress, rect.size.height);
? ? ?//渲染,在填充區(qū)域使用混個(gè)模式進(jìn)行填充
? ? ?UIRectFillUsingBlendMode(rect, kCGBlendModeSourceIn);
}
-(void)setProgress:(CGFloat)progress {
? ? ? _progress = progress;
? ? ?[self setNeedsDisplay];
}
? ? ? ? 第二張效果圖的歌詞展示控件是UIScrollView,展示每一句歌詞的label也是UIColorLabel.根據(jù)當(dāng)前播放歌詞的索引來(lái)動(dòng)態(tài)改變contentOffset,以實(shí)現(xiàn)播放中不斷滾動(dòng)的效果.
四.后臺(tái)運(yùn)行模式
? ? ? 僅僅打開(kāi)后臺(tái)運(yùn)行模式的話,在真機(jī)上進(jìn)行后臺(tái)播放時(shí),只會(huì)持續(xù)幾秒鐘就會(huì)掛起,如果想要持續(xù)在后臺(tái)運(yùn)行模式下播放,還需要在音頻管理單例的初始化方法中開(kāi)啟音頻會(huì)話,代碼如下:
? ? ? ? AVAudioSession *session = [AVAudioSession sharedInstance];
? ? ? ? [session setCategory:AVAudioSessionCategoryPlayback error:nil];
五.設(shè)置鎖屏視圖
? ? ? ? 如果手機(jī)鎖屏了,音頻還在進(jìn)行播放.再次點(diǎn)開(kāi)屏幕時(shí)的視圖即為鎖屏視圖.以上代碼為筆者在項(xiàng)目中的實(shí)現(xiàn)代碼.在設(shè)置封面圖片時(shí),為了能顯示歌詞,采取了繪制的方式(項(xiàng)目中的方法名:drawImageWithArtWorkAndLyric):先繪制指定大小的封面圖片,再在指定rect下繪制歌詞文字.如果鎖屏視圖中沒(méi)有顯示歌詞的需求,可采用以下方式設(shè)置封面圖片:
MPMediaItemArtwork *artWork = [[MPMediaItemArtwork alloc] initWithImage:[UIImage imageNamed:music.image]];
六.應(yīng)用開(kāi)啟遠(yuǎn)程控制,實(shí)現(xiàn)播放/暫停及自動(dòng)切歌,音頻打斷的處理
? ? ? 以上為筆者仿寫(xiě)QQ音樂(lè)播放器的主體思路,項(xiàng)目在github上的開(kāi)源地址:github.com/moonCai/SimpleMusicPlayer.歡迎交流探討.