Как использовать SurfaceView для рисования одного сложного изображения - PullRequest
0 голосов
/ 08 марта 2012

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

Для рисования изображения на телефоне Nexus S dev требуется от 5 до 15 секунд.

Чтобы поддерживать поток пользовательского интерфейса, это похоже на цель класса SurfaceView. Почти все примеры SurfaceView имеют дело с анимацией, а не с одним сложным изображением. Как только изображение будет нарисовано / отрендерено, я не буду его менять, пока пользователь

Итак, SurfaceView правильный компонент для использования? Если да, могу ли я получить обратный вызов от SurfaceView или его внутреннего потока, когда он завершит рисование, когда завершит рендеринг изображения? Обратный вызов, так что я знаю, что можно переключать блочную версию графического изображения с низким разрешением на версию с высоким разрешением?

Есть ли альтернатива SurfaceView, которая лучше подходит для комплексного рендеринга отдельных изображений. (Не анимация.)

ура!

1 Ответ

1 голос
/ 09 марта 2012

Если все, что вам нужно сделать, это визуализировать одно сложное изображение в другом потоке, чтобы пользовательский интерфейс оставался отзывчивым, то после того, как он завершит рендеринг, фактически нарисуйте его, вы можете рассмотреть возможность сделать это в стандартном keep-work-off-the- UI-поток, используя что-то вроде AsyncTask. Это не то, что вы делаете композитинг или что-то, что действительно специфично для GPU (если, как другие не предложили, вы можете перенести фактические расчеты рендеринга в GPU).

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

Если, с другой стороны, вы хотите, чтобы ваше изображение отображалось попиксельно, то, возможно, SurfaceView может быть разумным выбором, и в этом случае это будет в основном анимация, чтобы вы могли следовать другим учебникам. Есть и другие настройки, но главное - переопределить onDraw, и тогда вам, вероятно, придется использовать Canvas.drawPoint для рисования каждого пикселя.

...