Я провел всю ночь, пытаясь понять, почему я не могу нарисовать серию растровых изображений, полностью прилегающих друг к другу (без промежутков между ними), используя 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)
просто возвращает целочисленный массив значений пикселей для отрисовываемого вертикального окна.
Вот скриншот, чтобы показать, о чем я говорю.Изображение выглядит так, как будто оно позади крошечного тюремные решетки, и я хотел бы избавиться от них.
Спасибо!