现在一般的购物网站,在你完成交易后都会将页面拍照以免日后发生商务纠纷,而对于我们移动开发者这个传统互联网上的优秀经验也同样给了我们一些设计上的启迪,接下来我将几种实现思路写出来供大家参考。

方案一:使用WebViewClient的onPageFinished事件

我们使用WebView当做程序里的内嵌式浏览器的显示网页的时候,如果不进行特殊设置,当用户点击WebView里面的链接就会另外启动Android手机内置的浏览器,而离开当前的Activity,针对这一问题,我们可以进行自定义浏览器的客户端设置,代码如下:

  1. mWebView.setWebViewClient(new WebViewClient(){
  2. });

在setWebViewClient()的内容时,我们可以重写onPageFinished()来捕捉WebView加载完毕的事件,关键代码如下:

  1. /* WebView取得WebSettings */
  2. WebSettings webSettings = wView.getSettings();
  3. /* 设置能运行JavaScript */
  4. webSettings.setJavaScriptEnabled(true);
  5. /*  */
  6. /*  */
  7. /* WebView设置WebViewClient */
  8. wView.setWebViewClient(new WebViewClient(){
  9. @Override
  10. public void onPageFinished(WebView view, String url) {
  11. /* 获取画面 */
  12. Picture picture = view.capturePicture();
  13. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  14. /* 获取宽高 */
  15. int width = picture.getWidth();
  16. int height = picture.getHeight();
  17. if (width > 0 && height > 0) {
  18. Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  19. Canvas canvas = new Canvas(bitmap);
  20. picture.draw(canvas);
  21. bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos);
  22. FileOutputStream fos = null;
  23. try {
  24. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
  25. fos = new FileOutputStream(Environment.getExternalStorageDirectory());
  26. if (fos!=null) {
  27. bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
  28. fos.close();
  29. Toast.makeText(ATestActivity.this, "快照保存成功",Toast.LENGTH_LONG).show();
  30. }
  31. }
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. super.onPageFinished(view, url);
  37. }
  38. });

方案二:

使用View的 Bitmap  getDrawingCached(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)实现。

  1. public static Bitmap convertViewToBitmap(View view){
  2. view.buildDrawingCache();
  3.     Bitmap bitmap = view.getDrawingCache();
  4.     return bitmap;
  5. }

