Вы пытались изменить размер создаваемого растрового изображения, чтобы он был равен только границам клипа, а не всему размеру данного холста? Я не знаю, так ли это со всеми представлениями, но я обнаружил, что метод onDraw для некоторых представлений получает холст размером с экран, независимо от фактического размера содержимого. Затем он обрезает холст, ограничивая его только левым верхним углом, рисует там, а затем переводит эту часть куда-то на экран, когда он фактически готов отобразить весь макет. Другими словами, несмотря на то, что он имеет холст размером с весь экран, он на самом деле использует только его небольшой фрагмент. Так что вы можете попробовать вместо
Bitmap bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), ...)
Вы можете попробовать
Rect rect = canvas.getClipBounds();
int width = rect.width();
int height = rect.height();
Bitmap bitmap = Bitmap.createBitmap(width, height, ...);
Таким образом вы сокращаете накладные расходы при работе с намного большим битовым массивом, чем необходимо. Примечание. На самом деле я не пытался сделать это, так что это может не сработать, но стоит попробовать.