Android 同步歌詞滾動 唱片手勢滑動 原理手記

剛纔誤刪了一次。。。還好有個打開的頁面沒關掉

先上效果圖


 

中間就是同步滾動歌詞的部分了 現在是最簡單的效果 當前播放字體是紅色 其餘部分爲白色

右側是一個類似Gallery效果的 可以上下拖動 選擇唱片 擬3D 效果目前感覺還行

 

記錄下2部分的實現原理

————————————

 

首先是歌詞同步,這個很大部分都是參考了YOYOPlayer這個開源的播放器 

http://www.blogjava.net/hadeslee/archive/2008/01/11/173489.html 作者的開發手機 非常詳細的關於歌詞滾動的代碼實現 Android上的實現基本也是一樣

 

主要包括3個類 Sentence Lyric 以及LyricView

Sentence是指單個歌詞對象 其中包括了歌詞的開始時間,結束時間,以及歌詞內容,方法包含檢索當前時間是否屬於該歌詞,歌詞的着色屬性等 其中有一個非常重要的方法 用於獲得偏移量

偏移量是什麼呢 就是一句歌詞在每次刷新的時候移動的距離 計算該距離的公式是:

(字體高度+空隙)*((當前時間-開始時間)*1.0 /(結束時間-開始時間))

即距離除以歌詞播放持續的時間佔的比例(乘1.0是保持浮點型)

 

Lyric類保有Sentence對象的集合 也就是一首歌的完整歌詞 擁有一個List<Sentence> 裏面根據播放時間順序將每句歌詞都排列好了(邊解析LRC文件邊排序) 也就是之後要做的簡單來說就是依次取出歌詞對象 顯示 Lyric同時定義瞭如何繪製自己  也就是drawLyc方法 

畫歌詞的思路是 在中心位置畫當前歌詞(根據當前播放時間獲得) 之後一次在上方畫前面的部分 下方畫後面的部分 當tmpY<0 表示畫不下了 則停止不畫 需要注意的是 這裏所說的中心位置 是指屏幕中心+偏移量 得到的當前歌詞繪製位置

 

LyricView就是要在佈局文件中使用的控件了 這個類非常簡單 只是繼承View 在onDraw中將畫筆和畫布傳給Lyric,調用其drawLyc方法來繪製自己

在代碼中使用LyricView 需要爲其設定Lyric 也就是畫的歌詞集合 以及 當前音樂播放的時間

 

————————————

 

接下來是右側的滑動唱片

現在實現的方式將座標都寫死了 擴展移植性很差 應該需要再抽離出一層接口會更好 這裏只是記錄下思路

在當前畫面上顯示的是9張圖片 比如叫做ABCDEFGHI 這裏先繪製最後的兩張圖片A I 設置最高的透明度 尺寸 然後繪製B H。。依次類推 這樣就有了一個擬3D效果

那麼如何讓他滾起來呢 我們將視線放到單獨的張圖片上 比如這裏的中心圖片E E到F的過程是一個線性移動的過程 也就是說只是簡單的x+ y+ width,height- alpha-的過程 同樣這樣的模式可以應用到每一個圖片上 比如這裏我們設定中間過程有4幀 當第4幀時 E就到了F的位置 而D到了E的位置 此時就恢復到了初始的狀態 只是每個位置上的圖片變了下 變成了ZABCDEFGH 知道了這樣的過程 就可以進行進一步操作了

 

根據剛纔總結到的 定義了一個類似結構體的東西 其中分別是posX posY橫縱座標點alpha透明度以及width height值 比如叫做PosAlphaSize類

 

之後定義的是我們的自定義View控件 當然他自身會保有一個需要在界面上顯示的圖片List(只是顯示的9張) 然後onDraw方法中 根據PosAlphaSize中的參數 將9張圖片分別繪製在相應的位置 (先畫2側 再繪製中心圖片)

 

在主界面中,有一個所有封面圖片的集合 需要顯示的圖片就在是這個圖片集合中的一個子序列 有一個當前幀的計數器(0-4) 還有一個當前顯示圖片序列的下標index 以確定哪些圖片被顯示 然後將這個圖片子序列傳入到自定義的View中 讓其自身invalidate繪製 每一幀的具體位置都被定義了 即每幀每張圖片的座標(一個類似2維的數組,只需根據這個座標進行繪製就好了) 當然這也是做得不好的地方 正是因爲座標寫死了 導致移植性很差 不過目前先實現效果

 

最後  給這個View添加上手勢動作 onTouch Gesture等等 繪製下一幀的代碼主要寫在onScroll和onFling方法中。

 

——————————————

總結的比較亂 只是介紹下實現的原理 代碼寫得很是亂 還需要再進行優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章