问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android开发,请问如实现拖动页面来进行波形的显示

发布网友 发布时间:2022-04-22 14:55

我来回答

1个回答

热心网友 时间:2023-08-12 21:10



package com.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.audiofx.Equalizer;
import android.media.audiofx.Visualizer;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;

public class AudioFxActivity extends Activity
{
private static final String TAG = "AudioFxActivity";

private static final float VISUALIZER_HEIGHT_DIP = 160f;

private MediaPlayer mMediaPlayer;
private Visualizer mVisualizer;
private Equalizer mEqualizer;

private LinearLayout mLinearLayout;
private VisualizerView mVisualizerView;
private TextView mStatusTextView;
private TextView mInfoView;

@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);

mStatusTextView = new TextView(this);

mLinearLayout = new LinearLayout(this);
mLinearLayout.setOrientation(LinearLayout.VERTICAL);
mLinearLayout.addView(mStatusTextView);

setContentView(mLinearLayout);

// Create the MediaPlayer
mMediaPlayer = MediaPlayer.create(this, R.raw.my_life);
Log.d(TAG,
"MediaPlayer audio session ID: "
+ mMediaPlayer.getAudioSessionId());

setupVisualizerFxAndUI();
setupEqualizerFxAndUI();

// Make sure the visualizer is enabled only when you actually want to
// receive data, and
// when it makes sense to receive data.
mVisualizer.setEnabled(true);

// When the stream ends, we don't need to collect any more data. We
// don't do this in
// setupVisualizerFxAndUI because we likely want to have more,
// non-Visualizer related code
// in this callback.
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
{
public void onCompletion(MediaPlayer mediaPlayer)
{
mVisualizer.setEnabled(false);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setVolumeControlStream(AudioManager.STREAM_SYSTEM);
mStatusTextView.setText("音乐播放完毕");
}
});

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
mMediaPlayer.start();
mStatusTextView.setText("播放音乐中....");
}

private void setupEqualizerFxAndUI()
{
// Create the Equalizer object (an AudioEffect subclass) and attach it
// to our media player,
// with a default priority (0).
mEqualizer = new Equalizer(0, mMediaPlayer.getAudioSessionId());
mEqualizer.setEnabled(true);

TextView eqTextView = new TextView(this);
eqTextView.setText("均衡器:");
mLinearLayout.addView(eqTextView);

short bands = mEqualizer.getNumberOfBands();

final short minEQLevel = mEqualizer.getBandLevelRange()[0];
final short maxEQLevel = 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");
mLinearLayout.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((minEQLevel / 100) + " dB");

TextView 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.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.weight = 1;
SeekBar bar = new SeekBar(this);
bar.setLayoutParams(layoutParams);
bar.setMax(maxEQLevel - minEQLevel);
bar.setProgress(mEqualizer.getBandLevel(band));

bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
{
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser)
{
mEqualizer.setBandLevel(band, (short) (progress + minEQLevel));
}

public void onStartTrackingTouch(SeekBar seekBar)
{
}

public void onStopTrackingTouch(SeekBar seekBar)
{
}
});

row.addView(minDbTextView);
row.addView(bar);
row.addView(maxDbTextView);

mLinearLayout.addView(row);
}
}

private void setupVisualizerFxAndUI()
{
mVisualizerView = new VisualizerView(this);
mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
(int) (VISUALIZER_HEIGHT_DIP * getResources()
.getDisplayMetrics().density)));
mLinearLayout.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);
mLinearLayout.addView(mInfoView);

mVisualizer = new Visualizer(mMediaPlayer.getAudioSessionId());
mVisualizer.setCaptureSize(256);
mVisualizer.setDataCaptureListener(
new Visualizer.OnDataCaptureListener()
{
public void onWaveFormDataCapture(Visualizer visualizer,
byte[] bytes, int samplingRate)
{
mVisualizerView.updateVisualizer(bytes);
}

public void onFftDataCapture(Visualizer visualizer,
byte[] fft, int samplingRate)
{
mVisualizerView.updateVisualizer(fft);
}
}, maxCR / 2, false, true);
}

@Override
protected void onPause()
{
super.onPause();

if (isFinishing() && mMediaPlayer != null)
{
mVisualizer.release();
mEqualizer.release();
mMediaPlayer.release();
mMediaPlayer = null;
}
}

/**
 * A simple class that draws waveform data received from a
 * {@link Visualizer.OnDataCaptureListener#onWaveFormDataCapture }
 */
class VisualizerView extends View
{
private byte[] mBytes;
private float[] mPoints;
private Rect mRect = new Rect();

private Paint mForePaint = new Paint();
private int mSpectrumNum = 48;
private boolean mFirst = true;

public VisualizerView(Context context)
{
super(context);
init();
}

private void init()
{
mBytes = null;

mForePaint.setStrokeWidth(8f);
mForePaint.setAntiAlias(true);
mForePaint.setColor(Color.rgb(0, 128, 255));
}

public void updateVisualizer(byte[] fft)
{
if(mFirst )
{
mInfoView.setText(mInfoView.getText().toString() + "\nCaptureSize: " + fft.length);
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];
}

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();

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];
}

canvas.drawLines(mPoints, mForePaint);
}
}
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
经典鉴赏18:救世主回来了!魔神英雄传(神龙斗士)第二部赏析 魔神英雄传第2部第36集的插曲 魔神英雄第二部国语如何下载 暮光月袭职业怎么样?有什么特点? 暮光传奇游戏职业 暮光网页游戏有什么特色? 暮光起源职业介绍_暮光起源职业有哪些 暮光起源什么职业最好玩 暮光的特色介绍 暮光起源手游哪个职业好玩 新手职业推荐 对长征精神的感想用二三句话表达 如何绘制Android的音乐播放器的波形 长征故事的感受 观看红军长征的感想和收获 长征感悟 读了《七律 长征》,你有何感想 看雄关漫道的心得体会 读七律长征有感500字 iPad怎么和电视连接? 头发油的太快,有啥好办法减缓油的速度? 将手机Pad屏幕镜像到电视上 请问,头发很油有什么好方法解决? 小新pad怎样投屏到飞利浦电视上 头发油怎么办小妙招不能洗头 创维40寸miracast将手机,pad屏幕镜像到电视上 如何减少头发出油 404 Not Found 什么方法能减少头发出油! 怎样将手机pad屏幕镜像到电视上? 头发油怎么办小妙招 如何总结长征精神 404 Not Found 关于长征的故事和长征精神 android 怎么绘制时时音频波形图 读了两万五千/里长征后你有什么感受 android铃声剪辑软件的波形图怎么实现的 谁说Android的动画不廉价(五):水波纹动画 android 怎么实现按下显示不同颜色,又有波纹效果 Android开发,按钮水波纹 华为视频剪辑怎么取消结尾花瓣标 Android 5.0 Material Design 的Ripple波纹效果怎么默认全局实现 android 如何做到播放音乐时动态波形 android surfaceview 画上黑色还能让他透明吗 视频剪辑用什么软件好? android 怎么绘制空心线条 如何生成在Android的图像直方图 怎么编辑视频让视频结尾是慢慢变黑的那种 android频谱分析怎么做 Android绘制图片的几种方式 404 Not Found