Оптимизация пользовательского ImageView, который часто обновляется путем вызова onDraw - PullRequest
1 голос
/ 01 июня 2011

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

Это то, что я делаю в моем onDraw Custom ImageView

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    Log.e(TAG, "onDraw called");

    for (int i=0; i < bitmapList.size(); i++){
        drawBitmap(canvas, bitmapList.get(i));
    }
}

Как видите, я перерисовываю все растровые изображения в списке каждый раз, когда onDraw вызывается естественным образом, когда число растровых изображений превышает 4-5, скажем, операция становится очень дорогой и замедляет работу приложения.

Любое решение этой проблемы относительно того, как это может быть оптимизировано?

  1. Может ли вызов drawBitmap в другом потоке сделать операцию менее дорогой?

  2. Есть ли способ сохранить копию предыдущего холста, а затем просто восстановить ее в onDraw, а не рисовать все растровые изображения снова?

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

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Вы должны создать Bitmap, размер которого должен быть равен размеру изображения ImageView, и нарисовать все растровые изображения из bitmapList на этом растровом изображении только один раз.При каждом вызове onDraw() вы должны рисовать только этот битовый массив.Когда bitmapList изменяется, это дополнительное растровое изображение должно быть воссоздано.

1 голос
/ 01 июня 2011

Вы можете использовать изображение backbuffer для рисования всех ваших изображений, когда они меняются, а затем рисовать только изображение backbuffer на экране в onDraw ()

// create backbuffer and draw it as seldom as possible
final Bitmap bufferBitmap = Bitmap.createBitmap(320, 240, Bitmap.Config.ARGB_8888);
final Canvas bufferCanvas = new Canvas(bufferBitmap);
for (int i=0; i < bitmapList.size(); i++){
  drawBitmap(bufferCanvas, bitmapList.get(i));
  }

// draw the buffered image as often as needed
canvas.drawBitmap(bufferBitmap ...);
...