我正在开发一个应用程序,它或多或少地将二维值矩阵绘制到画布上。该矩阵的值被缩放到 Alpha 级别以说明强度,并且矩阵的坐标简单地从行和列索引外推。下面是我的 onDraw 例程。
public void onDraw(Canvas canvas, float [][] spectrum, float nsegs,int seglen) {
//canvas.translate(0,0);
//alpha = 0;
int canHeight = canvas.getHeight();
int canWidth = canvas.getWidth();
//float[] array = generateData(512);
float [] spec = new float[seglen];
final float bw = (float)(canWidth-2)/nsegs;
final float bh = (float)(canHeight-2)/(float) seglen;
for (int i = 0;i<seglen;i++){
spec[i] = spectrum[i][index]; // One column at a time
}
float max = maxVal(spec);
float min = minVal(spec);
xcoor = index;
for (int n = 0; n < seglen; n++){
//Scale value to alpha (0-255)
alpha =(int)Math.round((((spec[n] - min)/max)*255.0));
ycoor = n;
paint.setAlpha(alpha);
canvas.drawPoint(xcoor,ycoor, paint);
}
index = (int) (index +1);
if (index == nsegs-1){
index = 0;
}
}
这里的油漆配置预定义为:
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.WHITE);
paint.setStrokeWidth(2);
该程序一次绘制一个像素,填充一列像素,该像素等于矩阵一列中元素的数量。然后它从下一列开始,上一列仍然显示,依此类推。在这个阶段,当所有列都已满时,它会再次从第一列开始,在之前的元素之上绘制。
问题:尽管已经绘制了拖尾柱,但它似乎会闪烁并四处跳动,Alpha 也是如此。我试图用 canvas.save() 和 canvas.restore() 来捕获整个画布并在打印一列后恢复它。我已经仔细检查了我所有的行和列索引以及 alpha 值,以确保坐标按需要递增(它们确实如此)。这与示例 APIdemo DrawPoints.java 非常相似,但存在三个主要区别。
- 我使用的是 DrawPoint 而不是 DrawPoints,并且
- 我不使用“canvas.setColour”,因为它会从画布中删除拖尾列。
- 此 onDraw 函数在扩展 SurfaceView 的 Thread 中运行
任何想法将不胜感激,感谢您的宝贵时间。