Android:使用DrawPoint()的onDraw方法在画布上引起抖动和失真

时间:2011-09-30 01:34:14

标签: android animation android-canvas ondraw

我正在开发一个应用程序,它或多或少地为画布绘制了二维值矩阵。该矩阵的值被缩放到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非常相似,但有三个主要区别。

  1. 我使用DrawPoint而非DrawPoints,
  2. 我不使用“canvas.setColour”,因为它会从画布中删除拖尾列。
  3. 此onDraw函数在扩展SurfaceView
  4. 的Thread中运行

    非常感谢任何想法,谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

在上面的例子中,我使用的是SurfaceView而不是View。超出Android开发者文档

注意:在每次传递中,您从SurfaceHolder中检索Canvas,将保留Canvas的先前状态。为了正确地为图形设置动画,必须重新绘制整个表面。例如,您可以通过使用drawColor()填充颜色或使用drawBitmap()设置背景图像来清除Canvas的先前状态。否则,您将看到先前执行的绘图的痕迹。

解决方案,每次都重新绘制整个画布以防止抖动。