package com.xiaowa.live.audiovisual.sdk.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.xiaowa.live.audiovisual.sdk.R;
import com.xiaowa.live.audiovisual.sdk.utils.LogUtils;
import com.xiaowa.live.audiovisual.sdk.visualize.VisualizeCallback;
import com.xiaowa.live.audiovisual.sdk.visualize.VisualizerHelper;
/**
* Date: 2020/10/16
* Author: Yang
* Describe: a view for visualizing audio, showing spectrum with different ui mode
*/
public abstract class AudioVisualizeView extends View implements VisualizeCallback {
/**
* the count of spectrum
*/
protected int mSpectrumCount;
protected int mWaveThreshold;
/**
* the margin of adjoin spectrum
*/
protected float mItemMargin;
/**
* ratio of spectrum, between 0.0f - 2.0f
*/
protected float mSpectrumRatio;
/**
* the width of every spectrum
*/
protected float mStrokeWidth;
/**
* the color of drawing spectrum
*/
protected int mColor;
/**
* control enable of visualize
*/
protected boolean isVisualizationEnabled = true;
/**
* audio data transform by hypot
*/
protected float[] mRawAudioBytes;
protected RectF mRect;
protected Paint mPaint;
protected Path mPath;
protected float centerX, centerY;
protected VisualizerHelper visualizerHelper;
public AudioVisualizeView(Context context) {
this(context, null);
}
public AudioVisualizeView(Context context,
@Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public AudioVisualizeView(Context context,
@Nullable AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
handleStyleable(context, attrs, defStyleAttr);
init();
}
private void handleStyleable(Context context, AttributeSet attrs, int defStyle) {
TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.AudioVisualizeView, defStyle, 0);
try {
mColor = ta.getColor(R.styleable.AudioVisualizeView_visualize_color, Color.WHITE);
mSpectrumCount = ta.getInteger(R.styleable.AudioVisualizeView_visualize_count, 60) + 1;
mWaveThreshold = ta.getInteger(R.styleable.AudioVisualizeView_visualize_threshold, 0);
mSpectrumRatio = ta.getFloat(R.styleable.AudioVisualizeView_visualize_ratio, 1.0f);
mItemMargin = ta.getDimension(R.styleable.AudioVisualizeView_visualize_item_margin, 12f);
handleAttr(ta);
} catch (Exception e) {
e.printStackTrace();
} finally {
ta.recycle();
}
}
protected void init() {
mStrokeWidth = 5;
mPaint = new Paint();
mPaint.setStrokeWidth(mStrokeWidth);
mPaint.setColor(mColor);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setAntiAlias(true);
mPaint.setMaskFilter(new BlurMaskFilter(5, BlurMaskFilter.Blur.SOLID));
mRect = new RectF();
mPath = new Path();
visualizerHelper = new VisualizerHelper();
visualizerHelper.setVisualizeCallback(this);
visualizerHelper.setVisualCount(mSpectrumCount);
}
/**
* 绑定 audioSessionId
*
* @param audioSessionId audioSessionId
*/
public void bindAudioSessionId(int audioSessionId) {
try {
visualizerHelper.setAudioSessionId(audioSessionId);
} catch (Exception e) {
LogUtils.e(e.getMessage());
}
}
@Override
public void onFftDataCapture(float[] parseData) {
if (!isVisualizationEnabled) {
return;
}
mRawAudioBytes = parseData;
// 刷新数据
postInvalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int finallyWidth;
int finallyHeight;
int wSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int wSpecSize = MeasureSpec.getSize(widthMeasureSpec);
int hSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int hSpecSize = MeasureSpec.getSize(heightMeasureSpec);
if (wSpecMode == MeasureSpec.EXACTLY) {
finallyWidth = wSpecSize;
} else {
finallyWidth = 500;
}
if (hSpecMode == MeasureSpec.EXACTLY) {
finallyHeight = hSpecSize;
} else {
finallyHeight = 500;
}
setMeasuredDimension(finallyWidth, finallyHeight);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
mRect.set(0, 0, getWidth(), getHeight() - 50);
centerX = mRect.width() / 2;
centerY = mRect.height() / 2;
onLayoutFinish();
}
@Override
protected void onDraw(@NonNull Canvas canvas) {
super.onDraw(canvas);
if (mRawAudioBytes == null) {
return;
}
drawChild(canvas);
}
protected abstract void onLayoutFinish();
protected abstract void handleAttr(TypedArray typedArray);
protected abstract void drawChild(Canvas canvas);
public void setColor(int color) {
this.mColor = color;
this.mPaint.setColor(this.mColor);
}
/**
* Enable Visualization
*/
public void show() {
this.isVisualizationEnabled = true;
}
/**
* Disable Visualization
*/
public void hide() {
this.isVisualizationEnabled = false;
}
/**
* release media player and visualizer
*/
public void release() {
if (visualizerHelper != null) {
visualizerHelper.release();
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
模仿chatgpt播放音频动画(Java)
共59个文件
xml:18个
java:14个
webp:10个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 175 浏览量
2023-11-23
17:52:39
上传
评论
收藏 5.83MB ZIP 举报
温馨提示
模仿chatgpt播放音频动画
资源推荐
资源详情
资源评论
收起资源包目录
audiovisual-master.zip (59个子文件)
audiovisual-master
gradle.properties 1KB
gradle
wrapper
gradle-wrapper.jar 58KB
gradle-wrapper.properties 230B
audiovisualize
src
androidTest
java
com
xiaowa
live
audiovisual
sdk
ExampleInstrumentedTest.java 781B
test
java
com
xiaowa
live
audiovisual
sdk
ExampleUnitTest.java 392B
main
java
com
xiaowa
live
audiovisual
sdk
utils
LogUtils.java 299B
view
AudioVisualizeView.java 6KB
ChatGptAudioVisualizeView.java 2KB
visualize
VisualizerHelper.java 2KB
VisualizeCallback.java 196B
constants
VisualizeMode.java 1KB
res
values
attrs.xml 695B
AndroidManifest.xml 121B
proguard-rules.pro 750B
consumer-rules.pro 0B
.gitignore 6B
build.gradle.kts 2KB
app
src
androidTest
java
com
xiaowa
live
audiovisual
ExampleInstrumentedTest.java 768B
test
java
com
xiaowa
live
audiovisual
ExampleUnitTest.java 388B
main
java
com
xiaowa
live
audiovisual
media
MediaManagerListener.java 192B
MediaManager.java 2KB
utils
PermissionUtils.java 887B
MainActivity.java 2KB
res
mipmap-xxhdpi
ic_launcher_round.webp 6KB
ic_launcher.webp 3KB
mipmap-hdpi
ic_launcher_round.webp 3KB
ic_launcher.webp 1KB
mipmap-anydpi-v26
ic_launcher.xml 343B
ic_launcher_round.xml 343B
values-night
themes.xml 813B
mipmap-mdpi
ic_launcher_round.webp 2KB
ic_launcher.webp 982B
mipmap-xxxhdpi
ic_launcher_round.webp 8KB
ic_launcher.webp 4KB
mipmap-xhdpi
ic_launcher_round.webp 4KB
ic_launcher.webp 2KB
xml
data_extraction_rules.xml 551B
backup_rules.xml 478B
values
colors.xml 378B
strings.xml 73B
themes.xml 813B
layout
main_layout.xml 709B
drawable
ic_launcher_background.xml 5KB
ic_launcher_foreground.xml 2KB
raw
sound.mp3 5.73MB
AndroidManifest.xml 1KB
proguard-rules.pro 750B
.gitignore 6B
build.gradle.kts 1KB
gradlew.bat 3KB
.idea
vcs.xml 180B
misc.xml 409B
compiler.xml 169B
gradle.xml 791B
.gitignore 47B
gradlew 6KB
.gitignore 225B
settings.gradle.kts 357B
build.gradle.kts 231B
共 59 条
- 1
资源评论
十小大
- 粉丝: 9739
- 资源: 2555
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功