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了!