Android應用內截圖分享的實現記錄
近期的項目中有個需求,需要將某個表示用戶身份的頁面整個截取下來,分享到微信微博。網上也很多的解決方案,我也分享下我自己的爬坑記錄。
需求分析
有個頁面,用于展示用戶獲得的成就(主要是裝逼)。產品狗狗肯定希望通過sns渠道,把這種裝逼手段擴散出去形成口碑。要求很簡單,就將這個頁面整個截取下來保存成圖片,用sns的sdk分享出去。這里就有兩種情況:
- 頁面可見的情況下截圖分享;
- 頁面不可見的情況下截圖分享.
第一種情況很容易解決,而第二種因為頁面不可見,就有點蛋疼。
當然,不可能因為兩種情況就寫兩種截取方式。那么應該怎么實現呢?
實現方案
因為涉及到文件存儲,那么必然,在保存的過程中肯定不應該放到主線程操作,不然就很容易阻塞UI。又因為涉及到Bitmap的生成,那么我們得考慮下內存使用的問題。整個流程應該是這樣->:
展示View
將View轉成Bitmap
將Bitmap寫入SD卡
返回寫入文件的路徑
我們另起一個Activity,將其設為透明的主題樣式,將要截取的View動態add到Activity之中(當然也可以寫在Activity的布局文件中)并將其設為INVISIBLE狀態,現在這個View就已經呈現在我們眼前,只是我們看不到而已。這個時候就可以開始截圖啦。我將View轉為Bitmap的方法也是網上找的
public static Bitmap convertViewToBitmap(View view) {
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
Bitmap.Config.RGB_565);
//利用bitmap生成畫布
Canvas canvas = new Canvas(bitmap);
//把view中的內容繪制在畫布上
view.draw(canvas);
return bitmap;
}
將Bitmap寫入SD卡的方法:
public static void saveMyBitmap(Bitmap bitmap, String path) {
File f = new File(path);
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
return;
}
bitmap.compress(Bitmap.CompressFormat.PNG, 80, fOut);
try {
fOut.flush();
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
最后Activity調用setResult返回保存的文件地址并關閉Activity后,整個流程就結束了啵
到這里,我們要實現的目的已經達到了。有沒有可以優化的地方?那肯定有!最直接的優化方案就是將這個Actvity放在獨立進程操作,完成之后推出進程就OK了!