2015-08-27 10 views
1

Я пытаюсь создать и визуализировать представление полностью вне экрана. Во-первых, я пытался (от 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); 
    } 
}); 

Но все та же.

+0

Пробужденная диспетчерская доставка (c)? Я знаю, что она защищена ... также если вы r view является 'ViewGroup', вы не можете называть' draw' сразу после вызова 'layout', вам нужно, чтобы представление было« выложено »на самом деле – pskink

+0

@pskink реализация по умолчанию в представлении (что является моим случаем) ничего не делает:'/** * Вызывается рисованием, чтобы нарисовать вид ребенка. Это может быть переопределено * по производным классам, чтобы получить контроль непосредственно перед его рисунками * (но после того, как его собственный вид был нарисован). * @param холст холст, на котором нарисовать вид */ защищен недействительным dispatchDraw (холст холст) { } '' –

+0

вызов draw'/'dispatchDraw' в' Runnable', который передается в 'View # post (Runnable) ', чтобы убедиться, что ваш взгляд« выложен ». – pskink

ответ

3
int sizePixels = 1080; 

Bitmap result = Bitmap.createBitmap(sizePixels, sizePixels, Bitmap.Config.ARGB_8888); 
Canvas c = new Canvas(result); 

// measure view first 
int sizeSpec = View.MeasureSpec.makeMeasureSpec(sizePixels, View.MeasureSpec.EXACTLY); 
view.measure(sizeSpec, sizeSpec); 

// then layout 
int width = view.getMeasuredWidth(); 
int height = view.getMeasuredHeight(); 
view.layout(0, 0, width, height); 

// now you can draw it 
view.draw(c); 
+0

супер! это сработало отлично! –

+0

Я использовал это для отображения экрана и подачи его на принтер в виде растрового изображения. большое спасибо – Amare

0

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

Попробуйте этот процесс:

  1. Накачайте вид на существующий viewtree. (Вы могли бы framelayout, что, как правило, скрыты в кириллице

  2. Добавить onGlobalLayoutChangedListener к мнению, измерить вид и захватить растровое

    ViewTreeObserver vto = view.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); canvas.drawColor(Color.WHITE); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); view.draw(canvas); }};

Edit:.. К сожалению о форматирование, инструмент отступа, похоже, сейчас не работает для меня

+0

это не сработало. все такой же. –