2011-09-30 138 views
1

我正在开发一个应用程序,它或多或少地向画布绘制二维值矩阵。该矩阵的值被缩放到Alpha级别以说明强度,并且矩阵的坐标仅从行和列索引中外推。以下是我的onDraw例程。Android:使用DrawPoint()导致画布上的抖动和失真的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

线程任何想法的将不胜感激工作,感谢您的时间。

回答

1

在上面的例子中,我使用的是SurfaceView而不是View。从Android开发人员文档中删除

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

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