2012-01-11 5 views
1

J'essaie de créer un programme View en gonflant une mise en page.Création d'une image bitmap d'une vue

View marker = ((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.overlay_view, null); 

Maintenant, je veux convertir cette vue à une mise Bitmap:

public static Bitmap createDrawableFromView(Context context, View view){ 
     DisplayMetrics displayMetrics = new DisplayMetrics(); 
     ((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 

     view.measure(displayMetrics.widthPixels, displayMetrics.heightPixels); 
     view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels); 

     Bitmap cache = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 

     Canvas canvas = new Canvas(cache); 
     view.draw(canvas); 

     return cache; 
    } 

J'ai aussi essayé mesure (1, 1) et la mise en page (0, 0, 0, 0) sans aucune modification. Le bitmap ressemble à la mise en page remplie. Maintenant le problème: Si je mets quelque chose dans la vue qui rend la vue plus grande que l'affichage en largeur ou en hauteur (exemple: un TextView avec un texte long), le bitmap est également plus grand. La largeur et la hauteur XML Views est WRAP_CONTENT mais cela n'a pas fonctionné. Je ne mets jamais cette vue quelque part pour l'afficher (parce que j'ai seulement besoin de la Bitmap). Question: Comment puis-je WRAP la vue à un maximum de largeur = displayWidth?

J'ai essayé view.setLayoutParams (new LayoutParam (100, 100)) mais c'était aussi plus grand que 100 ?! Je ne comprends vraiment pas ce qui s'est passé, quand je gonfle la mise en page et définir le contenu de la vue.

Le view.getMeasuredWidth et Height est toujours plus grand que mon affichage ?! (Si je mets quelque chose de plus en elle)

Voici un exemple de la mise en page:

<RelativeLayout android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/somedrawable" 
     android:padding="10dp" 
     android:clickable="true"> 
     <TextView android:id="@+id/name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Name"/> 
     <TextView android:id="@+id/description" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/name" 
      android:text="Description" 
      android:textSize="20dp" 
      android:textColor="#ffffff"/> 
    </RelativeLayout> 
+0

[Cochez cette réponse] (http://stackoverflow.com/questions/8294110/taking-screenshot/8366223#8366223) –

+0

hum? Où est la réponse? Il y avait une réponse mais elle est partie maintenant ?! – Informatic0re

+0

vérifier le lien que j'avais donné. –

Répondre

0

J'ai trouvé une solution:

première étape: ajouter de nouvelles LayoutParams à la vue. Ceci est important, car sans vous obtiendrez un pointeur nul.

view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

Deuxième:

view.measure(MeasureSpec.makeMeasureSpec(displayMetrics.widthPixels), MeasureSpec.AT_MOST), 
      MeasureSpec.makeMeasureSpec(displayMetrics.heightPixels, MeasureSpec.AT_MOST)); 

pour view.measure() i utilisé MeasureSpec.makeMeasureSpec(displayMetrics.heightPixels, MeasureSpec.AT_MOST));. Le premier paramètre est la largeur d'affichage ou heigt et le second est le mode AT_MOST, ceci est nécessaire pour "envelopper" la vue.

Fonctionne bien! (pour moi: p)