现在一般的购物网站,在你完成交易后都会将页面拍照以免日后发生商务纠纷,而对于我们移动开发者这个传统互联网上的优秀经验也同样给了我们一些设计上的启迪,接下来我将几种实现思路写出来供大家参考。
方案一:使用WebViewClient的onPageFinished事件
我们使用WebView当做程序里的内嵌式浏览器的显示网页的时候,如果不进行特殊设置,当用户点击WebView里面的链接就会另外启动Android手机内置的浏览器,而离开当前的Activity,针对这一问题,我们可以进行自定义浏览器的客户端设置,代码如下:
mWebView.setWebViewClient(new WebViewClient(){});
在setWebViewClient()的内容时,我们可以重写onPageFinished()来捕捉WebView加载完毕的事件,关键代码如下:
/* WebView取得WebSettings */ WebSettings webSettings = wView.getSettings(); /* 设置能运行JavaScript */ webSettings.setJavaScriptEnabled(true); /* */ /* */ /* WebView设置WebViewClient */ wView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { /* 获取画面 */ Picture picture = view.capturePicture(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); /* 获取宽高 */ int width = picture.getWidth(); int height = picture.getHeight(); if (width > 0 && height > 0) { Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); picture.draw(canvas); bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos); FileOutputStream fos = null; try { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { fos = new FileOutputStream(Environment.getExternalStorageDirectory()); if (fos!=null) { bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); fos.close(); Toast.makeText(ATestActivity.this, "快照保存成功",Toast.LENGTH_LONG).show(); } } } catch (Exception e) { e.printStackTrace(); } } super.onPageFinished(view, url); } });
方案二:
使用View的 Bitmap getDrawingCache(boolean autoScale)方法实现,不过要注意的是cache先要通过setDrawingCacheEnable方法把cache开启,然后再调用getDrawingCache方法就可以获得view的cache图片了。buildDrawingCache方法可以不用调用,因为调用getDrawingCache方法时,若果 cache没有建立,系统会自动调用buildDrawingCache方法生成cache。若果要更新cache, 必须要调用destoryDrawingCache方法把旧的cache销毁,才能建立新的。
当调用setDrawingCacheEnabled方法设置为false, 系统也会自动把原来的cache销毁。
ViewGroup在绘制子view时,而外提供了两个方法
void setChildrenDrawingCacheEnabled(boolean enabled)
setChildrenDrawnWithCacheEnabled(boolean enabled)
setChildrenDrawingCacheEnabled方法可以使viewgroup里所有的子view开启cache, setChildrenDrawnWithCacheEnabled使在绘制子view时,若该子view开启了cache, 则使用它的cache进行绘制,从而节省绘制时间。
获取cache通常会占用一定的内存,所以通常不需要的时候有必要对其进行清理,通过destroyDrawingCache或setDrawingCacheEnabled(false)实现。
参考:http://blog.csdn.net/zhoujiyu123/article/details/8021544
http://blog.sina.com.cn/s/blog_9564cb6e0101gwdx.html