package com.example.mediaplayertest;import java.util.ArrayList;import java.util.List;import android.annotation.SuppressLint;import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.Paint.Style;import android.media.AudioManager;import android.media.MediaPlayer;import android.media.audiofx.BassBoost;import android.media.audiofx.Equalizer;import android.media.audiofx.PresetReverb;import android.media.audiofx.Visualizer;import android.os.Bundle;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemSelectedListener;import android.widget.ArrayAdapter;import android.widget.LinearLayout;import android.widget.SeekBar;import android.widget.Spinner;import android.widget.TextView;public class MediaPlayerTest extends Activity {private LinearLayout layout;private MediaPlayer mPlayer;//定义系统的示波器private Visualizer mVisualizer;//定义系统的均衡器private Equalizer mEqualizer;//定义系统的重低音控制器private BassBoost mBass;//定义系统的预设音场控制器private PresetReverb mPresetReverb;private List reverbNames = new ArrayList();private List reverbVals = new ArrayList();private TextView mInfoView;@SuppressLint("NewApi")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设定控制音乐声音setVolumeControlStream(AudioManager.STREAM_MUSIC);layout = new LinearLayout(this);layout.setOrientation(LinearLayout.VERTICAL);setContentView(layout);//创建mediaplayer对像mPlayer = MediaPlayer.create(this, R.raw.meihuasannong);//衩始化示波器setupVisualizer();mVisualizer.setEnabled(true);//初始化均衡控制器setupEqualizer();//初始化重低音控制器setupBassBoost();//初始化预设音场控制器setupPresetReverb();//开始播放音乐mPlayer.start();}//音场控制器@SuppressLint("NewApi")private void setupPresetReverb() {//以MediaPlayer的AudioSessionId创建PresetReverb//相当于设置PresetReverb负责控制该MediaPlayermPresetReverb = new PresetReverb(0, mPlayer.getAudioSessionId());mPresetReverb.setEnabled(true);//设置启用音场控制器TextView prTitle = new TextView(this);prTitle.setText("音场");layout.addView(prTitle);//获取系统支持的所有预设音场for (short i = 0; i < mEqualizer.getNumberOfPresets(); i++) {reverbNames.add(i);reverbVals.add(mEqualizer.getPresetName(i));}//使用Spinner作为音场选择器Spinner sp = new Spinner(this);sp.setAdapter(new ArrayAdapter(MediaPlayerTest.this,android.R.layout.simple_spinner_item, reverbVals));sp.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view,int position, long id) {//设置所选的音场mPresetReverb.setPreset(reverbNames.get(position));}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});layout.addView(sp);}@SuppressLint("NewApi")@Overrideprotected void onPause() {super.onPause();if(isFinishing() && mPlayer != null){mVisualizer.release();mEqualizer.release();mPresetReverb.release();mBass.release();mPlayer.release();mPlayer = null;}}//重低音控制器@SuppressLint("NewApi")private void setupBassBoost() {//以MediaPlayer的AudioSessionId创建BassBoost//相当于设置BassBoost负责控制该mediaplayermBass = new BassBoost(0, mPlayer.getAudioSessionId());mBass.setEnabled(true);//设置启用重低音效果TextView bbText = new TextView(this);bbText.setText("重低音:");layout.addView(bbText);//使用seekbar作为重低音的调整工具SeekBar bar = new SeekBar(this);//设置进度条的范围为0~1000bar.setMax(1000);bar.setProgress(0);bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {//设置重低音的强度mBass.setStrength((short) progress);}});layout.addView(bar);}//均衡控制器@SuppressLint("NewApi")private void setupEqualizer() {//以MediaPlayer的AudioSessionId创建均衡器mEqualizer = new Equalizer(0, mPlayer.getAudioSessionId());//设置启用均衡器mEqualizer.setEnabled(true);TextView eqTitle = new TextView(this);eqTitle.setText("均衡器:");layout.addView(eqTitle);//获取均衡器的最大值和最小值final short minEQLevel = mEqualizer.getBandLevelRange()[0];short maxEQLevel = mEqualizer.getBandLevelRange()[1];//获取均衡器所支持的所有频率short brands = mEqualizer.getNumberOfBands();for (short i = 0; i < brands; i++) {//创建一个TextView,用于显示频率TextView eqTextView = new TextView(this);eqTextView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT));eqTextView.setGravity(Gravity.CENTER_HORIZONTAL);//设置该均衡控制器的频率eqTextView.setText(mEqualizer.getCenterFreq(i) / 1000 + "Hz");layout.addView(eqTextView);//创建一个LinearLayout,水平排列组件LinearLayout tmpLayout = new LinearLayout(this);tmpLayout.setOrientation(LinearLayout.HORIZONTAL);//显示均衡器最小值的textviewTextView minDbTextView = new TextView(this);minDbTextView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));minDbTextView.setText((minEQLevel / 100) + "dB");//显示均衡器最大值的textviewTextView maxDbTextView = new TextView(this);maxDbTextView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));maxDbTextView.setText((maxEQLevel / 100) + "dB");LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);layoutParams.weight = 1;//定义seekbar作为调整工具SeekBar bar = new SeekBar(this);bar.setLayoutParams(layoutParams);bar.setMax(maxEQLevel - minEQLevel);bar.setProgress(mEqualizer.getBandLevel(i));final short brand = i;bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {//设置该频率的均衡值mEqualizer.setBandLevel(brand,(short) (progress + minEQLevel));}});tmpLayout.addView(minDbTextView);tmpLayout.addView(bar);tmpLayout.addView(maxDbTextView);layout.addView(tmpLayout);}}@SuppressLint("NewApi")private void setupVisualizer() {//创建MyVisualizerView组件,用于显示波形图final MyVisualizerView mVisualizerView = new MyVisualizerView(this);mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,(int) (160f * getResources().getDisplayMetrics().density)));//将组件添加到layout容器中layout.addView(mVisualizerView); mInfoView = new TextView(this);          String infoStr = "";                    int[] csr = Visualizer.getCaptureSizeRange();          if(csr != null)          {              String csrStr = "CaptureSizeRange: ";              for(int i = 0; i < csr.length; i ++)              {                  csrStr += csr[i];                  csrStr +=" ";              }              infoStr += csrStr;          }                    final int maxCR = Visualizer.getMaxCaptureRate();                    infoStr = infoStr + "\nMaxCaptureRate: " + maxCR;                    mInfoView.setText(infoStr);          layout.addView(mInfoView);  //以MediaPlayer的AudioSessionId创建Visualizer对像//相当于设置Visualizer负责显示该MediaPlayer的音频数据mVisualizer = new Visualizer(mPlayer.getAudioSessionId());mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {@Overridepublic void onWaveFormDataCapture(Visualizer visualizer,byte[] waveform, int samplingRate) {mVisualizerView.updateVisualizer(waveform);}@Overridepublic void onFftDataCapture(Visualizer visualizer,byte[] fft, int samplingRate) {mVisualizerView.updateVisualizer(fft);}}, Visualizer.getMaxCaptureRate() / 2, true, false);} class MyVisualizerView extends View {private byte[] bytes;private float[] points;private Paint paint = new Paint();private Rect rect = new Rect();private byte type = 0;private boolean mFirst = true; public MyVisualizerView(Context context) {super(context);bytes = null;paint.setStrokeWidth(1f);paint.setAntiAlias(true);paint.setColor(Color.GREEN);paint.setStyle(Style.FILL);}public void updateVisualizer(byte[] fft) {if(mFirst )          {              mInfoView.setText(mInfoView.getText().toString() + "\nCaptureSize: " + fft.length);              mFirst = false;          } bytes = fft;        invalidate();}@Overridepublic boolean onTouchEvent(MotionEvent event) {if(event.getAction() != MotionEvent.ACTION_DOWN){return false;}type ++;if(type >= 3){type = 0;}return true;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if(bytes == null){return;}canvas.drawColor(Color.WHITE);System.out.println("height-->"+getHeight());rect.set(0, 0, getWidth(), getHeight());switch(type){case 0:for(int i = 0;i < bytes.length - 1;i ++){float left = getWidth() * i / (bytes.length - 1);float top = rect.height() - (byte)(bytes[i + 1] + 128) * rect .height() / 128;float right = left + 1;float bottom = rect.height();canvas.drawRect(left, top, right, bottom, paint);}break;case 1:for(int i = 0;i < bytes.length - 1;i += 18){float left = getWidth() * i / (bytes.length - 1);float top = rect.height() - (byte)(bytes[i + 1] + 128) * rect .height() / 128;float right = left + 6;float bottom = rect.height();canvas.drawRect(left, top, right, bottom, paint);}break;case 2:if(points == null || points.length < bytes.length * 4){points = new float[bytes.length * 4];}for(int i = 0;i < bytes.length - 1;i ++){points[i * 4] = rect.width() * i / (bytes.length -1);points[i * 4 + 1] = (rect.height() / 2) + ((byte) (bytes[i]+ 128)) * 128 / (rect.height() / 2 );points[i * 4 + 2] = rect.width() * (i + 1) / (bytes.length - 1);points[i * 4 + 3] = (rect.height() / 2) + ((byte) (bytes[i + 1] + 128)) * 128 /(rect.height()/ 2); }canvas.drawLines(points, paint);break;/*case 2://bytes = null;  paint.setStrokeWidth(8f);              paint.setAntiAlias(true);              paint.setColor(Color.rgb(0, 128, 255));          byte[] model = new byte[bytes.length / 2 + 1];          model[0] = (byte) Math.abs(bytes[0]);          for (int i = 2, j = 1; j < 48;)          {              model[j] = (byte) Math.hypot(bytes[i], bytes[i + 1]);              i += 2;              j++;          }          bytes = model; if(points == null || points.length < bytes.length * 4){points = new float[bytes.length * 4];}rect.set(0, 0, getWidth(),(int) (160f * getResources().getDisplayMetrics().density));final int baseX = rect.width()/48;              final int height = rect.height();             System.out.println("height===>"+height);for (int i = 0; i < 48 ; i++)              {                  if (bytes[i] < 0)                  {                      bytes[i] = 127;                  }                                    final int xi = baseX*i + baseX/2;                                    points[i * 4] = xi;                  points[i * 4 + 1] = height;                                    points[i * 4 + 2] = xi;                  points[i * 4 + 3] = height - bytes[i];              }  canvas.drawLines(points, paint);break;*/}}}}

需要下载请到这个地址:

点击打开链接

更多相关文章

  1. Android 自定义时间选择器
  2. Android 中自定义控件和属性(attr.xml,declare-styleable,TypedA
  3. Android React Native自定义组件的流程
  4. 移动应用开发:如何创建自定义Android代码模板
  5. 自定义View之入门(一)
  6. Android 自定义控件
  7. Android 自定义View(一)原理

随机推荐

  1. Android实践:如何高效加载Bitmap
  2. Android开发——实现Android简易计算器
  3. Android(安卓)通过读取本地Arp表获取当前
  4. android 权限问题分析
  5. android Camera2 API使用详解
  6. android学习日记04-.9工具的使用
  7. Android(安卓)重要的组件
  8. Android保活
  9. android studio之build.gradle写法简介
  10. Android中获取手机屏幕各部分的尺寸