Android Studio 開發實踐——簡易版音遊APP(一)

 

FREE  ——簡易版音遊APP

 

一、APP介紹

通過識別本地曲庫,對音頻文件進行識別提取出時間點,來產生滑塊進行動態點擊的暢玩過程,享受音樂的律動美感。界面主要仿照節奏大師等音遊app,整體風格呈黑金色。(注:此app開發爲課程作業,部分圖片來自網圖非原創,未曾商用)

 

二、APP特點

1.多種模式選擇

常規設置:模式可選擇雙軌道或者四軌道;滑塊數量可以選滑塊較少或滑塊較多;滑塊速度可以選擇慢速、中速、快速。

高級設置(開發人員選項):通過調整樣本窗口大小、樣本窗口數量、閾值權重等參數來調整滑塊的數量。

2.支持本地所有MP3、WAV格式的音頻

         不同於曲庫人爲擺放滑塊的位置,本app滑塊位置是根據音頻自動生成的,暫時配置有MP3、WAV格式音頻文件的識別加載,能夠較大程度地支持本地音頻文件。

3.兼容不同分辨率的設備

         通過android開發特有的dp單位適應不同分辨率手機的開發環境,通過ppi屏幕分辨率密度進行px與dp單位之間的轉換,本APP能夠適應ldpi、mdpi、hdpi、xhdpi、xxhdpi等不同分辨率密度,適配更多機型。

 

三、項目難點

1.滑塊的滑動

         通過比較Transaction、ObjectAnimator、ValueAnimator等動畫效果,發現transaction只是表面移動,實際佈局位置未改變,無法識別移動的位置,而且有的無法設置動畫延遲時間,所以最後採用ObjectAnimatior爲滑塊滑動的主要部分。把滑塊設爲單獨的EachButton、LandEachButton類,來動態設置它的動畫起止位置,延遲時間等。這裏動畫延遲是結合音頻節奏點的時間,延遲到那個節奏點的時候滑塊動畫纔開始。

         滑塊的滑動主要用到的文件有Classes.EachButton、Classes.LandEachButton。

2.點擊效果

         這裏點擊時生成的best、good、miss字樣主要是通過自定義Toast的setView方法實現,通過得到點擊時該軌道列離得最近的滑塊的位置與按鈕位置之差d,得出best、good、miss指標的不同d的範圍來得出點擊評價,這裏miss字樣是在eachButton內部的onAnimationEnd()方法內部進行判別的。

         點擊效果主要用到的文件有toast.xml、toast_land.xml。

3.節奏點的識別

         節奏點的識別主要用到音頻採樣傅里葉變換(FFT的知識,音頻採樣得到時域信號,這個信號可以看成是多個正弦波疊加的結果,通過傅里葉變換得到一段信號(一個樣本窗口)裏的關鍵頻率,實現時域映射到頻域,並與周圍幾個樣本窗口的關鍵頻率求均值加權得到閾值,大於閾值的信號點就可以看做節奏的起點,然後這個信號點的位置比例乘以總時間即爲節奏點的時間,依此設置滑塊延時。

         實驗過程中先是找到了一個wav格式文件畫出波形圖的樣例,自己解讀實現了一下,然後找到了mp3轉化爲wav格式的方法,然後放到android裏面發現低於26的API不支持javax.sound等的包,於是又學習了mp3文件的格式,進行幀讀取,後來發現大部分mp3文件是壓縮過的,後來就仿照wav文件處理的代碼自己實現了一個mp3文件的識別(有些數據流結構對不上mp3的標準幀格式,所以只是大致識別)。

         節奏點識別主要用到的文件有WavHandle.WaveFileReader、Mp3Handle.Mp3FileReader、Classes.FFT 、Classes.HandleData。

4.兼容其他設備

         由於activity中滑塊位置的設置和獲取是以px爲單位的,所以需要轉化爲dp單位來兼容不同分辨率。通過得到設備的寬度getWindowManager().getDefaultDisplay().getWidth();對應不同的1dp=npx轉換,其中對應關係(width,n)(240,0.75)(320,1.0)(480,1.5)(720,2.0)(1080,3.0)

5.其他

         申請讀取內存的服務的實現。

通過MediaStore.Audio.Media.EXTERNAL_CONTENT_URI讀取本地曲庫,通過MediaStore.Audio.Media.DISPLAY_NAME等得到歌曲信息,通過RecycleView呈現歌單。其中用到的文件有Classes.Music、Classes.MusicAdapter。

         通過廣播、BaseActivity、ActivityCollector實現強行下線,避免重複打開活動。其中用到的文件有Classes.ActivityCollector、Classes.BaseActivity。

         強制橫屏的實現,通過layout_weight設置均分寬度居中。

 

四、APP界面

(注:此app開發爲課程作業,圖片來自網圖非原創,未曾商用)

1.Logo

 

2.首頁(MainActivity)

 

3.歌單頁面(MusicViewActivity)

 

4.基礎模式選擇(OriginChoiceActivity)

 

5.高級設置(ChoiceActivity)

 

6.雙軌道模式界面(GameActivity)

 

7.四軌道模型界面(FourGameActivity)

 

8.分數結果界面(ResultActivity)

 

 

六、改進空間

(時間限制,部分功能未曾實現)

1.暫停功能

2.連擊效果

3.歌曲搜索功能

4.排行榜

5.人工控制節奏點

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