2014-11-23 3 views
1

Я программно генерирую представление в Android. Родительский вид - это RelativeLayout, и я добавляю subviews динамически (например, TextView и ImageView).Программно сгенерировать растровое изображение и захват изображений

Если я добавлю представление в основной вид моей деятельности, тогда он отобразит прекрасный (как и ожидалось). Использование этого кода.

LinearLayout mainView = (LinearLayout)findViewById(R.id.mainView); 
mainView.addView(dynamicallyGeneratedView); 

Я не хочу добавлять представление в качестве подсмотра, хотя я просто хочу превратить его в растровое изображение. Поэтому я делаю следующее:

view.measure(View.MeasureSpec.UNSPECIFIED,View.MeasureSpec.UNSPECIFIED); 
Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 
Canvas c = new Canvas(b); 
view.draw(c); 

Но когда я добавляю это растровое изображение в ImageView, он ничего не показывает.

Что я делаю неправильно? Я хочу создать представление, превратить его в растровое изображение, но не отображает его на экране.

Любая помощь будет оценена по достоинству.

ответ

2

Ну, вам определенно не нужно звонить layout() после measure(), который необходим AFAIK здесь.

Не можете ли вы сойти с View.MeasureSpec.UNSPECIFIED и тому подобное, как getMeasuredWidth(), я не могу сказать, поскольку я этого не пробовал. Всякий раз, когда я вручную измерять и выложил View, я всегда использовал фактические размеры, такие как:

root=inflater.inflate(R.layout.add, null); 
root.measure(800, 480); 
root.layout(0, 0, 800, 480); 

Если Bitmap в настоящее время имеет полезный размер, но только не имеет никакого содержания, попробуйте layout() с размером прежде чем вы рисуете до Canvas. Если ваш Bitmap закончился с некоторым меньшим размером полезного размера (например, один или оба размера равны 0), вам, вероятно, нужно будет указать фактический размер, а не идти UNSPECIFIED.

+0

Хорошо, что сработало несколько, спасибо (теперь я вижу изображение), но, к сожалению, он не выделяет subviews в растровом изображении так же, как когда я добавляю представление как подвью непосредственно. Есть ли способ заставить мнение подумать о том, что он добавлен в качестве представления в представление активности, фактически не добавив его? –

+0

@ThomasClayson: Не то, что я знаю. Однако наличие корня «RelativeLayout», вероятно, является вашей проблемой. Попробуйте обернуть его чем-то другим (например, «FrameLayout») или переключиться на другой класс контейнера, чем «RelativeLayout». 'RelativeLayout' работает только в том случае, если он знает своего родителя, и в вашем случае у него нет родителя. – CommonsWare

+0

Отлично. Я добавил дополнительный FrameLayout в качестве родительского представления для моего RelativeLayout и теперь он работает! Большое спасибо. –