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.人工控制节奏点