Android:使用 DrawPoint() 的 onDraw 方法导致 Canvas 上的抖动和失真

标签 android animation android-canvas ondraw

我正在开发一个应用程序,它或多或少地在 Canvas 上绘制一个二维值矩阵。该矩阵的值按比例缩放到 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   paint = new Paint();
            paint.setStyle(Paint.Style.FILL);
    paint.setColor(Color.WHITE);
    paint.setStrokeWidth(2);

该程序一次绘制一个像素,填充一列像素等于矩阵一列中的元素数。然后它从下一列开始,上一列仍然显示,依此类推。在这个阶段,当所有列都已满时,它会再次从第一列开始,在之前的元素之上绘制。

问题:尽管已绘制尾柱,但它似乎在闪烁和跳跃,Alpha 也是如此。我曾尝试使用 canvas.save() 和 canvas.restore() 来捕获整个 Canvas 并在打印一列后将其恢复。我已经仔细检查了我所有的行和列索引以及 alpha 值,以确保坐标按需要递增(他们确实这样做了)。这与示例 APIdemo DrawPoints.java 非常相似,但存在三个主要区别。

  1. 我使用的是 DrawPoint 而不是 DrawPoints,并且
  2. 我不使用“canvas.setColour”,因为它会从 Canvas 中删除拖尾列。
  3. 此 onDraw 函数在扩展 SurfaceView 的线程中运行

如有任何想法,我们将不胜感激,感谢您抽出宝贵时间。

最佳答案

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

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

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

关于Android:使用 DrawPoint() 的 onDraw 方法导致 Canvas 上的抖动和失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7605116/

相关文章:

android - 使用加速度计移动对象

java - ArrayList 中的 Android Studio html View

android - "Enable foldable display"即使将 android studio 更新到版本 3.5 并将 android 模拟器更新到 29.1.12 也不会显示

flutter - 如何在 flutter 中使用 AnimatedPositioned 的 AnimatedSize 子项?

html - 单击另一个 div 时如何为 div 设置动画以及如何使动画 div 移动其他元素

android - 保存 Canvas 以供将来使用

Android 6 Nexus 5 USB 连接问题

java - 如何获取drawable中图片的照片名称?

ios - Scenekit:两个 SCNNode 之间的角度

android - SurfaceHolder.lockCanvas() 返回 null