1. 程式人生 > >Android:將一個Activity、某塊佈局轉換成圖片

Android:將一個Activity、某塊佈局轉換成圖片

  1. 使用截圖,然後儲存圖片

  2. 如果要儲存的佈局正好是撐滿這個螢幕,那可以使用截圖的方式來儲存圖片;

  3. 如果只是螢幕的某一個部分,那才用截圖後,還得對截圖後的圖片進行二次裁剪,而且要裁剪的座標點也比較難正確得出;

  4. 要儲存的佈局大於當前螢幕,那就得多次截圖,然後再把幾個截圖拼接起來,費時費力。

  5. 啟用View自帶繪製快取(這個名字估計不太合適) Google估計早就想到了這個問題,在檢視View的原始碼的時候,發現View本身有兩個方法很有意思。 一是:setDrawingCacheEnabled(boolean enabled),這個方法設定為true,就可以生成點陣圖的副本(原話:This API can be used to manually generate a bitmap copy of this view, by setting the flag to <code>true</code> and calling {@link #getDrawingCache()}.); 二是:getDrawingCache(),這個方法其實是呼叫的getDrawingCache(false),這個方法返回的一個繪製此View時的檢視快取Bitmap(原話:Returns the bitmap in which this view drawing is cached.); 知道了這兩個方法就可以將任意XML任意模組的View給生成圖片,是不是很簡單,如下:

  6. 父佈局(要生成圖片的佈局,下邊同)開啟繪圖快取;

  7. 計算父佈局寬高;

  8. 父佈局設定layout;

  9. 用Bitmap.createBitmap(獲取父佈局到的cache)生成Bitmap;

  10. 關閉DrawingCache;

  11. 接下來是儲存到本地還是直接設定給ImageView自己決定了。

點選儲存圖片按鈕,執行如下程式碼,將佈局儲存成Bitmap設定給“小兵”下邊那個ImageView,click的程式碼如下:

ll.setDrawingCacheEnabled(true);
ll.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
ll.layout(0, 0, ll.getMeasuredWidth(), ll.getMeasuredHeight());
Bitmap bitmap = Bitmap.createBitmap(ll.getDrawingCache());
ll.setDrawingCacheEnabled(false);
iv.setImageBitmap(bitmap);

執行前:

點選之前.png

點選儲存圖片後: