package com.terry.AudioFx;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.media.AudioManager;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.media.audiofx.Equalizer;import android.media.audiofx.Visualizer;import android.media.audiofx.Visualizer.OnDataCaptureListener;import android.os.Bundle;import android.util.Log;import android.view.Gravity;import android.view.View;import android.view.ViewGroup;import android.widget.LinearLayout;import android.widget.SeekBar;import android.widget.TextView;import android.widget.SeekBar.OnSeekBarChangeListener;public class AudioFxActivity extends Activity {    private static final String TAG = "AudioFxActivity";    private static final float VISUALIZER_HEIGHT_DIP = 50f;    private MediaPlayer mMediaPlayer;    private Visualizer mVisualizer;    private Equalizer mEqualizer; // 均衡器    private LinearLayout mLayout;    VisualizerView mVisualizerView;    private TextView mStatusTextView;    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setVolumeControlStream(AudioManager.STREAM_MUSIC);        mStatusTextView = new TextView(this);        mLayout = new LinearLayout(this);        mLayout.setOrientation(LinearLayout.VERTICAL);        mLayout.addView(mStatusTextView);        setContentView(mLayout);        mMediaPlayer = MediaPlayer.create(this, R.raw.z8806c);        setupVisualizerFxAndUi();        setupEqualizeFxAndUi();        mVisualizer.setEnabled(true);        mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {            @Override            public void onCompletion(MediaPlayer mp) {                // TODO Auto-generated method stub                mVisualizer.setEnabled(false);            }        });        mMediaPlayer.start();        mStatusTextView.setText("播放中。。。");    }    /**     * 通过mMediaPlayer返回的AudioSessionId创建一个优先级为0均衡器对象 并且通过频谱生成相应的UI和对应的事件     */    private void setupEqualizeFxAndUi() {        mEqualizer = new Equalizer(0, mMediaPlayer.getAudioSessionId());        mEqualizer.setEnabled(true);// 启用均衡器        TextView eqTextView = new TextView(this);        eqTextView.setText("均衡器:");        mLayout.addView(eqTextView);        // 通过均衡器得到其支持的频谱引擎        short bands = mEqualizer.getNumberOfBands();        // getBandLevelRange 是一个数组,返回一组频谱等级数组,        // 第一个下标为最低的限度范围        // 第二个下标为最大的上限,依次取出        final short minEqualizer = mEqualizer.getBandLevelRange()[0];        final short maxEqualizer = mEqualizer.getBandLevelRange()[1];        for (short i = 0; i < bands; i++) {            final short band = i;            TextView freqTextView = new TextView(this);            freqTextView.setLayoutParams(new ViewGroup.LayoutParams(                    ViewGroup.LayoutParams.FILL_PARENT,                    ViewGroup.LayoutParams.WRAP_CONTENT));            freqTextView.setGravity(Gravity.CENTER_HORIZONTAL);            // 取出中心频率            freqTextView                    .setText((mEqualizer.getCenterFreq(band) / 1000) + "HZ");            mLayout.addView(freqTextView);            LinearLayout row = new LinearLayout(this);            row.setOrientation(LinearLayout.HORIZONTAL);            TextView minDbTextView = new TextView(this);            minDbTextView.setLayoutParams(new ViewGroup.LayoutParams(                    ViewGroup.LayoutParams.WRAP_CONTENT,                    ViewGroup.LayoutParams.WRAP_CONTENT));            minDbTextView.setText((minEqualizer / 100) + " dB");            TextView maxDbTextView = new TextView(this);            maxDbTextView.setLayoutParams(new ViewGroup.LayoutParams(                    ViewGroup.LayoutParams.WRAP_CONTENT,                    ViewGroup.LayoutParams.WRAP_CONTENT));            maxDbTextView.setText((maxEqualizer / 100) + " dB");            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(                    ViewGroup.LayoutParams.FILL_PARENT,                    ViewGroup.LayoutParams.WRAP_CONTENT);            layoutParams.weight = 1;            SeekBar seekbar = new SeekBar(this);            seekbar.setLayoutParams(layoutParams);            seekbar.setMax(maxEqualizer - minEqualizer);            seekbar.setProgress(mEqualizer.getBandLevel(band));            seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {                @Override                public void onStopTrackingTouch(SeekBar seekBar) {                }                @Override                public void onStartTrackingTouch(SeekBar seekBar) {                }                @Override                public void onProgressChanged(SeekBar seekBar, int progress,                        boolean fromUser) {                    // TODO Auto-generated method stub                    mEqualizer.setBandLevel(band,                            (short) (progress + minEqualizer));                }            });            row.addView(minDbTextView);            row.addView(seekbar);            row.addView(maxDbTextView);            mLayout.addView(row);        }    }    /**     * 生成一个VisualizerView对象,使音频频谱的波段能够反映到 VisualizerView上     */    private void setupVisualizerFxAndUi() {        mVisualizerView = new VisualizerView(this);        mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(                ViewGroup.LayoutParams.FILL_PARENT,                (int) (VISUALIZER_HEIGHT_DIP * getResources()                        .getDisplayMetrics().density)));        mLayout.addView(mVisualizerView);        mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId());        // 参数内必须是2的位数        mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);        // 设置允许波形表示,并且捕获它        mVisualizer.setDataCaptureListener(new OnDataCaptureListener() {            @Override            public void onWaveFormDataCapture(Visualizer visualizer,                    byte[] waveform, int samplingRate) {                // TODO Auto-generated method stub                mVisualizerView.updateVisualizer(waveform);            }            @Override            public void onFftDataCapture(Visualizer visualizer, byte[] fft,                    int samplingRate) {                // TODO Auto-generated method stub            }        }, Visualizer.getMaxCaptureRate() / 2, true, false);    }    @Override    protected void onPause() {        // TODO Auto-generated method stub        super.onPause();        if (isFinishing() && mMediaPlayer != null) {            mVisualizer.release();            mMediaPlayer.release();            mEqualizer.release();            mMediaPlayer = null;        }    }    class VisualizerView extends View {        private byte[] mBytes;        private float[] mPoints;        // 矩形区域        private Rect mRect = new Rect();        // 画笔        private Paint mPaint = new Paint();        // 初始化画笔        private void init() {            mBytes = null;            mPaint.setStrokeWidth(1f);            mPaint.setAntiAlias(true);            mPaint.setColor(Color.BLUE);        }        public VisualizerView(Context context) {            super(context);            init();        }        public void updateVisualizer(byte[] mbyte) {            mBytes = mbyte;            invalidate();        }        @Override        protected void onDraw(Canvas canvas) {            // TODO Auto-generated method stub            super.onDraw(canvas);            if (mBytes == null) {                return;            }            if (mPoints == null || mPoints.length < mBytes.length * 4) {                mPoints = new float[mBytes.length * 4];            }            mRect.set(0, 0, getWidth(), getHeight());            for (int i = 0; i < mBytes.length - 1; i++) {                mPoints[i * 4] = mRect.width() * i / (mBytes.length - 1);                mPoints[i * 4 + 1] = mRect.height() / 2                        + ((byte) (mBytes[i] + 128)) * (mRect.height() / 2)                        / 128;                mPoints[i * 4 + 2] = mRect.width() * (i + 1)                        / (mBytes.length - 1);                mPoints[i * 4 + 3] = mRect.height() / 2                        + ((byte) (mBytes[i + 1] + 128)) * (mRect.height() / 2)                        / 128;            }            canvas.drawLines(mPoints, mPaint);        }    }}

 

更多相关文章

  1. 基于android的实时音频频谱仪
  2. Android自动识别标签的自定义TextView(可自定义点击事件)
  3. Android游戏开发系统控件-Dialog
  4. Android(安卓)富文本
  5. Flutter基本UI组件StatefulWidget与StatelessWidget(上)
  6. 用Android自带的DrawerLayout和ActionBarDrawerToggle实现侧滑效
  7. 从主流音乐应用程序中拔身出来,试试 Rocket Player 播放器吧
  8. Android——ECG心电图的绘制实现(二)
  9. Android(安卓)下枚举型使用、及与 int 转换的困惑

随机推荐

  1. Android数字签名解析(二)
  2. 【读书笔记】【Android(安卓)开发艺术探
  3. android 对listview数据的增删改查
  4. Android(安卓)webView 缓存 Cache + HTML
  5. Android微信右上角弹出的对话选择框实现
  6. Android软件发布--数字签名与优化
  7. Android开发周报:罗永浩激辩王自如
  8. 解决 :android studio 提交代码到git/gith
  9. [置顶] 自己开发的Android(安卓)软件发布
  10. Android与webservice进行实体对象的传递