Skip to content

Commit b76b371

Browse files
committed
abstract visualize view
1 parent bbfea0e commit b76b371

File tree

9 files changed

+317
-92
lines changed

9 files changed

+317
-92
lines changed

app/src/main/res/layout/activity_main.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
android:background="#000000"
88
tools:context=".MainActivity">
99

10-
<com.zjy.audiovisualize.view.AudioVisualizeView
10+
<com.zjy.audiovisualize.view.ReflectVisualizeView
1111
android:id="@+id/audio_visualize_view"
1212
android:text="Hello World!"
1313
app:visualize_ratio="2"
14-
app:visualize_mode="horizontal_line_top"
14+
app:visualize_mode="net"
1515
android:layout_width="match_parent"
1616
android:layout_height="match_parent"
1717
app:layout_constraintBottom_toBottomOf="parent"

audiovisualize/src/main/java/com/zjy/audiovisualize/constants/VisualizeMode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,9 @@ public class VisualizeMode {
2727
* In WAVE mode, show spectrum base on a horizontal line, it will link all points of spectrum so like a wave.
2828
*/
2929
public final static int WAVE = 5;
30+
/**
31+
* In NET mode, show spectrum base on a circle, with jumping around it and link all points of spectrum so like a net.
32+
*/
33+
public final static int NET = 6;
3034

3135
}

audiovisualize/src/main/java/com/zjy/audiovisualize/view/AudioVisualizeView.java

Lines changed: 21 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -15,70 +15,55 @@
1515
import androidx.annotation.Nullable;
1616

1717
import com.zjy.audiovisualize.R;
18-
import com.zjy.audiovisualize.constants.VisualizeMode;
1918
import com.zjy.audiovisualize.media.MediaManager;
2019
import com.zjy.audiovisualize.media.MediaManagerListener;
2120
import com.zjy.audiovisualize.utils.LogUtils;
2221
import com.zjy.audiovisualize.visualize.VisualizeCallback;
2322
import com.zjy.audiovisualize.visualize.VisualizerHelper;
2423

