2010-11-24 23 views
9

possible en double:
Converting a view to Bitmap without displaying it in Android?vue converti en bitmap

Je suis en train de convertir la vue en bitmap de lien de référence

link text

Maintenant le problème est comment puis-je obtenir le bitmap qui est en cours de conversion à partir de vue seulement. dans l'auteur exemple a utilisé relativelayout.dispatchDraw (c), mais cette ligne me donne erreur de compilation de temps à savoir

La méthode dispatchDraw (Canvas) de le type ViewGroup n'est pas visible

Voici mon code et moi avons écrit le code suivant dans la fonction onCreate

Canvas c=null; 

    //Create Layout 
    RelativeLayout relativeView ;   
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
    RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT 
    ); 

    relativeView = new RelativeLayout(this);    
    relativeView.setLayoutParams(lp); 

    //Background of Layout 
    Bitmap viewBgrnd = BitmapFactory.decodeResource(getResources(),R.drawable.bgblack); 
    relativeView.setBackgroundDrawable(new BitmapDrawable(viewBgrnd)); 

    //associated with canvas 
    Bitmap returnedBitmap =    Bitmap.createBitmap(320,480,Bitmap.Config.ARGB_8888);  
    c = new Canvas(returnedBitmap); 
    Paint paint = new Paint(); 


    //Create Imageview that holds image    
    ImageView newImage = new ImageView(this); 
    Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.bgpink); 
    newImage.setImageBitmap(srcBitmap); 

    TextView newText = new TextView(this); 

    newText.setText("This is the text that its going to appear");  

    c.drawBitmap(viewBgrnd, 0, 0, paint); 
      relativeView.layout(100, 0, 256, 256); 
    relativeView.addView(newImage); 
    relativeView.addView(newText); 


     // here i am getting compile time error so for timing i have replaced this line 
     // with relativeView.draw(c); 

    relativeView.dispatchDraw(c); 

ici, le returnedBitmap doit contenir l'image (ImageView et TextView), mais ce bitmap ne contient que bitmap bacground de relati veView dire bgblack

+1

J'ai eu le même temps anciens problèmes et n'a trouvé aucune solution, aussi. Quelqu'un m'a dit, que le cache de dessin peut être un point. Mais je n'étais pas capable de le faire fonctionner correctement. – Impression

+0

Je ne sais pas comment utiliser le cache – Hunt

+0

si j'utilise relativeView.setDrawingCacheEnabled (true); et après cela si je vais essayer d'obtenir le cache en utilisant relativeView.getDrawingCache() je reçois bitmap nul – Hunt

Répondre

6

Cela fonctionne pour moi:

Bitmap viewCapture = null; 

theViewYouWantToCapture.setDrawingCacheEnabled(true); 

viewCapture = Bitmap.createBitmap(theViewYouWantToCapture.getDrawingCache()); 

theViewYouWantToCapture.setDrawingCacheEnabled(false); 

Je crois que le point de vue doit être visible (ie. getVisiblity() == View.VISIBLE). Si vous essayez de le capturer mais de le cacher à l'utilisateur en même temps, vous pouvez le déplacer hors de l'écran ou y placer quelque chose.

+1

c'est bien. mais comment améliorer la qualité de l'image. tandis que la conversion de l'image bitmap semble floue ou semi-transparente. – Praveen

+0

Merci. C'est une méthode simple de l'API: Cette API peut être utilisée pour générer manuellement une copie bitmap de cette vue, en mettant l'indicateur à true et en appelant getDrawingCache(). –

25

voici ma solution:

public static Bitmap getBitmapFromView(View view) { 
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(returnedBitmap); 
    Drawable bgDrawable =view.getBackground(); 
    if (bgDrawable!=null) 
     bgDrawable.draw(canvas); 
    else 
     canvas.drawColor(Color.WHITE); 
    view.draw(canvas); 
    return returnedBitmap; 
} 

Enjoy :)