Я создал собственный 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, а не снова рисовать все растровые изображения?
В основном вопрос заключается в обновлении представления с большим количеством динамических изображений на нем и его оптимизации.
Вы должны создать Bitmap
, размер которого должен быть равен размеру ImageView
и вывести все растровые изображения из bitmapList
в это растровое изображение только один раз. На каждом вызове onDraw()
вы должны рисовать только это растровое изображение. Когда изменяется bitmapList
, эта дополнительная растровая карта должна быть воссоздана.
Вы можете использовать образы 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 ...);