2010-12-03 23 views
4

J'essaie de créer un bitmap à partir d'une vue qui n'est pas encore affichée pour le définir comme une texture avec OpenGL dans android. Le problème est que lorsque je crée mon bitmap, les paramètres de disposition de ma vue ont la valeur 0 parce que la fonction onLayout() n'a pas encore été appelée. Existe-t-il un moyen de "simuler" une mise en page ou de faire une "mise en page d'arrière-plan" pour obtenir les bons paramètres de mise en page? Je pensais à une mise en page Frame ayant deux vues, l'arrière-plan serait utilisé pour créer mon bitmap comme la mise en page aurait été faite.Bitmap de vue non affiché sur Android

Merci.

Répondre

19

Vous avez en effet besoin de mettre en forme votre vue avant de l'insérer dans un bitmap. Il suffit d'appeler myView.measure(...);

puis

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

J'ai posté un exemple sur la façon de le faire dans l'une des présentations suivantes: http://www.curious-creature.org/2010/12/02/android-graphics-animations-and-tips-tricks/

+3

Merci Romain J'ai essayé votre solution. Ça fonctionne bien. Je le poste ici pour ceux qui ne voudraient pas analyser la présentation (qui contiennent des informations très utiles): – dMathieuD

+3

int spec = MeasureSpec.makeMeasureSpec (0, MeasureSpec.UNDEFINED); view.measure (spec, spec); view.layout (0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); Bitmap b = Bitmap.createBitmap ( view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Toile c = nouveau Toile (b); c.translate (-view.getScrollX(), -view.getScrollY()); view.draw (c); – dMathieuD

+0

Cela fonctionne génial!Vous pouvez utiliser les paramètres de disposition pour déterminer la taille de votre bitmap. – Codeman

1

Ainsi, quelques modifications après la question a été précisé :)

Je vous suggère de créer le bitmap indépendamment de la vue, à l'échelle puis à la même taille que la vue une fois que la vue est créée. Créer un bitmap de taille arbitraire qui permet de rendre ce que vous voulez .. il

 
// 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 

Puis, après votre point de vue est créé, prendre le bitmap precreated et RESCALE à la bonne taille (je ne l'ai pas fait vérifié ce en le compilant - peut être des erreurs):

 
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); 
+0

Ok peut-être je pas été assez clair. Oubliez OpenGL. Disons que je veux un bitmap de ma vue qui n'a pas encore été affiché. Y a-t-il un moyen de l'atteindre? – dMathieuD

+0

Hm. Il semble que vous souhaitiez séparer le rendu bitmap de la vue (en refactorisant le code de création bitmap dans une nouvelle classe) et rendre le bitmap disponible à partir de cette nouvelle classe de rendu. Ensuite, vous aurez plus de contrôle sur le processus de rendu. –

+0

Ok, donc si je veux suivre cette façon de créer mon bitmap: – dMathieuD