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

方案一:使用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. sping注解原理

    持续更新中.. spring注解用的是java注解,用到的是java反射机制. 参考文档如下: http://zxf-noimp.iteye.com/blog/1071765 对应spring源码如下 ...

  2. sql 判断表、列、视图等是否存在

    1 判断数据库是否存在 if exists (select * from sys.databases where name = '数据库名')     drop database [数据库名] 2 判 ...

  3. MySQL 列子查询及 IN、ANY、SOME 和 ALL 操作符的使用

    列子查询是指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回. 一个列子查询的例子如下: SELECT * FROM article WHERE uid IN(SELECT ui ...

  4. php随机密码

    <?php /* * php自动生成新密码自定义函数(带实例演示) 适用环境: PHP5.2.x / mysql 5.0.x * */ function genPassword($a=1,$b= ...

  5. "float: left;" div 不换行显示

    <div id='p'> <div id='c1'> </div> <div id='c2'> </div> <div id='c3' ...

  6. JAVA-1-HelloWorld

    public class HelloWorld{ public static void main(String[] args){ System.out.println("HelloWorld ...

  7. jsp之间url传值出现中文乱码

    示例: T1.jsp http://localhost:8080/test/Test.action?site=北京 T2.jsp ..... <%@ page language="ja ...

  8. MVC模式下xml文件的解析

    第一次写blog,组织不当和出错的地方还请大家多担当哈. java操作xml文件的方式中用的较多的有四种,DOM.SAX.JDOM.DOM4J.除第一种外其余的三种我都有试过,这后三种方案中我选择用S ...

  9. 《javascript权威指南》读书笔记 -part2

    我真的很佩服副院长~他是一个很有耐心 极其细致的人 工作态度严谨  代码简洁风格统一~再乱遭遭的代码只要经过他的手就会变的很漂亮 羡煞我也~ 不说废话了  还是乖乖看书吧~maybe可能也许的某一天 ...

  10. PHPの页面跳转-常见方法

    PHP页面跳转一.header()函数 header()函数是PHP中进行页面跳转的一种十分简单的方法.header()函数的主要功能是将HTTP协议标头(header)输出到浏览器. header( ...