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;
BaseVisualizerView mBaseVisualizerView;
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);
// mMediaPlayer = new MediaPlayer();
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();
mMediaPlayer.setLooping(true);
mStatusTextView.setText("播放中。。。");
}
/**
* 通过mMediaPlayer返回的AudioSessionId创建一个优先级为0均衡器对象 并且通过频谱生成相应的UI和对应的事件
*/
private void setupEqualizeFxAndUi()
{
mEqualizer = new Equalizer(0, mMediaPlayer.getAudioSessionId());
// mEqualizer = new Equalizer(0, 0);
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);
mBaseVisualizerView = new BaseVisualizerView(this);
mBaseVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
(int) (VISUALIZER_HEIGHT_DIP * getResources()
.getDisplayMetrics().density)));
mLayout.addView(mBaseVisualizerView);
mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId());
// mVisualizer = new Visualizer(0);
// 参数内必须是2的位数
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
// 设置允许波形表示,并且捕获它
mBaseVisualizerView.setVisualizer(mVisualizer);
/*mVisualizer.setDataCaptureListener(new OnDataCaptureListener()
{
@Override
public void onWaveFormDataCapture(Visualizer visualizer,
byte[] waveform, int samplingRate)
{
// TODO Auto-generated method stub
// mVisualizerView.updateVisualizer(waveform);
// mBaseVisualizerView.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);
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
小程序 源码音乐实时跳动频谱显示(源码+截图).rar
共41个文件
class:12个
png:8个
java:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 100 浏览量
2023-03-19
20:08:31
上传
评论
收藏 8.37MB RAR 举报
温馨提示
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请举报或通知本人删除。
资源推荐
资源详情
资源评论
收起资源包目录
小程序 源码音乐实时跳动频谱显示(源码+截图).rar (41个子文件)
javaapk.com_0001.png 137KB
javaapk.com_0000.png 138KB
android 跳动频谱
project.properties 361B
.classpath 475B
.settings
org.eclipse.jdt.core.prefs 177B
assets
src
com
terry
AudioFx
AudioFxActivity.java 8KB
BaseVisualizerView.java 5KB
res
drawable-mdpi
icon.png 3KB
drawable-xhdpi
drawable-ldpi
icon.png 2KB
values
strings.xml 185B
layout
main.xml 382B
raw
z8806c.mp3 2.81MB
drawable-hdpi
icon.png 4KB
bin
classes
com
terry
AudioFx
AudioFxActivity$1.class 830B
AudioFxActivity$2.class 1KB
R$string.class 424B
AudioFxActivity.class 5KB
BaseVisualizerView.class 4KB
R$layout.class 391B
BuildConfig.class 343B
R$attr.class 337B
R$drawable.class 397B
R$raw.class 384B
R.class 526B
AudioFxActivity$VisualizerView.class 2KB
resources.ap_ 2.82MB
jarlist.cache 120B
res
drawable-mdpi
icon.png 2KB
drawable-ldpi
icon.png 2KB
drawable-hdpi
icon.png 4KB
AudioFxDemo.apk 2.83MB
classes.dex 14KB
dexedLibs
annotations-1c63d345f36822587876ba56fa58045e.jar 943B
annotations-b8fe4e7e418233f7d0d4621ee82d7924.jar 943B
AndroidManifest.xml 822B
proguard.cfg 1KB
default.properties 36B
.project 847B
AndroidManifest.xml 822B
gen
com
terry
AudioFx
BuildConfig.java 159B
R.java 735B
共 41 条
- 1
资源评论
荣华富贵8
- 粉丝: 124
- 资源: 7649
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功