當前位置:遊戲中心平台 - 遊戲盒子 - android在播放音樂時如何實現動態波形?

android在播放音樂時如何實現動態波形?

包裹?com。AudioFx

進口?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);

}

}

}

  • 上一篇:求壹部很老的外國動畫片的名字~
  • 下一篇:璜嬪晱QQ閬婃埐涓鐜夌殑榄斿崱鍚堟垚闇?瑕佸摢浜涙潗鏂欙紵
  • copyright 2024遊戲中心平台