Android:將View的內容對映成Bitmap轉圖片匯出

yangxi_001發表於2014-07-28

    前段時間在網上看到這麼個例子是將view對映到一個bitmap中,稍加改進可以用於一些截圖工具或者截圖軟體(QQ截圖之類),例子寫的不夠完善,不過很有些學習的意義內容大致如下:

    在Android中自有獲取view中的cache內容,然後將內容轉換成bitmap,方法名是:getDrawingCache(),返回結果為Bitmap,但是剛開始使用的時候,得到的結果都是null,所以在一個論壇裡查到了正確的使用方法.程式碼如下:


  1. contentLayout.setDrawingCacheEnabled(true);     
  2.        contentLayout.measure(     
  3.                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),     
  4.                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));     
  5.        contentLayout.layout(00, contentLayout.getMeasuredWidth(),     
  6.                 contentLayout.getMeasuredHeight());     
  7.    
  8.       contentLayout.buildDrawingCache();     
  9.        //會報Canvas: trying to use a recycled bitmap android.graphics.Bitmap
  10.        //Bitmap bitmap= contentLayout.getDrawingCache();
  11. //解決辦法:

    //Copy the bitmap before you pass it to the static variable.

            Bitmap bitmap = contentLayout.getDrawingCache(true);

    //to

            Bitmap bitmap = Bitmap.createBitmap(contentLayout.getDrawingCache(true));


在使用的時候呼叫

Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());

就可以得到圖片的bitmap了。

為了測試這個功能,作者使用了兩種方式來建立LinerLayout中的內容,一種是在xml檔案中就將view的內容新增了,只需在程式碼中新增對應ImageView中的圖片就行了;另一種是動態新增LinerLayout中的View。

 

setview的程式碼:

  1. public void onCreate(Bundle savedInstanceState) {     
  2.     super.onCreate(savedInstanceState);     
  3.     setContentView(R.layout.set_view);     
  4.     contentLayout = (LinearLayout) findViewById(R.id.content);     
  5.     imgSource1 = (ImageView) findViewById(R.id.imgSource1);     
  6.     imgSource2 = (ImageView) findViewById(R.id.imgSource2);     
  7.     imgCache = (ImageView) findViewById(R.id.imgCache);     
  8.     
  9.    imgSource1.setImageResource(R.drawable.source1);     
  10.     imgSource2.setImageResource(R.drawable.source2);     
  11.         
  12.     contentLayout.setDrawingCacheEnabled(true);     
  13.     contentLayout.measure(     
  14.             MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),     
  15.             MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));     
  16.     contentLayout.layout(00, contentLayout.getMeasuredWidth(),     
  17.             contentLayout.getMeasuredHeight());     
  18.     
  19.     contentLayout.buildDrawingCache();     
  20.          
  21.     Bitmap bitmap= contentLayout.getDrawingCache();     
  22.     if(bitmap!=null){     
  23.         imgCache.setImageBitmap(bitmap);     
  24.     }else{     
  25.         Log.i("CACHE_BITMAP""DrawingCache=null");     
  26.     }     
  27. }    

第二種方法程式碼:

 

  1. private void addRelativeLayout() {     
  2.         // TODO Auto-generated method stub     
  3.         RelativeLayout.LayoutParams layoutpare = new RelativeLayout.LayoutParams(     
  4.                 LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);     
  5.    
  6.         RelativeLayout relativeLayout = new RelativeLayout(this);     
  7.         relativeLayout.setLayoutParams(layoutpare);     
  8.     
  9.         ImageView imgView1 = new ImageView(this);     
  10.         ImageView imgView2 = new ImageView(this);     
  11.         imgView1.setImageResource(R.drawable.source1);     
  12.         imgView2.setImageResource(R.drawable.source2);     
  13.         RelativeLayout.LayoutParams img1 = new RelativeLayout.LayoutParams(38,     
  14.                 38);     
  15.         img1.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);     
  16.         RelativeLayout.LayoutParams img2 = new RelativeLayout.LayoutParams(38,     
  17.                 38);     
  18.         img2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);     
  19.     
  20.         relativeLayout.addView(imgView1, img1);     
  21.         relativeLayout.addView(imgView2, img2);     
  22.         addViewContent.addView(relativeLayout);     
  23.     }     
  24.     
  25.     /**    
  26.      * 新增圖片源    
  27.      */    
  28.    private void addImgSource() {     
  29.         ImageView imgView1 = new ImageView(this);     
  30.         ImageView imgView2 = new ImageView(this);     
  31.         imgView1.setImageResource(R.drawable.source1);     
  32.         imgView2.setImageResource(R.drawable.source2);     
  33.         addViewContent.addView(imgView1, new LayoutParams(     
  34.                 LinearLayout.LayoutParams.WRAP_CONTENT,     
  35.                 LinearLayout.LayoutParams.WRAP_CONTENT));     
  36.         addViewContent.addView(imgView2, new LayoutParams(     
  37.                 LinearLayout.LayoutParams.WRAP_CONTENT,     
  38.                 LinearLayout.LayoutParams.WRAP_CONTENT));     
  39.     }    

 

 

文章參考自:http://www.iteye.com/topic/1097916

相關文章