Рисование на холсте - PullRequest
       8

Рисование на холсте

3 голосов
/ 21 марта 2010

Я пишу приложение для Android, которое рисует непосредственно на холсте при событии onDraw в View.

Я рисую что-то, что включает рисование каждого пикселя отдельно, для этого я использую что-то вроде:

for (int x = 0; x < xMax; x++) {
  for (int y = 0; y < yMax; y++){
    MyColour = CalculateMyPoint(x, y);
    canvas.drawPoint(x, y, MyColour);
  }
}

Проблема здесь в том, что рисование занимает много времени, так как процедура CalculateMyPoint - довольно дорогой метод.

Существует ли более эффективный способ рисования на холсте, например, нужно ли рисовать на растровом изображении, а затем рисовать все растровое изображение на холсте в событии onDraw? Или, может быть, оцените мои цвета и заполните массив, который метод onDraw может использовать для рисования холста?

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

1 Ответ

5 голосов
/ 22 марта 2010

Как уже указывали люди, если метод CalculateMyPixel () стоит дорого, то вызов 150 000 (HVGA) или 384,00 раз (WVGA) просто убьет вас.

Кроме того, попытка нарисовать ваш интерфейс в виде отдельных пикселей с помощью canvas.drawPoint () каждый раз, когда происходит обновление, является едва ли не наименее эффективным способом сделать это.

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

Тогда вы можете выбрать лучший способ управления этим растровым изображением. Это самое простое - просто сделать объект Bitmap нужного размера и использовать там API для его заполнения.

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

Теперь вы можете переместить вычисление пикселей из метода onDraw (), который должен быть быстрым, чтобы иметь отзывчивый пользовательский интерфейс, и заполнить ваши пиксели где-нибудь еще. Может быть, вы рассчитываете их один раз во время инициализации. Возможно, вы их вычисляете и делаете выборочные обновления только тех частей, которые были изменены перед вызовом invalidate () (например, изменились пиксели из (0,0) - (10, l0), поэтому возьмите текущий битовый массив и просто измените эту область ). Если вычисление пикселей на самом деле просто медленное, вам, вероятно, потребуется создать отдельный поток для выполнения этой работы (обновление растрового изображения новыми пикселями, а затем postInvalidate () в пользовательском интерфейсе для их отрисовки).

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

...