2011-07-12 1 views
0

У меня есть приложение для рисования в Android, которое позволяет пользователю рисовать пальцем, а затем сохраняет полученные фигуры как Android Path s. Чтобы разрешить пользователю удалять отдельные Path s, которые они нарисовали, я применил this solution, который использует ограничивающий Rect для каждого Path, а затем использует внутренний многомерный двоичный массив для представления пикселей внутри ограничивающего Rect. Затем я заполняю массив, беря контрольные точки Пути и отслеживая его по математическому уравнению для квадратичной кривой Безье, устанавливая каждый элемент в массиве, который должен иметь пиксель под ним до 1.Проблемы столкновения/решения Android Path

Используя приведенную выше настройку, когда в режиме стирания я сначала проверяю на столкновение между пальцем пользователя и ограничивающим Rect, и если это происходит, я затем проверяю, установлен ли пиксель, затронутый пользователем, в массиве 1.

Теперь, когда пользователь загружает заметку, я загружаю все фигуры в объекты «stroke» ArrayList, чтобы затем я мог легко их отображать и прокручивать их, проверяя на столкновение в режиме стирания. Я также храню Rect и двоичный массив с штрихами в пользовательском объекте. Все работает так, как ожидалось, но объем памяти для хранения всех этих данных, в частности двоичного массива для ограничивающего ограничителя Rect пути, становится дорогим, и когда пользователь имеет большое количество штрихов, я получаю java.lang.OutOfMemoryError на части мой код, который создает массив для каждого штриха.

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

Спасибо,

Пол

ответ

0

Что такое фактическое представление "двоичный массив"? Я думаю, если вы настроите представление, чтобы отразить фактические данные, которые вам нужно сохранить (например, RLE кодирует биты: при этом y, начиная с этих x и для z пикселей), вы сможете хранить то, что вам нужно, без чрезмерного размера.

Сохранение фактического массива байтов с байтом на пиксель или на 8 пикселей (если это то, что вы делаете) для этого не требуется.

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

+0

Представление - это растровое изображение, поэтому массив имеет тип int и имеет размеры rect_width, rect_height. Хм, подумал о вычислении растрового изображения на лету, но думал, что это может быть слишком дорогостоящим с точки зрения производительности (хотя у меня может не быть выбора, очевидно). RLE тоже может работать, поэтому в основном я бы сохранил инструкции RLE для Path, и, пытаясь обнаружить, если точка X, Y попадает в Путь, я прослежу вдоль RLE? –

+0

@Paul - У вас есть несколько вариантов для RLE; один для каждого y в ограничивающей коробке хранит пересечение пути и что y как объекты (x, run_length) (это кривая Безье, поэтому для каждого y будет максимум два, я думаю ...) – antlersoft