我正在编写一个应该给我声音图的应用程序。 我正在为此使用graphview库。
像任何图一样,我有两个轴。幅度和时间轴。我使用两种方法绘制图形。第一种方法是绘制图形(drawGraph
)和添加一个单项(addEntry
)的方法。
我从PCM文件中获取幅度和时间数据(实际上我仅从PCM文件中获取幅度数据,但这不是重点),它们采用双精度数组的形式。
当我调用drawGraph
时,我使用一个简单的for循环分别提取每个点,然后使用drawGraph
绘制每个点。
SomeButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
double[] AmplitudeAxis = readPCM();
double[] TimeAxis= new double[AmplitudeAxis.length];
for (int i = 0; i < AmplitudeAxis.length; i++)
{
TimeAxis[i]=i;
}
drawGraph(TimeAxis,AmplitudeAxis);
}
private void drawGraph(double TimeAxis[], double AmplitudeAxis[])
{
for (int i=0; i<10000;i++)
{
addEntry(TimeAxis[i],AmplitudeAxis[i]);
}
}
private void addEntry(double a, double b)
{
series.appendData(new DataPoint(a, b), true, 500000);
}
如果我有少量样品,这很好用。 (1000以下) 但是,当我使用更多(1000-5000)时,该应用程序冻结了几秒钟,几秒钟后,所有样本均显示在图表上。 但是,当我有大量样本时,该应用程序将完全冻结。
由于某些原因,当我使用appendata
时,它不会在图形上绘制点。但是它要等到drawGraph
完成给出新点以绘制图形之后。
引人注意的第一件事是,仅在drawGraph
中的for循环完成之后才绘制图形。我希望在series.appendData(...)
之后画点。
我希望该应用程序冻结,因为它必须在任何时候处理太多点。任何人都对此有经验(甚至可以更好地解决此问题)?