Erstellen Sie einen Spektrumanalysator mit einer Android-App, die den Ton von einem Mikrofon erfasst, die Frequenz analysiert und das Spektrum anzeigt. (Ich habe es nicht veröffentlicht, weil ich nichts machen kann, was veröffentlicht wird) ** Außerdem bleibt das Problem bestehen. ** ** **
Die Grafikzeichnungsbibliothek [MPAndroidChart] wird verwendet.
Bearbeiten Sie build.gradle, um MPAndroidChart zu installieren. Es gibt zwei Arten von build.gradle, direkt unter dem Stammverzeichnis des Projekts und im App-Ordner. Fügen Sie Folgendes hinzu, um build.gradle direkt unter dem Stammverzeichnis zu erstellen
build.gradle(Project)
allprojects {
repositories {
maven {
url "https://jitpack.io"
}
}
}
Fügen Sie build.gradle im App-Ordner Folgendes hinzu
build.gradle(app)
dependencies {
implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
}
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
//In der Hauptaktivität
public LineChart lineChart;
//in onCreate
lineChart = findViewById(R.id.line_chart);
initChart();
//Innerhalb von onCheckedChanged (weil ich Switch verwende)
fft = new Thread(new Runnable() {
@Override
public void run() {
//Nach der Verarbeitung wie Fourier-Transformation
setData(decibelFrequencySpectrum);
}
});
fft.start();
InitChart-Methode zum Initialisieren des Diagramms
initChart
public void initChart() {
lineChart.setTouchEnabled(true);
lineChart.setDragEnabled(false);
//Rasterhintergrundfarbe
lineChart.setDrawGridBackground(true);
// no description text
lineChart.getDescription().setEnabled(true);
lineChart.setBackgroundColor(Color.LTGRAY);
LineData data = new LineData();
data.setValueTextColor(Color.BLACK);
// add empty data
lineChart.setData(data);
//Die vertikale Gitterachse ist unterbrochen
XAxis xAxis = lineChart.getXAxis();
xAxis.setAxisMaximum(2048);
xAxis.setAxisMinimum(0);
xAxis.enableGridDashedLine(10f, 10f, 0f);
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
YAxis leftAxis = lineChart.getAxisLeft();
//Maximale / minimale Einstellung der Y-Achse
leftAxis.setAxisMaximum(0f);
leftAxis.setAxisMinimum(-150f);
//Die horizontale Gitterachse ist unterbrochen
leftAxis.enableGridDashedLine(10f, 10f, 0f);
leftAxis.setDrawZeroLine(true);
//Skalieren Sie rechts
lineChart.getAxisRight().setEnabled(false);
}
SetData-Methode, die mit einem Mikrofon aufzeichnet und Fourier-transformierte Daten zeichnet
setData
public void setData(double[] data) {
ArrayList<Entry> values = new ArrayList<>();
for (int i = 0; i < data.length; i++) {
values.add(new Entry(i, (int)data[i], null, null));
}
LineDataSet set1;
if (lineChart.getData() != null && lineChart.getData().getDataSetCount() > 0) {
set1 = (LineDataSet) lineChart.getData().getDataSetByIndex(0);
set1.setValues(values);
lineChart.getData().notifyDataChanged();
lineChart.notifyDataSetChanged();
} else {
// create a dataset and give it a type
set1 = new LineDataSet(values, "Spectrum");
set1.setDrawIcons(false);
set1.setColor(Color.rgb(0, 0, 240));
set1. setDrawCircles(false);
set1.setLineWidth(0.5f);
set1.setValueTextSize(0f);
set1.setDrawFilled(false);
set1.setFormLineWidth(1f);
set1.setFormLineDashEffect(new DashPathEffect(new float[]{10f, 5f}, 0f));
set1.setFormSize(15.f);
set1.setDrawValues(true);
ArrayList<ILineDataSet> dataSets = new ArrayList<>();
dataSets.add(set1); // add the datasets
// create a data object with the datasets
LineData lineData = new LineData(dataSets);
// set data
lineChart.setData(lineData);
}
}
Das Diagramm wird korrekt angezeigt. Drücken Sie oben links auf Schalter, um die Aufnahme zu starten und das Spektrum zu zeichnen.
Wenn ich Schalter drücke, beginnt die Aufnahme, aber die Grafik wird nicht gezeichnet. Warum?
Es wurde gezeichnet. Die Grafik bewegt sich nicht, wenn Sie Ihre Hand loslassen. Wenn Sie es berühren, wird das Diagramm aktualisiert. Warum?
Ich habe lineChart.setTouchEnabled (True)
in False
in initChart geändert, aber diesmal ist es überhaupt verschwunden. Es gibt keine Änderung, auch wenn Sie das Diagramm berühren.
~~ Bitte sag mir, wie ich mich verbessern kann ~~
LineChart.invalidate ()
hinzugefügt, um das Diagramm auf die setData-Methode im fft-Thread zu aktualisieren.
Ich habe immer noch einen Fehler. Die Ursache ist ein Fehler, der durch den Versuch verursacht wird, die Benutzeroberfläche in einem anderen Thread als dem Hauptthread zu ändern.
Daher wird es gelöst, indem der Hauptthread aufgefordert wird, die setData-Methode mit Handler
zu verarbeiten.
Klicken Sie hier für neuen Code
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
//In der Hauptaktivität
public LineChart lineChart;
//in onCreate
lineChart = findViewById(R.id.line_chart);
initChart();
//Innerhalb von onCheckedChanged (weil ich Switch verwende)
fft = new Thread(new Runnable() {
@Override
public void run() {
//Nach der Verarbeitung wie Fourier-Transformation
handler.post(new Runnable() {
@Override
public void run() {
setData(decibelFrequencySpectrum);
}
});
}
});
fft.start();
setData
public void setData(double[] data) {
ArrayList<Entry> values = new ArrayList<>();
for (int i = 0; i < data.length; i++) {
values.add(new Entry(i, (int)data[i], null, null));
}
LineDataSet set1;
if (lineChart.getData() != null && lineChart.getData().getDataSetCount() > 0) {
set1 = (LineDataSet) lineChart.getData().getDataSetByIndex(0);
set1.setValues(values);
lineChart.getData().notifyDataChanged();
lineChart.notifyDataSetChanged();
lineChart.invalidate();
} else {
// create a dataset and give it a type
set1 = new LineDataSet(values, "Spectrum");
set1.setDrawIcons(false);
set1.setColor(Color.rgb(0, 0, 240));
set1. setDrawCircles(false);
set1.setLineWidth(0.5f);
set1.setValueTextSize(0f);
set1.setDrawFilled(false);
set1.setFormLineWidth(1f);
set1.setFormLineDashEffect(new DashPathEffect(new float[]{10f, 5f}, 0f));
set1.setFormSize(15.f);
set1.setDrawValues(true);
ArrayList<ILineDataSet> dataSets = new ArrayList<>();
dataSets.add(set1); // add the datasets
// create a data object with the datasets
LineData lineData = new LineData(dataSets);
// set data
lineChart.setData(lineData);
}
}
Recommended Posts