Android: метод onDraw с использованием DrawPoint () вызывает дрожание и искажение на холсте - PullRequest
1 голос
/ 30 сентября 2011

Я разрабатываю приложение, которое рисует более или менее двумерную матрицу значений на холсте.Значения этой матрицы масштабируются до альфа-уровней, чтобы проиллюстрировать интенсивность, а координаты матрицы просто экстраполируются из индексов строк и столбцов.Ниже моя подпрограмма 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);

Эта программа рисует один пиксель за раз, заполняет один столбец пикселей, равныйколичество элементов в столбце матрицы.Затем он начинается со следующего столбца, где предыдущий столбец все еще отображается, и так далее.На этом этапе, когда все столбцы заполнены, он снова начинается с первого столбца, рисуя поверх предыдущих элементов.

Проблема: Хвостовые колонки, хотя уже нарисованы, кажутся мерцающими и прыгают, как и Альфа.Я попытался использовать canvas.save () и canvas.restore (), чтобы захватить весь холст и восстановить его после печати столбца.Я дважды проверил все мои индексации строк и столбцов и альфа-значения, чтобы гарантировать приращение координат согласно желанию (и они делают).Это очень похоже на пример APIdemo DrawPoints.java, однако есть три основных отличия.

  1. Я использую DrawPoint, а не DrawPoints, и
  2. Я не использую "canvas.setColour", так как он удаляет хвостовые столбцы с холста.
  3. ЭтоФункция onDraw работает в потоке, который расширяет SurfaceView

Любая идея будет принята с благодарностью, спасибо за ваше время.

1 Ответ

1 голос
/ 18 июня 2012

В случае выше, я использовал SurfaceView вместо View. Из документации для разработчиков Android

Примечание. При каждом проходе холста из SurfaceHolder вы сохраняете предыдущее состояние холста. Чтобы правильно анимировать вашу графику, вы должны перекрасить всю поверхность. Например, вы можете очистить предыдущее состояние холста, заполнив цвет с помощью drawColor () или установив фоновое изображение с помощью drawBitmap (). В противном случае вы увидите следы ранее выполненных рисунков.

Решение, каждый раз перерисовывайте весь холст, чтобы избежать дрожания.

...