Android音谱
2016-01-25 16:03
671 查看
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
public class VisualizerView extends View {
private byte[] mBytes;
private float[] mPoints;
private float[] mPointsx;
private Rect mRect = new Rect();
private Paint mForePaint = new Paint();
private Paint mForePaintx = new Paint();
private int mSpectrumNum = 35;
private boolean mFirst = true;
public VisualizerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public VisualizerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
init();
}
public VisualizerView(Context context) {
this(context, null, 0);
init();
}
private void init() {
mBytes = null;
mForePaint.setStrokeWidth(20f);
mForePaint.setAntiAlias(true);
mForePaint.setARGB(255, 176, 203, 162);
mForePaintx.setStrokeWidth(20f);
mForePaintx.setAntiAlias(true);
mForePaintx.setARGB(255, 81, 138, 58);
}
public void updateVisualizer(byte[] fft) {
if (mFirst) {
mFirst = false;
}
byte[] model = new byte[fft.length / 2 + 1];
model[0] = (byte) Math.abs(fft[0]);
for (int i = 2, j = 1; j < mSpectrumNum;) {
model[j] = (byte) Math.hypot(fft[i], fft[i + 1]);
i += 2;
j++;
}
mBytes = model;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mBytes == null) {
return;
}
if (mPoints == null || mPoints.length < mBytes.length * 4) {
mPoints = new float[mBytes.length * 4];
}
if (mPointsx == null || mPointsx.length < mBytes.length * 4) {
mPointsx = 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;
// }
// 绘制频谱
final int baseX = mRect.width() / mSpectrumNum;
final int height = mRect.height() / 2;
final int heightx = mRect.height() / 2 + 5;
for (int i = 0; i < mSpectrumNum; i++) {
if (mBytes[i] < 0) {
mBytes[i] = 127;
}
final int xi = baseX * i + baseX / 2;
mPoints[i * 4] = xi;
mPoints[i * 4 + 1] = height;
mPoints[i * 4 + 2] = xi;
mPoints[i * 4 + 3] = height - mBytes[i];
mPointsx[i * 4] = xi;
mPointsx[i * 4 + 1] = heightx;
mPointsx[i * 4 + 2] = xi;
mPointsx[i * 4 + 3] = heightx + mBytes[i];
}
canvas.drawLines(mPoints, mForePaint);
canvas.drawLines(mPointsx, mForePaintx);
}
}
private void initVisualizer() {
// 以MediaPlayer的AudioSessionId创建Visualizer
// 相当于设置Visualizer负责显示该MediaPlayer的音频数据
mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId());
// 设置需要转换的音乐内容长度,专业的说这就是采样,该采样值一般为2的指数倍,如64,128,256,512,1024。
mVisualizer.setCaptureSize(1024);
final int maxCR = Visualizer.getMaxCaptureRate();
mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
// 这个回调应该采集的是波形数据
vv_music.updateVisualizer(bytes);
}
public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) {
// 这个回调应该采集的是快速傅里叶变换有关的数据
vv_music.updateVisualizer(fft);
}
}, maxCR / 2, false, true);
mVisualizer.setEnabled(true);
}
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
public class VisualizerView extends View {
private byte[] mBytes;
private float[] mPoints;
private float[] mPointsx;
private Rect mRect = new Rect();
private Paint mForePaint = new Paint();
private Paint mForePaintx = new Paint();
private int mSpectrumNum = 35;
private boolean mFirst = true;
public VisualizerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public VisualizerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
init();
}
public VisualizerView(Context context) {
this(context, null, 0);
init();
}
private void init() {
mBytes = null;
mForePaint.setStrokeWidth(20f);
mForePaint.setAntiAlias(true);
mForePaint.setARGB(255, 176, 203, 162);
mForePaintx.setStrokeWidth(20f);
mForePaintx.setAntiAlias(true);
mForePaintx.setARGB(255, 81, 138, 58);
}
public void updateVisualizer(byte[] fft) {
if (mFirst) {
mFirst = false;
}
byte[] model = new byte[fft.length / 2 + 1];
model[0] = (byte) Math.abs(fft[0]);
for (int i = 2, j = 1; j < mSpectrumNum;) {
model[j] = (byte) Math.hypot(fft[i], fft[i + 1]);
i += 2;
j++;
}
mBytes = model;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mBytes == null) {
return;
}
if (mPoints == null || mPoints.length < mBytes.length * 4) {
mPoints = new float[mBytes.length * 4];
}
if (mPointsx == null || mPointsx.length < mBytes.length * 4) {
mPointsx = 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;
// }
// 绘制频谱
final int baseX = mRect.width() / mSpectrumNum;
final int height = mRect.height() / 2;
final int heightx = mRect.height() / 2 + 5;
for (int i = 0; i < mSpectrumNum; i++) {
if (mBytes[i] < 0) {
mBytes[i] = 127;
}
final int xi = baseX * i + baseX / 2;
mPoints[i * 4] = xi;
mPoints[i * 4 + 1] = height;
mPoints[i * 4 + 2] = xi;
mPoints[i * 4 + 3] = height - mBytes[i];
mPointsx[i * 4] = xi;
mPointsx[i * 4 + 1] = heightx;
mPointsx[i * 4 + 2] = xi;
mPointsx[i * 4 + 3] = heightx + mBytes[i];
}
canvas.drawLines(mPoints, mForePaint);
canvas.drawLines(mPointsx, mForePaintx);
}
}
private void initVisualizer() {
// 以MediaPlayer的AudioSessionId创建Visualizer
// 相当于设置Visualizer负责显示该MediaPlayer的音频数据
mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId());
// 设置需要转换的音乐内容长度,专业的说这就是采样,该采样值一般为2的指数倍,如64,128,256,512,1024。
mVisualizer.setCaptureSize(1024);
final int maxCR = Visualizer.getMaxCaptureRate();
mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
// 这个回调应该采集的是波形数据
vv_music.updateVisualizer(bytes);
}
public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) {
// 这个回调应该采集的是快速傅里叶变换有关的数据
vv_music.updateVisualizer(fft);
}
}, maxCR / 2, false, true);
mVisualizer.setEnabled(true);
}
相关文章推荐
- [置顶] Android实现应用的增量更新\升级
- android AsyncTask使用注意事项以及总结
- Android LayoutInflater详解
- Android开发实现异步加载图片
- Android 实现自己定义多级树控件和全选与反选的效果
- Android应用程序的Activity启动过程简要介绍和学习计划
- Android开发点击返回键退出(出现dialog)
- 安卓开发者必备的42个链接
- android屏幕亮度调节
- android之字体阴影效果
- android 比较靠谱的图片压缩
- Android锁屏状态下弹出activity
- Android中用layer-list编写阴影效果
- android 加密导出apk
- Android应用开发allowBackup敏感信息泄露的一点反思
- Android layout属性大全
- ubuntu安装android开发环境
- Android 四大组件 (三) ContentProvider 使用简介
- Android使用Intent启动Service的Intent必须是显式的
- Glide-----一个新的android图片处理开源项目