進口?Android . app . activity;
進口?Android . content . context;
進口?Android . graphics . canvas;
進口?Android . graphics . color;
進口?Android . graphics . paint;
進口?Android . graphics . rect;
進口?Android . media . audio manager;
進口?Android . media . media player;
進口?android.media.audiofx .均衡器;
進口?Android . media . audio FX . visualizer;
進口?Android . OS . bundle;
進口?Android . util . log;
進口?Android . view . gravity;
進口?Android . view . view;
進口?Android . view . view group;
進口?Android . view . window manager;
進口?Android . widget . linear layout;
進口?Android . widget . seek bar;
進口?Android . widget . textview;
公共?班級?AudioFxActivity?延伸?活動
{
私人?靜電?決賽?字符串?標簽?=?”AudioFxActivity”;
私人?靜電?決賽?浮動?VISUALIZER_HEIGHT_DIP?=?160 f;
私人?MediaPlayer?多媒體播放器;
私人?可視化工具?mVisualizer
私人?均衡器?mEqualizer
私人?LinearLayout?mLinearLayout
私人?VisualizerView?mVisualizerView
私人?TextView?mStatusTextView
私人?TextView?mInfoView
@覆蓋
公共?作廢?onCreate(捆綁?冰柱)
{
super . oncreate(icicle);
mStatusTextView?=?新的?TextView(這個);
mLinearLayout?=?新的?LinearLayout(這個);
mlinearlayout . set orientation(linear layout。垂直);
mlinearlayout . add view(mStatusTextView);
setContentView(mLinearLayout);
//?創造?那個?媒體播放器
多媒體播放器?=?MediaPlayer.create(this,?r . raw . my _ life);
Log.d(標簽,
“MediaPlayer?音頻?會話?ID:?"
+?mmediaplayer . getaudiosessionid());
setup visualizerfxandui();
setupequilizerfxandui();
//?制造?確定嗎?那個?可視化工具?是嗎?啟用?只有?什麽時候?妳呢。真的嗎?想要嗎?到
//?接收?數據,?和
//?什麽時候?它?制造?感覺?去哪?接收?數據。
mvisualizer . set enabled(true);
//?什麽時候?那個?溪流?結束嗎?我們?不要?需要?去哪?收藏?有嗎?更多?數據。?我們
//?不要?做什麽?這個?在
//?setupVisualizerFxAndUI?因為?我們?可能嗎?想要嗎?去哪?有嗎?更多,
//?非可視化者?相關?密碼
//?在?這個?回電。
mmediaplayer . setoncompletionlistener(新?媒體播放器。OnCompletionListener()
{
公共?作廢?onCompletion(MediaPlayer?媒體播放器)
{
mvisualizer . set enabled(false);
getWindow()。clearFlags(WindowManager。layout params . FLAG _ KEEP _ SCREEN _ ON);
setVolumeControlStream(audio manager。STREAM _ SYSTEM);
MStatusTextView.setText("音樂完成");
}
});
getWindow()。addFlags(WindowManager。layout params . FLAG _ KEEP _ SCREEN _ ON);
setVolumeControlStream(audio manager。STREAM _ MUSIC);
mmediaplayer . start();
MStatusTextView.setText("播放音樂...");
}
私人?作廢?setupEqualizerFxAndUI()
{
//?創造?那個?均衡器?對象?(安?音效?子類)?然後呢。附上?它
//?去哪?我們的?媒體?玩家,
//?用什麽?答?違約?優先?(0).
mEqualizer?=?新的?均衡器(0,?mmediaplayer . getaudiosessionid());
me qualizer . set enabled(true);
TextView?eqTextView?=?新的?TextView(這個);
EqTextView.setText("均衡器:");
mlinearlayout . addview(eqTextView);
矮?樂隊?=?me qualizer . getnumberofbands();
決賽?矮?minEQLevel?=?me qualizer . getbandlevelrange()[0];
決賽?矮?maxEQLevel?=?me qualizer . getbandlevelrange()[1];
為了什麽?(短?我?=?0;?我?& lt?樂隊;?i++)
{
決賽?矮?樂隊?=?我;
TextView?freqTextView?=?新的?TextView(這個);
freqTextView.setLayoutParams(新?視圖組。布局參數(
視圖組。LayoutParams.FILL_PARENT,
視圖組。layout params . WRAP _ CONTENT));
freqtextview . set Gravity(Gravity。居中_水平);
freqtextview . settext((me qualifier . getcenterfreq(band)?/?1000)
+?"?Hz”);
mlinearlayout . add view(freqTextView);
LinearLayout?劃?=?新的?LinearLayout(這個);
row . set orientation(linear layout。橫向);
TextView?minDbTextView?=?新的?TextView(這個);
minDbTextView.setLayoutParams(新?視圖組。布局參數(
視圖組。LayoutParams.WRAP_CONTENT,
視圖組。layout params . WRAP _ CONTENT));
mindbtextview . settext((minEQLevel?/?100)?+?"?dB”);
TextView?maxDbTextView?=?新的?TextView(這個);
maxDbTextView.setLayoutParams(新?視圖組。布局參數(
視圖組。LayoutParams.WRAP_CONTENT,
視圖組。layout params . WRAP _ CONTENT));
maxdbtextview . settext((maxEQLevel?/?100)?+?"?dB”);
線性布局。LayoutParams?layoutParams?=?新的?線性布局。布局參數(
視圖組。LayoutParams.FILL_PARENT,
視圖組。layout params . WRAP _ CONTENT);
布局參數。重量?=?1;
SeekBar?酒吧?=?新的?SeekBar(這個);
bar . setlayoutparams(layout params);
bar.setMax(maxEQLevel?-?minEQLevel);
bar . set progress(me qualizer . get band level(band));
bar.setOnSeekBarChangeListener(新?SeekBar。OnSeekBarChangeListener()
{
公共?作廢?onProgressChanged(SeekBar?seekBar?int?進步,
布爾?fromUser)
{
mEqualizer.setBandLevel(band,?(短)?(進步?+?minEQLevel));
}
公共?作廢?onStartTrackingTouch(參見kBar?seekBar)
{
}
公共?作廢?onStopTrackingTouch(SeekBar?seekBar)
{
}
});
row . add view(minDbTextView);
row . add view(bar);
row . addview(maxDbTextView);
mlinearlayout . add view(row);
}
}
私人?作廢?setupVisualizerFxAndUI()
{
mVisualizerView?=?新的?visualizer view(this);
mvisualizerview . setlayoutparams(新?視圖組。布局參數(
視圖組。LayoutParams.FILL_PARENT,
(int)?(VISUALIZER_HEIGHT_DIP?*?getResources()
。getDisplayMetrics()。密度)));
mlinearlayout . add view(mVisualizerView);
mInfoView?=?新的?TextView(這個);
字符串?infoStr?=?"";
int[]?csr?=?visualizer . getcapturesizerange();
如果(csr?!=?空)
{
字符串?csrStr?=?" CaptureSizeRange:";
for(int?我?=?0;?我?& lt?csr .長度;?我?++)
{
csrStr?+=?CSR[I];
csrStr?+="?";
}
infoStr?+=?csrStr
}
決賽?int?maxCR?=?visualizer . getmaxcapturerate();
infoStr?=?infoStr?+?" nMaxCaptureRate:?"?+?maxCR
minfoview . settext(infoStr);
mlinearlayout . add view(mInfoView);
mVisualizer?=?新的?可視化工具(mmediaplayer . getaudiosessionid());
mvisualizer . setcapturesize(256);
mvisualizer . setdatacapturelistener(
新的?可視化工具。OnDataCaptureListener()
{
公共?作廢?onWaveFormDataCapture(可視化工具?可視化工具,
byte[]?字節,?int?采樣率)
{
mvisualizerview . update visualizer(字節);
}
公共?作廢?onFftDataCapture(可視化工具?可視化工具,
byte[]?fft,?int?采樣率)
{
mvisualizerview . update visualizer(FFT);
}
},?maxCR?/?2,?假的,?真);
}
@覆蓋
受保護?作廢?onPause()
{
super . on pause();
如果?(isFinishing()?& amp& amp?多媒體播放器?!=?空)
{
mvisualizer . release();
me qualizer . release();
mmediaplayer . release();
多媒體播放器?=?null
}
}
/**
?*?答?簡單?班級?那個?平局?波形?數據?收到?從哪裏?a
?*?{@link?可視化工具。ondatapturelistener # onWaveFormDataCapture?}
?*/
班級?VisualizerView?延伸?視角
{
私人?byte[]?兆字節;
私人?float[]?mPoints
私人?Rect?mRect?=?新的?rect();
私人?油漆?mForePaint?=?新的?paint();
私人?int?mSpectrumNum?=?48;
私人?布爾?mFirst?=?真實;
公共?VisualizerView(上下文?上下文)
{
超級(上下文);
init();
}
私人?作廢?初始化()
{
兆字節?=?null
mfore paint . setstrokewidth(8f);
mfore paint . setantialias(true);
mfore paint . set color(color . RGB(0,?128,?255));
}
公共?作廢?updateVisualizer(byte[]?fft)
{
if(mFirst?)
{
minfoview . settext(minfoview . gettext()。toString()?+?" \ n捕獲大小:"?+?FFT . length);
mFirst?=?假的;
}
byte[]?模特?=?新的?byte[fft.length?/?2?+?1];
型號[0]?=?(字節)?math . ABS(FFT[0]);
為了什麽?(int?我?=?2,?j?=?1;?j?& lt?光譜圖;)
{
型號[j]?=?(字節)?Math.hypot(fft[i],?fft【我?+?1]);
我?+=?2;
j++;
}
兆字節?=?模型;
invalidate();
}
@覆蓋
受保護?作廢?onDraw(畫布?畫布)
{
super.onDraw(畫布);
如果?(兆字節?==?空)
{
返回;
}
如果?(mPoints?==?null?||?mPoints.length?& lt?兆字節。長度?*?4)
{
mPoints?=?新的?float[mBytes.length?*?4];
}
mRect.set(0,0,?getWidth(),?getHeight());
//繪制波形
//?為了什麽?(int?我?=?0;?我?& lt?兆字節。長度?-?1;?i++)?{
//?mPoints[i?*?4]?=?mRect.width()?*?我?/?(兆字節.長度?-?1);
//?mPoints[i?*?4?+?1]?=?mRect.height()?/?2
//?+?((字節)?(mBytes[i]?+?128))?*?(mRect.height()?/?2)?/?128;
//?mPoints[i?*?4?+?2]?=?mRect.width()?*?(我?+?1)?/?(兆字節.長度?-?1);
//?mPoints[i?*?4?+?3]?=?mRect.height()?/?2
//?+?((字節)?(mBytes[i?+?1]?+?128))?*?(mRect.height()?/?2)?/?128;
//?}
//繪制頻譜
決賽?int?baseX?=?mrect . width()/mSpectrumNum;
決賽?int?身高?=?mrect . height();
為了什麽?(int?我?=?0;?我?& lt?mSpectrumNum?;?i++)
{
如果?(mBytes[i]?& lt?0)
{
兆字節[i]?=?127;
}
決賽?int?xi?=?baseX*i?+?baseX/2;
mPoints[i?*?4]?=?Xi;
mPoints[i?*?4?+?1]?=?身高;
mPoints[i?*?4?+?2]?=?Xi;
mPoints[i?*?4?+?3]?=?身高?-?兆字節[I];
}
canvas.drawLines(mPoints,?mfore paint);
}
}
}