Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bitmap from View not displayed on Android

I am trying to create a bitmap from a View that is not displayed yet to set it as a texture with OpenGL in android. The problem is that when I create my bitmap the layout parameters of my View have 0 value cause the onLayout() function has not been called yet. Is there a way to "simulate" a layout or do a "background layout" to get the right layout params ? I was thinking about a Frame layout having two views, the background one would be used to create my bitmap as the layout would have been done.

Thanks.

like image 224
dMathieuD Avatar asked Nov 30 '22 17:11

dMathieuD


2 Answers

You indeed need to layout your View before drawing it into a Bitmap. Simply call myView.measure(...);

then

myView.layout(0, 0, myView.getMeasuredWidth(), myView.getMeasuredHeight());

I have posted an example on how to do this in one of the following presentations: http://www.curious-creature.org/2010/12/02/android-graphics-animations-and-tips-tricks/

like image 61
Romain Guy Avatar answered Dec 02 '22 07:12

Romain Guy


So, some edits after the question was clarified :)

I suggest you create the bitmap independently of the view, then scale it to the same size as the view once the view is created. Create an arbitrary size bitmap that allows you to render what you want to it ..

// This in some class that renders your bitmap independently, and can be
// queried to get the bitmap ...
Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_4444); 
// render something to your bitmap here

Then after your view is created, take the precreated bitmap and rescale it to the right size (I've not actually checked this by compiling it -- might be errors):

Rect original = new Rect(0, 0, 100, 100);
RectF destination = new RectF(0.0, 0.0, (float)myView.getWidth(), (float)myView.getHeight());
Canvas canvas = new Canvas(); 
canvas.drawBitmap(myRenderingClass.b, original, destination, null); 
myView.draw(canvas);
like image 39
Tim Barrass Avatar answered Dec 02 '22 07:12

Tim Barrass