Оптимизация пользовательского ImageView, который часто обновляется путем вызова onDraw

1

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

Это то, что я делаю в своем onDraw пользовательского 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, операция становится очень дорогой и замедляет приложение вниз.

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

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

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

  • В основном вопрос заключается в обновлении представления с большим количеством динамических изображений на нем и его оптимизации.

  • 0
    Привет Правин, у тебя есть решение этой проблемы, я тоже столкнулся с той же проблемой. Пожалуйста, поделись своими выводами.
Теги:
android-layout
android-imageview

2 ответа

3
Лучший ответ

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

  • 0
    Спасибо за ответ, который я попробовал, и он действительно улучшает производительность, однако использование traceview показывает, что теперь метод, который создает bufferCanvas, занимает это время. Хотя это улучшает производительность, так как теперь мне не нужно рисовать все растровые изображения каждый раз, когда вызывается onDraw, это все еще медленно, когда мне нужно обновить буферы.
  • 0
    Вы можете попытаться создать новый буфер каждый раз, когда вам нужно обновить его, и вы можете сделать это из отдельного потока. Думаю, это заставит ваше приложение работать быстрее.
1

Вы можете использовать образы 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 ...);
  • 0
    ... в основном тот же ответ, который дал вам @Pixie .. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню