2014-11-23 84 views
1

我以编程方式在Android中生成视图。父视图是RelativeLayout,我将动态添加子视图(例如,TextViewImageView)。以编程方式生成视图并捕获位图

如果我将视图添加到我的活动的主视图,那么它显示正常(就像预期的那样)。使用此代码。

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

那么,你肯定没有在measure()之后致电layout(),这里需要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

好,所以有点工作,谢谢(我现在可以看到一个图像),但不幸的是它没有在位图中布置子视图,就像直接将视图添加为子视图一样。有没有办法让视图认为它被添加为活动视图的子视图而不实际添加它? – 2014-11-23 16:09:22

+0

@ThomasClayson:不是我所知道的。然而,有一个'RelativeLayout'的根可能是你的问题。尝试将其封装在其他某个东西(例如'FrameLayout')或切换到不同于'RelativeLayout'的不同容器类。 'RelativeLayout'只在知道它的父亲时才有效,在你的情况下,它没有父亲。 – CommonsWare 2014-11-23 16:12:34

+0

完美。我添加了一个额外的FrameLayout作为我的RelativeLayout的父视图,它现在正在工作!非常感谢你。 – 2014-11-23 16:36:31