Я пытаюсь создать и визуализировать представление полностью вне экрана. Во-первых, я пытался (от http://arpitonline.com/2012/07/17/capturing-bitmaps-of-views-in-android/):Android вне экрана выглядит привлекает только его фон и ничего больше
Bitmap result = Bitmap.createBitmap(1080, 1080, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(result);
view.layout(0, 0, 1080, 1080);
view.draw(c);
return result;
Она вынесла цвет фона только моего вида. Это правильный размер и правильный цвет фона, но содержимое полностью пуст. Потом я наткнулся на это:
view.layout(0, 0, 1080, 1080);
view.invalidate();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bmp = view.getDrawingCache();
Bitmap result = bmp.copy(Bitmap.Config.ARGB_8888, false);
view.destroyDrawingCache();
return result;
Но опять же, это дает тот же результат: правильный размер и цвет фона с пустым содержанием. В моем представлении много представлений, я установил на них много свойств, нет нулевых указателей и т. Д., Все правильно настроено. Но они просто не нарисованы. Почему это произойдет?
UPDATE: Как предложил psking, я переместил чертежный логику View#post
, но это все та же (хотя это занимает больше времени, чтобы стрелять завершение, которое может быть ключом к виду на самом деле делать что-то). Пробовал оба метода:
(завершение моя функция, которая принимает Bitmap)
final Bitmap result = Bitmap.createBitmap(1080, 1080, Bitmap.Config.ARGB_8888);
final Canvas c = new Canvas(result);
view.layout(0, 0, 1080, 1080);
view.post(new Runnable() {
@Override
public void run() {
view.draw(c);
completion.call(result);
}
});
и
view.layout(0, 0, 1080, 1080);
view.invalidate();
view.setDrawingCacheEnabled(true);
view.post(new Runnable() {
@Override
public void run() {
view.buildDrawingCache();
Bitmap bmp = view.getDrawingCache();
Bitmap result = bmp.copy(Bitmap.Config.ARGB_8888, false);
view.destroyDrawingCache();
completion.call(result);
}
});
Но все та же.
Пробужденная диспетчерская доставка (c)? Я знаю, что она защищена ... также если вы r view является 'ViewGroup', вы не можете называть' draw' сразу после вызова 'layout', вам нужно, чтобы представление было« выложено »на самом деле – pskink
@pskink реализация по умолчанию в представлении (что является моим случаем) ничего не делает:'/** * Вызывается рисованием, чтобы нарисовать вид ребенка. Это может быть переопределено * по производным классам, чтобы получить контроль непосредственно перед его рисунками * (но после того, как его собственный вид был нарисован). * @param холст холст, на котором нарисовать вид */ защищен недействительным dispatchDraw (холст холст) { } '' –
вызов draw'/'dispatchDraw' в' Runnable', который передается в 'View # post (Runnable) ', чтобы убедиться, что ваш взгляд« выложен ». – pskink