Skip to content

Commit 4f67b6e

Browse files
committed
feat: grain visualize
1 parent 1be0c55 commit 4f67b6e

File tree

8 files changed

+141
-2
lines changed

8 files changed

+141
-2
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
1. 支持自定义可视化颜色 <br/>
88
2. 支持本地路径、url、raw的音频路径读取,或自定义外部MediaPlayer传入音频数据渲染 <br/>
99
3. 支持自定义频谱展示数目 <br/>
10-
4. 支持多种可视化展示形式,包括圆形、水平、波浪、网状等 <br/>
10+
4. 支持多种可视化展示形式,包括圆形、水平、波浪、网状、粒子等 <br/>
1111
5. 支持AndroidX <br/>
1212

1313
## 效果预览
@@ -16,6 +16,7 @@
1616
![](https://github.com/GitHubZJY/AudioVisualizeView/blob/master/image/CircleVisualize.gif)
1717
![](https://github.com/GitHubZJY/AudioVisualizeView/blob/master/image/WaveVisualize.gif)
1818
![](https://github.com/GitHubZJY/AudioVisualizeView/blob/master/image/NetVisualize.gif)
19+
![](https://github.com/GitHubZJY/AudioVisualizeView/blob/master/image/GrainVisualize.gif)
1920

2021
## 如何使用
2122
在项目根目录的build.gradle添加:

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<activity android:name=".SingleVisualizeActivity"/>
2323
<activity android:name=".WaveVisualizeActivity"/>
2424
<activity android:name=".NetVisualizeActivity"/>
25+
<activity android:name=".GrainVisualizeActivity"/>
2526
</application>
2627

2728
</manifest>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.zjy.audiovisualizeview;
2+
3+
import android.os.Bundle;
4+
5+
import androidx.appcompat.app.AppCompatActivity;
6+
7+
import com.zjy.audiovisualize.view.AudioVisualizeView;
8+
9+
public class GrainVisualizeActivity extends AppCompatActivity {
10+
11+
private AudioVisualizeView vAudioVisualize;
12+
13+
@Override
14+
protected void onCreate(Bundle savedInstanceState) {
15+
super.onCreate(savedInstanceState);
16+
setContentView(R.layout.activity_grain_visualize);
17+
18+
vAudioVisualize = findViewById(R.id.audio_visualize_view);
19+
vAudioVisualize.doPlay(R.raw.sound);
20+
}
21+
22+
23+
@Override
24+
protected void onDestroy() {
25+
super.onDestroy();
26+
if (vAudioVisualize != null) {
27+
vAudioVisualize.release();
28+
}
29+
}
30+
}

app/src/main/java/com/zjy/audiovisualizeview/MainActivity.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
1717

18-
private TextView vReflect, vCircle, vSingle, vWave, vNet;
18+
private TextView vReflect, vCircle, vSingle, vWave, vNet, vGrain;
1919
private static final int RECORD_AUDIO = 10001;
2020
private static final int READ_EXTERNAL_STORAGE = 10002;
2121

@@ -29,11 +29,13 @@ protected void onCreate(Bundle savedInstanceState) {
2929
vSingle = findViewById(R.id.single_entrance);
3030
vWave = findViewById(R.id.wave_entrance);
3131
vNet = findViewById(R.id.net_entrance);
32+
vGrain = findViewById(R.id.grain_entrance);
3233
vSingle.setOnClickListener(this);
3334
vReflect.setOnClickListener(this);
3435
vCircle.setOnClickListener(this);
3536
vWave.setOnClickListener(this);
3637
vNet.setOnClickListener(this);
38+
vGrain.setOnClickListener(this);
3739

3840
PermissionUtils.requestPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO, RECORD_AUDIO);
3941
PermissionUtils.requestPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE);
@@ -58,6 +60,9 @@ public void onClick(View view) {
5860
case R.id.net_entrance:
5961
intent = new Intent(MainActivity.this, NetVisualizeActivity.class);
6062
break;
63+
case R.id.grain_entrance:
64+
intent = new Intent(MainActivity.this, GrainVisualizeActivity.class);
65+
break;
6166
}
6267
startActivity(intent);
6368
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent"
7+
android:orientation="vertical"
8+
android:background="#000000"
9+
tools:context=".MainActivity">
10+
11+
<com.zjy.audiovisualize.view.GrainVisualizeView
12+
android:id="@+id/audio_visualize_view"
13+
android:text="Hello World!"
14+
app:visualize_ratio="4"
15+
android:layout_width="match_parent"
16+
android:layout_height="match_parent"
17+
app:visualize_orientation="horizontal_line_top"
18+
app:layout_constraintBottom_toBottomOf="parent"
19+
app:layout_constraintLeft_toLeftOf="parent"
20+
app:layout_constraintRight_toRightOf="parent"
21+
app:layout_constraintTop_toTopOf="parent" />
22+
23+
</LinearLayout>

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,14 @@
6161
android:text="NetVisualizeView"
6262
android:textColor="#FFFFFF" />
6363

64+
<TextView
65+
android:id="@+id/grain_entrance"
66+
android:layout_width="match_parent"
67+
android:layout_height="60dp"
68+
android:layout_marginTop="16dp"
69+
android:background="@drawable/bg_entrance"
70+
android:gravity="center"
71+
android:text="GrainVisualizeView"
72+
android:textColor="#FFFFFF" />
73+
6474
</LinearLayout>
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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+
import com.zjy.audiovisualize.R;
12+
13+
import static com.zjy.audiovisualize.constants.VisualizeMode.HORIZONTAL_LINE_BOTTOM;
14+
import static com.zjy.audiovisualize.constants.VisualizeMode.HORIZONTAL_LINE_TOP;
15+
16+
/**
17+
* Date: 2020/11/30
18+
* Author: Yang
19+
* Describe: In GRAIN mode, show spectrum base on a horizontal line, with grain above of the center line.
20+
*/
21+
public class GrainVisualizeView extends AudioVisualizeView{
22+
23+
private int mOrientation;
24+
25+
26+
public GrainVisualizeView(Context context) {
27+
super(context);
28+
}
29+
30+
public GrainVisualizeView(Context context, @Nullable AttributeSet attrs) {
31+
super(context, attrs);
32+
}
33+
34+
public GrainVisualizeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
35+
super(context, attrs, defStyleAttr);
36+
}
37+
38+
@Override
39+
protected void handleAttr(TypedArray typedArray) {
40+
mOrientation = typedArray.getInteger(R.styleable.AudioVisualizeView_visualize_orientation, HORIZONTAL_LINE_TOP);
41+
}
42+
43+
@Override
44+
protected void drawChild(Canvas canvas) {
45+
mStrokeWidth = (mRect.width() - (mSpectrumCount - 1) * mItemMargin) / mSpectrumCount * 1.0f;
46+
mPaint.setStrokeWidth(mStrokeWidth);
47+
mPaint.setStyle(Paint.Style.FILL);
48+
for (int i = 0; i < mSpectrumCount; i++) {
49+
if (mRawAudioBytes[i] < 0) {
50+
mRawAudioBytes[i] = 127;
51+
}
52+
switch (mOrientation) {
53+
case HORIZONTAL_LINE_TOP:
54+
drawGrain(canvas, mRect.width() * i / mSpectrumCount, mRect.height() / 2, 2 + mRect.height() / 2 - mRawAudioBytes[i]);
55+
break;
56+
case HORIZONTAL_LINE_BOTTOM:
57+
drawGrain(canvas, mRect.width() * i / mSpectrumCount, mRect.height() / 2, 2 + mRect.height() / 2 + mRawAudioBytes[i]);
58+
break;
59+
default:
60+
break;
61+
}
62+
}
63+
}
64+
65+
private void drawGrain(final Canvas canvas, final float x, float startY, float endY) {
66+
canvas.drawPoint(x, endY, mPaint);
67+
canvas.drawPoint(x, mRect.height() / 4 + endY/2, mPaint);
68+
}
69+
}

image/GrainVisualize.gif

160 KB
Loading

0 commit comments

Comments
 (0)