一般情况下,直接使用上面方法是能够正常的工作。但有时候,生成Bitmap会出现问题(Bitmap全黑色)。主要原因是drawingCache的值大于系统给定的值。我们可以看一下buildDrawingCache()方法中的一段代码:

  1. if (width <= 0 || height <= 0 ||(width * height * (opaque && !translucentWindow ? 2 : 4) > ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {
  2. destroyDrawingCache();
  3. return;
  4. }

上面的代码中,width和height是所要cache的view绘制的宽度和高度,所以(width * height * (opaque
&& !translucentWindow ? 2 : 4)
计算的是当前所需要的cache大小。
ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize()得到的是系统
所提供的最大的DrawingCache的值。当所需要的drawingCache
>系统所提供的最大DrawingCache值时,生成Bitmap就会出现问题,此时获取的Bitmap就为null。

所以在只需要修改所需的cache值就可以解决问题了。代码实现如下:

    1. public static Bitmap convertViewToBitmap(View view){
    2.    view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    3. view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
    4. view.buildDrawingCache();
    5. Bitmap bitmap = view.getDrawingCache();
    6.      return bitmap;
    7. }

实现Android 版网页快照功能的更多相关文章

  1. 微信 Android版隐藏功能代码

  2. 【项目记录】-液化气配送app android版

    15年底参与过甲方呼叫中心平台开发.液化气配送app android版要求1个月开发完成.开发此项目以前我只有过一周android的开发经验.(与甲方签署过保密协议,遵循职业道德有些敏感信息不能写.) ...

  3. android版高仿淘宝客户端源码V2.3

    android版高仿淘宝客户端源码V2.3,这个版本我已经更新到2.3了,源码也上传到源码天堂那里了,大家可以看一下吧,该应用实现了我们常用的购物功能了,也就是在手机上进行网购的流程的,如查看产品(浏 ...

  4. Android版xx助手之天天酷跑外挂具体分析

    Android版xx助手之天天酷跑外挂具体分析 图/文      莫灰灰 背景 近些年来,移动互联网的大肆崛起,潜移默化中影响着人们的生活和工作习惯.当腾讯的微信平台接入手机游戏之后,移动端的游戏也開 ...

  5. 微信5.0 Android版飞机大战破解无敌模式手记

    微信5.0 Android版飞机大战破解无敌模式手记 转载: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html 微信5.0 ...

  6. android 实现分享功能两种方法

    当我想做一个智能的记事本的时候,我就在尝试自己写一组分享功能.后来才知道,原来每个社交软件中都有自己的分享接口. 这就大大减少了我们的代码量了. 第一种方法:特点--简单 package com.ex ...

  7. 支付宝 Android 版使用的开源组件

    支付宝 Android 版使用的开源组件 前言: 花了点时间整理了 支付宝 Android 客户端使用的开源组件,给需要的同学.在你不知道用什么开源框架的时候可以作下参考,毕竟支付宝是阿里的重量级产品 ...

  8. ShiWangMeSDK Android版接口文档 0.2.0 版

    # ShiWangMeSDK Android版接口文档 0.2.0 版 android 总共有 14 个接口,分别涉及到初始化和对界面的一些细节的控制.下面详细介绍接口,如果没有特殊说明,接口都在 S ...

  9. 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

    1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理!   我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...

随机推荐

  1. Spring 3.0就这么简单读书笔记

    一般情况下,spring容器中的大部分Bean都是单实例的,所以一般无须通过@Repository.@Service.@Component等注解的value属性为Bean指定名称,也无须使用@Qual ...

  2. IO流(数据流

    数据流 创建一个输入或者输出流只想底层的输入输出流 File file1=new File("test1.txt"); FileOutputStream out1=new File ...

  3. [转]PageRank算法

    原文引自: 原文引自: http://blog.csdn.net/hguisu/article/details/7996185 感谢 1. PageRank算法概述 PageRank,即网页排名,又称 ...

  4. QT学习篇: 入门(二)

    库存订单界面: (1)包括序号.订单代码.订单名称.产品代码.产品类型.计划加工数量.最晚完工日期. (2)model增加临时map,用于存储库存订单. (3)后台计算完成后,会将库存订单推送给前台, ...

  5. ruby on rails 中render的使用

    最近写ror,因为比较菜,很多东西不知道,只能看一点查一点了 render 先上点搜集的常用方式 render :action => "long_goal", :layout ...

  6. 1109HTML学习

    <div><!--face里面用逗号隔开表示 字体优先选择.size是字体1到7 --><font color="red" face="微软 ...

  7. sql错误代码一览表

    http://docstore.mik.ua/orelly/java-ent/jenut/ch08_06.htm Table 8-3. SQL-92 SQLSTATE Return Codes Cla ...

  8. JavaScript获取Select下拉框Option的Value和Text值的方法

    Js获取select下拉列表框各个Option的Value值相对比较容易,不过获取Text值却有点麻烦,对于一个初学JavaScript的 新手来说,可能一时还无从下手,那么就请看下本文的方法,以一个 ...

  9. sublime 使用快捷记录

    1.sublime 中有一个htmlprettify 插件 这个插件 可以用来格式化 html css js 使我们的代码看着比较美观 ctrl + shift + h 这个快捷方式是美化代码间距的 ...

  10. 04 - 替换vtkDataObject中的GetPipelineInformation 和GetExecutive 方法 VTK 6.0 迁移

    VTK6 引入了许多不兼容的变.其中之一是删除vtkDataObject中所有有关管道的方法.其中的两个方法就是GetPipelineInformation() 和 GetExecutive().这些 ...