Как нарисовать соседние растровые изображения на холсте в Android?

Я провел всю ночь, пытаясь понять, почему я не могу нарисовать серию растровых изображений, полностью прилегающих друг к другу (без промежутков между ними), используя Android.

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

Я знаю, что описанный ниже подход в конечном итоге сломается, когда приложение попытается отрисовать размеры экрана, но пока я не беспокоюсь об этом. Проблема, которую я хотел бы решить, заключается в том, что приведенный ниже код приводит к разрыву в один пиксель между нарисованными растровыми изображениями, когда я действительно хотел бы, чтобы они были абсолютно смежными.

Это метод run() для моего потока таймера:

    public void run() {
        Canvas c = null;
        try {
            c = sh.lockCanvas(null);
            synchronized(sh) {
                doDraw(c);
            }
        } finally {
            if (c!=null) {
                sh.unlockCanvasAndPost(c);
            }
        }
    }

Это метод doDraw(), который рисует растровые изображения, а затем переходит к концу этого нарисованного растрового изображения, чтобы нарисовать следующее. Он просто делает это, увеличивая поле 'windowsDrawn':

    private void doDraw(Canvas canvas) {
        canvas.drawBitmap(spec.getBitmapWindow(windowsDrawn), 0, 1, windowsDrawn, 0, 1, h, false, null);
        System.out.println("Windows drawn: "+windowsDrawn);
        windowsDrawn++;
    }

spec.getBitmapWindow(windowsDrawn) просто возвращает целочисленный массив значений пикселей для отрисовываемого вертикального окна.

Вот скриншот, чтобы показать, о чем я говорю.Изображение выглядит так, как будто оно позади крошечного тюремные решетки, и я хотел бы избавиться от них.

Спасибо!


person Ben Elliott    schedule 22.12.2013    source источник


Ответы (1)


Я узнал, что я делаю неправильно. Эффект «тюремных решеток» на самом деле был побочным эффектом того, что я писал добавочные обновления для заднего буфера, который, по-видимому, время от времени переворачивался (следовательно, терялись некоторые из моих обновлений для другого буфера, что давало черные вертикальные линии). Проблема была решена путем обеспечения того, чтобы я вместо этого записывал в растровое изображение буфера, а затем каждый раз перерисовывал весь кадр. Инкрементальные обновления экрана (как я пытался сделать) не разрешены в Android.

person Ben Elliott    schedule 22.12.2013