25-
import static com.zjy.audiovisualize.constants.VisualizeMode.CIRCLE;
26-
import static com.zjy.audiovisualize.constants.VisualizeMode.HORIZONTAL_LINE_BOTTOM;
27-
import static com.zjy.audiovisualize.constants.VisualizeMode.HORIZONTAL_LINE_TOP;
28-
import static com.zjy.audiovisualize.constants.VisualizeMode.REFLECT;
29-
import static com.zjy.audiovisualize.constants.VisualizeMode.WAVE;
30-
3124
/**
3225
* Date: 2020/10/16
3326
* Author: Yang
3427
* Describe: a view for visualizing audio, showing spectrum with different ui mode
3528
*/
36-
public class AudioVisualizeView extends View implements MediaManagerListener, VisualizeCallback {
29+
public abstract class AudioVisualizeView extends View implements MediaManagerListener, VisualizeCallback {
3730

3831
/**
3932
* the count of spectrum
4033
*/
41-
private int mSpectrumCount;
34+
protected int mSpectrumCount;
4235
/**
4336
* the margin of adjoin spectrum
4437
*/
45-
private float mItemMargin;
38+
protected float mItemMargin;
4639
/**
4740
* ratio of spectrum, between 0.0f - 2.0f
4841
*/
49-
private float mSpectrumRatio;
42+
protected float mSpectrumRatio;
5043
/**
5144
* the width of every spectrum
5245
*/
53-
private float mStrokeWidth;
46+
protected float mStrokeWidth;
5447
/**
5548
* the color of drawing spectrum
5649
*/
57-
private int mColor;
58-
/**
59-
* provide different mode to show
60-
* {@link VisualizeMode#HORIZONTAL_LINE_TOP}
61-
* {@link VisualizeMode#HORIZONTAL_LINE_BOTTOM}
62-
* {@link VisualizeMode#CIRCLE}
63-
* {@link VisualizeMode#REFLECT}
64-
* {@link VisualizeMode#WAVE}
65-
*/
66-
private int mShowMode;
50+
protected int mColor;
6751
/**
6852
* control enable of visualize
6953
*/
70-
private boolean isVisualizationEnabled = true;
54+
protected boolean isVisualizationEnabled = true;
7155
/**
7256
* audio data transform by hypot
7357
*/
7458
protected byte[] mRawAudioBytes;
7559

76-
private RectF mRect;
77-
private Paint mPaint;
78-
private Path mPath;
60+
protected RectF mRect;
61+
protected Paint mPaint;
62+
protected Path mPath;
63+
protected float centerX, centerY;
7964

80-
private MediaManager mediaManager;
81-
private VisualizerHelper visualizerHelper;
65+
protected MediaManager mediaManager;
66+
protected VisualizerHelper visualizerHelper;
8267

8368
public AudioVisualizeView(Context context) {
8469
this(context, null);
@@ -103,7 +88,7 @@ private void handleStyleable(Context context, AttributeSet attrs, int defStyle)
10388
mColor = ta.getColor(R.styleable.AudioVisualizeView_visualize_color, Color.WHITE);
10489
mSpectrumCount = ta.getInteger(R.styleable.AudioVisualizeView_visualize_count, 60);
10590
mSpectrumRatio = ta.getFloat(R.styleable.AudioVisualizeView_visualize_ratio, 1.0f);
106-
mShowMode = ta.getInteger(R.styleable.AudioVisualizeView_visualize_mode, HORIZONTAL_LINE_TOP);
91+
handleAttr(ta);
10792
} catch (Exception e) {
10893
e.printStackTrace();
10994
} finally {
@@ -211,73 +196,23 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
211196
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
212197
super.onLayout(changed, left, top, right, bottom);
213198
mRect.set(0, 0, getWidth(), getHeight() - 50);
199+
centerX = mRect.width() / 2;
200+
centerY = mRect.height() / 2;
214201
}
215202

216203
@Override
217204
protected void onDraw(Canvas canvas) {
218-
219205
super.onDraw(canvas);
220-
221206
if (mRawAudioBytes == null) {
222207
return;
223208
}
224-
float centerX = mRect.width() / 2;
225-
float centerY = mRect.height() / 2;
226-
float radius = 150;
227-
switch (mShowMode) {
228-
case CIRCLE:
229-
mStrokeWidth = (float) ((Math.PI * 2 * radius - (mSpectrumCount - 1) * mItemMargin) / mSpectrumCount * 1.0f);
230-
mPaint.setStyle(Paint.Style.STROKE);
231-
mPaint.setStrokeWidth(2);
232-
canvas.drawCircle(centerX, centerY, radius, mPaint);
233-
break;
234-
default:
235-
mStrokeWidth = (mRect.width() - (mSpectrumCount - 1) * mItemMargin) / mSpectrumCount * 1.0f;
236-
237-
break;
238-
}
239-
mPaint.setStrokeWidth(mStrokeWidth);
240-
mPaint.setStyle(Paint.Style.FILL);
241-
mPath.moveTo(0, centerY);
242-
for (int i = 0; i < mSpectrumCount; i++) {
243-
if (mRawAudioBytes[i] < 0) {
244-
mRawAudioBytes[i] = 127;
245-
}
246-
247-
switch (mShowMode) {
248-
case HORIZONTAL_LINE_TOP:
249-
canvas.drawLine(mRect.width() * i / mSpectrumCount, mRect.height() / 2,mRect.width() * i / mSpectrumCount, 2 + mRect.height() / 2 - mRawAudioBytes[i], mPaint);
250-
break;
251-
case HORIZONTAL_LINE_BOTTOM:
252-
canvas.drawLine(mRect.width() * i / mSpectrumCount, mRect.height() / 2,mRect.width() * i / mSpectrumCount, 2 + mRect.height() / 2 + mRawAudioBytes[i], mPaint);
253-
break;
254-
case CIRCLE:
255-
double angel = ((360d/ mSpectrumCount *1.0d) * (i+1));
256-
double startX = centerX + (radius + mStrokeWidth/2) * Math.sin(Math.toRadians(angel));
257-
double startY = centerY + (radius + mStrokeWidth/2) * Math.cos(Math.toRadians(angel));
258-
double stopX = centerX + (radius + mStrokeWidth/2 + mSpectrumRatio * mRawAudioBytes[i]) * Math.sin(Math.toRadians(angel));
259-
double stopY = centerY + (radius + mStrokeWidth/2 + mSpectrumRatio * mRawAudioBytes[i]) * Math.cos(Math.toRadians(angel));
260-
canvas.drawLine((float) startX, (float) startY, (float) stopX, (float) stopY, mPaint);
261-
break;
262-
case REFLECT:
263-
canvas.drawLine(mRect.width() * i / mSpectrumCount, mRect.height() / 2,mRect.width() * i / mSpectrumCount, 2 + mRect.height() / 2 - mSpectrumRatio * mRawAudioBytes[i], mPaint);
264-
canvas.drawLine(mRect.width() * i / mSpectrumCount, mRect.height() / 2,mRect.width() * i / mSpectrumCount, 2 + mRect.height() / 2 + mSpectrumRatio * mRawAudioBytes[i], mPaint);
265-
break;
266-
case WAVE:
267-
mPath.lineTo(mRect.width() * i / mSpectrumCount, 2 + mRect.height() / 2 + mRawAudioBytes[i]);
268-
break;
269-
default:
270-
break;
271-
}
272-
}
273-
mPath.lineTo(mRect.width(), centerY);
274-
mPath.close();
275-
if (mShowMode == WAVE) {
276-
canvas.drawPath(mPath, mPaint);
277-
}
278-
mPath.reset();
209+
drawChild(canvas);
279210
}
280211

212+
protected abstract void handleAttr(TypedArray typedArray);
213+
214+
protected abstract void drawChild(Canvas canvas);
215+
281216
public void setColor(int color) {
282217
this.mColor = color;
283218
this.mPaint.setColor(this.mColor);
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.zjy.audiovisualize.view;
2+
3+
import android.content.Context;
4+
import android.content.res.TypedArray;
5+
import android.graphics.Canvas;
6+
import android.graphics.Paint;
7+
import android.util.AttributeSet;
8+
9+
import androidx.annotation.Nullable;
10+
11+
/**
12+
* Date: 2020/11/30
13+
* Author: Yang
14+
* Describe:
15+
*/
16+
public class CircleVisualizeView extends AudioVisualizeView{
17+
18+
public CircleVisualizeView(Context context) {
19+
super(context);
20+
}
21+
22+
public CircleVisualizeView(Context context, @Nullable AttributeSet attrs) {
23+
super(context, attrs);
24+
}
25+
26+
public CircleVisualizeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
27+
super(context, attrs, defStyleAttr);
28+
}
29+
30+
@Override
31+
protected void handleAttr(TypedArray typedArray) {
32+
33+
}
34+
35+
@Override
36+
protected void drawChild(Canvas canvas) {
37+
float radius = 150;
38+
mStrokeWidth = (float) ((Math.PI * 2 * radius - (mSpectrumCount - 1) * mItemMargin) / mSpectrumCount * 1.0f);
39+
mPaint.setStyle(Paint.Style.STROKE);
40+
mPaint.setStrokeWidth(2);
41+
canvas.drawCircle(centerX, centerY, radius, mPaint);
42+
mPaint.setStrokeWidth(mStrokeWidth);
43+
mPaint.setStyle(Paint.Style.FILL);
44+
mPath.moveTo(0, centerY);
45+
for (int i = 0; i < mSpectrumCount; i++) {
46+
if (mRawAudioBytes[i] < 0) {
47+
mRawAudioBytes[i] = 127;
48+
}
49+
double angel = ((360d/ mSpectrumCount *1.0d) * (i+1));
50+
double startX = centerX + (radius + mStrokeWidth/2) * Math.sin(Math.toRadians(angel));
51+
double startY = centerY + (radius + mStrokeWidth/2) * Math.cos(Math.toRadians(angel));
52+
double stopX = centerX + (radius + mStrokeWidth/2 + mSpectrumRatio * mRawAudioBytes[i]) * Math.sin(Math.toRadians(angel));
53+
double stopY = centerY + (radius + mStrokeWidth/2 + mSpectrumRatio * mRawAudioBytes[i]) * Math.cos(Math.toRadians(angel));
54+
canvas.drawLine((float) startX, (float) startY, (float) stopX, (float) stopY, mPaint);
55+
}
56+
}
57+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.zjy.audiovisualize.view;
2+
3+
import android.content.Context;
4+
import android.content.res.TypedArray;
5+
import android.graphics.Canvas;
6+
import android.graphics.Paint;
7+
import android.util.AttributeSet;
8+
9+
import androidx.annotation.Nullable;
10+
11+
/**
12+
* Date: 2020/11/30
13+
* Author: Yang
14+
* Describe:
15+
*/
16+
public class NetVisualizeView extends AudioVisualizeView{
17+
18+
19+
public NetVisualizeView(Context context) {
20+
super(context);
21+
}
22+
23+
public NetVisualizeView(Context context, @Nullable AttributeSet attrs) {
24+
super(context, attrs);
25+
}
26+
27+
public NetVisualizeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
28+
super(context, attrs, defStyleAttr);
29+
}
30+
31+
@Override
32+
protected void handleAttr(TypedArray typedArray) {
33+
34+
}
35+
36+
@Override
37+
protected void drawChild(Canvas canvas) {
38+
float radius = 150;
39+
mStrokeWidth = (float) ((Math.PI * 2 * radius - (mSpectrumCount - 1) * mItemMargin) / mSpectrumCount * 1.0f);
40+
mPaint.setStyle(Paint.Style.STROKE);
41+
mPaint.setStrokeWidth(2);
42+
canvas.drawCircle(centerX, centerY, radius, mPaint);
43+
44+
mPaint.setStrokeWidth(mStrokeWidth);
45+
mPaint.setStyle(Paint.Style.FILL);
46+
mPath.moveTo(0, centerY);
47+
for (int i = 0; i < mSpectrumCount; i++) {
48+
if (mRawAudioBytes[i] < 0) {
49+
mRawAudioBytes[i] = 127;
50+
}
51+
52+
double angel = ((360d/ mSpectrumCount *1.0d) * (i+1));
53+
double startX = centerX + (radius + mStrokeWidth/2) * Math.sin(Math.toRadians(angel));
54+
double startY = centerY + (radius + mStrokeWidth/2) * Math.cos(Math.toRadians(angel));
55+
double stopX = centerX + (radius + mStrokeWidth/2 + mSpectrumRatio * mRawAudioBytes[i]) * Math.sin(Math.toRadians(angel));
56+
double stopY = centerY + (radius + mStrokeWidth/2 + mSpectrumRatio * mRawAudioBytes[i]) * Math.cos(Math.toRadians(angel));
57+
canvas.drawLine((float) startX, (float) startY, (float) stopX, (float) stopY, mPaint);
58+
if (i == 0) {
59+
mPath.moveTo((float) startX, (float) startY);
60+
}
61+
mPath.lineTo((float) stopX, (float) stopY);
62+
}
63+
mPaint.setStyle(Paint.Style.STROKE);
64+
canvas.drawPath(mPath, mPaint);
65+
mPath.reset();
66+
}
67+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.zjy.audiovisualize.view;
2+
3+
import android.content.Context;
4+
import android.content.res.TypedArray;
5+
import android.graphics.Canvas;
6+
import android.graphics.Paint;
7+
import android.util.AttributeSet;
8+
9+
import androidx.annotation.Nullable;
10+
11+
/**
12+
* Date: 2020/11/30
13+
* Author: Yang
14+
* Describe:
15+
*/
16+
public class ReflectVisualizeView extends AudioVisualizeView{
17+
18+
public ReflectVisualizeView(Context context) {
19+
super(context);
20+
}
21+
22+
public ReflectVisualizeView(Context context, @Nullable AttributeSet attrs) {
23+
super(context, attrs);
24+
}
25+
26+
public ReflectVisualizeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
27+
super(context, attrs, defStyleAttr);
28+
}
29+
30+
@Override
31+
protected void handleAttr(TypedArray typedArray) {
32+
33+
}
34+
35+
@Override
36+
protected void drawChild(Canvas canvas) {
37+
mStrokeWidth = (mRect.width() - (mSpectrumCount - 1) * mItemMargin) / mSpectrumCount * 1.0f;
38+
mPaint.setStrokeWidth(mStrokeWidth);
39+
mPaint.setStyle(Paint.Style.FILL);
40+
for (int i = 0; i < mSpectrumCount; i++) {
41+
if (mRawAudioBytes[i] < 0) {
42+
mRawAudioBytes[i] = 127;
43+
}
44+
canvas.drawLine(mRect.width() * i / mSpectrumCount, mRect.height() / 2,mRect.width() * i / mSpectrumCount, 2 + mRect.height() / 2 - mSpectrumRatio * mRawAudioBytes[i], mPaint);
45+
canvas.drawLine(mRect.width() * i / mSpectrumCount, mRect.height() / 2,mRect.width() * i / mSpectrumCount, 2 + mRect.height() / 2 + mSpectrumRatio * mRawAudioBytes[i], mPaint);
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)