Android應(yīng)用內(nèi)截圖分享的實(shí)現(xiàn)記錄
近期的項(xiàng)目中有個(gè)需求,需要將某個(gè)表示用戶身份的頁(yè)面整個(gè)截取下來(lái),分享到微信微博正驻。網(wǎng)上也很多的解決方案镣隶,我也分享下我自己的爬坑記錄。
需求分析
有個(gè)頁(yè)面达布,用于展示用戶獲得的成就(主要是裝逼)。產(chǎn)品狗狗肯定希望通過(guò)sns渠道,把這種裝逼手段擴(kuò)散出去形成口碑矗晃。要求很簡(jiǎn)單,就將這個(gè)頁(yè)面整個(gè)截取下來(lái)保存成圖片宴倍,用sns的sdk分享出去张症。這里就有兩種情況:
- 頁(yè)面可見(jiàn)的情況下截圖分享;
- 頁(yè)面不可見(jiàn)的情況下截圖分享.
第一種情況很容易解決,而第二種因?yàn)轫?yè)面不可見(jiàn)鸵贬,就有點(diǎn)蛋疼俗他。
當(dāng)然,不可能因?yàn)閮煞N情況就寫兩種截取方式阔逼。那么應(yīng)該怎么實(shí)現(xiàn)呢兆衅?
實(shí)現(xiàn)方案
因?yàn)樯婕暗轿募鎯?chǔ),那么必然嗜浮,在保存的過(guò)程中肯定不應(yīng)該放到主線程操作羡亩,不然就很容易阻塞UI。又因?yàn)樯婕暗紹itmap的生成危融,那么我們得考慮下內(nèi)存使用的問(wèn)題畏铆。整個(gè)流程應(yīng)該是這樣->:
展示View
將View轉(zhuǎn)成Bitmap
將Bitmap寫入SD卡
返回寫入文件的路徑
我們另起一個(gè)Activity,將其設(shè)為透明的主題樣式专挪,將要截取的View動(dòng)態(tài)add到Activity之中(當(dāng)然也可以寫在Activity的布局文件中)并將其設(shè)為INVISIBLE狀態(tài),現(xiàn)在這個(gè)View就已經(jīng)呈現(xiàn)在我們眼前及志,只是我們看不到而已。這個(gè)時(shí)候就可以開(kāi)始截圖啦寨腔。我將View轉(zhuǎn)為Bitmap的方法也是網(wǎng)上找的
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中的內(nèi)容繪制在畫布上
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調(diào)用setResult返回保存的文件地址并關(guān)閉Activity后速侈,整個(gè)流程就結(jié)束了啵
到這里,我們要實(shí)現(xiàn)的目的已經(jīng)達(dá)到了迫卢。有沒(méi)有可以優(yōu)化的地方倚搬?那肯定有!最直接的優(yōu)化方案就是將這個(gè)Actvity放在獨(dú)立進(jìn)程操作乾蛤,完成之后推出進(jìn)程就OK了每界!