layout - Android Problems Converting ViewGroup with Children into Bitmap -
i'm converting viewgroup (relativelayout) bitmap using canvas. however, when draw happens see viewgroup background drawable , not children (two textviews) should laid out within relativelayout using rules fill_parent.
the relativelayout created using following static function:
public static relativelayout createprogrammeview(context context, int width, int height, string title, string time) { relativelayout.layoutparams params; // layout root view (relativelayout) relativelayout rlv = new relativelayout(context); params = new relativelayout.layoutparams(width, height); rlv.setlayoutparams(params); rlv.setpadding(3, 3, 3, 3); rlv.setbackgroundresource(r.drawable.background); // layout title textview tv = new textview(context); params = new relativelayout.layoutparams(relativelayout.layoutparams.fill_parent, relativelayout.layoutparams.wrap_content); params.addrule(relativelayout.align_parent_top); params.addrule(relativelayout.align_parent_left); params.addrule(relativelayout.align_parent_right); tv.setid(r.id.title); tv.setlayoutparams(params); tv.setgravity(gravity.center_vertical); tv.setsingleline(true); tv.setellipsize(truncateat.end); tv.settextcolor(color.parsecolor("#fff")); tv.settextsize(11); tv.settext(title); rlv.addview(tv); // layout start time tv = new textview(context); params = new relativelayout.layoutparams(16, relativelayout.layoutparams.wrap_content); params.addrule(relativelayout.below, r.id.title); params.addrule(relativelayout.align_parent_left); params.setmargins(0, 4, 0, 0); tv.setid(r.id.time); tv.setlayoutparams(params); tv.setgravity(gravity.center_vertical); tv.setsingleline(true); tv.setellipsize(null); tv.settextcolor(color.parsecolor("#fff")); tv.settextsize(10); tv.settext(time); rlv.addview(tv); } return rlv; }
i use following turn relativelayout bitmap:
public static bitmap loadbitmapfromview(relativelayout v) { bitmap b = bitmap.createbitmap(v.getlayoutparams().width, v.getlayoutparams().height, bitmap.config.rgb_565); canvas c = new canvas(b); v.draw(c); return b; }
as expected gives me nice bitmap in dimensions require background drawable, children not in bitmap. call these functions quite lot build large image gets drawn onto custom view in activity.
this loop calls static function:
public static void renderviews(final context context) { largebitmap = bitmap.createbitmap(largewidth, largeheight, bitmap.config.rgb_565); canvas largecanvas = new canvas(largebitmap); (int = 0; < items.size(); i++) { int leftmargin = ...some calculations...; relativelayout newview = createprogrammeview(context, width, rowheight, "title", "21:00"); bitmap newviewbitmap = loadbitmapfromview(newview); largecanvas.drawbitmap(newviewbitmap, leftmargin, 0, new paint()); } mycustomview.invalidate(); }
my custom view overrides ondraw() function:
@override protected void ondraw(canvas canvas) { super.ondraw(canvas); canvas.drawbitmap(largebitmap, 0, 0, null); }
from can see believe because android doesn't call measure() on child views. have tried calling manually, doesn't solve problem.
so, guess know is, how can achieve converting relativelayout children bitmap , android measure children respect relative layout rules.
many can me work out.
rob
the problem you did not measure , layout container. must call v.measure(widthspec, heightspec)
, v.layout(left, top, right, bottom)
before drawing can work. first method make sure view knows how big want be, , second method ensure children positioned properly.
in case do:
v.measure(measurespec.makemeasurespec(v.getlayoutparams().width, measurespec.exactly), measurespec.makemeasurespec(v.getlayoutparams().height, measurespec.exactly)); v.layout(0, 0, v.getmeasuredwidth(), v.getmeasuredheight()); bitmap b = bitmap.createbitmap(v.getwidth(), v.getheight(), bitmap.config.rgb_565); canvas c = new canvas(b); v.draw(c);
Comments
Post a Comment